import { Injectable } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import { UserService } from '../users/user.service'; import { CreateUserDto, LoginUserDto } from '../users/user.dto'; import { AuthResponse, JwtPayload } from './types'; import { UserRole } from '../entities'; @Injectable() export class AuthService { constructor( private userService: UserService, private jwtService: JwtService, ) {} async validateUser( username: string, password: string, ): Promise<{ id: string; username: string; email: string; role: string; } | null> { return this.userService.validateUser(username, password); } async login(loginUserDto: LoginUserDto): Promise { const user = await this.validateUser( loginUserDto.username, loginUserDto.password, ); if (!user) { throw new Error('Invalid credentials'); } const payload: JwtPayload = { sub: user.id, username: user.username, email: user.email, role: user.role as UserRole, }; return { access_token: this.jwtService.sign(payload), user: { id: user.id, username: user.username, email: user.email, role: user.role as UserRole, }, }; } async register(createUserDto: CreateUserDto): Promise { // Default new users to USER role const userDto = { ...createUserDto, role: UserRole.USER, }; const user = await this.userService.create(userDto); const payload: JwtPayload = { sub: user.id, username: user.username, email: user.email, role: user.role, }; return { access_token: this.jwtService.sign(payload), user: { id: user.id, username: user.username, email: user.email, role: user.role, }, }; } }