mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-27 14:20:58 +00:00
51 lines
2.4 KiB
TypeScript
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();
|
|
}
|
|
} |