import { Controller, Post, Body, Req, UseGuards } from '@nestjs/common'; import { ApiTags, ApiBearerAuth, ApiOperation } from '@nestjs/swagger'; import { UserAuthService } from './auth.service'; import { UserRegisterDto } from './dto/register.dto'; import { UserLoginDto } from './dto/login.dto'; import { VerifyEmailOtpDto } from './dto/verify-email-otp.dto'; import { ResendEmailOtpDto } from './dto/resend-email-otp.dto'; import { RegisterPhoneDto } from './dto/register-phone.dto'; import { VerifyPhoneOtpDto } from './dto/verify-phone-otp.dto'; import { CompleteProfileDto } from './dto/complete-profile.dto'; import { UserRefreshTokenDto } from './dto/refresh-token.dto'; import { Public } from 'src/shared/decorators/public.decorator'; import { GetUser } from 'src/shared/decorators/get-user.decorator'; import { LogToDiscord } from 'src/shared/decorators/log-to-discord.decorator'; import type { UserSessionType } from 'src/shared/types/user-session.type'; import { UserAuthGuard } from './guards/user-auth.guard'; @ApiTags('User: Authentication') @Controller('user/auth') @UseGuards(UserAuthGuard) @LogToDiscord() export class UserAuthController { constructor(private readonly userAuthService: UserAuthService) {} // PHASE 1: Initial Registration @Public() @Post('register') @ApiOperation({ summary: 'Register a new user (Step 1/5)' }) async register(@Body() registerDto: UserRegisterDto) { return this.userAuthService.register(registerDto); } // PHASE 2: Email Verification @Public() @Post('verify-email') @ApiOperation({ summary: 'Verify email with OTP (Step 2/5)' }) async verifyEmail(@Body() verifyDto: VerifyEmailOtpDto) { return this.userAuthService.verifyEmailOtp(verifyDto); } @Public() @Post('resend-email-otp') @ApiOperation({ summary: 'Resend email OTP' }) async resendEmailOtp(@Body() resendDto: ResendEmailOtpDto) { return this.userAuthService.resendEmailOtp(resendDto); } // PHASE 3: Phone Registration @Public() @Post('register-phone') @ApiOperation({ summary: 'Register phone number (Step 3/5)' }) async registerPhone(@Body() registerPhoneDto: RegisterPhoneDto) { return this.userAuthService.registerPhone(registerPhoneDto); } // PHASE 4: Phone Verification @Public() @Post('verify-phone') @ApiOperation({ summary: 'Verify phone with OTP (Step 4/5)' }) async verifyPhone(@Body() verifyDto: VerifyPhoneOtpDto) { return this.userAuthService.verifyPhoneOtp(verifyDto); } // PHASE 5: Complete Profile @Public() @Post('complete-profile') @ApiOperation({ summary: 'Complete profile and activate account (Step 5/5)' }) async completeProfile( @Body() completeDto: CompleteProfileDto, @Req() request: any, ) { return this.userAuthService.completeProfile(completeDto, request); } // Login (Only for verified users) @Public() @Post('login') @ApiOperation({ summary: 'Login user (Only verified accounts)' }) async login(@Body() loginDto: UserLoginDto, @Req() request: any) { return this.userAuthService.login(loginDto, request); } @ApiBearerAuth() @Post('logout') @ApiOperation({ summary: 'Logout user' }) async logout(@GetUser() sessionData: UserSessionType) { return this.userAuthService.logout(sessionData); } @Public() @Post('refresh-token') @ApiOperation({ summary: 'Refresh access token' }) async refreshToken(@Body() refreshTokenDto: UserRefreshTokenDto) { return this.userAuthService.refreshToken(refreshTokenDto); } @ApiBearerAuth() @Post('profile') @ApiOperation({ summary: 'Get user profile' }) async getProfile(@GetUser() sessionData: UserSessionType) { return { user: sessionData.user }; } }