index.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import jwt from "jsonwebtoken";
  2. import redis from "../../../config/redis";
  3. import {
  4. User
  5. } from "../../../models/User";
  6. import {
  7. RefreshTokenResult
  8. } from "./types";
  9. const refreshToken = async (userId: string, token: string): Promise<RefreshTokenResult> => {
  10. try {
  11. if (!userId || !token) {
  12. return {
  13. message: "userId and refreshToken required",
  14. code: 400
  15. };
  16. }
  17. const user = await User.findById(userId);
  18. if (!user) {
  19. return {
  20. message: "user-not-found",
  21. code: 404
  22. };
  23. }
  24. let decoded: {
  25. companyName: string;
  26. fullName: string;
  27. userId: string;
  28. mail: string;
  29. };
  30. try {
  31. decoded = jwt.verify(
  32. token,
  33. process.env.JWT_SECRET as string
  34. ) as typeof decoded;
  35. } catch {
  36. return {
  37. message: "invalid-refresh-token",
  38. code: 401
  39. };
  40. }
  41. if (decoded.userId !== userId) {
  42. return {
  43. message: "invalid-refresh-token",
  44. code: 401
  45. };
  46. }
  47. const newAccessToken = jwt.sign(
  48. {
  49. companyName: user.companyName,
  50. fullName: user.fullName,
  51. userId: user._id,
  52. mail: user.mail,
  53. },
  54. process.env.JWT_SECRET as string,
  55. {
  56. expiresIn: "4h"
  57. }
  58. );
  59. const newRefreshToken = jwt.sign(
  60. {
  61. companyName: user.companyName,
  62. fullName: user.fullName,
  63. userId: user._id,
  64. mail: user.mail,
  65. },
  66. process.env.JWT_SECRET as string,
  67. {
  68. expiresIn: "30d"
  69. }
  70. );
  71. await redis.del(`${userId}`);
  72. await redis.setex(`${userId}`, 14400, newAccessToken);
  73. user.refreshToken = newRefreshToken;
  74. await user.save();
  75. return {
  76. code: 200,
  77. message: "token-refreshed",
  78. payload: {
  79. accessToken: newAccessToken,
  80. refreshToken: newRefreshToken,
  81. },
  82. };
  83. } catch (error) {
  84. console.error("RefreshToken action error:", error);
  85. return {
  86. message: "internal-server-error",
  87. code: 500
  88. };
  89. }
  90. };
  91. export default refreshToken;