swagger configurado na rota chavenfe

This commit is contained in:
unknown
2025-03-29 15:06:21 -03:00
parent 5e4ef04b4a
commit 32bd7c14b3
29 changed files with 709 additions and 241 deletions

View File

@@ -4,13 +4,15 @@ import { DataConsultController } from './data-consult.controller';
import { DataConsultRepository } from './data-consult.repository';
import { LoggerModule } from 'src/Log/logger.module';
import { ConfigModule } from '@nestjs/config';
import { RedisModule } from 'src/core/configs/cache/redis.module';
@Module({
imports: [LoggerModule, ConfigModule],
imports: [LoggerModule, ConfigModule, RedisModule],
controllers: [DataConsultController],
providers: [
DataConsultService,
DataConsultRepository,
],
})
export class DataConsultModule {}

View File

@@ -47,10 +47,12 @@ export class DataConsultRepository {
FROM PCUSUARI
WHERE PCUSUARI.DTTERMINO IS NULL
AND PCUSUARI.TIPOVEND NOT IN ('P')
AND (PCUSUARI.BLOQUEIO IS NULL OR PCUSUARI.BLOQUEIO = 'N')
ORDER BY PCUSUARI.NOME
`;
return this.executeQuery<SellerDto[]>(sql);
}
async findBillings(): Promise<BillingDto[]> {
const sql = `

View File

@@ -6,13 +6,24 @@ import { BillingDto } from './dto/billing.dto';
import { CustomerDto } from './dto/customer.dto';
import { ProductDto } from './dto/product.dto';
import { ILogger } from '../Log/ILogger';
import { RedisClientToken } from '../core/configs/cache/redis-client.adapter.provider';
import { IRedisClient } from '../core/configs/cache/IRedisClient';
import { getOrSetCache } from '../shared/cache.util';
@Injectable()
export class DataConsultService {
private readonly SELLERS_CACHE_KEY = 'data-consult:sellers';
private readonly SELLERS_TTL = 3600; // 1 hora
constructor(
private readonly repository: DataConsultRepository,
@Inject(RedisClientToken) private readonly redisClient: IRedisClient,
@Inject('LoggerService')
private readonly logger: ILogger
private readonly logger: ILogger,
) {}
/**
@@ -29,9 +40,17 @@ export class DataConsultService {
* @returns Array de SellerDto
*/
async sellers(): Promise<SellerDto[]> {
this.logger.log('Buscando todos os vendedores');
return this.repository.findSellers();
}
this.logger.log('Buscando vendedores com cache Redis...');
return getOrSetCache<SellerDto[]>(
this.redisClient,
this.SELLERS_CACHE_KEY,
this.SELLERS_TTL,
async () => {
this.logger.log('Cache de vendedores vazio. Buscando no banco...');
return this.repository.findSellers();
}
);
}
/**
* Obter todos os faturamentos

114
src/data-consult/doc.html Normal file
View File

@@ -0,0 +1,114 @@
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Documentação - DataConsult Module</title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: #f9f9f9;
color: #333;
line-height: 1.6;
padding: 2rem;
}
h1, h2, h3 {
color: #007acc;
}
code, pre {
background-color: #eee;
padding: 1rem;
border-radius: 4px;
display: block;
white-space: pre-wrap;
margin-bottom: 1rem;
}
table {
width: 100%;
border-collapse: collapse;
margin: 1rem 0;
}
th, td {
border: 1px solid #ddd;
padding: 0.75rem;
}
th {
background-color: #007acc;
color: white;
}
.tag {
display: inline-block;
background: #007acc;
color: white;
padding: 0.2rem 0.6rem;
border-radius: 4px;
font-size: 0.85rem;
}
</style>
</head>
<body>
<h1>📊 Módulo de Consultas - Portal Juru API</h1>
<h2>📌 Endpoints Disponíveis</h2>
<h3>🔹 GET /api/v1/data-consult/stores</h3>
<p><strong>Descrição:</strong> Lista todas as lojas.</p>
<p><strong>Autenticação:</strong> <span class="tag">JWT</span></p>
<code>Retorna: StoreDto[]</code>
<h3>🔹 GET /api/v1/data-consult/sellers</h3>
<p><strong>Descrição:</strong> Lista todos os vendedores ativos.</p>
<p><strong>Autenticação:</strong> <span class="tag">JWT</span></p>
<code>Retorna: SellerDto[]</code>
<h3>🔹 GET /api/v1/data-consult/billings</h3>
<p><strong>Descrição:</strong> Retorna todos os tipos de faturamento válidos.</p>
<p><strong>Autenticação:</strong> <span class="tag">JWT</span></p>
<code>Retorna: BillingDto[]</code>
<h3>🔹 GET /api/v1/data-consult/customers/:filter</h3>
<p><strong>Descrição:</strong> Busca clientes por nome, código ou CPF/CNPJ.</p>
<p><strong>Parâmetro:</strong> <code>filter</code></p>
<p><strong>Autenticação:</strong> <span class="tag">JWT</span></p>
<code>Retorna: CustomerDto[]</code>
<h3>🔹 GET /api/v1/data-consult/products/:filter</h3>
<p><strong>Descrição:</strong> Busca produtos por descrição, código ou código auxiliar.</p>
<p><strong>Parâmetro:</strong> <code>filter</code></p>
<p><strong>Autenticação:</strong> Não requer</p>
<code>Retorna: ProductDto[]</code>
<h2>🧱 Camadas e Responsabilidades</h2>
<table>
<tr><th>Camada</th><th>Responsabilidade</th></tr>
<tr><td>DataConsultController</td><td>Recebe as requisições HTTP e delega para o service</td></tr>
<tr><td>DataConsultService</td><td>Intermediário entre controller e repositório; adiciona logs e trata exceções</td></tr>
<tr><td>DataConsultRepository</td><td>Executa queries SQL no Oracle via TypeORM</td></tr>
<tr><td>LoggerService</td><td>Registra logs de acesso, sucesso ou erro</td></tr>
</table>
<h2>📦 Detalhes Técnicos</h2>
<ul>
<li>Utiliza <strong>Oracle</strong> como banco de dados com configuração customizada.</li>
<li>As buscas por cliente e produto realizam múltiplas tentativas de match (ex: por código, nome, etc.).</li>
<li>Repositório implementa <code>queryRunner</code> com liberação segura de conexão.</li>
<li>Camada de serviço registra log com <code>ILogger</code> em todas as operações.</li>
<li>Erros no endpoint <code>products</code> são tratados com <code>HttpException</code>.</li>
</ul>
<h2>🔐 Segurança</h2>
<p>Endpoints protegidos utilizam <code>@UseGuards(JwtAuthGuard)</code> e <code>@ApiBearerAuth()</code>.</p>
<p><strong>Header necessário:</strong></p>
<code>Authorization: Bearer &lt;token&gt;</code>
<h2>🚀 Melhorias Futuras</h2>
<ul>
<li>[🔹 ] Cache Redis para lojas, vendedores e faturamentos</li>
<li>[ ] Auditoria detalhada de acessos no logger</li>
<li>[ ] Paginação nas buscas de clientes e produtos</li>
<li>[ ] Endpoint para exportação dos dados em CSV</li>
</ul>
<p><strong>Última atualização:</strong> 29/03/2025</p>
</body>
</html>