import { Body, Controller, Get, Param, Post, Patch, Delete, UseGuards, Query } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiBearerAuth, ApiQuery, ApiResponse } from '@nestjs/swagger'; import { IsPublic } from '@tria-plc/api-common/modules/auth/decorators/public.decorator'; import { StationsService } from './stations.service'; import { CreateStationDto } from './stations.dto'; import { JwtGuard } from '../../common/jwt.guard'; @ApiTags('Stations') @Controller('stations') export class StationsController { constructor(private service: StationsService) {} @Get() @IsPublic() @ApiOperation({ summary: 'List all stations with country information', description: 'Returns all stations on the Ethio-Djibouti Railway with country codes (ET for Ethiopia, DJ for Djibouti)' }) @ApiQuery({ name: 'search', required: false, description: 'Search by station name or code' }) @ApiQuery({ name: 'country', required: false, description: 'Filter by country code (ET, DJ)' }) @ApiQuery({ name: 'operational', required: false, description: 'Filter by operational status (true, false)' }) @ApiResponse({ status: 200, description: 'Array of stations', schema: { example: [ { id: '550e8400-e29b-41d4-a716-446655440000', code: 'AAA', sequence: 1, name: 'Addis Ababa', city: 'Addis Ababa', countryCode: 'ET', lat: 9.0054, lng: 38.7636, timezone: 'Africa/Addis_Ababa', isOperational: true, createdAt: '2024-01-15T10:30:00.000Z', updatedAt: '2024-01-15T10:30:00.000Z' } ] } }) findAll( @Query('search') search?: string, @Query('country') country?: string, @Query('operational') operational?: string, ) { return this.service.findAll({ search, country, operational }); } @Get(':id') @IsPublic() @ApiOperation({ summary: 'Get station details by ID', description: 'Returns station information including name, code, country, coordinates, and facilities' }) @ApiResponse({ status: 200, description: 'Station details', schema: { example: { id: '550e8400-e29b-41d4-a716-446655440000', code: 'AAA', sequence: 1, name: 'Addis Ababa', city: 'Addis Ababa', countryCode: 'ET', lat: 9.0054, lng: 38.7636, timezone: 'Africa/Addis_Ababa', isOperational: true, createdAt: '2024-01-15T10:30:00.000Z', updatedAt: '2024-01-15T10:30:00.000Z' } } }) findOne(@Param('id') id: string) { return this.service.findOne(id); } @Post() @UseGuards(JwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Create new station' }) @ApiResponse({ status: 201, description: 'Station created', schema: { example: { id: '550e8400-e29b-41d4-a716-446655440000', code: 'AAA', sequence: 1, name: 'Addis Ababa', city: 'Addis Ababa', countryCode: 'ET', lat: 9.0054, lng: 38.7636, timezone: 'Africa/Addis_Ababa', isOperational: true, createdAt: '2024-01-15T10:30:00.000Z', updatedAt: '2024-01-15T10:30:00.000Z' } } }) create(@Body() dto: CreateStationDto) { return this.service.create(dto); } @Patch(':id') @UseGuards(JwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Update station' }) @ApiResponse({ status: 200, description: 'Station updated', schema: { example: { id: '550e8400-e29b-41d4-a716-446655440000', code: 'AAA', sequence: 1, name: 'Addis Ababa', city: 'Addis Ababa', countryCode: 'ET', lat: 9.0054, lng: 38.7636, timezone: 'Africa/Addis_Ababa', isOperational: true, createdAt: '2024-01-15T10:30:00.000Z', updatedAt: '2024-01-15T10:30:00.000Z' } } }) @ApiResponse({ status: 404, description: 'Station not found' }) update(@Param('id') id: string, @Body() dto: Partial) { return this.service.update(id, dto); } @Delete(':id') @UseGuards(JwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Delete station' }) @ApiResponse({ status: 200, description: 'Station deleted successfully' }) @ApiResponse({ status: 404, description: 'Station not found' }) remove(@Param('id') id: string) { return this.service.remove(id); } }