Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | 4x 4x 4x 4x 4x 4x 4x 4x 3x 3x 2x 1x 4x 3x 3x 2x 4x 6x 6x 2x 2x 1x 1x 1x 5x 5x 4x 4x 4x 2x 2x 1x 1x 1x 3x 3x 4x 4x 4x 2x 2x 1x 1x 1x 3x 3x 4x | const { status: httpStatus } = require('http-status'); const tokenService = require('./token.service'); const userService = require('./user.service'); const Token = require('../models/token.model'); const ApiError = require('../utils/ApiError'); const { tokenTypes } = require('../config/tokens'); const logger = require('../config/logger'); /** * Login with username and password * @param {string} email * @param {string} password * @returns {Promise<User>} */ const loginUserWithEmailAndPassword = async (email, password) => { const user = await userService.getUserByEmail(email); if (!user || !(await user.isPasswordMatch(password))) { throw new ApiError(httpStatus.UNAUTHORIZED, 'Incorrect email or password'); } return user; }; /** * Logout * @param {string} refreshToken * @returns {Promise} */ const logout = async (refreshToken) => { const refreshTokenDoc = await Token.findOneAndDelete({ token: refreshToken, type: tokenTypes.REFRESH, blacklisted: false, }); if (!refreshTokenDoc) { throw new ApiError(httpStatus.NOT_FOUND, 'Not found'); } }; /** * Refresh auth tokens * @param {string} refreshToken * @returns {Promise<Object>} */ const refreshAuth = async (refreshToken) => { try { const refreshTokenDoc = await tokenService.verifyToken(refreshToken, tokenTypes.REFRESH); const user = await userService.getUserById(refreshTokenDoc.user); if (!user) { throw new Error(); } await Token.findByIdAndDelete(refreshTokenDoc._id); return tokenService.generateAuthTokens(user); } catch (error) { logger.error(error); throw new ApiError(httpStatus.UNAUTHORIZED, 'Please authenticate'); } }; /** * Reset password * @param {string} resetPasswordToken * @param {string} newPassword * @returns {Promise} */ const resetPassword = async (resetPasswordToken, newPassword) => { try { const resetPasswordTokenDoc = await tokenService.verifyToken(resetPasswordToken, tokenTypes.RESET_PASSWORD); const user = await userService.getUserById(resetPasswordTokenDoc.user); if (!user) { throw new Error(); } await userService.updateUserById(user.id, { password: newPassword }); await Token.deleteMany({ user: user.id, type: tokenTypes.RESET_PASSWORD }); } catch (error) { logger.error(error); throw new ApiError(httpStatus.UNAUTHORIZED, 'Password reset failed'); } }; /** * Verify email * @param {string} verifyEmailToken * @returns {Promise} */ const verifyEmail = async (verifyEmailToken) => { try { const verifyEmailTokenDoc = await tokenService.verifyToken(verifyEmailToken, tokenTypes.VERIFY_EMAIL); const user = await userService.getUserById(verifyEmailTokenDoc.user); if (!user) { throw new Error(); } await Token.deleteMany({ user: user.id, type: tokenTypes.VERIFY_EMAIL }); await userService.updateUserById(user.id, { isEmailVerified: true }); } catch (error) { logger.error(error); throw new ApiError(httpStatus.UNAUTHORIZED, 'Email verification failed'); } }; module.exports = { loginUserWithEmailAndPassword, logout, refreshAuth, resetPassword, verifyEmail, }; |