import jwt from "jsonwebtoken"; import redis from "../../../config/redis"; import { User } from "../../../models/User"; import { RefreshTokenResult } from "./types"; const refreshToken = async (token: string): Promise => { try { if (!token) { return { message: "refreshToken-required", code: 400 }; } const user = await User.findOne({ refreshToken: token }); if (!user) { return { message: "user-not-found", code: 404 }; } const userID = user._id.toString(); let decoded: { companyName: string; fullName: string; userID: string; }; try { decoded = jwt.verify( token, process.env.JWT_SECRET as string ) as typeof decoded; } catch { return { message: "invalid-refresh-token", code: 401 }; } const newAccessToken = jwt.sign( { companyName: user.companyName, fullName: user.fullName, userID: user._id }, process.env.JWT_SECRET as string, { expiresIn: "4h" } ); const newRefreshToken = jwt.sign( { companyName: user.companyName, fullName: user.fullName, userID: user._id }, process.env.JWT_SECRET as string, { expiresIn: "30d" } ); await redis.setex(userID, 14400, newAccessToken); user.refreshToken = newRefreshToken; await user.save(); return { code: 200, message: "token-refreshed", payload: { refreshToken: newRefreshToken, accessToken: newAccessToken, }, }; } catch (error) { console.error("RefreshToken action error:", error); return { message: "internal-server-error", code: 500 }; } }; export default refreshToken;