@maestro-ai/cli 1.0.0
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 +59 -0
- package/content/guides/Cat/303/241logo de Stacks para Cloud Moderna.md" +119 -0
- package/content/guides/Cat/303/241logo de Stacks para Hospedagem Compartilhada.md" +147 -0
- package/content/guides/Checklist Mestre de Entrega.md +68 -0
- package/content/guides/Gates de Qualidade.md +209 -0
- package/content/guides/Guia de Adi/303/247/303/243o de Novas Funcionalidades.md" +355 -0
- package/content/guides/Guia de Chaos Engineering.md +267 -0
- package/content/guides/Guia de Debugging com IA.md +135 -0
- package/content/guides/Guia de Estrat/303/251gias de Cache.md" +352 -0
- package/content/guides/Guia de Migrations Zero-Downtime.md +311 -0
- package/content/guides/Guia de Multi-tenancy.md +368 -0
- package/content/guides/Guia de Otimiza/303/247/303/243o de Custos Cloud.md" +195 -0
- package/content/guides/Guia de Refatora/303/247/303/243o de C/303/263digo Legado com IA.md" +162 -0
- package/content/guides/Guia de SLOs e Error Budgets.md +315 -0
- package/content/guides/M/303/251tricas de Efici/303/252ncia do Desenvolvimento com IA.md" +93 -0
- package/content/guides/Rules base.md +90 -0
- package/content/prompts/README.md +203 -0
- package/content/prompts/acessibilidade/analise-acessibilidade.md +257 -0
- package/content/prompts/apis/design-api-rest.md +303 -0
- package/content/prompts/apis/idempotencia.md +254 -0
- package/content/prompts/apis/versionamento.md +313 -0
- package/content/prompts/arquitetura/arquitetura-c4-completo.md +190 -0
- package/content/prompts/arquitetura/clean-architecture.md +151 -0
- package/content/prompts/arquitetura/ddd-bounded-contexts.md +183 -0
- package/content/prompts/arquitetura/ddd-cqrs.md +176 -0
- package/content/prompts/arquitetura/modelo-dominio.md +207 -0
- package/content/prompts/arquitetura/multi-tenancy.md +235 -0
- package/content/prompts/database/migrations-zero-downtime.md +192 -0
- package/content/prompts/database/otimizacao-queries.md +296 -0
- package/content/prompts/desenvolvimento/code-review.md +301 -0
- package/content/prompts/desenvolvimento/gerar-servico.md +271 -0
- package/content/prompts/devops/docker-compose.md +336 -0
- package/content/prompts/devops/feature-flags.md +374 -0
- package/content/prompts/devops/kubernetes-deploy.md +460 -0
- package/content/prompts/devops/pipeline-cicd.md +358 -0
- package/content/prompts/devops/terraform-iac.md +502 -0
- package/content/prompts/escalabilidade/analise-performance.md +240 -0
- package/content/prompts/escalabilidade/analise-performance.txt +94 -0
- package/content/prompts/escalabilidade/caching.md +255 -0
- package/content/prompts/observabilidade/chaos-testing.md +237 -0
- package/content/prompts/observabilidade/estrategia-observabilidade.md +263 -0
- package/content/prompts/observabilidade/estrategia-observabilidade.txt +134 -0
- package/content/prompts/observabilidade/slos.md +215 -0
- package/content/prompts/produto/discovery-inicial.md +203 -0
- package/content/prompts/produto/discovery-inicial.txt +33 -0
- package/content/prompts/requisitos/refinar-requisitos.md +232 -0
- package/content/prompts/requisitos/refinar-requisitos.txt +40 -0
- package/content/prompts/seguranca/analise-seguranca.md +243 -0
- package/content/prompts/seguranca/pentest-checklist.md +333 -0
- package/content/prompts/seguranca/rate-limiting.md +356 -0
- package/content/prompts/seguranca/revisao-lgpd.md +227 -0
- package/content/prompts/seguranca/threat-modeling.md +224 -0
- package/content/prompts/testes/contract-testing.md +340 -0
- package/content/prompts/testes/gerar-testes-unitarios.md +474 -0
- package/content/prompts/testes/testes-e2e.md +460 -0
- package/content/prompts/testes/testes-integracao.md +418 -0
- package/content/prompts/testes/testes-performance.md +458 -0
- package/content/prompts/ux/gerar-ui-stitch.md +151 -0
- package/content/skills/api-patterns/SKILL.md +81 -0
- package/content/skills/api-patterns/api-style.md +42 -0
- package/content/skills/api-patterns/auth.md +24 -0
- package/content/skills/api-patterns/documentation.md +26 -0
- package/content/skills/api-patterns/graphql.md +41 -0
- package/content/skills/api-patterns/rate-limiting.md +31 -0
- package/content/skills/api-patterns/response.md +37 -0
- package/content/skills/api-patterns/rest.md +40 -0
- package/content/skills/api-patterns/scripts/api_validator.py +211 -0
- package/content/skills/api-patterns/security-testing.md +122 -0
- package/content/skills/api-patterns/trpc.md +41 -0
- package/content/skills/api-patterns/versioning.md +22 -0
- package/content/skills/app-builder/SKILL.md +75 -0
- package/content/skills/app-builder/agent-coordination.md +71 -0
- package/content/skills/app-builder/feature-building.md +53 -0
- package/content/skills/app-builder/project-detection.md +34 -0
- package/content/skills/app-builder/scaffolding.md +118 -0
- package/content/skills/app-builder/tech-stack.md +40 -0
- package/content/skills/app-builder/templates/SKILL.md +39 -0
- package/content/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
- package/content/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
- package/content/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
- package/content/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
- package/content/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
- package/content/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
- package/content/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
- package/content/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +82 -0
- package/content/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +100 -0
- package/content/skills/app-builder/templates/nextjs-static/TEMPLATE.md +106 -0
- package/content/skills/app-builder/templates/nuxt-app/TEMPLATE.md +101 -0
- package/content/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
- package/content/skills/app-builder/templates/react-native-app/TEMPLATE.md +93 -0
- package/content/skills/architecture/SKILL.md +55 -0
- package/content/skills/architecture/context-discovery.md +43 -0
- package/content/skills/architecture/examples.md +94 -0
- package/content/skills/architecture/pattern-selection.md +68 -0
- package/content/skills/architecture/patterns-reference.md +50 -0
- package/content/skills/architecture/trade-off-analysis.md +77 -0
- package/content/skills/bash-linux/SKILL.md +199 -0
- package/content/skills/behavioral-modes/SKILL.md +242 -0
- package/content/skills/brainstorming/SKILL.md +163 -0
- package/content/skills/brainstorming/dynamic-questioning.md +350 -0
- package/content/skills/clean-code/SKILL.md +201 -0
- package/content/skills/code-review-checklist/SKILL.md +109 -0
- package/content/skills/database-design/SKILL.md +52 -0
- package/content/skills/database-design/database-selection.md +43 -0
- package/content/skills/database-design/indexing.md +39 -0
- package/content/skills/database-design/migrations.md +48 -0
- package/content/skills/database-design/optimization.md +36 -0
- package/content/skills/database-design/orm-selection.md +30 -0
- package/content/skills/database-design/schema-design.md +56 -0
- package/content/skills/database-design/scripts/schema_validator.py +172 -0
- package/content/skills/deployment-procedures/SKILL.md +241 -0
- package/content/skills/doc.md +177 -0
- package/content/skills/documentation-templates/SKILL.md +194 -0
- package/content/skills/frontend-design/SKILL.md +396 -0
- package/content/skills/frontend-design/animation-guide.md +331 -0
- package/content/skills/frontend-design/color-system.md +311 -0
- package/content/skills/frontend-design/decision-trees.md +418 -0
- package/content/skills/frontend-design/motion-graphics.md +306 -0
- package/content/skills/frontend-design/scripts/accessibility_checker.py +183 -0
- package/content/skills/frontend-design/scripts/ux_audit.py +722 -0
- package/content/skills/frontend-design/typography-system.md +345 -0
- package/content/skills/frontend-design/ux-psychology.md +541 -0
- package/content/skills/frontend-design/visual-effects.md +383 -0
- package/content/skills/game-development/2d-games/SKILL.md +119 -0
- package/content/skills/game-development/3d-games/SKILL.md +135 -0
- package/content/skills/game-development/SKILL.md +167 -0
- package/content/skills/game-development/game-art/SKILL.md +185 -0
- package/content/skills/game-development/game-audio/SKILL.md +190 -0
- package/content/skills/game-development/game-design/SKILL.md +129 -0
- package/content/skills/game-development/mobile-games/SKILL.md +108 -0
- package/content/skills/game-development/multiplayer/SKILL.md +132 -0
- package/content/skills/game-development/pc-games/SKILL.md +144 -0
- package/content/skills/game-development/vr-ar/SKILL.md +123 -0
- package/content/skills/game-development/web-games/SKILL.md +150 -0
- package/content/skills/geo-fundamentals/SKILL.md +156 -0
- package/content/skills/geo-fundamentals/scripts/geo_checker.py +289 -0
- package/content/skills/i18n-localization/SKILL.md +154 -0
- package/content/skills/i18n-localization/scripts/i18n_checker.py +241 -0
- package/content/skills/intelligent-routing/SKILL.md +334 -0
- package/content/skills/lint-and-validate/SKILL.md +45 -0
- package/content/skills/lint-and-validate/scripts/lint_runner.py +172 -0
- package/content/skills/lint-and-validate/scripts/type_coverage.py +173 -0
- package/content/skills/mcp-builder/SKILL.md +176 -0
- package/content/skills/mobile-design/SKILL.md +394 -0
- package/content/skills/mobile-design/decision-trees.md +516 -0
- package/content/skills/mobile-design/mobile-backend.md +491 -0
- package/content/skills/mobile-design/mobile-color-system.md +420 -0
- package/content/skills/mobile-design/mobile-debugging.md +122 -0
- package/content/skills/mobile-design/mobile-design-thinking.md +357 -0
- package/content/skills/mobile-design/mobile-navigation.md +458 -0
- package/content/skills/mobile-design/mobile-performance.md +767 -0
- package/content/skills/mobile-design/mobile-testing.md +356 -0
- package/content/skills/mobile-design/mobile-typography.md +433 -0
- package/content/skills/mobile-design/platform-android.md +666 -0
- package/content/skills/mobile-design/platform-ios.md +561 -0
- package/content/skills/mobile-design/scripts/mobile_audit.py +670 -0
- package/content/skills/mobile-design/touch-psychology.md +537 -0
- package/content/skills/nextjs-best-practices/SKILL.md +203 -0
- package/content/skills/nodejs-best-practices/SKILL.md +333 -0
- package/content/skills/parallel-agents/SKILL.md +175 -0
- package/content/skills/performance-profiling/SKILL.md +143 -0
- package/content/skills/performance-profiling/scripts/lighthouse_audit.py +76 -0
- package/content/skills/plan-writing/SKILL.md +152 -0
- package/content/skills/powershell-windows/SKILL.md +167 -0
- package/content/skills/python-patterns/SKILL.md +441 -0
- package/content/skills/react-patterns/SKILL.md +198 -0
- package/content/skills/red-team-tactics/SKILL.md +199 -0
- package/content/skills/seo-fundamentals/SKILL.md +129 -0
- package/content/skills/seo-fundamentals/scripts/seo_checker.py +219 -0
- package/content/skills/server-management/SKILL.md +161 -0
- package/content/skills/systematic-debugging/SKILL.md +109 -0
- package/content/skills/tailwind-patterns/SKILL.md +269 -0
- package/content/skills/tdd-workflow/SKILL.md +149 -0
- package/content/skills/testing-patterns/SKILL.md +178 -0
- package/content/skills/testing-patterns/scripts/test_runner.py +219 -0
- package/content/skills/vulnerability-scanner/SKILL.md +276 -0
- package/content/skills/vulnerability-scanner/checklists.md +121 -0
- package/content/skills/vulnerability-scanner/scripts/security_scan.py +458 -0
- package/content/skills/webapp-testing/SKILL.md +187 -0
- package/content/skills/webapp-testing/scripts/playwright_runner.py +173 -0
- package/content/specialists/Especialista em Acessibilidade.md +266 -0
- package/content/specialists/Especialista em An/303/241lise de Testes.md" +434 -0
- package/content/specialists/Especialista em Arquitetura Avan/303/247ada.md" +358 -0
- package/content/specialists/Especialista em Arquitetura de Software.md +177 -0
- package/content/specialists/Especialista em Banco de Dados.md +260 -0
- package/content/specialists/Especialista em Contrato de API.md +172 -0
- package/content/specialists/Especialista em Dados e Analytics com IA.md +246 -0
- package/content/specialists/Especialista em Debugging e Troubleshooting.md +191 -0
- package/content/specialists/Especialista em Desenvolvimento Frontend.md +477 -0
- package/content/specialists/Especialista em Desenvolvimento Mobile.md +241 -0
- package/content/specialists/Especialista em Desenvolvimento e Vibe Coding Estruturado.md +417 -0
- package/content/specialists/Especialista em DevOps e Infraestrutura.md +294 -0
- package/content/specialists/Especialista em Documenta/303/247/303/243o T/303/251cnica.md" +227 -0
- package/content/specialists/Especialista em Engenharia de Requisitos com IA.md +299 -0
- package/content/specialists/Especialista em Explora/303/247/303/243o de Codebase.md" +179 -0
- package/content/specialists/Especialista em Gest/303/243o de Produto.md" +179 -0
- package/content/specialists/Especialista em Migra/303/247/303/243o e Moderniza/303/247/303/243o.md" +410 -0
- package/content/specialists/Especialista em Modelagem e Arquitetura de Dom/303/255nio com IA.md" +248 -0
- package/content/specialists/Especialista em Observabilidade.md +415 -0
- package/content/specialists/Especialista em Performance e Escalabilidade.md +373 -0
- package/content/specialists/Especialista em Plano de Execu/303/247/303/243o com IA.md" +341 -0
- package/content/specialists/Especialista em Prototipagem R/303/241pida com Google Stitch.md" +419 -0
- package/content/specialists/Especialista em Seguran/303/247a da Informa/303/247/303/243o.md" +508 -0
- package/content/specialists/Especialista em UX Design.md +453 -0
- package/content/specialists/INDEX.md +43 -0
- package/content/templates/PRD.md +165 -0
- package/content/templates/README.md +65 -0
- package/content/templates/adr.md +103 -0
- package/content/templates/arquitetura.md +279 -0
- package/content/templates/backlog.md +185 -0
- package/content/templates/checklist-seguranca.md +180 -0
- package/content/templates/contexto.md +120 -0
- package/content/templates/criterios-aceite.md +99 -0
- package/content/templates/design-banco.md +270 -0
- package/content/templates/design-doc.md +240 -0
- package/content/templates/feature.md +88 -0
- package/content/templates/historia-backend.md +84 -0
- package/content/templates/historia-frontend.md +75 -0
- package/content/templates/historia-usuario.md +125 -0
- package/content/templates/mapa-navegacao.md +133 -0
- package/content/templates/matriz-rastreabilidade.md +121 -0
- package/content/templates/modelo-dominio.md +219 -0
- package/content/templates/plano-testes.md +199 -0
- package/content/templates/prototipo-stitch.md +138 -0
- package/content/templates/requisitos.md +162 -0
- package/content/templates/slo-sli.md +197 -0
- package/content/workflows/README-MCP.md +363 -0
- package/content/workflows/brainstorm.md +113 -0
- package/content/workflows/create.md +59 -0
- package/content/workflows/debug.md +103 -0
- package/content/workflows/deploy.md +176 -0
- package/content/workflows/enhance.md +63 -0
- package/content/workflows/mcp-debug.md +506 -0
- package/content/workflows/mcp-feature.md +385 -0
- package/content/workflows/mcp-gate.md +413 -0
- package/content/workflows/mcp-next.md +388 -0
- package/content/workflows/mcp-refactor.md +600 -0
- package/content/workflows/mcp-start.md +304 -0
- package/content/workflows/mcp-status.md +400 -0
- package/content/workflows/orchestrate.md +237 -0
- package/content/workflows/plan.md +89 -0
- package/content/workflows/preview.md +81 -0
- package/content/workflows/status.md +86 -0
- package/content/workflows/test.md +144 -0
- package/content/workflows/ui-ux-pro-max.md +296 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.js +138 -0
- package/dist/commands/update.d.ts +5 -0
- package/dist/commands/update.js +50 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +21 -0
- package/package.json +48 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
# Prompt: Design de API REST
|
|
2
|
+
|
|
3
|
+
> **Quando usar**: Fase de arquitetura, antes de implementar endpoints
|
|
4
|
+
> **Especialista**: [Arquitetura de Software](../../02-especialistas/Especialista%20em%20Arquitetura%20de%20Software.md)
|
|
5
|
+
> **Nível**: Médio
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Fluxo de Contexto
|
|
10
|
+
|
|
11
|
+
Antes de usar este prompt, tenha em mãos:
|
|
12
|
+
- `docs/CONTEXTO.md` - Entendimento do projeto
|
|
13
|
+
- `docs/02-requisitos/requisitos.md` - Requisitos funcionais
|
|
14
|
+
- `docs/04-modelo/modelo-dominio.md` - Entidades do sistema
|
|
15
|
+
|
|
16
|
+
Após gerar, salve o resultado em:
|
|
17
|
+
- `docs/06-api/api-design.md`
|
|
18
|
+
- `docs/06-api/openapi.yaml` (especificação)
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Prompt Completo
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
Atue como arquiteto de APIs especializado em REST e OpenAPI.
|
|
26
|
+
|
|
27
|
+
## Contexto do Projeto
|
|
28
|
+
|
|
29
|
+
[COLE O CONTEÚDO DE docs/CONTEXTO.md]
|
|
30
|
+
|
|
31
|
+
## Requisitos Funcionais
|
|
32
|
+
|
|
33
|
+
[COLE RFs DE docs/02-requisitos/requisitos.md]
|
|
34
|
+
|
|
35
|
+
## Modelo de Domínio
|
|
36
|
+
|
|
37
|
+
[COLE ENTIDADES DE docs/04-modelo/modelo-dominio.md]
|
|
38
|
+
|
|
39
|
+
## Configurações
|
|
40
|
+
|
|
41
|
+
Versionamento: [URL path: /v1 | Header: X-API-Version | Query: ?version=1]
|
|
42
|
+
Autenticação: [JWT Bearer | API Key | OAuth 2.0 | Session]
|
|
43
|
+
Formato: [JSON | JSON:API | HAL]
|
|
44
|
+
Base URL: [https://api.exemplo.com]
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Sua Missão
|
|
49
|
+
|
|
50
|
+
Projete uma API REST completa seguindo boas práticas:
|
|
51
|
+
|
|
52
|
+
### 1. Recursos e Endpoints
|
|
53
|
+
|
|
54
|
+
Para cada recurso (baseado nas entidades):
|
|
55
|
+
|
|
56
|
+
**Recurso: /recursos**
|
|
57
|
+
|
|
58
|
+
| Método | Endpoint | Descrição | Auth |
|
|
59
|
+
|--------|----------|-----------|------|
|
|
60
|
+
| GET | /recursos | Listar (paginado) | Sim/Não |
|
|
61
|
+
| GET | /recursos/:id | Obter por ID | Sim/Não |
|
|
62
|
+
| POST | /recursos | Criar | Sim/Não |
|
|
63
|
+
| PUT | /recursos/:id | Atualizar completo | Sim/Não |
|
|
64
|
+
| PATCH | /recursos/:id | Atualizar parcial | Sim/Não |
|
|
65
|
+
| DELETE | /recursos/:id | Remover | Sim/Não |
|
|
66
|
+
|
|
67
|
+
### 2. Padrões de Nomenclatura
|
|
68
|
+
|
|
69
|
+
- Recursos no plural: /users, /orders
|
|
70
|
+
- Kebab-case para multi-palavras: /order-items
|
|
71
|
+
- IDs como path parameter: /users/:id
|
|
72
|
+
- Relacionamentos: /users/:id/orders
|
|
73
|
+
- Ações especiais: POST /orders/:id/cancel
|
|
74
|
+
|
|
75
|
+
### 3. Query Parameters
|
|
76
|
+
|
|
77
|
+
Padronize:
|
|
78
|
+
- **Paginação**: page, limit (ou cursor)
|
|
79
|
+
- **Ordenação**: sort=field:asc,field2:desc
|
|
80
|
+
- **Filtros**: filter[field]=value
|
|
81
|
+
- **Campos**: fields=id,name,email
|
|
82
|
+
- **Expands**: include=orders,profile
|
|
83
|
+
|
|
84
|
+
### 4. Request/Response Schemas
|
|
85
|
+
|
|
86
|
+
Para cada endpoint principal, defina:
|
|
87
|
+
|
|
88
|
+
**Request Body (POST/PUT)**
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"campo1": "tipo",
|
|
92
|
+
"campo2": "tipo"
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Response Body (Sucesso)**
|
|
97
|
+
```json
|
|
98
|
+
{
|
|
99
|
+
"data": { ... },
|
|
100
|
+
"meta": { ... }
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**Response Body (Lista)**
|
|
105
|
+
```json
|
|
106
|
+
{
|
|
107
|
+
"data": [ ... ],
|
|
108
|
+
"meta": {
|
|
109
|
+
"page": 1,
|
|
110
|
+
"limit": 20,
|
|
111
|
+
"total": 100,
|
|
112
|
+
"totalPages": 5
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### 5. HTTP Status Codes
|
|
118
|
+
|
|
119
|
+
| Código | Quando Usar |
|
|
120
|
+
|--------|-------------|
|
|
121
|
+
| 200 | Sucesso (GET, PUT, PATCH) |
|
|
122
|
+
| 201 | Criado (POST) |
|
|
123
|
+
| 204 | Sem conteúdo (DELETE) |
|
|
124
|
+
| 400 | Request inválido |
|
|
125
|
+
| 401 | Não autenticado |
|
|
126
|
+
| 403 | Não autorizado |
|
|
127
|
+
| 404 | Não encontrado |
|
|
128
|
+
| 409 | Conflito (duplicação) |
|
|
129
|
+
| 422 | Erro de validação |
|
|
130
|
+
| 429 | Rate limit exceeded |
|
|
131
|
+
| 500 | Erro interno |
|
|
132
|
+
|
|
133
|
+
### 6. Formato de Erros
|
|
134
|
+
|
|
135
|
+
```json
|
|
136
|
+
{
|
|
137
|
+
"error": {
|
|
138
|
+
"code": "VALIDATION_ERROR",
|
|
139
|
+
"message": "Mensagem amigável",
|
|
140
|
+
"details": [
|
|
141
|
+
{
|
|
142
|
+
"field": "email",
|
|
143
|
+
"message": "Email inválido"
|
|
144
|
+
}
|
|
145
|
+
],
|
|
146
|
+
"traceId": "abc-123"
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### 7. Headers
|
|
152
|
+
|
|
153
|
+
**Request Headers**
|
|
154
|
+
- Authorization: Bearer {token}
|
|
155
|
+
- Content-Type: application/json
|
|
156
|
+
- Accept: application/json
|
|
157
|
+
- X-Request-ID: {uuid}
|
|
158
|
+
|
|
159
|
+
**Response Headers**
|
|
160
|
+
- X-Request-ID: {uuid}
|
|
161
|
+
- X-RateLimit-Limit: 100
|
|
162
|
+
- X-RateLimit-Remaining: 95
|
|
163
|
+
- X-RateLimit-Reset: timestamp
|
|
164
|
+
|
|
165
|
+
### 8. Versionamento
|
|
166
|
+
|
|
167
|
+
Estratégia escolhida e como deprecar versões antigas.
|
|
168
|
+
|
|
169
|
+
### 9. Segurança
|
|
170
|
+
|
|
171
|
+
- Rate limiting por endpoint
|
|
172
|
+
- Validação de input
|
|
173
|
+
- CORS configuration
|
|
174
|
+
|
|
175
|
+
### 10. OpenAPI Specification
|
|
176
|
+
|
|
177
|
+
Gere a especificação OpenAPI 3.0 em YAML para os endpoints principais.
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Exemplo de Uso
|
|
183
|
+
|
|
184
|
+
```text
|
|
185
|
+
Atue como arquiteto de APIs especializado em REST e OpenAPI.
|
|
186
|
+
|
|
187
|
+
## Contexto do Projeto
|
|
188
|
+
|
|
189
|
+
Sistema de agendamento para salões de beleza.
|
|
190
|
+
|
|
191
|
+
## Requisitos Funcionais
|
|
192
|
+
|
|
193
|
+
- RF-001: Listar horários disponíveis
|
|
194
|
+
- RF-002: Criar agendamento
|
|
195
|
+
- RF-003: Cancelar agendamento
|
|
196
|
+
- RF-004: Listar agendamentos do dia
|
|
197
|
+
|
|
198
|
+
## Modelo de Domínio
|
|
199
|
+
|
|
200
|
+
- Cliente (id, nome, telefone, email)
|
|
201
|
+
- Servico (id, nome, duracao, preco)
|
|
202
|
+
- Profissional (id, nome, especialidades)
|
|
203
|
+
- Agendamento (id, clienteId, servicoId, profissionalId, dataHora, status)
|
|
204
|
+
|
|
205
|
+
## Configurações
|
|
206
|
+
|
|
207
|
+
Versionamento: URL path /v1
|
|
208
|
+
Autenticação: JWT Bearer (admin) / Público (cliente agendando)
|
|
209
|
+
Formato: JSON
|
|
210
|
+
Base URL: https://api.salao.com
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## Resposta Esperada
|
|
216
|
+
|
|
217
|
+
### Recursos
|
|
218
|
+
|
|
219
|
+
**Recurso: /agendamentos**
|
|
220
|
+
|
|
221
|
+
| Método | Endpoint | Descrição | Auth |
|
|
222
|
+
|--------|----------|-----------|------|
|
|
223
|
+
| GET | /v1/agendamentos | Listar (admin) | JWT |
|
|
224
|
+
| GET | /v1/agendamentos/:id | Obter | JWT |
|
|
225
|
+
| POST | /v1/agendamentos | Criar | Público |
|
|
226
|
+
| DELETE | /v1/agendamentos/:id | Cancelar | JWT ou Token |
|
|
227
|
+
|
|
228
|
+
**Recurso: /disponibilidade**
|
|
229
|
+
|
|
230
|
+
| Método | Endpoint | Descrição | Auth |
|
|
231
|
+
|--------|----------|-----------|------|
|
|
232
|
+
| GET | /v1/profissionais/:id/disponibilidade | Horários livres | Público |
|
|
233
|
+
|
|
234
|
+
### Request/Response
|
|
235
|
+
|
|
236
|
+
**POST /v1/agendamentos**
|
|
237
|
+
|
|
238
|
+
Request:
|
|
239
|
+
```json
|
|
240
|
+
{
|
|
241
|
+
"profissionalId": "uuid",
|
|
242
|
+
"servicoId": "uuid",
|
|
243
|
+
"dataHora": "2024-01-15T14:00:00Z",
|
|
244
|
+
"cliente": {
|
|
245
|
+
"nome": "Maria Silva",
|
|
246
|
+
"telefone": "11999998888"
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
Response (201):
|
|
252
|
+
```json
|
|
253
|
+
{
|
|
254
|
+
"data": {
|
|
255
|
+
"id": "uuid",
|
|
256
|
+
"status": "CONFIRMADO",
|
|
257
|
+
"dataHora": "2024-01-15T14:00:00Z",
|
|
258
|
+
"profissional": { "id": "uuid", "nome": "Ana" },
|
|
259
|
+
"servico": { "id": "uuid", "nome": "Corte", "duracao": 30 }
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### OpenAPI (Resumo)
|
|
265
|
+
|
|
266
|
+
```yaml
|
|
267
|
+
openapi: 3.0.3
|
|
268
|
+
info:
|
|
269
|
+
title: API Salão de Beleza
|
|
270
|
+
version: 1.0.0
|
|
271
|
+
|
|
272
|
+
paths:
|
|
273
|
+
/v1/agendamentos:
|
|
274
|
+
post:
|
|
275
|
+
summary: Criar agendamento
|
|
276
|
+
requestBody:
|
|
277
|
+
content:
|
|
278
|
+
application/json:
|
|
279
|
+
schema:
|
|
280
|
+
$ref: '#/components/schemas/CriarAgendamento'
|
|
281
|
+
responses:
|
|
282
|
+
'201':
|
|
283
|
+
description: Agendamento criado
|
|
284
|
+
content:
|
|
285
|
+
application/json:
|
|
286
|
+
schema:
|
|
287
|
+
$ref: '#/components/schemas/AgendamentoResponse'
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## Checklist Pós-Geração
|
|
293
|
+
|
|
294
|
+
- [ ] Todos os recursos mapeados das entidades
|
|
295
|
+
- [ ] Verbos HTTP corretos para cada ação
|
|
296
|
+
- [ ] Paginação padronizada
|
|
297
|
+
- [ ] Formato de erro consistente
|
|
298
|
+
- [ ] Status codes documentados
|
|
299
|
+
- [ ] Headers de request/response definidos
|
|
300
|
+
- [ ] Rate limiting especificado
|
|
301
|
+
- [ ] Versionamento definido
|
|
302
|
+
- [ ] OpenAPI spec gerada
|
|
303
|
+
- [ ] Salvar em `docs/06-api/api-design.md`
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
# Prompt: Idempotência em APIs
|
|
2
|
+
|
|
3
|
+
> **Prioridade**: 🔴 CRÍTICA
|
|
4
|
+
> **Aplicável a**: Projetos Nível 2 (Médio) e Nível 3 (Complexo)
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Por que é Crítico?
|
|
9
|
+
|
|
10
|
+
Sem idempotência, operações podem ser duplicadas em caso de:
|
|
11
|
+
- Retry automático de clientes
|
|
12
|
+
- Timeout de rede seguido de retry manual
|
|
13
|
+
- Falha de conexão após processamento
|
|
14
|
+
|
|
15
|
+
**Consequências em produção:**
|
|
16
|
+
- Cobranças duplicadas em pagamentos
|
|
17
|
+
- Pedidos duplicados em e-commerce
|
|
18
|
+
- Criação de recursos duplicados
|
|
19
|
+
- Inconsistência de dados
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Conceito
|
|
24
|
+
|
|
25
|
+
> **Idempotência**: Uma operação que pode ser executada múltiplas vezes produzindo o mesmo resultado.
|
|
26
|
+
|
|
27
|
+
| Método HTTP | Naturalmente Idempotente? |
|
|
28
|
+
|-------------|---------------------------|
|
|
29
|
+
| GET | ✅ Sim |
|
|
30
|
+
| PUT | ✅ Sim (substitui recurso) |
|
|
31
|
+
| DELETE | ✅ Sim (recurso já deletado = ok) |
|
|
32
|
+
| POST | ❌ **Não** - Requer implementação |
|
|
33
|
+
| PATCH | ⚠️ Depende da implementação |
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Prompt Base
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
Atue como arquiteto de APIs com foco em resiliência.
|
|
41
|
+
|
|
42
|
+
Preciso implementar idempotência no seguinte endpoint:
|
|
43
|
+
- Método: [POST/PATCH]
|
|
44
|
+
- Rota: [ex: /api/v1/payments]
|
|
45
|
+
- Operação: [ex: criar pagamento, processar pedido]
|
|
46
|
+
|
|
47
|
+
Stack: [ex: Node.js + Express + Redis / Java + Spring + PostgreSQL]
|
|
48
|
+
|
|
49
|
+
Gere uma implementação completa com:
|
|
50
|
+
|
|
51
|
+
1. **Estratégia de Idempotency Key**
|
|
52
|
+
- Via header `Idempotency-Key`
|
|
53
|
+
- Formato: UUID v4
|
|
54
|
+
- Validação de formato
|
|
55
|
+
|
|
56
|
+
2. **Armazenamento de Estado**
|
|
57
|
+
- Schema para Redis ou tabela em banco
|
|
58
|
+
- Estados: PROCESSING, COMPLETED, FAILED
|
|
59
|
+
- TTL apropriado (mínimo 24h)
|
|
60
|
+
|
|
61
|
+
3. **Fluxo de Processamento**
|
|
62
|
+
- Verificar se key já existe
|
|
63
|
+
- Se PROCESSING: retornar 409 Conflict
|
|
64
|
+
- Se COMPLETED: retornar resposta cacheada
|
|
65
|
+
- Se nova: processar e armazenar resultado
|
|
66
|
+
|
|
67
|
+
4. **Middleware/Interceptor**
|
|
68
|
+
- Código reutilizável para decorar endpoints
|
|
69
|
+
|
|
70
|
+
5. **Testes**
|
|
71
|
+
- Request normal (200)
|
|
72
|
+
- Request duplicada (resposta cached)
|
|
73
|
+
- Request durante processamento (409)
|
|
74
|
+
- Request com key inválida (400)
|
|
75
|
+
|
|
76
|
+
Inclua:
|
|
77
|
+
- Código completo e comentado
|
|
78
|
+
- Schema de armazenamento
|
|
79
|
+
- Exemplos de uso
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Padrões Obrigatórios
|
|
85
|
+
|
|
86
|
+
### Header Padrão
|
|
87
|
+
|
|
88
|
+
```http
|
|
89
|
+
POST /api/v1/orders HTTP/1.1
|
|
90
|
+
Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000
|
|
91
|
+
Content-Type: application/json
|
|
92
|
+
|
|
93
|
+
{
|
|
94
|
+
"product_id": "123",
|
|
95
|
+
"quantity": 1
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Respostas
|
|
100
|
+
|
|
101
|
+
| Cenário | Status Code | Body |
|
|
102
|
+
|---------|-------------|------|
|
|
103
|
+
| Primeira execução com sucesso | 200/201 | Recurso criado |
|
|
104
|
+
| Key já processada com sucesso | 200/201 | Resposta cacheada (idêntica) |
|
|
105
|
+
| Key em processamento | 409 Conflict | `{"error": "Request already in progress"}` |
|
|
106
|
+
| Key inválida/ausente | 400 Bad Request | `{"error": "Invalid Idempotency-Key"}` |
|
|
107
|
+
| Primeira execução com erro | 4xx/5xx | Erro original (cachear também) |
|
|
108
|
+
|
|
109
|
+
### Schema Redis
|
|
110
|
+
|
|
111
|
+
```plaintext
|
|
112
|
+
Key: idempotency:{idempotency_key}
|
|
113
|
+
TTL: 86400 (24 horas)
|
|
114
|
+
Value: {
|
|
115
|
+
"status": "PROCESSING" | "COMPLETED" | "FAILED",
|
|
116
|
+
"response_code": 201,
|
|
117
|
+
"response_body": {...},
|
|
118
|
+
"created_at": "2024-01-01T00:00:00Z"
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Schema SQL (Alternativa)
|
|
123
|
+
|
|
124
|
+
```sql
|
|
125
|
+
CREATE TABLE idempotency_keys (
|
|
126
|
+
key VARCHAR(36) PRIMARY KEY,
|
|
127
|
+
status VARCHAR(20) NOT NULL DEFAULT 'PROCESSING',
|
|
128
|
+
response_code INT,
|
|
129
|
+
response_body JSONB,
|
|
130
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
131
|
+
updated_at TIMESTAMP DEFAULT NOW()
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
CREATE INDEX idx_idempotency_created ON idempotency_keys(created_at);
|
|
135
|
+
|
|
136
|
+
-- Job para limpar keys antigas (> 24h)
|
|
137
|
+
DELETE FROM idempotency_keys WHERE created_at < NOW() - INTERVAL '24 hours';
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Exemplo de Implementação (Node.js + Express + Redis)
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
import { Redis } from 'ioredis';
|
|
146
|
+
import { Request, Response, NextFunction } from 'express';
|
|
147
|
+
|
|
148
|
+
const redis = new Redis();
|
|
149
|
+
const TTL_SECONDS = 86400; // 24 horas
|
|
150
|
+
|
|
151
|
+
interface IdempotencyRecord {
|
|
152
|
+
status: 'PROCESSING' | 'COMPLETED' | 'FAILED';
|
|
153
|
+
responseCode?: number;
|
|
154
|
+
responseBody?: any;
|
|
155
|
+
createdAt: string;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export function idempotent() {
|
|
159
|
+
return async (req: Request, res: Response, next: NextFunction) => {
|
|
160
|
+
const idempotencyKey = req.headers['idempotency-key'] as string;
|
|
161
|
+
|
|
162
|
+
// Validar presença e formato
|
|
163
|
+
if (!idempotencyKey) {
|
|
164
|
+
return res.status(400).json({ error: 'Idempotency-Key header required' });
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
168
|
+
if (!uuidRegex.test(idempotencyKey)) {
|
|
169
|
+
return res.status(400).json({ error: 'Invalid Idempotency-Key format' });
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const redisKey = `idempotency:${idempotencyKey}`;
|
|
173
|
+
|
|
174
|
+
// Verificar se já existe
|
|
175
|
+
const existing = await redis.get(redisKey);
|
|
176
|
+
|
|
177
|
+
if (existing) {
|
|
178
|
+
const record: IdempotencyRecord = JSON.parse(existing);
|
|
179
|
+
|
|
180
|
+
if (record.status === 'PROCESSING') {
|
|
181
|
+
return res.status(409).json({
|
|
182
|
+
error: 'Request already in progress',
|
|
183
|
+
idempotency_key: idempotencyKey
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Retornar resposta cacheada
|
|
188
|
+
return res.status(record.responseCode!).json(record.responseBody);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Marcar como em processamento
|
|
192
|
+
const processingRecord: IdempotencyRecord = {
|
|
193
|
+
status: 'PROCESSING',
|
|
194
|
+
createdAt: new Date().toISOString()
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
await redis.setex(redisKey, TTL_SECONDS, JSON.stringify(processingRecord));
|
|
198
|
+
|
|
199
|
+
// Interceptar a resposta para cachear
|
|
200
|
+
const originalJson = res.json.bind(res);
|
|
201
|
+
res.json = (body: any) => {
|
|
202
|
+
const completedRecord: IdempotencyRecord = {
|
|
203
|
+
status: res.statusCode >= 400 ? 'FAILED' : 'COMPLETED',
|
|
204
|
+
responseCode: res.statusCode,
|
|
205
|
+
responseBody: body,
|
|
206
|
+
createdAt: processingRecord.createdAt
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
redis.setex(redisKey, TTL_SECONDS, JSON.stringify(completedRecord));
|
|
210
|
+
|
|
211
|
+
return originalJson(body);
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
next();
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Uso no router
|
|
219
|
+
app.post('/api/v1/orders', idempotent(), createOrderHandler);
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Prompt para Revisar Idempotência Existente
|
|
225
|
+
|
|
226
|
+
```text
|
|
227
|
+
Tenho este endpoint que realiza operações que não podem ser duplicadas:
|
|
228
|
+
[COLE O CÓDIGO DO ENDPOINT]
|
|
229
|
+
|
|
230
|
+
Analise:
|
|
231
|
+
1. O endpoint é idempotente? Se não, por quê?
|
|
232
|
+
2. Quais operações podem causar problemas se duplicadas?
|
|
233
|
+
3. Sugira como adicionar idempotência mantendo compatibilidade.
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## Checklist de Implementação
|
|
239
|
+
|
|
240
|
+
- [ ] Header `Idempotency-Key` definido
|
|
241
|
+
- [ ] Validação de formato (UUID v4)
|
|
242
|
+
- [ ] Armazenamento de estado configurado (Redis/DB)
|
|
243
|
+
- [ ] TTL mínimo de 24 horas
|
|
244
|
+
- [ ] Tratamento de requisição em andamento (409)
|
|
245
|
+
- [ ] Cache de resposta para requests duplicadas
|
|
246
|
+
- [ ] Testes automatizados cobrindo todos os cenários
|
|
247
|
+
- [ ] Documentação na OpenAPI/Swagger
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## Referências
|
|
252
|
+
|
|
253
|
+
- [Stripe - Idempotent Requests](https://stripe.com/docs/api/idempotent_requests)
|
|
254
|
+
- [Idempotency Patterns](https://blog.bitsrc.io/design-patterns-for-microservices-idempotency/)
|