UNPKG

typescript-express-starter

Version:
61 lines (47 loc) 2.27 kB
import { hash, compare } from 'bcrypt'; import { sign } from 'jsonwebtoken'; import { Service } from 'typedi'; import { SECRET_KEY } from '@config'; import { HttpException } from '@exceptions/httpException'; import { DataStoredInToken, TokenData } from '@interfaces/auth.interface'; import { User } from '@interfaces/users.interface'; import { UserModel } from '@models/users.model'; const createToken = (user: User): TokenData => { const dataStoredInToken: DataStoredInToken = { id: user.id }; const expiresIn: number = 60 * 60; return { expiresIn, token: sign(dataStoredInToken, SECRET_KEY, { expiresIn }) }; }; const createCookie = (tokenData: TokenData): string => { return `Authorization=${tokenData.token}; HttpOnly; Max-Age=${tokenData.expiresIn};`; }; @Service() export class AuthService { public async signup(userData: User): Promise<User> { const findUser: User = await UserModel.query().select().from('users').where('email', '=', userData.email).first(); if (findUser) throw new HttpException(409, `This email ${userData.email} already exists`); const hashedPassword = await hash(userData.password, 10); const createUserData: User = await UserModel.query() .insert({ ...userData, password: hashedPassword }) .into('users'); return createUserData; } public async login(userData: User): Promise<{ cookie: string; findUser: User }> { const findUser: User = await UserModel.query().select().from('users').where('email', '=', userData.email).first(); if (!findUser) throw new HttpException(409, `This email ${userData.email} was not found`); const isPasswordMatching: boolean = await compare(userData.password, findUser.password); if (!isPasswordMatching) throw new HttpException(409, 'Password is not matching'); const tokenData = createToken(findUser); const cookie = createCookie(tokenData); return { cookie, findUser }; } public async logout(userData: User): Promise<User> { const findUser: User = await UserModel.query() .select() .from('users') .where('email', '=', userData.email) .andWhere('password', '=', userData.password) .first(); if (!findUser) throw new HttpException(409, "User doesn't exist"); return findUser; } }