import { Body, Controller, Get, Param, Post, UseGuards, Request, BadRequestException } from "@nestjs/common"; import { OrdersService } from "./orders.service"; import { ApiBearerAuth, ApiOperation, ApiParam, ApiResponse, ApiTags } from "@nestjs/swagger"; import { JwtAuthGuard } from "../auth/guards/jwt-auth.guard"; import { RequestWithUser } from "../auth/auth.types"; import { Logger } from "nestjs-pino"; import { IsString, IsObject, IsIn, IsNotEmpty } from "class-validator"; class CreateOrderBody { @IsString() @IsNotEmpty() @IsIn(["Internet", "eSIM", "SIM", "VPN", "Other"]) orderType: "Internet" | "eSIM" | "SIM" | "VPN" | "Other"; @IsObject() selections: Record; } @ApiTags("orders") @Controller("orders") export class OrdersController { constructor( private ordersService: OrdersService, private readonly logger: Logger ) {} @UseGuards(JwtAuthGuard) @ApiBearerAuth() @Post() @ApiOperation({ summary: "Create Salesforce Order (one service per order)" }) @ApiResponse({ status: 201 }) async create(@Request() req: RequestWithUser, @Body() body: CreateOrderBody) { this.logger.log({ body, userId: req.user?.id, orderType: body?.orderType }, "Order creation request received"); return this.ordersService.create(req.user.id, body); } @UseGuards(JwtAuthGuard) @ApiBearerAuth() @Get(":sfOrderId") @ApiOperation({ summary: "Get order summary/status" }) @ApiParam({ name: "sfOrderId", type: String }) async get(@Request() req: RequestWithUser, @Param("sfOrderId") sfOrderId: string) { return this.ordersService.get(req.user.id, sfOrderId); } @UseGuards(JwtAuthGuard) @ApiBearerAuth() @Post(":sfOrderId/provision") @ApiOperation({ summary: "Trigger provisioning for an approved order" }) @ApiParam({ name: "sfOrderId", type: String }) async provision(@Request() req: RequestWithUser, @Param("sfOrderId") sfOrderId: string) { return this.ordersService.provision(req.user.id, sfOrderId); } }