import { Controller, Get, Post, Put, Delete, Body, Param, Query, HttpCode, HttpStatus, NotFoundException } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiResponse, ApiBody } from '@nestjs/swagger'; import { PrismaService } from '../services/prisma.service'; import { PrismaClientKnownRequestError } from '@prisma/client/runtime/library'; import { CreateOrderDto, UpdateOrderDto, FindManyOrderDto, FlatQueryOrderDto, OrderResponseDto, OrderIdDto, } from '../dto/order'; @ApiTags('Order') @Controller('order') export class OrderController { constructor(private readonly prisma: PrismaService) {} @Post() @ApiOperation({ summary: 'Create a new Order record', operationId: 'createOrder' }) @ApiBody({ type: CreateOrderDto }) @ApiResponse({ status: 201, description: 'Created Order record', type: OrderResponseDto }) async createOrder(@Body() data: CreateOrderDto): Promise { return this.prisma.order.create({ data }); } @Put(':id') @ApiOperation({ summary: 'Update a Order record', operationId: 'updateOrder' }) @ApiBody({ type: UpdateOrderDto }) @ApiResponse({ status: 200, description: 'Updated Order record', type: OrderResponseDto }) @ApiResponse({ status: 404, description: 'Order record not found' }) async updateOrder(@Param() params: OrderIdDto, @Body() data: UpdateOrderDto): Promise { try { return await this.prisma.order.update({ where: params, data }); } catch (error) { if (error instanceof PrismaClientKnownRequestError && error.code === 'P2025') { throw new NotFoundException('Order record not found'); } throw error; } } @Get(':id') @ApiOperation({ summary: 'Get a Order record by ID', operationId: 'getOrder' }) @ApiResponse({ status: 200, description: 'Order record', type: OrderResponseDto }) @ApiResponse({ status: 404, description: 'Order record not found' }) async getOrder(@Param() params: OrderIdDto): Promise { try { return await this.prisma.order.findUniqueOrThrow({ where: params }); } catch (error) { if (error instanceof PrismaClientKnownRequestError && error.code === 'P2025') { throw new NotFoundException('Order record not found'); } throw error; } } @Get() @ApiOperation({ summary: 'Get a list of Order records', operationId: 'getOrderList' }) @ApiResponse({ status: 200, description: 'List of Order records', type: [OrderResponseDto] }) async getOrderList(@Query() query: FlatQueryOrderDto): Promise { return this.prisma.order.findMany(query.toPrismaQuery()); } @Post('search') @ApiOperation({ summary: 'Search Order records', operationId: 'searchOrder' }) @ApiBody({ type: FindManyOrderDto }) @ApiResponse({ status: 200, description: 'List of Order records', type: [OrderResponseDto] }) async searchOrder(@Body() query: FindManyOrderDto): Promise { const { where, orderBy, take, skip } = query; return this.prisma.order.findMany({ where, orderBy, take, skip, }); } @Delete(':id') @ApiOperation({ summary: 'Delete a Order record', operationId: 'deleteOrder' }) @HttpCode(HttpStatus.NO_CONTENT) @ApiResponse({ status: 204, description: 'Order record deleted' }) @ApiResponse({ status: 404, description: 'Order record not found' }) async deleteOrder(@Param() params: OrderIdDto): Promise { try { await this.prisma.order.delete({ where: params }); } catch (error) { if (error instanceof PrismaClientKnownRequestError && error.code === 'P2025') { throw new NotFoundException('Order record not found'); } throw error; } } }