Micro-SaaS & MVPs
Cursor / Copilot
Sistema de Feature Flags com Rollout Gradual por Percentual
Biblioteca leve de feature flags em TypeScript: flags no banco, rollout determinístico por % do usuário, overrides por e-mail e SDK client-side.
0cópias
0joinhas
0favoritos
O prompt
Crie um sistema de feature flags leve para o SaaS {{nome_saas}} em TypeScript.
Parâmetros:
- Nome do SaaS: {{nome_saas}}
- Armazenamento: postgresql (Prisma) com cache em memória de 30s
- Flags Iniciais: {{flags_iniciais}} (ex.: 'novo-checkout, dark-mode-beta')
Requisitos:
1. Schema Prisma FeatureFlag { key unique, name, description, rolloutPercent (0-100), enabled, allowlist String[], denylist String[], createdAt, updatedAt }.
2. Núcleo isFlagEnabled(flagKey, user): ordem de decisão — flag desligada → false; e-mail no denylist → false; no allowlist → true; senão hash determinístico do e-mail (FNV-1a mod 100) < rolloutPercent → true. Determinístico: o mesmo usuário sempre recebe a mesma resposta enquanto a flag não muda.
3. Cache em memória de 30s das flags (invalidado por escrita); endpoint admin POST /api/flags/:key (auth) para ajustar rolloutPercent/allowlist/denylist/enabled com auditoria em tabela FlagAudit { flagKey, changedBy, before, after, createdAt }.
4. SDK client-side: GET /api/flags/public?email= retorna apenas as flags ativas + o resultado já calculado para o usuário (nunca expor rolloutPercent); no front, useFlag('novo-checkout') via hook React ou função vanilla.
5. Crie as flags {{flags_iniciais}} com rollout 0% e allowlist vazia; inclua um script npm run flags:seed idempotente.
6. Testes unitários cobrindo: determinismo do hash (mesmo e-mail → mesmo resultado), precedência deny > allow > rollout, e cache invalidado após update.
Como usar
- Substitua {{nome_saas}} e {{flags_iniciais}} (separadas por vírgula).
- Cole no Cursor/Copilot em um projeto Node/TS + Prisma — schema, núcleo, admin API e SDK saem prontos.
- npm run flags:seed && npm test: os testes de determinismo e precedência devem passar; depois suba o rollout de 'novo-checkout' para 10% via POST /api/flags/novo-checkout.
- No front, troque o if hardcoded por useFlag('novo-checkout') — o SDK já faz o fetch único com cache de 30s no servidor.
Exemplo de saída
Pacote flags (~200 linhas): schema FeatureFlag + FlagAudit, isFlagEnabled com precedência deny > allow > hash FNV-1a determinístico (mod 100), cache 30s invalidado por escrita, admin API autenticada com auditoria antes/depois, GET /flags/public expondo só o resultado calculado, seed idempotente das flags iniciais em 0% e testes de determinismo/precedência/cache.