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 { CreateAddressDto, UpdateAddressDto, FindManyAddressDto, FlatQueryAddressDto, AddressResponseDto, AddressIdDto, } from '../dto/address'; @ApiTags('Address') @Controller('address') export class AddressController { constructor(private readonly prisma: PrismaService) {} @Post() @ApiOperation({ summary: 'Create a new Address record', operationId: 'createAddress' }) @ApiBody({ type: CreateAddressDto }) @ApiResponse({ status: 201, description: 'Created Address record', type: AddressResponseDto }) async createAddress(@Body() data: CreateAddressDto): Promise { return this.prisma.address.create({ data }); } @Put(':id') @ApiOperation({ summary: 'Update a Address record', operationId: 'updateAddress' }) @ApiBody({ type: UpdateAddressDto }) @ApiResponse({ status: 200, description: 'Updated Address record', type: AddressResponseDto }) @ApiResponse({ status: 404, description: 'Address record not found' }) async updateAddress(@Param() params: AddressIdDto, @Body() data: UpdateAddressDto): Promise { try { return await this.prisma.address.update({ where: params, data }); } catch (error) { if (error instanceof PrismaClientKnownRequestError && error.code === 'P2025') { throw new NotFoundException('Address record not found'); } throw error; } } @Get(':id') @ApiOperation({ summary: 'Get a Address record by ID', operationId: 'getAddress' }) @ApiResponse({ status: 200, description: 'Address record', type: AddressResponseDto }) @ApiResponse({ status: 404, description: 'Address record not found' }) async getAddress(@Param() params: AddressIdDto): Promise { try { return await this.prisma.address.findUniqueOrThrow({ where: params }); } catch (error) { if (error instanceof PrismaClientKnownRequestError && error.code === 'P2025') { throw new NotFoundException('Address record not found'); } throw error; } } @Get() @ApiOperation({ summary: 'Get a list of Address records', operationId: 'getAddressList' }) @ApiResponse({ status: 200, description: 'List of Address records', type: [AddressResponseDto] }) async getAddressList(@Query() query: FlatQueryAddressDto): Promise { return this.prisma.address.findMany(query.toPrismaQuery()); } @Post('search') @ApiOperation({ summary: 'Search Address records', operationId: 'searchAddress' }) @ApiBody({ type: FindManyAddressDto }) @ApiResponse({ status: 200, description: 'List of Address records', type: [AddressResponseDto] }) async searchAddress(@Body() query: FindManyAddressDto): Promise { const { where, orderBy, take, skip } = query; return this.prisma.address.findMany({ where, orderBy, take, skip, }); } @Delete(':id') @ApiOperation({ summary: 'Delete a Address record', operationId: 'deleteAddress' }) @HttpCode(HttpStatus.NO_CONTENT) @ApiResponse({ status: 204, description: 'Address record deleted' }) @ApiResponse({ status: 404, description: 'Address record not found' }) async deleteAddress(@Param() params: AddressIdDto): Promise { try { await this.prisma.address.delete({ where: params }); } catch (error) { if (error instanceof PrismaClientKnownRequestError && error.code === 'P2025') { throw new NotFoundException('Address record not found'); } throw error; } } }