import { Controller, Get, Post, Patch, Body, Param, Query, UseGuards, Request } from '@nestjs/common'; import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; import { RolesGuard, Roles } from '../auth/guards/roles.guard'; import { DriversService } from './drivers.service'; class UpdateLocationDto { lng: number; lat: number; heading?: number; speedKmh?: number; } @Controller('drivers') @UseGuards(JwtAuthGuard, RolesGuard) export class DriversController { constructor(private readonly driversService: DriversService) {} // ---- Driver self-service endpoints ---- @Get('me/profile') @Roles('driver') getProfile(@Request() req) { return this.driversService.getProfile(req.user.driverId); } @Get('me/session') @Roles('driver') getSession(@Request() req) { return this.driversService.getSession(req.user.driverId); } @Post('me/session/start') @Roles('driver') startSession(@Request() req) { return this.driversService.startSession(req.user.driverId); } @Post('me/session/end') @Roles('driver') endSession(@Request() req) { return this.driversService.endSession(req.user.driverId); } @Get('me/earnings') @Roles('driver') getEarnings(@Request() req, @Query('days') days?: string) { return this.driversService.getEarningsHistory(req.user.driverId, days ? parseInt(days) : 30); } @Get('me/analytics') @Roles('driver') getAnalytics(@Request() req) { return this.driversService.getAnalytics(req.user.driverId); } @Patch('me/location') @Roles('driver') updateLocation(@Request() req, @Body() dto: UpdateLocationDto) { return this.driversService.updateLocation( req.user.driverId, dto.lng, dto.lat, dto.heading, dto.speedKmh, ); } @Patch('me/availability') @Roles('driver') setAvailability(@Request() req, @Body('available') available: boolean) { return this.driversService.setAvailability(req.user.driverId, available); } // ---- Public endpoints ---- @Get('nearby') getNearbyDrivers( @Query('lng') lng: string, @Query('lat') lat: string, @Query('radius') radius?: string, ) { return this.driversService.getNearbyDrivers( parseFloat(lng), parseFloat(lat), radius ? parseFloat(radius) : 5, ); } }