typescript-express-starter
Version:
Quick and Easy TypeScript Express Starter
61 lines (47 loc) • 2.27 kB
text/typescript
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};`;
};
()
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;
}
}