import { PrismaClient } from "@prisma/client"; import jwt, { JwtPayload } from "jsonwebtoken"; import moment from "moment"; import config from "../../../config/config"; const prisma = new PrismaClient(); export class TokenService { private generateToken( user_xid: number, expiresIn: Date, type: string, secret: string ): { token: string; expires: Date } { const token = jwt.sign( { sub: user_xid, iat: moment().unix(), exp: moment(expiresIn).unix(), type, }, secret ); return { token, expires: expiresIn }; } async generateAuthToken( user_xid: number, ): Promise<{ access: { token: string; expires: Date }; refresh: { token: string; expires: Date }; }> { const accessTokenExpires = moment() .add(config.jwt.accessExpirationMinutes, "minutes") .toDate(); const refreshTokenExpires = moment() .add(config.jwt.refreshExpirationDays, "days") .toDate(); const accessToken = this.generateToken( user_xid, accessTokenExpires, "access", config.jwt.secret ); const refreshToken = this.generateToken( user_xid, refreshTokenExpires, "refresh", config.jwt.secret ); await prisma.token.create({ data: { token: refreshToken.token, expiringAt: refreshToken.expires, tokenType: "refresh", isBlackListed: false, user: { connect: { id: user_xid }, }, }, }); return { access: accessToken, refresh: refreshToken, }; } async generateAuthTokenAdmin( user_xid: number ): Promise<{ access: { token: string; expires: Date }; refresh: { token: string; expires: Date }; }> { const accessTokenExpires = moment() .add(config.jwt.accessExpirationMinutes, "minutes") .toDate(); const refreshTokenExpires = moment() .add(config.jwt.refreshExpirationDays, "days") .toDate(); const accessToken = this.generateToken( user_xid, accessTokenExpires, "access", config.jwt.secret ); const refreshToken = this.generateToken( user_xid, refreshTokenExpires, "refresh", config.jwt.secret ); await prisma.token.create({ data: { token: refreshToken.token, expiringAt: refreshToken.expires, tokenType: "refresh", isBlackListed: false, user: { connect: { id: user_xid }, }, }, }); return { access: accessToken, refresh: refreshToken, }; } async revokeToken(user_xid: number, deviceId: string): Promise { const existingToken = await prisma.token.findFirst({ where: { id: user_xid, deviceId, }, }); if (!existingToken) return false; await prisma.token.delete({ where: { id: existingToken.id } }); return true; } async isTokenBlackListed(token: string): Promise { const existing = await prisma.token.findUnique({ where: { token }, }); return existing ? true : false; } async verifyRefreshToken( token: string ): Promise { try { return jwt.verify(token, config.jwt.secret); } catch { return null; } } async decodeToken(token: string): Promise { try { return jwt.decode(token); } catch { return null; } } }