import { Controller, Get, Post, Body, UseGuards, Res, Req, Patch, Param } from '@nestjs/common'; import { PagerService } from '../providers/pager.service'; import { CreatePagerDto } from '../dto/create-pager.dto'; import { OptionalAuthGuard } from '../../auth/guards/optinalAuth.guard'; import { RestId } from 'src/common/decorators/rest-id.decorator'; import { UserId } from 'src/common/decorators/user-id.decorator'; import { RestSlug } from 'src/common/decorators/rest-slug.decorator'; import { ApiTags, ApiOperation, ApiBody, ApiHeader, ApiBearerAuth, ApiParam } from '@nestjs/swagger'; import type { FastifyReply, FastifyRequest } from 'fastify'; import { AdminAuthGuard } from '../../auth/guards/adminAuth.guard'; import { AdminId } from 'src/common/decorators/admin-id.decorator'; import { UpdatePagerStatusDto } from '../dto/update-pager.dto'; @ApiTags('pager') @Controller() export class PagerController { constructor(private readonly pagerService: PagerService) {} @UseGuards(OptionalAuthGuard) @Post('public/pager') @ApiOperation({ summary: 'Create a new pager request' }) @ApiHeader({ name: 'X-Slug', required: true, description: 'Restaurant slug identifier' }) @ApiHeader({ name: 'Authorization', required: false, description: 'Bearer token (optional authentication)' }) @ApiBody({ type: CreatePagerDto }) async create( @Body() createPagerDto: CreatePagerDto, @Req() request: FastifyRequest, @Res() reply: FastifyReply, @RestSlug() slug: string, @RestId() restId?: string, @UserId() userId?: string, ) { // Convert empty strings to undefined for cleaner validation const normalizedRestId = restId || undefined; const normalizedUserId = userId || undefined; const userCookieId = request.cookies['pagerId'] || undefined; const pager = await this.pagerService.create(createPagerDto, { restId: normalizedRestId, userId: normalizedUserId, userCookieId, slug, }); reply.setCookie('pagerId', pager.cookieId, { httpOnly: true, secure: process.env.NODE_ENV === 'production', maxAge: 1000 * 60 * 60 * 24 * 1, // 1 days path: '/', }); return reply.code(200).send({ success: true, message: 'Pager request created successfully', data: null, }); } @UseGuards(OptionalAuthGuard) @Get('public/pager') @ApiOperation({ summary: 'Get all pager requests for the current session' }) @ApiHeader({ name: 'X-Slug', required: true, description: 'Restaurant slug identifier', example: 'zhivan' }) @ApiHeader({ name: 'Authorization', required: false, description: 'Bearer token (optional authentication)' }) async findAll(@Req() request: FastifyRequest) { const cookieId = request.cookies['pagerId'] || undefined; if (!cookieId) { return []; } return this.pagerService.findAll(cookieId); } @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Get('admin/pager') @ApiOperation({ summary: 'Get all pager requests for the restaurant' }) async findAllAdmin(@RestId() restId: string) { return this.pagerService.findAllByRestaurantId(restId); } @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Patch('admin/pager/:pagerId/status') @ApiParam({ name: 'pagerId', required: true, type: String }) @ApiOperation({ summary: 'Update the status of a pager request' }) @ApiBody({ type: UpdatePagerStatusDto }) async updateStatus( @Param('pagerId') pagerId: string, @RestId() restId: string, @AdminId() adminId: string, @Body() dto: UpdatePagerStatusDto, ) { return this.pagerService.updateStatus(pagerId, restId, adminId, dto.status); } }