81 lines
1.8 KiB
TypeScript
81 lines
1.8 KiB
TypeScript
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<AuthResponse> {
|
|
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<AuthResponse> {
|
|
// 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,
|
|
},
|
|
};
|
|
}
|
|
}
|