mirror of
https://github.com/melgarafael/DeskcommCRM.git
synced 2026-10-02 01:28:34 +08:00
A main recebeu a 0500 (avisos do Jev na Central), que acrescenta jev_pedido_de_humano e jev_parar_de_receber ao CHECK de agent_inbox_items.kind. A 0501 reconstrói esse CHECK com a lista inteira e roda DEPOIS da 0500 na cadeia do CLI: sem os dois tipos, ela apagaria o vocabulário da 0500 (ou falharia com avisos do Jev já gravados). A lista da 0501 e o bloco único do baseline levam os três tipos. Nos testes, os dois lados ficam. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
lib/api/
Helpers e convenções compartilhadas por toda rota /api/v1/*.
wrappers.ts—ok(data, opts)/fail(code, message, status, opts)/noContent()+ tiposApiSuccess<T>/ApiErrorerrors.ts—ApiErrorCodes(constante canônica de códigos)idempotency.ts—comIdempotencia: reserva antes do efeito, replay (mesma chave e corpo devolvem a resposta gravada) e conflito (mesma chave com corpo diferente, para o chamador responder 409). Persiste emidempotency_keys, com recibo de 24h e reserva de 60s.
Exemplo
import { ok, fail } from "@/lib/api/wrappers";
import { ApiErrorCodes } from "@/lib/api/errors";
export async function GET(req: Request) {
const data = await fetchSomething();
if (!data) return fail(ApiErrorCodes.not_found, "Lead não encontrado", 404);
return ok(data, { meta: { cursor: nextCursor, has_more: true } });
}
A adicionar (próximas specs)
auth.ts— extrai user / tenant da request (cookie OU bearer); valida MFA; retornaAuthContextrate-limit.ts— sliding window via Upstash; injeta headersX-RateLimit-*pagination.ts— encode/decode de cursor opaco base64 + HMACaudit.ts— fire-and-forget write emapi_audit_logcors.ts— allowlist por tenant