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

145
src/core/configs/cache/index.html vendored Normal file
View File

@@ -0,0 +1,145 @@
<!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 - Integração Redis</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>📦 Integração Redis com Abstração - Portal Juru API</h1>
<h2>🧱 Arquitetura</h2>
<p>O projeto utiliza o Redis com uma interface genérica para garantir desacoplamento, facilidade de teste e reaproveitamento em múltiplos módulos.</p>
<h3>🔌 Interface IRedisClient</h3>
<pre><code>export interface IRedisClient {
get&lt;T&gt;(key: string): Promise&lt;T | null&gt;;
set&lt;T&gt;(key: string, value: T, ttlSeconds?: number): Promise&lt;void&gt;;
del(key: string): Promise&lt;void&gt;;
}</code></pre>
<h3>🧩 Provider REDIS_CLIENT</h3>
<p>Faz a conexão direta com o Redis usando a biblioteca <code>ioredis</code> e o <code>ConfigService</code> para pegar host e porta.</p>
<pre><code>export const RedisProvider: Provider = {
provide: 'REDIS_CLIENT',
useFactory: (configService: ConfigService) =&gt; {
const redis = new Redis({
host: configService.get('REDIS_HOST', '10.1.1.109'),
port: configService.get('REDIS_PORT', 6379),
});
redis.on('error', (err) =&gt; {
console.error('Erro ao conectar ao Redis:', err);
});
return redis;
},
inject: [ConfigService],
};</code></pre>
<h3>📦 RedisClientAdapter (Wrapper)</h3>
<p>Classe que implementa <code>IRedisClient</code> e encapsula as operações de cache. É injetada em serviços via token.</p>
<pre><code>@Injectable()
export class RedisClientAdapter implements IRedisClient {
constructor(@Inject('REDIS_CLIENT') private readonly redis: Redis) {}
async get&lt;T&gt;(key: string): Promise&lt;T | null&gt; {
const data = await this.redis.get(key);
return data ? JSON.parse(data) : null;
}
async set&lt;T&gt;(key: string, value: T, ttlSeconds = 300): Promise&lt;void&gt; {
await this.redis.set(key, JSON.stringify(value), 'EX', ttlSeconds);
}
async del(key: string): Promise&lt;void&gt; {
await this.redis.del(key);
}
}</code></pre>
<h3>🔗 Token e Provider</h3>
<p>Token de injeção definido para o adapter:</p>
<pre><code>export const RedisClientToken = 'RedisClientInterface';
export const RedisClientAdapterProvider = {
provide: RedisClientToken,
useClass: RedisClientAdapter,
};</code></pre>
<h3>📦 Módulo Global RedisModule</h3>
<p>Torna o Redis disponível em toda a aplicação.</p>
<pre><code>@Global()
@Module({
imports: [ConfigModule],
providers: [RedisProvider, RedisClientAdapterProvider],
exports: [RedisProvider, RedisClientAdapterProvider],
})
export class RedisModule {}</code></pre>
<h2>🧠 Uso em Serviços</h2>
<p>Injetando o cache no seu service:</p>
<pre><code>constructor(
@Inject(RedisClientToken)
private readonly redisClient: IRedisClient
) {}</code></pre>
<p>Uso típico:</p>
<pre><code>const data = await this.redisClient.get&lt;T&gt;('chave');
if (!data) {
const result = await fetchFromDb();
await this.redisClient.set('chave', result, 3600);
}</code></pre>
<h2>🧰 Boas práticas</h2>
<ul>
<li>✅ TTL por recurso (ex: produtos: 1h, lojas: 24h)</li>
<li>✅ Nomear chaves com prefixos por domínio (ex: <code>data-consult:sellers</code>)</li>
<li>✅ Centralizar helpers como <code>getOrSetCache</code> para evitar repetição</li>
<li>✅ Usar <code>JSON.stringify</code> e <code>JSON.parse</code> no adapter</li>
<li>✅ Marcar módulo como <code>@Global()</code> para acesso em toda a aplicação</li>
</ul>
<p><strong>Última atualização:</strong> 29/03/2025</p>
</body>
</html>

View File

@@ -9,4 +9,4 @@ import { RedisClientAdapterProvider } from './redis-client.adapter.provider';
providers: [RedisProvider, RedisClientAdapterProvider],
exports: [RedisProvider, RedisClientAdapterProvider],
})
export class CacheModule {}
export class RedisModule {}

View File

@@ -1,21 +1,21 @@
import { Provider } from '@nestjs/common';
import Redis from 'ioredis';
import { ConfigService } from '@nestjs/config';
import { Provider } from '@nestjs/common';
import Redis from 'ioredis';
import { ConfigService } from '@nestjs/config';
export const RedisProvider: Provider = {
provide: 'REDIS_CLIENT',
useFactory: (configService: ConfigService) => {
const redis = new Redis({
host: configService.get<string>('REDIS_HOST', '10.1.1.109'),
port: configService.get<number>('REDIS_PORT', 6379),
// password: configService.get<string>('REDIS_PASSWORD', ''),
});
export const RedisProvider: Provider = {
provide: 'REDIS_CLIENT',
useFactory: (configService: ConfigService) => {
const redis = new Redis({
host: configService.get<string>('REDIS_HOST', '10.1.1.109'),
port: configService.get<number>('REDIS_PORT', 6379),
// password: configService.get<string>('REDIS_PASSWORD', ''),
});
redis.on('error', (err) => {
console.error('Erro ao conectar ao Redis:', err);
});
redis.on('error', (err) => {
console.error('Erro ao conectar ao Redis:', err);
});
return redis;
},
inject: [ConfigService],
};
return redis;
},
inject: [ConfigService],
};