176 lines
5.6 KiB
TypeScript
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);
|
|
}
|
|
}
|