streamflix-api / src /modules /user /auth /auth.controller.ts
Akshar2325
feat(discord-logger): implement api request and response logging
d201b18
Raw
History Blame
3.69 kB
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 };
}
}