2025-03-03 17:28:22 +03:00

90 lines
2.2 KiB
TypeScript

import { Controller, Post, Body, UnauthorizedException } from '@nestjs/common';
import { AuthService } from './auth.service';
import { UsersService } from '../users/users.service';
import { ApiTags, ApiOperation, ApiBody, ApiResponse, ApiBearerAuth } from '@nestjs/swagger';
class LoginDto {
username: string;
password: string;
}
class LoginResponse {
access_token: string;
}
class RegisterDto {
username: string;
email: string;
password: string;
}
@ApiTags('Auth')
@Controller('auth')
export class AuthController {
constructor(
private authService: AuthService,
private usersService: UsersService,
) {}
@ApiOperation({ summary: 'Register new user' })
@ApiBody({
description: 'User registration data',
type: RegisterDto,
examples: {
example1: {
summary: 'Typical registration',
value: {
username: 'john_doe',
email: 'john@example.com',
password: '123456',
},
},
},
})
@ApiResponse({
status: 201,
description: 'User created successfully',
})
@ApiResponse({
status: 409,
description: 'Username already exists',
})
@Post('register')
async register(@Body() body: RegisterDto) {
const existing = await this.usersService.findOneByUsername(body.username);
if (existing) {
throw new UnauthorizedException('Username already exists');
}
return this.usersService.create(body);
}
@ApiOperation({ summary: 'Login user' })
@ApiBody({
description: 'User login data',
type: LoginDto,
examples: {
example1: {
summary: 'Typical login',
value: {
username: 'john_doe',
password: '123456',
},
},
},
})
@ApiResponse({
status: 200,
description: 'User logged in successfully',
type: LoginResponse,
})
@ApiResponse({
status: 401,
description: 'Invalid username or password',
})
@Post('login')
async login(@Body() body: LoginDto) {
const user = await this.authService.validateUser(body.username, body.password);
return this.authService.login(user);
}
}