index.ts 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import jwt from "jsonwebtoken";
  2. import {
  3. plainToInstance
  4. } from "class-transformer";
  5. import {
  6. validate
  7. } from "class-validator";
  8. import {
  9. User
  10. } from "../../../models/User";
  11. import {
  12. LoginResult,
  13. LoginInput
  14. } from "./types";
  15. import redis from "../../../config/redis";
  16. import {
  17. formatValidationErrors
  18. } from "../../../utils";
  19. export const login = async (input: LoginInput): Promise<LoginResult> => {
  20. const dto = plainToInstance(LoginInput, input);
  21. const errors = await validate(dto);
  22. if (errors.length > 0) {
  23. const formattedErrors = formatValidationErrors(errors);
  24. return {
  25. code: 400,
  26. message: formattedErrors[0],
  27. };
  28. }
  29. const {
  30. password,
  31. mail
  32. } = input;
  33. const user = await User.findOne({
  34. mail
  35. });
  36. if (!user) {
  37. return {
  38. message: "User not found",
  39. code: 404,
  40. };
  41. }
  42. if (user.password !== password) {
  43. return {
  44. message: "Wrong password",
  45. code: 401,
  46. };
  47. }
  48. if (!user.isMailVerified) {
  49. return {
  50. message: "Please verify your email address.",
  51. code: 403,
  52. payload: {
  53. isMailVerified: user.isMailVerified,
  54. mail: user.mail,
  55. },
  56. };
  57. }
  58. const accessToken = jwt.sign(
  59. {
  60. companyName: user.companyName,
  61. fullName: user.fullName,
  62. userId: user._id,
  63. mail: user.mail
  64. },
  65. process.env.JWT_SECRET as string,
  66. {
  67. expiresIn: "4h"
  68. }
  69. );
  70. await redis.setex(`user:${user._id.toString()}`, 14400, accessToken);
  71. const refreshToken = jwt.sign(
  72. {
  73. companyName: user.companyName,
  74. fullName: user.fullName,
  75. userId: user._id,
  76. mail: user.mail
  77. },
  78. process.env.JWT_REFRESH_SECRET as string || process.env.JWT_SECRET as string,
  79. {
  80. expiresIn: "30d"
  81. }
  82. );
  83. user.refreshToken = refreshToken;
  84. await user.save();
  85. return {
  86. message: "Login successful",
  87. code: 200,
  88. payload: {
  89. refreshToken,
  90. accessToken,
  91. user: {
  92. phoneNumber: user.phoneNumber,
  93. companyName: user.companyName,
  94. userId: user._id.toString(),
  95. firstName: user.firstName,
  96. lastName: user.lastName,
  97. fullName: user.fullName,
  98. mail: user.mail,
  99. },
  100. },
  101. };
  102. };
  103. export default login;