import { Body, Controller, Get, Param, Post, Request, UsePipes } from "@nestjs/common"; import { OrderOrchestrator } from "./services/order-orchestrator.service"; import type { RequestWithUser } from "@bff/modules/auth/auth.types"; import { Logger } from "nestjs-pino"; import { ZodValidationPipe } from "@bff/core/validation"; import { createOrderRequestSchema, sfOrderIdParamSchema, type CreateOrderRequest, type SfOrderIdParam, } from "@customer-portal/domain"; @Controller("orders") export class OrdersController { constructor( private orderOrchestrator: OrderOrchestrator, private readonly logger: Logger ) {} @Post() @UsePipes(new ZodValidationPipe(createOrderRequestSchema)) async create(@Request() req: RequestWithUser, @Body() body: CreateOrderRequest) { this.logger.log( { userId: req.user?.id, orderType: body.orderType, skuCount: body.skus?.length || 0, }, "Order creation request received" ); try { return await this.orderOrchestrator.createOrder(req.user.id, body); } catch (error) { this.logger.error( { error: error instanceof Error ? error.message : String(error), userId: req.user?.id, orderType: body.orderType, }, "Order creation failed" ); throw error; } } @Get("user") async getUserOrders(@Request() req: RequestWithUser) { return this.orderOrchestrator.getOrdersForUser(req.user.id); } @Get(":sfOrderId") @UsePipes(new ZodValidationPipe(sfOrderIdParamSchema)) async get(@Request() req: RequestWithUser, @Param() params: SfOrderIdParam) { return this.orderOrchestrator.getOrder(params.sfOrderId); } // Note: Order provisioning has been moved to SalesforceProvisioningController // This controller now focuses only on customer-facing order operations }