import { Body, Controller, Get, HttpCode, HttpStatus, Request, Post, UseGuards, Patch, Delete, SerializeOptions, } from '@nestjs/common'; import { AuthService } from './auth.service'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { AuthEmailLoginDto } from './dto/auth-email-login.dto'; import { AuthForgotPasswordDto } from './dto/auth-forgot-password.dto'; import { AuthConfirmEmailDto } from './dto/auth-confirm-email.dto'; import { AuthResetPasswordDto } from './dto/auth-reset-password.dto'; import { AuthUpdateDto } from './dto/auth-update.dto'; import { AuthGuard } from '@nestjs/passport'; import { AuthRegisterLoginDto } from './dto/auth-register-login.dto'; import { LoginResponseType } from './types/login-response.type'; import { NullableType } from '../utils/types/nullable.type'; import { User } from 'src/users/domain/user'; @ApiTags('Auth') @Controller({ path: 'auth', version: '1', }) export class AuthController { constructor(private readonly service: AuthService) {} @SerializeOptions({ groups: ['me'], }) @Post('email/login') @HttpCode(HttpStatus.OK) public login( @Body() loginDto: AuthEmailLoginDto, ): Promise { return this.service.validateLogin(loginDto); } @Post('email/register') @HttpCode(HttpStatus.NO_CONTENT) async register(@Body() createUserDto: AuthRegisterLoginDto): Promise { return this.service.register(createUserDto); } @Post('email/confirm') @HttpCode(HttpStatus.NO_CONTENT) async confirmEmail( @Body() confirmEmailDto: AuthConfirmEmailDto, ): Promise { return this.service.confirmEmail(confirmEmailDto.hash); } @Post('forgot/password') @HttpCode(HttpStatus.NO_CONTENT) async forgotPassword( @Body() forgotPasswordDto: AuthForgotPasswordDto, ): Promise { return this.service.forgotPassword(forgotPasswordDto.email); } @Post('reset/password') @HttpCode(HttpStatus.NO_CONTENT) resetPassword(@Body() resetPasswordDto: AuthResetPasswordDto): Promise { return this.service.resetPassword( resetPasswordDto.hash, resetPasswordDto.password, ); } @ApiBearerAuth() @SerializeOptions({ groups: ['me'], }) @Get('me') @UseGuards(AuthGuard('jwt')) @HttpCode(HttpStatus.OK) public me(@Request() request): Promise> { return this.service.me(request.user); } @ApiBearerAuth() @SerializeOptions({ groups: ['me'], }) @Post('refresh') @UseGuards(AuthGuard('jwt-refresh')) @HttpCode(HttpStatus.OK) public refresh(@Request() request): Promise> { return this.service.refreshToken({ sessionId: request.user.sessionId, hash: request.user.hash, }); } @ApiBearerAuth() @Post('logout') @UseGuards(AuthGuard('jwt')) @HttpCode(HttpStatus.NO_CONTENT) public async logout(@Request() request): Promise { await this.service.logout({ sessionId: request.user.sessionId, }); } @ApiBearerAuth() @SerializeOptions({ groups: ['me'], }) @Patch('me') @UseGuards(AuthGuard('jwt')) @HttpCode(HttpStatus.OK) public update( @Request() request, @Body() userDto: AuthUpdateDto, ): Promise> { return this.service.update(request.user, userDto); } @ApiBearerAuth() @Delete('me') @UseGuards(AuthGuard('jwt')) @HttpCode(HttpStatus.NO_CONTENT) public async delete(@Request() request): Promise { return this.service.softDelete(request.user); } }