import jwt from "jsonwebtoken"; import { User } from "../../../models/User"; import { LoginResult, LoginInput } from "./types"; import redis from "../../../config/redis"; const login = async (input: LoginInput): Promise => { const { password, mail } = input; const user = await User.findOne({ mail }); if (!user) { return { message: "user-not-found", code: 404, }; } if (user.password !== password) { return { message: "wrong-password", code: 401, }; } if (!user.isPhoneVerified) { return { message: "please-verify-your-phone-first", code: 403, payload: { userID: user._id.toString() } }; } if (!user.isApproved) { return { message: "your-account-is-currently-under-review-we-will-get-back-to-you", code: 200, }; } const accessToken = jwt.sign( { companyName: user.companyName, fullName: user.fullName, userID: user._id, mail: user.mail }, process.env.JWT_SECRET as string, { expiresIn: "4h" } ); await redis.setex(user._id.toString(), 14400, accessToken); const refreshToken = jwt.sign( { companyName: user.companyName, fullName: user.fullName, userID: user._id, mail: user.mail }, process.env.JWT_SECRET as string, { expiresIn: "30d" } ); user.refreshToken = refreshToken; await user.save(); return { message: "login-successful", code: 200, payload: { refreshToken, accessToken, user: { phoneNumber: user.phoneNumber, companyName: user.companyName, userID: user._id.toString(), firstName: user.firstName, lastName: user.lastName, fullName: user.fullName, mail: user.mail, }, }, }; }; export default login;