get-express-starter
Version:
Get production ready express boilerplate with a single command
71 lines (61 loc) • 2.56 kB
text/typescript
import httpStatus from 'http-status';
import tokenService from './token.service';
import userService from './user.service';
import { ApiError } from '@/utils';
import { tokenTypes } from '@/config/tokens';
import { logger } from '@/config/logger';
import { comparePassword } from '@/utils/passwordHash';
const loginUserWithEmailAndPassword = async (email: string, password: string) => {
const user = await userService.getUserByEmail(email);
if (!user || !(await comparePassword(password, user.password))) {
throw new ApiError(httpStatus.UNAUTHORIZED, 'Incorrect email or password');
}
return user;
};
const logout = async (refreshToken: string) => {
await tokenService.getToken({
token: refreshToken,
type: tokenTypes.REFRESH,
blacklisted: false,
});
await tokenService.deleteToken({ token: refreshToken, type: tokenTypes.REFRESH, blacklisted: false });
};
const refreshAuth = async (refreshToken: string) => {
try {
const refreshTokenDoc = await tokenService.verifyToken(refreshToken, tokenTypes.REFRESH);
const user = await userService.getUserById(refreshTokenDoc.userId);
await tokenService.deleteToken({ userId: refreshTokenDoc.userId });
return tokenService.generateAuthTokens(user);
} catch (error) {
logger.error(error);
throw new ApiError(httpStatus.UNAUTHORIZED, 'Please authenticate');
}
};
const resetPassword = async (resetPasswordToken: string, newPassword: string) => {
try {
const resetPasswordTokenDoc = await tokenService.verifyToken(resetPasswordToken, tokenTypes.RESET_PASSWORD);
const user = await userService.getUserById(resetPasswordTokenDoc.userId);
await userService.updateUserById(user.id, { password: newPassword });
await tokenService.deleteToken({ userId: user.id, type: tokenTypes.RESET_PASSWORD });
return user;
} catch (error) {
throw new ApiError(httpStatus.UNAUTHORIZED, 'Password reset failed');
}
};
const verifyEmail = async (verifyEmailToken: string) => {
try {
const verifyEmailTokenDoc = await tokenService.verifyToken(verifyEmailToken, tokenTypes.VERIFY_EMAIL);
const user = await userService.getUserById(verifyEmailTokenDoc.userId);
await tokenService.deleteToken({ userId: user.id, type: tokenTypes.VERIFY_EMAIL });
await userService.updateUserById(user.id, { isEmailVerified: true });
} catch (error) {
throw new ApiError(httpStatus.UNAUTHORIZED, 'Email verification failed');
}
};
export default {
loginUserWithEmailAndPassword,
logout,
refreshAuth,
resetPassword,
verifyEmail,
};