lego/back-end/src/controllers/auth.controller.ts
2024-11-08 12:04:58 +01:00

72 lines
2.2 KiB
TypeScript

import { Request, Response, Router } from 'express';
import bcrypt from 'bcrypt';
import { SignJWT } from 'jose';
import { JWT_ISSUER, JWT_AUDIENCE, JWT_SECRET, JWT_EXPIRATION, JWT_SECRET_KEY } from '../config/auth.config';
import { Member, User } from '../types/member';
import memberService from '../services/member.service';
import { Either, eitherLeft, eitherRight } from '../utils/utils';
const register = (req: Request, res: Response) => {
if (!req || !req.body || !req.body.name || !req.body.password) {
res.status(400).send();
return;
}
const name: string = req.body.name;
bcrypt.genSalt(10, (err, salt) => {
if (err) {
res.status(500).send();
return;
}
bcrypt.hash(req.body.password, salt, async (err, hash) => {
if (err) {
res.status(500).send();
return;
}
const member: Either<Member, string> = await memberService.createMember(name, hash);
if (member.hasRight) {
res.status(401).send(member.right);
return;
}
const token = await new SignJWT({ name })
.setProtectedHeader({ alg: 'HS256' })
.setAudience(JWT_AUDIENCE)
.setIssuer(JWT_ISSUER)
.setExpirationTime(JWT_EXPIRATION)
.sign(JWT_SECRET_KEY);
res.status(200).send({ member: memberService.userAdapter(member.left), token: token });
});
});
};
const login = async (req: Request, res: Response) => {
if (!req || !req.body || !req.body.name || !req.body.password) {
res.status(400).send();
return;
}
const name: string = req.body.name;
const member: Either<Member, string> = await memberService.getMember(name);
if (member.hasRight) {
res.send(member.right).send();
return;
}
bcrypt.compare(req.body.password, member.left.password, async (err, r) => {
if (err) {
res.status(500).send();
return;
}
if (!r) {
res.status(401).send();
return;
}
const token = await new SignJWT({ name })
.setProtectedHeader({ alg: 'HS256' })
.setAudience(JWT_AUDIENCE)
.setIssuer(JWT_ISSUER)
.setExpirationTime(JWT_EXPIRATION)
.sign(JWT_SECRET_KEY);
res.status(200).send({ member: memberService.userAdapter(member.left), token: token });
});
};
export { register, login };