feat: ( reschedule ) manage reschedule policies from a Master Data page with full CRUD

This commit is contained in:
Abubeker Yasin
2026-08-24 10:44:28 +03:00
parent 0fd6a1d7d7
commit 2c9453f87d
9 changed files with 554 additions and 154 deletions

View File

@@ -1,10 +1,15 @@
import { Body, Controller, Get, Param, Patch, Post, Req, UseGuards } from '@nestjs/common';
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 { CreateRescheduleDto, RescheduleQuoteDto, UpdateReschedulePolicyDto } from './reschedule.dto';
import {
CreateReschedulePolicyDto,
CreateRescheduleDto,
RescheduleQuoteDto,
UpdateReschedulePolicyDto,
} from './reschedule.dto';
@ApiTags('Reschedule')
@Controller()
@@ -14,11 +19,27 @@ export class RescheduleController {
@Get('reschedule/policies')
@PassengerStaff(PASSENGER_PERMS.bookings.view)
@ApiBearerAuth('JWT-auth')
@ApiOperation({ summary: 'Reschedule policy per coach type (fare class)' })
@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')
@@ -27,6 +48,14 @@ export class RescheduleController {
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')