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 = 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 = 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 };