import { Body, Controller, Get, Param, Post, Patch, Delete, UseGuards, Request, Query } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiBearerAuth } from '@nestjs/swagger'; import { PackagesService } from './packages.service'; import { CreatePackageDto, BookPackageDto, CreatePriceTierDto, UpdatePriceTierDto } from './packages.dto'; import { JwtGuard } from '../../common/jwt.guard'; import { OptionalJwtGuard } from '../verifayda/optional-jwt.guard'; @ApiTags('Packages') @Controller('packages') export class PackagesController { constructor(private readonly service: PackagesService) {} @Get() @ApiOperation({ summary: 'List active packages' }) listActive() { return this.service.listActive(); } @Get('all') @UseGuards(JwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'List all packages (admin)' }) listAll(@Query('page') page?: string, @Query('pageSize') pageSize?: string) { return this.service.listAll(page ? +page : 1, pageSize ? +pageSize : 20); } @Get('my-bookings') @UseGuards(JwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Get my package bookings' }) myBookings(@Request() req: any) { return this.service.getMyBookings(req.user.passengerId); } @Get('booking/:ref') @ApiOperation({ summary: 'Get package booking by reference' }) getBookingByRef(@Param('ref') ref: string) { return this.service.getBookingByRef(ref); } @Get(':id') @ApiOperation({ summary: 'Get package details' }) getById(@Param('id') id: string) { return this.service.getById(id); } @Post() @UseGuards(JwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Create package (admin)' }) create(@Body() dto: CreatePackageDto) { return this.service.create(dto); } @Patch(':id') @UseGuards(JwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Update package (admin)' }) update(@Param('id') id: string, @Body() dto: Partial) { return this.service.update(id, dto); } @Patch(':id/activate') @UseGuards(JwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Activate package (admin)' }) activate(@Param('id') id: string) { return this.service.activate(id); } @Post(':id/tiers') @UseGuards(JwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Add price tier to package (admin)' }) addTier(@Param('id') id: string, @Body() dto: CreatePriceTierDto) { return this.service.addTier(id, dto); } @Patch('tiers/:tierId') @UseGuards(JwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Update price tier (admin)' }) updateTier(@Param('tierId') tierId: string, @Body() dto: UpdatePriceTierDto) { return this.service.updateTier(tierId, dto); } @Delete('tiers/:tierId') @UseGuards(JwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Delete price tier (admin)' }) deleteTier(@Param('tierId') tierId: string) { return this.service.deleteTier(tierId); } @Post('book') @UseGuards(OptionalJwtGuard) @ApiBearerAuth('JWT-auth') @ApiOperation({ summary: 'Book a package (public or authenticated)' }) book(@Body() dto: BookPackageDto, @Request() req: any) { return this.service.book(dto, req.user?.passengerId); } }