Files
portalweb-api/src/products/products.controller.ts

176 lines
5.6 KiB
TypeScript

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<ProductValidationDto> {
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<ProductDetailResponseDto[]> {
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<RotinaA4ResponseDto> {
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<ProductDetailResponseDto[]> {
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<Oferta8026ResponseDto[]> {
return this.productsService.getOferta8026(query);
}
}