import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { PassportStrategy } from '@nestjs/passport'; import { ExtractJwt, Strategy } from 'passport-jwt'; import { PrismaService } from '../prisma/prisma.service'; import { displayName } from '../common/mobile.util'; export type JwtPayload = { sub: string; mobile: string; role: string; }; @Injectable() export class JwtStrategy extends PassportStrategy(Strategy) { constructor( config: ConfigService, private readonly prisma: PrismaService, ) { super({ jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(), ignoreExpiration: false, secretOrKey: config.get('JWT_SECRET', 'dev-secret'), }); } async validate(payload: JwtPayload) { const user = await this.prisma.user.findUnique({ where: { id: payload.sub }, select: { id: true, mobile: true, firstName: true, lastName: true, role: true, permissions: true, isActive: true, }, }); if (!user || !user.isActive) { return null; } return { ...user, name: displayName(user.firstName, user.lastName), }; } }