@cargolift-cdi/lib-common 0.0.71 → 0.0.73
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +265 -170
- package/dist/auth/api-client.decorator.d.ts +1 -0
- package/dist/auth/api-client.decorator.d.ts.map +1 -0
- package/dist/auth/auth.guard.d.ts +1 -0
- package/dist/auth/auth.guard.d.ts.map +1 -0
- package/dist/auth/auth.guard.js +16 -5
- package/dist/auth/auth.guard.js.map +1 -1
- package/dist/auth/auth.module.d.ts +1 -0
- package/dist/auth/auth.module.d.ts.map +1 -0
- package/dist/auth/jwt-verifier.service.d.ts +1 -0
- package/dist/auth/jwt-verifier.service.d.ts.map +1 -0
- package/dist/auth/jwt-verifier.service.js +6 -3
- package/dist/auth/jwt-verifier.service.js.map +1 -1
- package/dist/auth/roles.decorator.d.ts +1 -0
- package/dist/auth/roles.decorator.d.ts.map +1 -0
- package/dist/auth/token-jwt.decorator.d.ts +2 -1
- package/dist/auth/token-jwt.decorator.d.ts.map +1 -0
- package/dist/errors/base.error.d.ts +6 -5
- package/dist/errors/base.error.d.ts.map +1 -0
- package/dist/errors/base.error.js +5 -0
- package/dist/errors/base.error.js.map +1 -1
- package/dist/errors/errors.error.d.ts +1 -0
- package/dist/errors/errors.error.d.ts.map +1 -0
- package/dist/errors/errors.util.d.ts +1 -0
- package/dist/errors/errors.util.d.ts.map +1 -0
- package/dist/errors/invalid-payload-business.error.d.ts +2 -1
- package/dist/errors/invalid-payload-business.error.d.ts.map +1 -0
- package/dist/errors/invalid-payload-business.error.js +3 -1
- package/dist/errors/invalid-payload-business.error.js.map +1 -1
- package/dist/errors/not-found-business.error.d.ts +1 -0
- package/dist/errors/not-found-business.error.d.ts.map +1 -0
- package/dist/errors/payload-validation.error.d.ts +1 -0
- package/dist/errors/payload-validation.error.d.ts.map +1 -0
- package/dist/errors/payload-validation.error.js +3 -2
- package/dist/errors/payload-validation.error.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/logger/app-logger.module.d.ts +1 -0
- package/dist/logger/app-logger.module.d.ts.map +1 -0
- package/dist/logger/app-logger.token.d.ts +1 -0
- package/dist/logger/app-logger.token.d.ts.map +1 -0
- package/dist/logger/logger.async-context.d.ts +1 -0
- package/dist/logger/logger.async-context.d.ts.map +1 -0
- package/dist/logger/logger.module.d.ts +1 -0
- package/dist/logger/logger.module.d.ts.map +1 -0
- package/dist/logger/logger.service.d.ts +5 -1
- package/dist/logger/logger.service.d.ts.map +1 -0
- package/dist/logger/logger.service.js +58 -32
- package/dist/logger/logger.service.js.map +1 -1
- package/dist/nestjs/filters/http-exceptions.filter.d.ts +1 -0
- package/dist/nestjs/filters/http-exceptions.filter.d.ts.map +1 -0
- package/dist/nestjs/filters/http-exceptions.filter.js +2 -1
- package/dist/nestjs/filters/http-exceptions.filter.js.map +1 -1
- package/dist/nestjs/middleware/http-logger.middleware.d.ts +1 -0
- package/dist/nestjs/middleware/http-logger.middleware.d.ts.map +1 -0
- package/dist/nestjs/middleware/http-logger.middleware.js +8 -3
- package/dist/nestjs/middleware/http-logger.middleware.js.map +1 -1
- package/dist/util/payload.util.d.ts +2 -1
- package/dist/util/payload.util.d.ts.map +1 -0
- package/dist/util/payload.util.js +14 -14
- package/dist/util/payload.util.js.map +1 -1
- package/package.json +47 -41
- package/dist/__tests__/payload-util/payload-util.test.d.ts +0 -1
- package/dist/__tests__/payload-util/payload-util.test.js +0 -65
- package/dist/__tests__/payload-util/payload-util.test.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
package/README.md
CHANGED
|
@@ -1,232 +1,327 @@
|
|
|
1
|
-
# @cargolift-cdi/common
|
|
1
|
+
# @cargolift-cdi/lib-common
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+

|
|
4
|
+

|
|
5
|
+

|
|
6
|
+

|
|
4
7
|
|
|
5
|
-
|
|
6
|
-
- Classes de erro de domínio (BusinessError) com código, dados adicionais e causa encadeada
|
|
7
|
-
- Filtro global de exceções para APIs (APIExceptionsFilter) já integrado ao util-logger
|
|
8
|
+
Biblioteca de utilitários comuns para serviços NestJS do ecossistema Middleware Cargolift, com foco em **logs estruturados**, **autenticação/autorização** e **padronização de erros**.
|
|
8
9
|
|
|
10
|
+
---
|
|
9
11
|
|
|
10
|
-
##
|
|
12
|
+
## 📌 Objetivo
|
|
11
13
|
|
|
12
|
-
|
|
13
|
-
- Node.js LTS (18+) e npm
|
|
14
|
-
- Peer dependency: `@nestjs/common@^11`
|
|
14
|
+
Este repositório centraliza componentes reutilizáveis usados pelos serviços do middleware para reduzir duplicidade e garantir padrões técnicos consistentes entre APIs e workers.
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
No contexto do monorepo `middleware`, a `lib-common` entrega uma base para:
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
O pacote depende de `@cargolift-cdi/util-logger` (instalado automaticamente).
|
|
18
|
+
- Observabilidade e rastreabilidade ponta a ponta (correlation id, trace, warns).
|
|
19
|
+
- Tratamento uniforme de exceções HTTP e erros de domínio.
|
|
20
|
+
- Autenticação JWT e autorização por role/cliente para endpoints NestJS.
|
|
21
|
+
- Utilitários de payload com sanitização de dados sensíveis.
|
|
23
22
|
|
|
23
|
+
---
|
|
24
24
|
|
|
25
|
-
##
|
|
25
|
+
## ✨ Funcionalidades
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
- **Logger contextual com AsyncLocalStorage:** contexto isolado por requisição/mensagem com API simples para enriquecer logs.
|
|
28
|
+
- **Middleware HTTP de logging:** captura request/response com duração, origem e payload sanitizado.
|
|
29
|
+
- **Filtro global de exceções (`HTTPExceptionsFilter`):** resposta padronizada e log estruturado para erros 4xx/5xx.
|
|
30
|
+
- **Módulo de autenticação (`AuthModule`):** verificação JWT RS256 via OpenID/JWKS + `AuthGuard` com validação de roles.
|
|
31
|
+
- **Pacote de erros de domínio/aplicação:** classes de erro tipadas com metadados (`code`, `source`, `retryable`, `cause`, `data`).
|
|
32
|
+
- **Utilitário de payload (`PayloadUtil`):** normalização, extração de envelope/payload e mascaramento de campos sensíveis.
|
|
28
33
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
import { LoggerContextService } from '@cargolift-cdi/util-logger';
|
|
34
|
+
Diferenciais técnicos:
|
|
35
|
+
- Compatível com arquitetura orientada a eventos e serviços HTTP.
|
|
36
|
+
- Uso de padrões consistentes para `source`, `trace` e classificação de erro.
|
|
37
|
+
- Pronto para integração com stack de observabilidade do middleware.
|
|
34
38
|
|
|
35
|
-
|
|
36
|
-
const app = await NestFactory.create(AppModule, { bufferLogs: true });
|
|
39
|
+
---
|
|
37
40
|
|
|
38
|
-
|
|
39
|
-
const logger = app.get(LoggerContextService);
|
|
40
|
-
app.useGlobalFilters(new APIExceptionsFilter(logger));
|
|
41
|
+
## 🔍 Detalhamento
|
|
41
42
|
|
|
42
|
-
|
|
43
|
-
}
|
|
43
|
+
### Logging e contexto
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
```
|
|
45
|
+
O `LoggerContextService` implementa o `LoggerService` do NestJS usando `pino` e mantém o contexto por fluxo assíncrono com `AsyncLocalStorage`.
|
|
47
46
|
|
|
48
|
-
|
|
47
|
+
Principais recursos:
|
|
48
|
+
- Métodos: `log`, `info`, `debug`, `warn`, `error`, `clientError`, `businessError`, `businessWarn`.
|
|
49
|
+
- Contexto: `setContextRequest`, `setContextRabbitMQ`, `setExternalReference`, `setBusinessKey`, `setLogContext`, `updateSource`.
|
|
50
|
+
- Helpers exportados: `runWithLoggerContext`, `getLoggerContext`, `updateLoggerContext`, `clearLoggerContext`.
|
|
49
51
|
|
|
50
|
-
|
|
52
|
+
#### Exemplo de uso (App Logger global)
|
|
51
53
|
|
|
52
54
|
```ts
|
|
53
|
-
import { Module } from '@nestjs/common';
|
|
54
|
-
import {
|
|
55
|
-
import { APIExceptionsFilter } from '@cargolift-cdi/lib-common';
|
|
56
|
-
// Certifique-se de que o LoggerContextService esteja disponível no container
|
|
57
|
-
import { LoggerContextService } from '@cargolift-cdi/util-logger';
|
|
55
|
+
import { Inject, Injectable, Module } from '@nestjs/common';
|
|
56
|
+
import { AppLoggerModule, APP_LOGGER, LoggerContextService } from '@cargolift-cdi/lib-common';
|
|
58
57
|
|
|
59
58
|
@Module({
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
59
|
+
imports: [
|
|
60
|
+
AppLoggerModule.forRoot({
|
|
61
|
+
application: { name: 'middleware-api', function: 'service' },
|
|
62
|
+
}),
|
|
63
63
|
],
|
|
64
64
|
})
|
|
65
65
|
export class AppModule {}
|
|
66
|
-
```
|
|
67
66
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
import { NotFoundBusinessError, GenericBusinessError } from '@cargolift-cdi/lib-common';
|
|
72
|
-
|
|
73
|
-
// Recurso não encontrado
|
|
74
|
-
throw new NotFoundBusinessError('Order', '12345');
|
|
67
|
+
@Injectable()
|
|
68
|
+
export class ExampleService {
|
|
69
|
+
constructor(@Inject(APP_LOGGER) private readonly logger: LoggerContextService) {}
|
|
75
70
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
});
|
|
71
|
+
execute() {
|
|
72
|
+
this.logger.log('Serviço executado');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
81
75
|
```
|
|
82
76
|
|
|
77
|
+
### Autenticação e autorização
|
|
83
78
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
- `BusinessError` (abstrata)
|
|
87
|
-
- Base para erros de domínio. Suporta `code?: string`, `data?: Record<string, unknown>`, `cause?: unknown` e serialização segura via `toJSON()`.
|
|
88
|
-
- `GenericBusinessError`
|
|
89
|
-
- Erro de negócio genérico (mensagem padrão "Generic Business error" quando não informada). Útil para normalizar exceções desconhecidas.
|
|
90
|
-
- `NotFoundBusinessError`
|
|
91
|
-
- Especialização para recursos não encontrados: construtor `(resourceType: string, resourceId: string|number, message?, options?)`.
|
|
92
|
-
- `APIExceptionsFilter` (NestJS)
|
|
93
|
-
- Filtro global de exceções. Decide tipo do erro (business/application), aplica códigos padrão e registra logs estruturados via `LoggerContextService`.
|
|
94
|
-
|
|
95
|
-
Observação: existem classes internas adicionais (ex.: `ApplicationError`, `GenericApplicationError`) que podem evoluir; utilize apenas a API pública acima para evitar quebras.
|
|
79
|
+
`AuthModule` exporta `JwtVerifierService` e `AuthGuard`.
|
|
96
80
|
|
|
97
|
-
|
|
81
|
+
O `AuthGuard`:
|
|
82
|
+
- valida token Bearer RS256,
|
|
83
|
+
- popula `request.user`,
|
|
84
|
+
- resolve client id via `@ApiClient()` ou claims,
|
|
85
|
+
- valida roles via `@RequireRoles()`.
|
|
98
86
|
|
|
99
|
-
|
|
87
|
+
#### Exemplo de uso
|
|
100
88
|
|
|
101
|
-
Benefícios:
|
|
102
|
-
- Menos alocações de instâncias (melhor para alto throughput)
|
|
103
|
-
- Propagação automática de contexto por callbacks/promises sem passar manualmente
|
|
104
|
-
- Publishers/clients apenas usam `logger.getContext()`
|
|
105
|
-
|
|
106
|
-
Helpers exportados:
|
|
107
89
|
```ts
|
|
108
|
-
import {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
1. Cria um child logger a partir dos headers da mensagem (`childFromRabbit`)
|
|
122
|
-
2. Semeia o ALS com `runWithLoggerContext(child.getContext(), processMessage)`
|
|
123
|
-
3. Dentro do processamento usa-se o `logger` base normalmente
|
|
124
|
-
|
|
125
|
-
Caso precise anexar dados adicionais no meio da execução:
|
|
126
|
-
```ts
|
|
127
|
-
updateLoggerContext({ caller_info: { type: 'user', id: 'u-1' } });
|
|
90
|
+
import { Controller, Get, UseGuards } from '@nestjs/common';
|
|
91
|
+
import { AuthGuard, RequireRoles, ApiClient, TokenJWT } from '@cargolift-cdi/lib-common';
|
|
92
|
+
|
|
93
|
+
@Controller('orders')
|
|
94
|
+
@UseGuards(AuthGuard)
|
|
95
|
+
export class OrdersController {
|
|
96
|
+
@Get(':entity')
|
|
97
|
+
@ApiClient('api.middleware')
|
|
98
|
+
@RequireRoles(':entity')
|
|
99
|
+
list(@TokenJWT() jwt: any) {
|
|
100
|
+
return { subject: jwt?.sub };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
128
103
|
```
|
|
129
104
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
105
|
+
### Erros e exceções HTTP
|
|
133
106
|
|
|
134
|
-
|
|
107
|
+
`BaseError` e suas especializações (`BusinessError`, `ApplicationError`, `MiddlewareError`, `ClientError` e versões transitórias) padronizam semântica de erro no domínio.
|
|
135
108
|
|
|
136
|
-
|
|
109
|
+
Para APIs HTTP, use `HTTPExceptionsFilter` como filtro global para resposta uniforme e logs consistentes.
|
|
137
110
|
|
|
138
|
-
|
|
139
|
-
- `name: string` — Nome da classe (ex.: `NotFoundBusinessError`)
|
|
140
|
-
- `message?: string` — Mensagem humana
|
|
141
|
-
- `code?: string` — Ex.: `BUSINESS_RESOURCE_NOT_FOUND`, `INVALID_PAYLOAD`
|
|
142
|
-
- `data?: Record<string, unknown>` — Dados serializáveis extras
|
|
143
|
-
- `cause?: unknown` — Erro original para encadeamento
|
|
144
|
-
- `toJSON()` — Retorna objeto serializável, inclusive com `stack` enumerável e `cause` segura
|
|
111
|
+
#### Exemplo de uso
|
|
145
112
|
|
|
146
|
-
`BusinessErrorOptions`:
|
|
147
113
|
```ts
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
data?: Record<string, unknown>;
|
|
152
|
-
};
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
### NotFoundBusinessError
|
|
156
|
-
|
|
157
|
-
- Código padrão: `BUSINESS_RESOURCE_NOT_FOUND`
|
|
158
|
-
- `data`: `{ resourceType: string, resourceId: string|number }`
|
|
159
|
-
|
|
160
|
-
### GenericBusinessError
|
|
114
|
+
import { Module } from '@nestjs/common';
|
|
115
|
+
import { APP_FILTER } from '@nestjs/core';
|
|
116
|
+
import { HTTPExceptionsFilter, LoggerModule } from '@cargolift-cdi/lib-common';
|
|
161
117
|
|
|
162
|
-
|
|
163
|
-
|
|
118
|
+
@Module({
|
|
119
|
+
imports: [LoggerModule],
|
|
120
|
+
providers: [{ provide: APP_FILTER, useClass: HTTPExceptionsFilter }],
|
|
121
|
+
})
|
|
122
|
+
export class AppModule {}
|
|
123
|
+
```
|
|
164
124
|
|
|
165
|
-
###
|
|
125
|
+
### Utilitário de payload
|
|
126
|
+
|
|
127
|
+
`PayloadUtil` oferece:
|
|
128
|
+
- `normalize(payload)`: converte string JSON/objeto para estrutura utilizável.
|
|
129
|
+
- `sanitize(payload)`: mascara campos sensíveis.
|
|
130
|
+
- `extract(rawPayload)`: separa `envelope` e `payload` quando houver wrapper.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 🛠 Tecnologias e Dependências
|
|
135
|
+
|
|
136
|
+
<table>
|
|
137
|
+
<thead>
|
|
138
|
+
<tr>
|
|
139
|
+
<th>Tecnologia</th>
|
|
140
|
+
<th>Versão</th>
|
|
141
|
+
<th>Finalidade</th>
|
|
142
|
+
</tr>
|
|
143
|
+
</thead>
|
|
144
|
+
<tbody>
|
|
145
|
+
<tr>
|
|
146
|
+
<td>TypeScript</td>
|
|
147
|
+
<td>^5.9.2</td>
|
|
148
|
+
<td>Implementação tipada da biblioteca</td>
|
|
149
|
+
</tr>
|
|
150
|
+
<tr>
|
|
151
|
+
<td>NestJS Common/Core</td>
|
|
152
|
+
<td>^11.1.6</td>
|
|
153
|
+
<td>Integração com DI, guards, decorators, filters e middleware</td>
|
|
154
|
+
</tr>
|
|
155
|
+
<tr>
|
|
156
|
+
<td>Pino + Pino Pretty</td>
|
|
157
|
+
<td>^9.11.0 / ^13.1.1</td>
|
|
158
|
+
<td>Logging estruturado e saída amigável em desenvolvimento</td>
|
|
159
|
+
</tr>
|
|
160
|
+
<tr>
|
|
161
|
+
<td>uuid</td>
|
|
162
|
+
<td>^13.0.0</td>
|
|
163
|
+
<td>Geração de correlation id</td>
|
|
164
|
+
</tr>
|
|
165
|
+
<tr>
|
|
166
|
+
<td>Vitest</td>
|
|
167
|
+
<td>^4.0.16</td>
|
|
168
|
+
<td>Testes unitários</td>
|
|
169
|
+
</tr>
|
|
170
|
+
</tbody>
|
|
171
|
+
</table>
|
|
172
|
+
|
|
173
|
+
**Dependência interna:**
|
|
174
|
+
- `@cargolift-cdi/types` (`workspace:*`)
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## 🚀 Instalação
|
|
179
|
+
|
|
180
|
+
### Pré-requisitos
|
|
181
|
+
|
|
182
|
+
- Node.js: 18+
|
|
183
|
+
- pnpm: recomendado no monorepo
|
|
184
|
+
- NestJS: peer dependency `@nestjs/common@^11.1.6`
|
|
185
|
+
|
|
186
|
+
### Instalar no monorepo (workspace)
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
pnpm --filter @cargolift-cdi/lib-common install
|
|
190
|
+
```
|
|
166
191
|
|
|
167
|
-
|
|
168
|
-
- Cria/propaga `correlation_id` no contexto de log
|
|
169
|
-
- Resposta JSON padrão:
|
|
192
|
+
### Consumir em outro pacote do monorepo
|
|
170
193
|
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
"message": "<mensagem>",
|
|
174
|
-
"error": {
|
|
175
|
-
"statusCode": 500,
|
|
176
|
-
"timestamp": "2025-01-01T00:00:00.000Z",
|
|
177
|
-
"path": "/rota",
|
|
178
|
-
"errorCode": "INTERNAL_ERROR"
|
|
179
|
-
}
|
|
180
|
-
}
|
|
194
|
+
```bash
|
|
195
|
+
pnpm add @cargolift-cdi/lib-common
|
|
181
196
|
```
|
|
182
197
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
198
|
+
### Variáveis de ambiente
|
|
199
|
+
|
|
200
|
+
<table>
|
|
201
|
+
<thead>
|
|
202
|
+
<tr>
|
|
203
|
+
<th>Variável</th>
|
|
204
|
+
<th>Descrição</th>
|
|
205
|
+
<th>Obrigatória</th>
|
|
206
|
+
<th>Valor padrão</th>
|
|
207
|
+
</tr>
|
|
208
|
+
</thead>
|
|
209
|
+
<tbody>
|
|
210
|
+
<tr>
|
|
211
|
+
<td>KEYCLOAK_BASE_URL</td>
|
|
212
|
+
<td>Base URL do provedor OIDC (Keycloak)</td>
|
|
213
|
+
<td>Sim (para AuthGuard/JWT)</td>
|
|
214
|
+
<td>-</td>
|
|
215
|
+
</tr>
|
|
216
|
+
<tr>
|
|
217
|
+
<td>KEYCLOAK_REALM</td>
|
|
218
|
+
<td>Realm do Keycloak</td>
|
|
219
|
+
<td>Sim (para AuthGuard/JWT)</td>
|
|
220
|
+
<td>-</td>
|
|
221
|
+
</tr>
|
|
222
|
+
<tr>
|
|
223
|
+
<td>KEYCLOAK_ISSUER</td>
|
|
224
|
+
<td>Issuer esperado no token</td>
|
|
225
|
+
<td>Recomendado</td>
|
|
226
|
+
<td>-</td>
|
|
227
|
+
</tr>
|
|
228
|
+
<tr>
|
|
229
|
+
<td>KEYCLOAK_AUDIENCE</td>
|
|
230
|
+
<td>Audience esperada no token</td>
|
|
231
|
+
<td>Recomendado</td>
|
|
232
|
+
<td>api.util</td>
|
|
233
|
+
</tr>
|
|
234
|
+
<tr>
|
|
235
|
+
<td>LOG_LEVEL</td>
|
|
236
|
+
<td>Nível de log do pino</td>
|
|
237
|
+
<td>Não</td>
|
|
238
|
+
<td>info</td>
|
|
239
|
+
</tr>
|
|
240
|
+
<tr>
|
|
241
|
+
<td>LOG_DEBUG_IGNORE</td>
|
|
242
|
+
<td>Campos ignorados na saída de debug</td>
|
|
243
|
+
<td>Não</td>
|
|
244
|
+
<td>pid,hostname,trace,correlation_id,application,message</td>
|
|
245
|
+
</tr>
|
|
246
|
+
<tr>
|
|
247
|
+
<td>TRACE_MAX_DEPTH</td>
|
|
248
|
+
<td>Profundidade máxima do array de trace</td>
|
|
249
|
+
<td>Não</td>
|
|
250
|
+
<td>5</td>
|
|
251
|
+
</tr>
|
|
252
|
+
<tr>
|
|
253
|
+
<td>NODE_ENV</td>
|
|
254
|
+
<td>Controla saída formatada com pino-pretty</td>
|
|
255
|
+
<td>Não</td>
|
|
256
|
+
<td>development</td>
|
|
257
|
+
</tr>
|
|
258
|
+
</tbody>
|
|
259
|
+
</table>
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 💡 Como Usar
|
|
264
|
+
|
|
265
|
+
### Quickstart
|
|
186
266
|
|
|
187
267
|
```ts
|
|
188
|
-
import {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
export class SomeService {
|
|
204
|
-
constructor(@Inject(APP_LOGGER) private readonly appLogger: LoggerContextService) {}
|
|
268
|
+
import {
|
|
269
|
+
LoggerModule,
|
|
270
|
+
HTTPLoggerMiddleware,
|
|
271
|
+
HTTPExceptionsFilter,
|
|
272
|
+
AuthModule,
|
|
273
|
+
PayloadUtil,
|
|
274
|
+
} from '@cargolift-cdi/lib-common';
|
|
275
|
+
|
|
276
|
+
// Importe LoggerModule/AuthModule no seu AppModule.
|
|
277
|
+
// Registre HTTPLoggerMiddleware no consumer de middlewares.
|
|
278
|
+
// Registre HTTPExceptionsFilter como APP_FILTER.
|
|
279
|
+
|
|
280
|
+
const sanitized = PayloadUtil.sanitize({ authorization: 'Bearer abc', value: 1 });
|
|
281
|
+
// => { authorization: '[REDACTED]', value: 1 }
|
|
282
|
+
```
|
|
205
283
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## 📁 Estrutura do Projeto
|
|
287
|
+
|
|
288
|
+
```text
|
|
289
|
+
src/
|
|
290
|
+
├── auth/ # AuthModule, guard, decorators e verificação JWT
|
|
291
|
+
├── errors/ # BaseError, erros tipados e utilitários de classificação
|
|
292
|
+
├── logger/ # LoggerContextService, módulos de logger e AsyncLocalStorage
|
|
293
|
+
├── nestjs/
|
|
294
|
+
│ ├── filters/ # HTTPExceptionsFilter
|
|
295
|
+
│ └── middleware/ # HTTPLoggerMiddleware
|
|
296
|
+
├── util/ # PayloadUtil
|
|
297
|
+
├── __tests__/ # Testes unitários
|
|
298
|
+
└── index.ts # Export público da biblioteca
|
|
210
299
|
```
|
|
211
300
|
|
|
212
|
-
|
|
213
|
-
- Este log possui um contexto único; não chame `setContext`.
|
|
214
|
-
- Para logs por mensagem/requisição , use a versão de escopo TRANSIENT `LoggerContextService` e chame `setContextRabbitMQ`/`setContextRequest`.
|
|
301
|
+
---
|
|
215
302
|
|
|
303
|
+
## 🧪 Testes
|
|
216
304
|
|
|
305
|
+
```bash
|
|
306
|
+
pnpm --filter @cargolift-cdi/lib-common test
|
|
307
|
+
```
|
|
217
308
|
|
|
218
|
-
|
|
309
|
+
Build local:
|
|
219
310
|
|
|
220
|
-
|
|
221
|
-
|
|
311
|
+
```bash
|
|
312
|
+
pnpm --filter @cargolift-cdi/lib-common build
|
|
313
|
+
```
|
|
222
314
|
|
|
315
|
+
---
|
|
223
316
|
|
|
224
|
-
##
|
|
317
|
+
## 🤝 Contribuindo
|
|
225
318
|
|
|
226
|
-
-
|
|
227
|
-
-
|
|
319
|
+
- Siga os padrões do monorepo middleware.
|
|
320
|
+
- Priorize mudanças pequenas e focadas.
|
|
321
|
+
- Inclua/atualize testes quando alterar comportamento.
|
|
228
322
|
|
|
323
|
+
---
|
|
229
324
|
|
|
230
|
-
## Licença
|
|
325
|
+
## 📄 Licença
|
|
231
326
|
|
|
232
327
|
MIT © Cargolift CDI
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.decorator.d.ts","sourceRoot":"","sources":["../../src/auth/api-client.decorator.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AACjD,eAAO,MAAM,SAAS,GAAI,UAAU,MAAM,qDAA6C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.guard.d.ts","sourceRoot":"","sources":["../../src/auth/auth.guard.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,gBAAgB,EAKjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAInE,qBACa,SAAU,YAAW,WAAW;IAEzC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,WAAW,EAAE,kBAAkB,EAC/B,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,oBAAoB;IAI/C,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,kBAAkB;IAgBpB,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;CA8F/D"}
|
package/dist/auth/auth.guard.js
CHANGED
|
@@ -14,6 +14,9 @@ import { LoggerContextService } from "../logger/logger.service.js";
|
|
|
14
14
|
import { ROLES_KEY } from "./roles.decorator.js";
|
|
15
15
|
import { API_CLIENT_ID_KEY } from "./api-client.decorator.js";
|
|
16
16
|
let AuthGuard = class AuthGuard {
|
|
17
|
+
jwtVerifier;
|
|
18
|
+
reflector;
|
|
19
|
+
logger;
|
|
17
20
|
constructor(jwtVerifier, reflector, logger) {
|
|
18
21
|
this.jwtVerifier = jwtVerifier;
|
|
19
22
|
this.reflector = reflector;
|
|
@@ -59,14 +62,22 @@ let AuthGuard = class AuthGuard {
|
|
|
59
62
|
request.ip ||
|
|
60
63
|
request.connection?.remoteAddress ||
|
|
61
64
|
undefined;
|
|
62
|
-
const username = payload?.
|
|
65
|
+
const username = payload?.azp || payload?.client_id || payload?.preferred_username || "unknown";
|
|
63
66
|
this.logger.updateSource({
|
|
64
67
|
ip: ip,
|
|
65
68
|
user_agent: request.headers["user-agent"],
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
69
|
+
audience: payload?.aud,
|
|
70
|
+
subject: payload?.azp || payload?.aud,
|
|
71
|
+
authentication: {
|
|
72
|
+
id: payload?.sub,
|
|
73
|
+
username: username,
|
|
74
|
+
email: payload?.email,
|
|
75
|
+
},
|
|
76
|
+
actor: {
|
|
77
|
+
id: payload?.sub,
|
|
78
|
+
username: username,
|
|
79
|
+
email: payload?.email,
|
|
80
|
+
}
|
|
70
81
|
});
|
|
71
82
|
}
|
|
72
83
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.guard.js","sourceRoot":"","sources":["../../src/auth/auth.guard.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAGL,UAAU,EACV,qBAAqB,EACrB,kBAAkB,EAClB,4BAA4B,GAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGvD,IAAM,SAAS,GAAf,MAAM,SAAS;
|
|
1
|
+
{"version":3,"file":"auth.guard.js","sourceRoot":"","sources":["../../src/auth/auth.guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.module.d.ts","sourceRoot":"","sources":["../../src/auth/auth.module.ts"],"names":[],"mappings":"AAKA,qBAIa,UAAU;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-verifier.service.d.ts","sourceRoot":"","sources":["../../src/auth/jwt-verifier.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAyBnE,qBACa,kBAAmB,YAAW,YAAY;IAKzC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,QAAQ,CAA4D;IAC5E,OAAO,CAAC,eAAe,CAAC,CAAS;gBAEJ,MAAM,EAAE,oBAAoB;IAGzD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAE1C,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,KAAK,QAAQ,GAEnB;IAED,OAAO,KAAK,YAAY,GAIvB;YAEa,iBAAiB;YAiBjB,SAAS;YAWT,WAAW;IAmBzB,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,YAAY;IAuBd,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAsBnC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CA2BpC"}
|
|
@@ -18,12 +18,15 @@ function base64urlDecode(input) {
|
|
|
18
18
|
return Buffer.from(input, 'base64');
|
|
19
19
|
}
|
|
20
20
|
let JwtVerifierService = class JwtVerifierService {
|
|
21
|
+
logger;
|
|
22
|
+
openIdConfig;
|
|
23
|
+
keyCache = new Map();
|
|
24
|
+
configFetchedAt;
|
|
21
25
|
constructor(logger) {
|
|
22
26
|
this.logger = logger;
|
|
23
|
-
this.keyCache = new Map();
|
|
24
|
-
this.CONFIG_TTL_MS = 60_000;
|
|
25
|
-
this.KEY_TTL_MS = 10 * 60_000;
|
|
26
27
|
}
|
|
28
|
+
CONFIG_TTL_MS = 60_000;
|
|
29
|
+
KEY_TTL_MS = 10 * 60_000;
|
|
27
30
|
get issuer() {
|
|
28
31
|
return process.env.KEYCLOAK_ISSUER;
|
|
29
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt-verifier.service.js","sourceRoot":"","sources":["../../src/auth/jwt-verifier.service.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,UAAU,EAAgB,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,YAAY,EAAa,MAAM,QAAQ,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAkBnE,SAAS,eAAe,CAAC,KAAa;IACpC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,IAAI,GAAG;QAAE,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC;AAGM,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;
|
|
1
|
+
{"version":3,"file":"jwt-verifier.service.js","sourceRoot":"","sources":["../../src/auth/jwt-verifier.service.ts"],"names":[],"mappings":"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"}
|