import { Controller, Get, Param, ParseUUIDPipe, Query } from '@nestjs/common'; import { ApiBearerAuth, ApiForbiddenResponse, ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiTags, ApiUnauthorizedResponse, } from '@nestjs/swagger'; import { RequirePrivilege } from '../../../common/decorators/require-privilege.decorator'; import { Pagination, type PaginationResponse, PaginationMetaDto, } from '../../../common/http/response'; import { BEARER_AUTH_NAME } from '../../../common/swagger/setup-swagger'; import { ProductDto, ListProductsQueryDto } from './dto/product.dto'; import { ProductsService } from './products.service'; export const PRODUCT_PRIVILEGE_KEY = 'ADMIN.SETTINGS.DATA.PRODUCT'; @ApiTags('products') @ApiBearerAuth(BEARER_AUTH_NAME) @Controller('products') export class ProductsReadController { constructor(private readonly productsService: ProductsService) {} @Get() @Pagination() @RequirePrivilege(PRODUCT_PRIVILEGE_KEY, 'view') @ApiOperation({ summary: 'List products' }) @ApiOkResponse({ schema: { properties: { data: { type: 'array', items: { $ref: '#/components/schemas/ProductDto' }, }, meta: { $ref: '#/components/schemas/PaginationMetaDto' }, }, }, }) @ApiUnauthorizedResponse() @ApiForbiddenResponse() list( @Query() query: ListProductsQueryDto, ): Promise> { return this.productsService.list(query); } @Get(':id') @RequirePrivilege(PRODUCT_PRIVILEGE_KEY, 'view') @ApiOperation({ summary: 'Get product detail' }) @ApiOkResponse({ type: ProductDto }) @ApiNotFoundResponse() @ApiUnauthorizedResponse() @ApiForbiddenResponse() findOne(@Param('id', ParseUUIDPipe) id: string): Promise { return this.productsService.findById(id); } } void PaginationMetaDto;