72 lines
2.2 KiB
TypeScript
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 };
|