import { Body, Controller, Get, Param, Post, UseGuards } from '@nestjs/common'; import { ApiBearerAuth, ApiCreatedResponse, ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger'; import { Public } from '../../common/decorators/public.decorator'; import { Roles } from '../../common/decorators/roles.decorator'; import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard'; import { RolesGuard } from '../../common/guards/roles.guard'; import { CitiesService } from './cities.service'; import { CityResponseDto, DistrictResponseDto } from './dto/city-response.dto'; import { CreateCityDto, CreateDistrictDto } from './dto/create-city.dto'; @ApiTags('cities') @Controller('cities') export class CitiesController { constructor(private readonly citiesService: CitiesService) {} @Public() @Get() @ApiOperation({ summary: 'Get all cities' }) @ApiOkResponse({ type: [CityResponseDto] }) findAll() { return this.citiesService.findAll(); } @Public() @Get(':cityId/districts') @ApiOperation({ summary: 'Get districts for a city' }) @ApiOkResponse({ type: [DistrictResponseDto] }) findDistricts(@Param('cityId') cityId: string) { return this.citiesService.findDistricts(cityId); } @ApiBearerAuth() @UseGuards(JwtAuthGuard, RolesGuard) @Roles('admin') @Post() @ApiOperation({ summary: 'Create city (admin only)' }) @ApiCreatedResponse({ type: CityResponseDto }) createCity(@Body() body: CreateCityDto) { return this.citiesService.createCity(body.name, body.lat, body.lng); } @ApiBearerAuth() @UseGuards(JwtAuthGuard, RolesGuard) @Roles('admin') @Post(':cityId/districts') @ApiOperation({ summary: 'Create district (admin only)' }) @ApiCreatedResponse({ type: DistrictResponseDto }) createDistrict(@Param('cityId') cityId: string, @Body() body: CreateDistrictDto) { return this.citiesService.createDistrict(cityId, body.name); } }