feat(signatures): UI completa do módulo + rate limiting em rotas públicas
Fecha as duas pendências da leva anterior (módulo de Assinatura Eletrônica): tela de backoffice para gerenciar envelopes (criação, envio, cancelamento, checkpoint/finalização, auditoria) e as duas páginas públicas (/assinar/:token, /verificar/:verificationId). Backend: novos endpoints de streaming de PDF (documento congelado e PDF final consolidado, autenticados e via token público) que faltavam para a UI funcionar — o signatário não tinha como ver o próprio documento antes de confirmar leitura. Rate limiting (guard próprio, em memória, chaves por IP e por token) em todas as rotas sem sessão: auth (login/mfa/forgot-password/reset-password/refresh/logout) e todo o fluxo público de assinatura/verificação. Suíte: 77/77 verdes. pnpm turbo run typecheck build: 28/28. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
16
apps/api/src/common/rate-limit/rate-limit.module.ts
Normal file
16
apps/api/src/common/rate-limit/rate-limit.module.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import { Module } from "@nestjs/common";
|
||||
import { RateLimiterService } from "./rate-limiter.service.js";
|
||||
import { RateLimitGuard } from "./rate-limit.guard.js";
|
||||
|
||||
/**
|
||||
* Imported by every module that has public (no-session) routes. Nest
|
||||
* dedupes module imports within one application graph, so AuthModule and
|
||||
* SignaturesModule importing this both resolve to the SAME
|
||||
* RateLimiterService instance — one shared in-memory store, bucket names
|
||||
* are what keep routes from colliding (see rate-limit.decorator.ts).
|
||||
*/
|
||||
@Module({
|
||||
providers: [RateLimiterService, RateLimitGuard],
|
||||
exports: [RateLimiterService, RateLimitGuard],
|
||||
})
|
||||
export class RateLimitModule {}
|
||||
Reference in New Issue
Block a user