Files
edr-platform/apps/edr-passenger-api/src/modules/segments/segments.controller.ts
2026-05-27 15:11:23 +03:00

51 lines
2.4 KiB
TypeScript

import { Controller, Post, Get, Body, Query } from '@nestjs/common';
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
import { EnhancedSeatsService } from './enhanced-seats.service';
import { ConfirmBookingDto, SeatAvailabilityDto, ReleaseSeatsDto } from './segments.dto';
@ApiTags('Segment-based Seats')
@Controller('segments/seats')
export class SegmentSeatsController {
constructor(private enhancedSeatsService: EnhancedSeatsService) {}
@Post('confirm')
@ApiOperation({
summary: 'Confirm booking — convert hold to reservation',
description: 'Call after payment succeeds. Converts the SeatHold (created via POST /seats/hold) into JourneySegment records scoped to the passenger\'s leg.',
})
@ApiResponse({ status: 200, description: 'Booking confirmed, JourneySegments created for the held leg' })
@ApiResponse({ status: 400, description: 'Hold expired or booking not found' })
confirmBooking(@Body() dto: ConfirmBookingDto) {
return this.enhancedSeatsService.confirmBooking(dto);
}
@Post('release')
@ApiOperation({
summary: 'Release seats when train reaches a station',
description: 'Called by the live tracking system when the train departs a station. Frees seats for passengers whose journey ended at that station.',
})
@ApiResponse({ status: 200, description: 'Seats released for passengers who reached their destination' })
releaseSeats(@Body() dto: ReleaseSeatsDto) {
return this.enhancedSeatsService.releaseSeats(dto.scheduleId, dto.currentStationId);
}
@Get('availability')
@ApiOperation({
summary: 'Get available seats for a specific leg',
description: 'Returns seats that have no overlapping reservation for the requested origin→destination leg. A seat booked A→B is shown as available for B→D.',
})
@ApiResponse({ status: 200, description: 'Available seats with coach, seat class, row, col, window/aisle/bed flags' })
getSeatAvailability(@Query() dto: SeatAvailabilityDto) {
return this.enhancedSeatsService.getSeatAvailability(dto.scheduleId, dto.originStationId, dto.destinationStationId);
}
@Post('expire-holds')
@ApiOperation({
summary: 'Expire stale seat holds (background job)',
description: 'Removes holds past their expiry time. Called by the scheduler every minute.',
})
@ApiResponse({ status: 200, description: 'Expired holds removed' })
expireHolds() {
return this.enhancedSeatsService.expireHolds();
}
}