import { Body, Controller, Get, Param, Post, Query, // UseGuards, // Comentado para uso futuro } from '@nestjs/common'; import { ProductsService } from './products.service'; import { ExposedProduct } from 'src/core/models/exposed-product.model'; // import { JwtAuthGuard } from 'src/auth/guards/jwt-auth.guard'; // Comentado para uso futuro import { ExposedProductDto } from './dto/exposed-product.dto'; import { ProductValidationDto } from './dto/ProductValidationDto'; import { ProductEcommerceDto } from './dto/product-ecommerce.dto'; import { ApiTags, ApiOperation, ApiParam, ApiQuery, ApiBody, ApiResponse, // ApiBearerAuth, // Comentado para uso futuro } from '@nestjs/swagger'; import { ProductDetailQueryDto } from './dto/product-detail-query.dto'; import { ProductDetailResponseDto } from './dto/product-detail-response.dto'; import { RotinaA4QueryDto } from './dto/rotina-a4-query.dto'; import { RotinaA4ResponseDto } from './dto/rotina-a4-response.dto'; import { UnifiedProductSearchDto } from './dto/unified-product-search.dto'; import { Oferta8026QueryDto } from './dto/oferta-8026-query.dto'; import { Oferta8026ResponseDto } from './dto/oferta-8026-response.dto'; //@ApiBearerAuth() //@UseGuards(JwtAuthGuard) @ApiTags('Produtos') @Controller('api/v1/products') export class ProductsController { constructor(private readonly productsService: ProductsService) {} ///enpoit produtos-ecommecer @Get('products-ecommerce') @ApiOperation({ summary: 'Lista produtos para o e-commerce' }) @ApiResponse({ status: 200, description: 'Lista de produtos retornada com sucesso.', type: ProductEcommerceDto, isArray: true, }) ///ENDPOIT DE VALIDAR PRODUTO POR FILTRO @Get('product-validation/:storeId/:filtro') @ApiOperation({ summary: 'Valida produto pelo filtro (código, EAN ou descrição)', }) @ApiParam({ name: 'storeId', type: String, description: 'ID da loja' }) @ApiParam({ name: 'filtro', type: String, description: 'Filtro de busca (código, EAN ou descrição)', }) @ApiQuery({ name: 'tipoBusca', required: false, enum: ['codauxiliar', 'codprod', 'descricao', 'todos'], description: 'Tipo de busca específica (opcional). Padrão: busca em todos os campos', }) @ApiResponse({ status: 200, description: 'Produto encontrado com sucesso.', type: ProductValidationDto, }) @ApiResponse({ status: 404, description: 'Produto não localizado.' }) async productValidation( @Param('storeId') storeId: string, @Param('filtro') filtro: string, @Query('tipoBusca') tipoBusca?: 'codauxiliar' | 'codprod' | 'descricao' | 'todos', ): Promise { return this.productsService.productsValidation(storeId, filtro, tipoBusca); } /// ENDPOIT PRODUTOS EXPOSTOS @Post('exposed-product') @ApiOperation({ summary: 'Registra produto em exposição' }) @ApiBody({ type: ExposedProductDto }) @ApiResponse({ status: 201, description: 'Produto exposto registrado com sucesso.', }) async exposedProduct(@Body() exposedProduct: ExposedProduct) { return this.productsService.exposedProduct(exposedProduct); } /** * Endpoint para buscar detalhes de produtos com preço e estoque */ @Post('product-details') @ApiOperation({ summary: 'Busca detalhes de produtos com preço e estoque' }) @ApiBody({ type: ProductDetailQueryDto }) @ApiResponse({ status: 200, description: 'Lista de produtos com detalhes retornada com sucesso.', type: ProductDetailResponseDto, isArray: true, }) @ApiResponse({ status: 400, description: 'Parâmetros inválidos.' }) async getProductDetails( @Body() query: ProductDetailQueryDto, ): Promise { return this.productsService.getProductDetails(query); } /** * Endpoint para buscar informações do produto conforme rotina A4 */ @Post('rotina-A4') @ApiOperation({ summary: 'Busca informações do produto conforme rotina A4' }) @ApiBody({ type: RotinaA4QueryDto }) @ApiResponse({ status: 200, description: 'Dados do produto retornados com sucesso.', type: RotinaA4ResponseDto, }) @ApiResponse({ status: 404, description: 'Produto não encontrado para os parâmetros informados.', }) async getRotinaA4( @Body() query: RotinaA4QueryDto, ): Promise { return this.productsService.getRotinaA4(query); } /** * Endpoint para busca unificada de produtos por nome, código de barras ou codprod */ @Post('unified-search') @ApiOperation({ summary: 'Busca unificada de produtos por nome, código de barras ou codprod', }) @ApiBody({ type: UnifiedProductSearchDto }) @ApiResponse({ status: 200, description: 'Lista de produtos encontrados retornada com sucesso.', type: ProductDetailResponseDto, isArray: true, }) @ApiResponse({ status: 400, description: 'Parâmetros inválidos.' }) async unifiedProductSearch( @Body() query: UnifiedProductSearchDto, ): Promise { return this.productsService.unifiedProductSearch(query); } /** * Endpoint para buscar ofertas 8026 */ @Post('oferta-8026') @ApiOperation({ summary: 'Busca ofertas 8026 conforme parâmetros específicos' }) @ApiBody({ type: Oferta8026QueryDto }) @ApiResponse({ status: 200, description: 'Lista de ofertas retornada com sucesso.', type: Oferta8026ResponseDto, isArray: true, }) @ApiResponse({ status: 400, description: 'Parâmetros inválidos.' }) async getOferta8026( @Body() query: Oferta8026QueryDto, ): Promise { return this.productsService.getOferta8026(query); } }