import { Body, Controller, Delete, Get, Param, Patch, Post, Req, UseGuards } from '@nestjs/common'; import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger'; import { JwtGuard } from '../../common/jwt.guard'; import { PassengerAdmin, PassengerStaff } from '../../common/passenger-guards'; import { PASSENGER_PERMS } from '../../seed/passenger-permissions.registry'; import { RescheduleService } from './reschedule.service'; import { CreateReschedulePolicyDto, CreateRescheduleDto, RescheduleQuoteDto, UpdateReschedulePolicyDto, } from './reschedule.dto'; @ApiTags('Reschedule') @Controller() export class RescheduleController { constructor(private service: RescheduleService) {} @Get('reschedule/policies') @PassengerStaff(PASSENGER_PERMS.bookings.view) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Every reschedule policy, each with its coach type (fare class)' }) listPolicies() { return this.service.listPolicies(); } @Get('reschedule/policies/available-coach-types') @PassengerStaff(PASSENGER_PERMS.bookings.view) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Coach types that do not have a reschedule policy yet (add-dialog dropdown)' }) listUnconfiguredCoachTypes() { return this.service.listUnconfiguredCoachTypes(); } @Post('reschedule/policies') @PassengerAdmin() @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Create a reschedule policy for a coach type (admin)' }) createPolicy(@Req() req: any, @Body() dto: CreateReschedulePolicyDto) { return this.service.createPolicy(dto, req.user?.id); } @Patch('reschedule/policies/:coachTypeId') @PassengerAdmin() @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Update the reschedule policy of a coach type (admin)' }) updatePolicy(@Req() req: any, @Param('coachTypeId') coachTypeId: string, @Body() dto: UpdateReschedulePolicyDto) { return this.service.updatePolicy(coachTypeId, dto, req.user?.id); } @Delete('reschedule/policies/:coachTypeId') @PassengerAdmin() @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Delete a reschedule policy — rescheduling is then refused for that fare class (admin)' }) deletePolicy(@Req() req: any, @Param('coachTypeId') coachTypeId: string) { return this.service.deletePolicy(coachTypeId, req.user?.id); } @Get('bookings/:bookingRef/reschedule') @UseGuards(JwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Reschedule eligibility per leg, pending request, history' }) options(@Req() req: any, @Param('bookingRef') bookingRef: string) { return this.service.getOptions(bookingRef, req.user); } @Post('bookings/:bookingRef/reschedule/quote') @UseGuards(JwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Itemised quote (fee, fare difference, amount due) for a proposed change' }) quote(@Req() req: any, @Param('bookingRef') bookingRef: string, @Body() dto: RescheduleQuoteDto) { return this.service.quote(bookingRef, dto, req.user); } @Post('bookings/:bookingRef/reschedule') @UseGuards(JwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Reschedule a leg. Applies immediately when nothing is due, otherwise returns a payment token' }) create(@Req() req: any, @Param('bookingRef') bookingRef: string, @Body() dto: CreateRescheduleDto) { return this.service.create(bookingRef, dto, req.user); } }