import { applyDecorators, UseGuards } from '@nestjs/common'; import { JwtGuard } from '@tria-plc/api-common/modules/auth/services/jwt.guard'; import { FreightPermissionGuard } from './freight-permission.guard'; import { FREIGHT_PERMS } from '../seed/freight-permissions.registry'; export const BookingStaff = (permission: string | string[]) => applyDecorators( UseGuards( JwtGuard, FreightPermissionGuard( Array.isArray(permission) ? permission : [permission], ), ), ); /** * Read-only reference data (yard dropdowns, search filters): any signed-in * staff. Menu/page visibility stays permission-gated in the frontend — this * only lets forms populate their lookups. */ export const StaffReference = () => applyDecorators(UseGuards(JwtGuard)); export const BookingView = () => BookingStaff(FREIGHT_PERMS.bookings.view); export const TrainSchedulingView = () => BookingStaff(FREIGHT_PERMS.trainScheduling.view); export const TrainSchedulingManage = () => BookingStaff(FREIGHT_PERMS.trainScheduling.manage); /** * Fleet guards take an optional granular per-resource key (locomotives:create, * wagons:delete, …). The legacy coarse fleet:view / fleet:manage keys remain * valid as a one-of fallback so existing role grants keep working. */ export const FleetView = (granular?: string) => BookingStaff( granular ? [granular, FREIGHT_PERMS.fleet.view] : FREIGHT_PERMS.fleet.view, ); export const FleetManage = (granular?: string) => BookingStaff( granular ? [granular, FREIGHT_PERMS.fleet.manage] : FREIGHT_PERMS.fleet.manage, ); /** Requester creates a wagon-transfer request (count-only, no wagon picks). */ export const WagonTransferRequest = () => BookingStaff(FREIGHT_PERMS.wagons.transferRequest); /** OCC fulfils a wagon-transfer request — picks the wagons and executes the move. */ export const WagonTransferFulfill = () => BookingStaff(FREIGHT_PERMS.wagons.transferFulfill); /** Admin: read every staffer's wagon-transfer history (not just one's own). */ export const WagonTransferHistoryAll = () => BookingStaff(FREIGHT_PERMS.wagons.transferHistoryAll); /** Org-administration endpoints (user mgmt, billing config, company CRUD, settings). */ export const FreightAdmin = () => BookingStaff(FREIGHT_PERMS.admin); /** Container allocation on a booking (allocate-containers endpoint). */ export const AllocationManage = () => BookingStaff(FREIGHT_PERMS.allocation.manage);