import { Body, Controller, Get, Param, Post, Put, Req } from '@nestjs/common'; import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; import { Request } from 'express'; import { DriverService } from './DriverService'; import { CompleteOnboardingInputDTO } from './dtos/CompleteOnboardingInputDTO'; import { CompleteOnboardingOutputDTO } from './dtos/CompleteOnboardingOutputDTO'; import { DriverRegistrationStatusDTO } from './dtos/DriverRegistrationStatusDTO'; import { DriversLeaderboardDTO } from './dtos/DriversLeaderboardDTO'; import { DriverStatsDTO } from './dtos/DriverStatsDTO'; import { GetDriverOutputDTO } from './dtos/GetDriverOutputDTO'; import { GetDriverProfileOutputDTO } from './dtos/GetDriverProfileOutputDTO'; interface AuthenticatedRequest extends Request { user?: { userId: string }; } @ApiTags('drivers') @Controller('drivers') export class DriverController { constructor(private readonly driverService: DriverService) {} @Get('leaderboard') @ApiOperation({ summary: 'Get drivers leaderboard' }) @ApiResponse({ status: 200, description: 'List of drivers for the leaderboard', type: DriversLeaderboardDTO }) async getDriversLeaderboard(): Promise { return await this.driverService.getDriversLeaderboard(); } @Get('total-drivers') @ApiOperation({ summary: 'Get the total number of drivers' }) @ApiResponse({ status: 200, description: 'Total number of drivers', type: DriverStatsDTO }) async getTotalDrivers(): Promise { return await this.driverService.getTotalDrivers(); } @Get('current') @ApiOperation({ summary: 'Get current authenticated driver' }) @ApiResponse({ status: 200, description: 'Current driver data', type: GetDriverOutputDTO }) @ApiResponse({ status: 404, description: 'Driver not found' }) async getCurrentDriver(@Req() req: AuthenticatedRequest): Promise { const userId = req.user?.userId; if (!userId) { return null; } return await this.driverService.getCurrentDriver(userId); } @Post('complete-onboarding') @ApiOperation({ summary: 'Complete driver onboarding for a user' }) @ApiResponse({ status: 200, description: 'Onboarding complete', type: CompleteOnboardingOutputDTO }) async completeOnboarding( @Body() input: CompleteOnboardingInputDTO, @Req() req: AuthenticatedRequest, ): Promise { const userId = req.user!.userId; return await this.driverService.completeOnboarding(userId, input); } @Get(':driverId/races/:raceId/registration-status') @ApiOperation({ summary: 'Get driver registration status for a specific race' }) @ApiResponse({ status: 200, description: 'Driver registration status', type: DriverRegistrationStatusDTO }) async getDriverRegistrationStatus( @Param('driverId') driverId: string, @Param('raceId') raceId: string, ): Promise { return await this.driverService.getDriverRegistrationStatus({ driverId, raceId }); } @Get(':driverId') @ApiOperation({ summary: 'Get driver by ID' }) @ApiResponse({ status: 200, description: 'Driver data', type: GetDriverOutputDTO }) @ApiResponse({ status: 404, description: 'Driver not found' }) async getDriver(@Param('driverId') driverId: string): Promise { return await this.driverService.getDriver(driverId); } @Get(':driverId/profile') @ApiOperation({ summary: 'Get driver profile with full details' }) @ApiResponse({ status: 200, description: 'Driver profile data', type: GetDriverProfileOutputDTO }) @ApiResponse({ status: 404, description: 'Driver not found' }) async getDriverProfile(@Param('driverId') driverId: string): Promise { return await this.driverService.getDriverProfile(driverId); } @Put(':driverId/profile') @ApiOperation({ summary: 'Update driver profile' }) @ApiResponse({ status: 200, description: 'Driver profile updated', type: GetDriverOutputDTO }) async updateDriverProfile( @Param('driverId') driverId: string, @Body() body: { bio?: string; country?: string }, ): Promise { return await this.driverService.updateDriverProfile(driverId, body.bio, body.country); } // Add other Driver endpoints here based on other presenters }