adi_dev_workflow 1.3.0 → 1.4.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.
Files changed (75) hide show
  1. package/frameworks/commands/ministack/generate-tasks.md +212 -212
  2. package/frameworks/commands/sdd/generate-task-plan.md +4 -4
  3. package/frameworks/commands/sdd/generate-tech-direction.md +2 -2
  4. package/frameworks/commands/sdd/generate-tech-spec.md +4 -4
  5. package/frameworks/commands/sdd/generate-tests.md +171 -39
  6. package/frameworks/config/ai-framework-config.yaml +2 -2
  7. package/frameworks/skills/ministack-tasks-expert/SKILL.md +115 -104
  8. package/frameworks/skills/ministack-tech-direction-expert/SKILL.md +21 -6
  9. package/frameworks/skills/prompt-engineer-expert/SKILL.md +10 -7
  10. package/frameworks/skills/sdd-tech-direction-expert/SKILL.md +21 -6
  11. package/frameworks/skills/sdd-tech-spec-expert/SKILL.md +23 -7
  12. package/package.json +1 -1
  13. package/src/cli.js +27 -2
  14. package/src/installer.js +185 -106
  15. package/frameworks/agents/qa-validation-expert.md +0 -458
  16. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/benchmark.json +0 -99
  17. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/benchmark.md +0 -64
  18. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/eval_metadata.json +0 -12
  19. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/grading.json +0 -32
  20. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/outputs/response.md +0 -134
  21. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/outputs/transcript.md +0 -68
  22. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/timing.json +0 -5
  23. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/grading.json +0 -32
  24. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/outputs/response.md +0 -525
  25. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/outputs/transcript.md +0 -30
  26. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/timing.json +0 -5
  27. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/eval_metadata.json +0 -12
  28. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/grading.json +0 -32
  29. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/response.md +0 -1126
  30. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/transcript.md +0 -131
  31. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/timing.json +0 -5
  32. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/grading.json +0 -32
  33. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/outputs/response.md +0 -452
  34. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/outputs/transcript.md +0 -78
  35. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/timing.json +0 -5
  36. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/eval_metadata.json +0 -12
  37. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/grading.json +0 -32
  38. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/outputs/response.md +0 -101
  39. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/outputs/transcript.md +0 -133
  40. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/timing.json +0 -5
  41. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/grading.json +0 -32
  42. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/response.md +0 -248
  43. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/transcript.md +0 -49
  44. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/timing.json +0 -5
  45. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/review.html +0 -1325
  46. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/benchmark.json +0 -94
  47. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/benchmark.md +0 -67
  48. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/eval_metadata.json +0 -12
  49. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/grading.json +0 -32
  50. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/outputs/response.md +0 -117
  51. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/outputs/transcript.md +0 -91
  52. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/timing.json +0 -1
  53. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/grading.json +0 -32
  54. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/outputs/response.md +0 -694
  55. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/outputs/transcript.md +0 -45
  56. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/timing.json +0 -1
  57. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/eval_metadata.json +0 -12
  58. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/grading.json +0 -32
  59. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/outputs/response.md +0 -1087
  60. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/outputs/transcript.md +0 -124
  61. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/timing.json +0 -1
  62. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/grading.json +0 -32
  63. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/outputs/response.md +0 -458
  64. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/outputs/transcript.md +0 -84
  65. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/timing.json +0 -1
  66. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/eval_metadata.json +0 -12
  67. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/grading.json +0 -32
  68. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/outputs/response.md +0 -70
  69. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/outputs/transcript.md +0 -148
  70. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/timing.json +0 -1
  71. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/grading.json +0 -32
  72. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/outputs/response.md +0 -249
  73. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/outputs/transcript.md +0 -80
  74. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/timing.json +0 -1
  75. package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/review.html +0 -1325
@@ -1,1126 +0,0 @@
1
- # Resposta Completa — TASK PLAN: Adicionar Telefone ao Usuario
2
-
3
- ## Simulacao do Fluxo Interativo
4
-
5
- ---
6
-
7
- ### Passo 1: Receber e ler o SPEC_TECH
8
-
9
- SPEC_TECH recebido e lido com sucesso.
10
-
11
- ### Passo 2: Extrair nome da feature
12
-
13
- Nome extraido da secao "1. Identificacao", campo "Feature/Projeto": **Adicionar Telefone ao Modulo de Usuario**
14
-
15
- Nome em kebab-case: `telefone-usuario`
16
- Diretorio: `docs/telefone-usuario/v1/`
17
-
18
- ### Passo 3: Confirmar nome
19
-
20
- > **Pergunta que seria feita ao usuario:**
21
- > "Obrigado! Vamos iniciar o TASK PLAN para **Adicionar Telefone ao Modulo de Usuario**. Podemos iniciar a definicao macro das fases?"
22
-
23
- > **Resposta simulada do usuario:** "Sim, pode iniciar."
24
-
25
- ### Passo 4: Analise obrigatoria do projeto
26
-
27
- **Analise realizada do codebase:**
28
-
29
- 1. **Migracao existente:** `internal/db/migrations/001_create_usuarios.sql` — tabela `usuarios` com colunas `id`, `nome`, `email`, `senha_hash`, `data_criacao`, `data_atualizacao`. NAO possui coluna `telefone`.
30
- 2. **Queries SQLC:** `internal/db/sqlc/queries/user.sql` — queries `CreateUser` e `GetUserByID`. NAO inclui `telefone`.
31
- 3. **Repository:** `internal/repository/user_repository.go` — struct `User` com campos `ID`, `Name`, `Email`, `PasswordHash`, `CreatedAt`, `UpdatedAt`. NAO possui `Phone`. Interface `UserRepository` com metodos `Create` e `GetByID`.
32
- 4. **Service:** `internal/service/user_service.go` — struct `CreateUserInput` com `Name`, `Email`, `Password`. NAO possui `Phone`. Interface `UserService` com `CreateUser` e `GetUser`. NAO possui `UpdateUser`.
33
- 5. **Handler:** `internal/handler/grpc/user_handler.go` — handler com `CreateUser` e `GetUser`. NAO possui `UpdateUser`.
34
- 6. **Proto:** `api/proto/v1/user.proto` — messages `CreateUserRequest`, `CreateUserResponse`, `GetUserRequest`, `GetUserResponse`. NAO possui `UpdateUser` nem campo `phone`.
35
- 7. **Testes existentes:** `user_service_test.go` (table-driven, testify/mock) e `user_handler_test.go` (testify/mock, gRPC status codes).
36
- 8. **Padrao de DI:** Uber FX modules em cada pacote, composicao em `internal/infra/di/fx.go`.
37
- 9. **Servidor gRPC:** `internal/infra/grpc/server.go` — registra `UserServiceServer`.
38
-
39
- **Observacao critica:** O SPEC_TECH menciona "UpdateUser" mas o endpoint `UpdateUser` NAO existe atualmente no projeto. Isso significa que a feature precisa CRIAR o endpoint UpdateUser completo (proto, handler, service, repository, queries SQLC, migracao).
40
-
41
- ### Passo 5: Propor macro-fases
42
-
43
- > **Pergunta que seria feita ao usuario:**
44
- > "Analisei o codebase e identifiquei que o endpoint UpdateUser NAO existe atualmente. O SPEC_TECH menciona atualizar CreateUser e UpdateUser para incluir telefone. Proponho as seguintes macro-fases:
45
- >
46
- > - **Fase 1 -- Preparacao / Banco de Dados**: Migracao para adicionar coluna `telefone` e atualizacao das queries SQLC
47
- > - **Fase 2 -- Implementacao Backend**: Atualizar repository, service e criar UpdateUser completo (repository + service) com campo phone
48
- > - **Fase 3 -- Interface gRPC**: Atualizar proto, handler CreateUser e criar handler UpdateUser com campo phone
49
- > - **Fase 4 -- Testes e Validacao**: Atualizar testes existentes e criar novos testes para o campo phone e endpoint UpdateUser
50
- >
51
- > Podemos seguir com estas fases?"
52
-
53
- > **Resposta simulada do usuario:** "Sim, pode seguir. O UpdateUser faz parte do escopo, pode criar do zero."
54
-
55
- ### Passo 6: Destrinchar tasks
56
-
57
- > **Pergunta que seria feita ao usuario:**
58
- > "Podemos destrinchar as tasks da Fase 1?"
59
-
60
- > **Resposta simulada do usuario:** "Sim."
61
-
62
- Apos analise detalhada do codebase e do SPEC_TECH, as tasks foram definidas conforme abaixo.
63
-
64
- ---
65
-
66
- ## TASK PLAN (documento de referencia)
67
-
68
- ---
69
-
70
- # TASK PLAN -- Plano de Execucao das Tasks
71
-
72
- ## 1. Identificacao
73
- - **Feature/Projeto**: Adicionar Telefone ao Modulo de Usuario
74
- - **Responsavel (Tech Lead)**: N/A (definido pelo time)
75
- - **Data**: 2026-03-07
76
- - **Status**: Rascunho
77
- - **SPEC Relacionado**: docs/feature-telefone-usuario/v1/spec_tech.md (inline no prompt)
78
- - **PRD Relacionado**: docs/feature-telefone-usuario/v1/prd.md
79
-
80
- ---
81
-
82
- ## 2. Objetivo do Task Plan
83
- Adicionar o campo opcional `telefone` a tabela `usuarios` no banco de dados SQLite, expor esse campo nos endpoints gRPC `CreateUser` e `GetUser`, e criar o endpoint completo `UpdateUser` com suporte ao campo `phone`. Ao final, o usuario podera informar, visualizar e atualizar seu telefone via API gRPC.
84
-
85
- ---
86
-
87
- ## 3. Macro-Fases (alto nivel)
88
- - **Fase 1 -- Preparacao / Banco de Dados**
89
- - Objetivo: Adicionar coluna `telefone` ao schema e atualizar queries SQLC
90
- - Tasks: T1, T2
91
- - **Fase 2 -- Implementacao Backend**
92
- - Objetivo: Atualizar repository e service para suportar campo phone e criar UpdateUser
93
- - Tasks: T3, T4
94
- - **Fase 3 -- Interface gRPC**
95
- - Objetivo: Atualizar proto e handlers para expor campo phone e endpoint UpdateUser
96
- - Tasks: T5, T6
97
- - **Fase 4 -- Testes e Validacao**
98
- - Objetivo: Atualizar testes existentes e criar novos testes
99
- - Tasks: (testes incluidos em cada task individual)
100
-
101
- ---
102
-
103
- ## 4. Lista de Tasks (visao macro)
104
- | ID | Nome da Task | Arquivo | Fase | Dependencias | Pode Rodar em Paralelo? | Status |
105
- | --- | ----------------------------------------------- | ----------------- | ---- | ------------ | ----------------------- | ------- |
106
- | T1 | Criar migracao para adicionar coluna telefone | [T1](tasks/T1.md) | 1 | Nenhuma | Sim (com T5) | A Fazer |
107
- | T2 | Atualizar queries SQLC para incluir telefone | [T2](tasks/T2.md) | 1 | T1 | Nao | A Fazer |
108
- | T3 | Atualizar repository com campo Phone | [T3](tasks/T3.md) | 2 | T2 | Nao | A Fazer |
109
- | T4 | Atualizar service com campo Phone e UpdateUser | [T4](tasks/T4.md) | 2 | T3 | Nao | A Fazer |
110
- | T5 | Atualizar proto com campo phone e UpdateUser | [T5](tasks/T5.md) | 3 | Nenhuma | Sim (com T1) | A Fazer |
111
- | T6 | Atualizar handler com campo phone e UpdateUser | [T6](tasks/T6.md) | 3 | T4, T5 | Nao | A Fazer |
112
-
113
- ---
114
-
115
- ## 5. Rastreabilidade: User Stories -> Tasks
116
-
117
- | User Story (PRD) | Definicao Tecnica (SPEC) | Tasks Relacionadas | Status |
118
- | ---------------- | --------------------------------------------------------------------- | ------------------ | ------- |
119
- | US-10 | 3.1 Banco de Dados: ALTER TABLE adicionar coluna telefone | T1 | A Fazer |
120
- | US-10 | 3.2 SQLC: Atualizar queries CreateUser e UpdateUser | T2 | A Fazer |
121
- | US-10 | 3.3 Repository: Adicionar campo Phone ao modelo User | T3 | A Fazer |
122
- | US-10 | 3.4 Service: Aceitar campo phone, validacao 10-15 caracteres | T4 | A Fazer |
123
- | US-10 | 3.5/3.6 Handler/Proto: Adicionar campo phone nas mensagens e UpdateUser | T5, T6 | A Fazer |
124
-
125
- > Esta tabela garante que TODAS as user stories do PRD tem tasks correspondentes para implementacao.
126
-
127
- ---
128
-
129
- ## 6. Dependencias Gerais
130
-
131
- - T1 (migracao) e T5 (proto) podem rodar em paralelo pois sao independentes
132
- - T2 depende de T1 (queries precisam da coluna no schema)
133
- - T3 depende de T2 (repository usa codigo gerado pelo SQLC)
134
- - T4 depende de T3 (service depende do repository)
135
- - T6 depende de T4 e T5 (handler depende do service e do proto gerado)
136
- - Apos T2 e T5, e necessario executar `make generate` (buf + sqlc) para regenerar codigo
137
-
138
- **Grafo de dependencias:**
139
- ```
140
- T1 --> T2 --> T3 --> T4 --\
141
- --> T6
142
- T5 ----------------------------/
143
- ```
144
-
145
- ---
146
-
147
- ## 7. Criterios de Conclusao da Feature
148
- A feature sera considerada concluida quando:
149
- - [x] Coluna `telefone` existe na tabela `usuarios`
150
- - [ ] Queries SQLC incluem `telefone` em CreateUser, UpdateUser e GetUserByID
151
- - [ ] Modelo `User` no repository possui campo `Phone`
152
- - [ ] Service aceita e valida campo `phone` (10-15 caracteres quando informado)
153
- - [ ] Endpoint CreateUser aceita campo `phone` opcional
154
- - [ ] Endpoint UpdateUser criado e funcional com campo `phone`
155
- - [ ] Campo `phone` retornado no GetUser
156
- - [ ] Todos os testes existentes atualizados e passando
157
- - [ ] Novos testes para validacao de telefone criados e passando
158
- - [ ] Nenhum comportamento divergente do PRD
159
- - [ ] Todas as User Stories cobertas (tabela secao 5)
160
-
161
- ---
162
-
163
- ## 8. Riscos & Mitigacoes
164
- - **Risco 1**: Migracao ALTER TABLE em SQLite pode ter limitacoes → Mitigacao: `ALTER TABLE ADD COLUMN` e suportado normalmente no SQLite para adicionar colunas
165
- - **Risco 2**: Queries SQLC existentes podem quebrar apos adicionar coluna → Mitigacao: Usar `SELECT *` ja existente nas queries garante que a nova coluna sera retornada automaticamente
166
- - **Risco 3**: Testes existentes podem falhar se mock nao incluir campo Phone → Mitigacao: Atualizar mocks e assertions em cada task que modifica interfaces
167
-
168
- ---
169
-
170
- ## 9. Checklist Final
171
- - [x] Task Plan completo
172
- - [x] Tasks mapeadas
173
- - [x] Dependencias validadas
174
- - [x] Rastreabilidade User Stories -> Tasks preenchida
175
- - [x] Pronto para execucao paralela
176
-
177
- ---
178
- ---
179
-
180
- ## TASKS INDIVIDUAIS
181
-
182
- ---
183
-
184
- # T1 -- Criar migracao para adicionar coluna telefone
185
-
186
- ## 1. Identificacao
187
- - **ID**: T1
188
- - **Nome da Task**: Criar migracao para adicionar coluna telefone
189
- - **Responsavel**: N/A
190
- - **Status**: A Fazer
191
- - **Fase**: 1 -- Preparacao / Banco de Dados
192
- - **Dependencias**: Nenhuma
193
- - **User Stories Relacionadas**: US-10
194
-
195
- ---
196
-
197
- ## 2. Objetivo da Task
198
- Criar arquivo de migracao SQL que adiciona a coluna `telefone` (TEXT, opcional) a tabela `usuarios`.
199
-
200
- ---
201
-
202
- ## 3. Descricao Detalhada
203
- Criar um novo arquivo de migracao seguindo a convencao de nomenclatura do projeto:
204
-
205
- 1. **Arquivo**: `internal/db/migrations/002_add_telefone_usuarios.sql`
206
- 2. **Conteudo**: Instrucao `ALTER TABLE usuarios ADD COLUMN telefone TEXT;`
207
- 3. A coluna e opcional (sem `NOT NULL`), pois o telefone nao e obrigatorio
208
- 4. NAO editar a migracao existente `001_create_usuarios.sql` (regra de imutabilidade de migracoes)
209
- 5. A migracao sera executada automaticamente no boot da aplicacao via golang-migrate
210
-
211
- **Observacao**: O projeto usa apenas migracoes `.sql` (sem separacao up/down em arquivos distintos com base no que existe). Seguir o mesmo padrao da migracao `001_create_usuarios.sql`.
212
-
213
- ---
214
-
215
- ## 4. Aceite Tecnico (criterios objetivos)
216
- A task estara concluida quando:
217
- - [ ] Arquivo `002_add_telefone_usuarios.sql` criado em `internal/db/migrations/`
218
- - [ ] SQL contem `ALTER TABLE usuarios ADD COLUMN telefone TEXT;`
219
- - [ ] Coluna e opcional (sem NOT NULL)
220
- - [ ] Migracao 001 NAO foi editada
221
- - [ ] Nenhuma quebra nos fluxos existentes
222
-
223
- ---
224
-
225
- ## 5. Arquivos Impactados
226
-
227
- ### 5.1 Arquivos a Criar
228
- | Arquivo | Descricao |
229
- |---------|-----------|
230
- | `internal/db/migrations/002_add_telefone_usuarios.sql` | Migracao para adicionar coluna telefone |
231
-
232
- ### 5.2 Arquivos a Modificar
233
- | Arquivo | Modificacao |
234
- |---------|------------|
235
- | Nenhum | N/A |
236
-
237
- ### 5.3 Arquivos de Referencia
238
- | Arquivo | Motivo da Consulta |
239
- |---------|-------------------|
240
- | `internal/db/migrations/001_create_usuarios.sql` | Referencia de padrao de migracao existente |
241
-
242
- ---
243
-
244
- ## 6. Testes
245
-
246
- ### 6.1 Testes Unitarios
247
- N/A -- migracao SQL nao possui testes unitarios isolados.
248
-
249
- ### 6.2 Testes de Integracao
250
- - [ ] Teste: Verificar que a migracao aplica corretamente e a coluna `telefone` existe na tabela `usuarios` apos execucao
251
- - [ ] Teste: Verificar que registros existentes na tabela `usuarios` continuam acessiveis apos a migracao (coluna `telefone` com valor NULL)
252
-
253
- ### 6.3 Testes E2E
254
- N/A -- validacao sera feita indiretamente pelos testes das camadas superiores.
255
-
256
- ### 6.4 Cenarios de Erro
257
- - [ ] Cenario: Migracao re-executada nao causa erro (idempotencia — verificar comportamento do golang-migrate)
258
-
259
- ---
260
-
261
- ## 7. Notas / Observacoes
262
- - SQLite suporta `ALTER TABLE ADD COLUMN` normalmente
263
- - A coluna sera NULL para usuarios existentes, o que e o comportamento desejado (campo opcional)
264
- - O projeto usa um unico arquivo `.sql` por migracao (nao separa up/down em arquivos distintos), conforme padrao observado em `001_create_usuarios.sql`
265
-
266
- ---
267
-
268
- ## 8. Checklist Final
269
- - [ ] Implementada conforme SPEC
270
- - [ ] Testes unitarios criados/atualizados
271
- - [ ] Testes de integracao criados/atualizados
272
- - [ ] Aceite tecnico atendido
273
- - [ ] Revisada
274
- - [ ] Integrada a branch principal
275
-
276
- ---
277
- ---
278
-
279
- # T2 -- Atualizar queries SQLC para incluir telefone
280
-
281
- ## 1. Identificacao
282
- - **ID**: T2
283
- - **Nome da Task**: Atualizar queries SQLC para incluir telefone
284
- - **Responsavel**: N/A
285
- - **Status**: A Fazer
286
- - **Fase**: 1 -- Preparacao / Banco de Dados
287
- - **Dependencias**: T1
288
- - **User Stories Relacionadas**: US-10
289
-
290
- ---
291
-
292
- ## 2. Objetivo da Task
293
- Atualizar as queries SQLC existentes para incluir a coluna `telefone` e criar a nova query `UpdateUser`. Apos editar, executar `make generate` para regenerar o codigo Go.
294
-
295
- ---
296
-
297
- ## 3. Descricao Detalhada
298
-
299
- ### 3.1 Atualizar query `CreateUser`
300
- No arquivo `internal/db/sqlc/queries/user.sql`, modificar a query `CreateUser` para incluir a coluna `telefone`:
301
-
302
- ```sql
303
- -- name: CreateUser :one
304
- INSERT INTO usuarios (id, nome, email, senha_hash, telefone, data_criacao, data_atualizacao)
305
- VALUES (?, ?, ?, ?, ?, ?, ?)
306
- RETURNING *;
307
- ```
308
-
309
- ### 3.2 Criar query `UpdateUser`
310
- Adicionar nova query `UpdateUser` ao arquivo `internal/db/sqlc/queries/user.sql`:
311
-
312
- ```sql
313
- -- name: UpdateUser :one
314
- UPDATE usuarios SET nome = ?, email = ?, telefone = ?, data_atualizacao = ?
315
- WHERE id = ?
316
- RETURNING *;
317
- ```
318
-
319
- ### 3.3 Query `GetUserByID`
320
- A query `GetUserByID` usa `SELECT *`, portanto ja retornara automaticamente a coluna `telefone`. NAO precisa ser alterada.
321
-
322
- ### 3.4 Regenerar codigo
323
- Executar `make generate` (ou `sqlc generate` dentro de `internal/db/sqlc/`) para regenerar os arquivos Go em `internal/db/sqlc/`.
324
-
325
- ---
326
-
327
- ## 4. Aceite Tecnico (criterios objetivos)
328
- A task estara concluida quando:
329
- - [ ] Query `CreateUser` inclui coluna `telefone`
330
- - [ ] Query `UpdateUser` criada com colunas `nome`, `email`, `telefone`, `data_atualizacao` e filtro por `id`
331
- - [ ] Query `GetUserByID` mantida inalterada (ja usa SELECT *)
332
- - [ ] `make generate` executado com sucesso
333
- - [ ] Codigo gerado em `internal/db/sqlc/` reflete as novas queries
334
- - [ ] Struct `CreateUserParams` gerada inclui campo `Telefone`
335
- - [ ] Struct `UpdateUserParams` gerada existe com campos corretos
336
- - [ ] Struct `Usuario` gerada inclui campo `Telefone`
337
-
338
- ---
339
-
340
- ## 5. Arquivos Impactados
341
-
342
- ### 5.1 Arquivos a Criar
343
- | Arquivo | Descricao |
344
- |---------|-----------|
345
- | Nenhum | N/A |
346
-
347
- ### 5.2 Arquivos a Modificar
348
- | Arquivo | Modificacao |
349
- |---------|------------|
350
- | `internal/db/sqlc/queries/user.sql` | Adicionar coluna `telefone` ao CreateUser e criar query UpdateUser |
351
-
352
- ### 5.3 Arquivos de Referencia
353
- | Arquivo | Motivo da Consulta |
354
- |---------|-------------------|
355
- | `internal/db/sqlc/sqlc.yaml` | Configuracao do SQLC para verificar engine e paths |
356
- | `internal/db/migrations/002_add_telefone_usuarios.sql` | Schema atualizado com coluna telefone |
357
-
358
- ---
359
-
360
- ## 6. Testes
361
-
362
- ### 6.1 Testes Unitarios
363
- N/A -- queries SQLC sao validadas na geracao e testadas via integracao.
364
-
365
- ### 6.2 Testes de Integracao
366
- - [ ] Teste: Query `CreateUser` com campo `telefone` preenchido insere registro corretamente e retorna todos os campos incluindo `telefone`
367
- - [ ] Teste: Query `CreateUser` com campo `telefone` vazio (NULL) insere registro corretamente
368
- - [ ] Teste: Query `UpdateUser` atualiza `nome`, `email`, `telefone` e `data_atualizacao` corretamente
369
- - [ ] Teste: Query `UpdateUser` com `telefone` NULL atualiza corretamente
370
- - [ ] Teste: Query `GetUserByID` retorna campo `telefone` corretamente
371
-
372
- ### 6.3 Testes E2E
373
- N/A -- coberto pelos testes de integracao e camadas superiores.
374
-
375
- ### 6.4 Cenarios de Erro
376
- - [ ] Cenario: `UpdateUser` com ID inexistente retorna erro (sql.ErrNoRows)
377
-
378
- ---
379
-
380
- ## 7. Notas / Observacoes
381
- - NAO editar arquivos em `internal/db/sqlc/` diretamente (sao gerados)
382
- - Apenas editar `internal/db/sqlc/queries/user.sql`
383
- - Apos editar, obrigatoriamente rodar `make generate`
384
- - O campo `telefone` no SQLite sera do tipo `sql.NullString` no codigo gerado (por ser nullable)
385
-
386
- ---
387
-
388
- ## 8. Checklist Final
389
- - [ ] Implementada conforme SPEC
390
- - [ ] Testes unitarios criados/atualizados
391
- - [ ] Testes de integracao criados/atualizados
392
- - [ ] Aceite tecnico atendido
393
- - [ ] Revisada
394
- - [ ] Integrada a branch principal
395
-
396
- ---
397
- ---
398
-
399
- # T3 -- Atualizar repository com campo Phone e metodo Update
400
-
401
- ## 1. Identificacao
402
- - **ID**: T3
403
- - **Nome da Task**: Atualizar repository com campo Phone e metodo Update
404
- - **Responsavel**: N/A
405
- - **Status**: A Fazer
406
- - **Fase**: 2 -- Implementacao Backend
407
- - **Dependencias**: T2
408
- - **User Stories Relacionadas**: US-10
409
-
410
- ---
411
-
412
- ## 2. Objetivo da Task
413
- Adicionar campo `Phone` ao modelo `User` do repository, atualizar o mapeamento SQLC, adicionar metodo `Update` a interface `UserRepository` e implementa-lo.
414
-
415
- ---
416
-
417
- ## 3. Descricao Detalhada
418
-
419
- ### 3.1 Atualizar struct `User`
420
- Em `internal/repository/user_repository.go`, adicionar campo `Phone` a struct `User`:
421
-
422
- ```go
423
- type User struct {
424
- ID string
425
- Name string
426
- Email string
427
- PasswordHash string
428
- Phone string // mapeado de 'telefone' no banco
429
- CreatedAt time.Time
430
- UpdatedAt time.Time
431
- }
432
- ```
433
-
434
- ### 3.2 Atualizar interface `UserRepository`
435
- Adicionar metodo `Update` a interface:
436
-
437
- ```go
438
- type UserRepository interface {
439
- Create(ctx context.Context, user *User) (*User, error)
440
- GetByID(ctx context.Context, id string) (*User, error)
441
- Update(ctx context.Context, user *User) (*User, error)
442
- }
443
- ```
444
-
445
- ### 3.3 Atualizar metodo `Create`
446
- Incluir campo `Telefone` nos params do SQLC:
447
-
448
- ```go
449
- params := sqlc.CreateUserParams{
450
- // ... campos existentes ...
451
- Telefone: sql.NullString{String: user.Phone, Valid: user.Phone != ""},
452
- }
453
- ```
454
-
455
- ### 3.4 Implementar metodo `Update`
456
- Criar metodo `Update` na struct `sqlcUserRepository`:
457
-
458
- ```go
459
- func (r *sqlcUserRepository) Update(ctx context.Context, user *User) (*User, error) {
460
- params := sqlc.UpdateUserParams{
461
- Nome: user.Name,
462
- Email: user.Email,
463
- Telefone: sql.NullString{String: user.Phone, Valid: user.Phone != ""},
464
- DataAtualizacao: user.UpdatedAt,
465
- ID: user.ID,
466
- }
467
- row, err := r.queries.UpdateUser(ctx, params)
468
- if err != nil {
469
- if err == sql.ErrNoRows {
470
- return nil, fmt.Errorf("repository: usuario com id %q nao encontrado", user.ID)
471
- }
472
- return nil, fmt.Errorf("repository: falha ao atualizar usuario: %w", err)
473
- }
474
- return toUser(row), nil
475
- }
476
- ```
477
-
478
- ### 3.5 Atualizar funcao `toUser`
479
- Incluir mapeamento do campo `Telefone`:
480
-
481
- ```go
482
- func toUser(u sqlc.Usuario) *User {
483
- return &User{
484
- // ... campos existentes ...
485
- Phone: u.Telefone.String, // NullString -> string
486
- }
487
- }
488
- ```
489
-
490
- ---
491
-
492
- ## 4. Aceite Tecnico (criterios objetivos)
493
- A task estara concluida quando:
494
- - [ ] Struct `User` possui campo `Phone string`
495
- - [ ] Interface `UserRepository` possui metodo `Update(ctx, *User) (*User, error)`
496
- - [ ] Metodo `Create` envia campo `Telefone` ao SQLC
497
- - [ ] Metodo `Update` implementado com mapeamento correto
498
- - [ ] Funcao `toUser` mapeia `Telefone` -> `Phone`
499
- - [ ] Tratamento de `sql.NullString` para campo nullable
500
- - [ ] Erros encapsulados com mensagens em portugues
501
- - [ ] Nenhuma quebra nos fluxos existentes
502
-
503
- ---
504
-
505
- ## 5. Arquivos Impactados
506
-
507
- ### 5.1 Arquivos a Criar
508
- | Arquivo | Descricao |
509
- |---------|-----------|
510
- | Nenhum | N/A |
511
-
512
- ### 5.2 Arquivos a Modificar
513
- | Arquivo | Modificacao |
514
- |---------|------------|
515
- | `internal/repository/user_repository.go` | Adicionar campo Phone ao User, metodo Update a interface e implementacao, atualizar Create e toUser |
516
-
517
- ### 5.3 Arquivos de Referencia
518
- | Arquivo | Motivo da Consulta |
519
- |---------|-------------------|
520
- | `internal/db/sqlc/` (codigo gerado) | Verificar structs e metodos gerados pelo SQLC |
521
-
522
- ---
523
-
524
- ## 6. Testes
525
-
526
- ### 6.1 Testes Unitarios
527
- N/A -- repository e testado via integracao (depende do banco).
528
-
529
- ### 6.2 Testes de Integracao
530
- - [ ] Teste: `Create` com campo `Phone` preenchido persiste e retorna corretamente
531
- - [ ] Teste: `Create` com campo `Phone` vazio persiste com `telefone` NULL no banco
532
- - [ ] Teste: `Update` com campo `Phone` preenchido atualiza e retorna corretamente
533
- - [ ] Teste: `Update` com campo `Phone` vazio (limpar telefone) atualiza corretamente
534
- - [ ] Teste: `GetByID` retorna campo `Phone` corretamente
535
- - [ ] Teste: `Update` com ID inexistente retorna erro "usuario nao encontrado"
536
-
537
- ### 6.3 Testes E2E
538
- N/A -- coberto pelos testes de integracao e testes do service.
539
-
540
- ### 6.4 Cenarios de Erro
541
- - [ ] Cenario: `Update` com ID inexistente retorna erro adequado
542
- - [ ] Cenario: `Update` com email duplicado retorna erro de constraint
543
-
544
- ---
545
-
546
- ## 7. Notas / Observacoes
547
- - O campo `telefone` no banco e nullable, portanto usar `sql.NullString` nos params SQLC
548
- - Na conversao de volta (`toUser`), converter `NullString.String` para string simples (vazio se NULL)
549
- - O import de `database/sql` ja existe no arquivo
550
-
551
- ---
552
-
553
- ## 8. Checklist Final
554
- - [ ] Implementada conforme SPEC
555
- - [ ] Testes unitarios criados/atualizados
556
- - [ ] Testes de integracao criados/atualizados
557
- - [ ] Aceite tecnico atendido
558
- - [ ] Revisada
559
- - [ ] Integrada a branch principal
560
-
561
- ---
562
- ---
563
-
564
- # T4 -- Atualizar service com campo Phone, validacao e UpdateUser
565
-
566
- ## 1. Identificacao
567
- - **ID**: T4
568
- - **Nome da Task**: Atualizar service com campo Phone, validacao e UpdateUser
569
- - **Responsavel**: N/A
570
- - **Status**: A Fazer
571
- - **Fase**: 2 -- Implementacao Backend
572
- - **Dependencias**: T3
573
- - **User Stories Relacionadas**: US-10
574
-
575
- ---
576
-
577
- ## 2. Objetivo da Task
578
- Adicionar campo `Phone` ao `CreateUserInput`, criar `UpdateUserInput`, adicionar metodo `UpdateUser` a interface `UserService`, implementar validacao de telefone (10-15 caracteres quando informado) e implementar o metodo `UpdateUser`.
579
-
580
- ---
581
-
582
- ## 3. Descricao Detalhada
583
-
584
- ### 3.1 Atualizar `CreateUserInput`
585
- Adicionar campo `Phone` ao input de criacao:
586
-
587
- ```go
588
- type CreateUserInput struct {
589
- Name string
590
- Email string
591
- Password string
592
- Phone string // opcional
593
- }
594
- ```
595
-
596
- ### 3.2 Criar `UpdateUserInput`
597
- Criar nova struct de input para atualizacao:
598
-
599
- ```go
600
- type UpdateUserInput struct {
601
- ID string
602
- Name string
603
- Email string
604
- Phone string // opcional
605
- }
606
- ```
607
-
608
- ### 3.3 Criar variavel de erro para telefone
609
- ```go
610
- var ErrInvalidPhone = errors.New("telefone deve ter entre 10 e 15 caracteres")
611
- ```
612
-
613
- ### 3.4 Atualizar interface `UserService`
614
- Adicionar metodo `UpdateUser`:
615
-
616
- ```go
617
- type UserService interface {
618
- CreateUser(ctx context.Context, input CreateUserInput) (*repository.User, error)
619
- GetUser(ctx context.Context, id string) (*repository.User, error)
620
- UpdateUser(ctx context.Context, input UpdateUserInput) (*repository.User, error)
621
- }
622
- ```
623
-
624
- ### 3.5 Atualizar metodo `CreateUser`
625
- Adicionar validacao de telefone e passar campo Phone ao repository:
626
-
627
- ```go
628
- func (s *userServiceImpl) CreateUser(ctx context.Context, input CreateUserInput) (*repository.User, error) {
629
- // ... validacoes existentes ...
630
-
631
- // Validacao de telefone (opcional)
632
- if input.Phone != "" {
633
- if len(input.Phone) < 10 || len(input.Phone) > 15 {
634
- return nil, ErrInvalidPhone
635
- }
636
- }
637
-
638
- // ... hash de senha ...
639
-
640
- user := &repository.User{
641
- // ... campos existentes ...
642
- Phone: input.Phone,
643
- }
644
- return s.repo.Create(ctx, user)
645
- }
646
- ```
647
-
648
- ### 3.6 Implementar metodo `UpdateUser`
649
- ```go
650
- func (s *userServiceImpl) UpdateUser(ctx context.Context, input UpdateUserInput) (*repository.User, error) {
651
- if input.ID == "" {
652
- return nil, errors.New("id e obrigatorio")
653
- }
654
- if input.Name == "" {
655
- return nil, errors.New("nome e obrigatorio")
656
- }
657
- if input.Email == "" {
658
- return nil, errors.New("email e obrigatorio")
659
- }
660
- if input.Phone != "" {
661
- if len(input.Phone) < 10 || len(input.Phone) > 15 {
662
- return nil, ErrInvalidPhone
663
- }
664
- }
665
-
666
- now := time.Now()
667
- user := &repository.User{
668
- ID: input.ID,
669
- Name: input.Name,
670
- Email: input.Email,
671
- Phone: input.Phone,
672
- UpdatedAt: now,
673
- }
674
- return s.repo.Update(ctx, user)
675
- }
676
- ```
677
-
678
- ---
679
-
680
- ## 4. Aceite Tecnico (criterios objetivos)
681
- A task estara concluida quando:
682
- - [ ] `CreateUserInput` possui campo `Phone`
683
- - [ ] `UpdateUserInput` criado com campos `ID`, `Name`, `Email`, `Phone`
684
- - [ ] Interface `UserService` possui metodo `UpdateUser`
685
- - [ ] Validacao de telefone: se informado, entre 10 e 15 caracteres
686
- - [ ] Validacao de telefone: se vazio, aceito sem erro (campo opcional)
687
- - [ ] `ErrInvalidPhone` definido como variavel de erro exportada
688
- - [ ] `CreateUser` passa campo `Phone` ao repository
689
- - [ ] `UpdateUser` implementado com validacoes de nome, email, id e phone
690
- - [ ] Erros com mensagens em portugues
691
- - [ ] Nenhuma quebra nos fluxos existentes
692
-
693
- ---
694
-
695
- ## 5. Arquivos Impactados
696
-
697
- ### 5.1 Arquivos a Criar
698
- | Arquivo | Descricao |
699
- |---------|-----------|
700
- | Nenhum | N/A |
701
-
702
- ### 5.2 Arquivos a Modificar
703
- | Arquivo | Modificacao |
704
- |---------|------------|
705
- | `internal/service/user_service.go` | Adicionar Phone ao CreateUserInput, criar UpdateUserInput, UpdateUser, validacao de telefone |
706
-
707
- ### 5.3 Arquivos de Referencia
708
- | Arquivo | Motivo da Consulta |
709
- |---------|-------------------|
710
- | `internal/repository/user_repository.go` | Interface UserRepository e struct User atualizadas |
711
-
712
- ---
713
-
714
- ## 6. Testes
715
-
716
- ### 6.1 Testes Unitarios
717
- - [ ] Teste: `CreateUser` com phone valido (10 caracteres) cria usuario com sucesso
718
- - [ ] Teste: `CreateUser` com phone valido (15 caracteres) cria usuario com sucesso
719
- - [ ] Teste: `CreateUser` com phone vazio cria usuario com sucesso (campo opcional)
720
- - [ ] Teste: `CreateUser` com phone invalido (9 caracteres) retorna `ErrInvalidPhone`
721
- - [ ] Teste: `CreateUser` com phone invalido (16 caracteres) retorna `ErrInvalidPhone`
722
- - [ ] Teste: `UpdateUser` com dados validos atualiza usuario com sucesso
723
- - [ ] Teste: `UpdateUser` com phone valido atualiza com sucesso
724
- - [ ] Teste: `UpdateUser` com phone vazio atualiza com sucesso
725
- - [ ] Teste: `UpdateUser` com phone invalido retorna `ErrInvalidPhone`
726
- - [ ] Teste: `UpdateUser` com ID vazio retorna erro
727
- - [ ] Teste: `UpdateUser` com nome vazio retorna erro
728
- - [ ] Teste: `UpdateUser` com email vazio retorna erro
729
- - [ ] Teste: `UpdateUser` com erro do repository propaga erro
730
-
731
- ### 6.2 Testes de Integracao
732
- N/A -- service e testado com mocks do repository (unitarios).
733
-
734
- ### 6.3 Testes E2E
735
- N/A -- coberto pelos testes do handler.
736
-
737
- ### 6.4 Cenarios de Erro
738
- - [ ] Cenario: Validacao de telefone com caracteres no limite inferior (10) e superior (15) -- boundary test
739
- - [ ] Cenario: Repository retorna erro na atualizacao (ex: usuario nao encontrado)
740
-
741
- ### Testes existentes a modificar
742
- | Arquivo | Modificacao |
743
- |---------|------------|
744
- | `internal/service/user_service_test.go` | Atualizar mock `MockUserRepository` para incluir metodo `Update`. Atualizar testes de `CreateUser` para incluir campo `Phone` no `CreateUserInput`. Adicionar novos testes para `UpdateUser` e validacao de telefone. |
745
-
746
- ---
747
-
748
- ## 7. Notas / Observacoes
749
- - O mock `MockUserRepository` no arquivo de testes precisa ser atualizado para incluir o metodo `Update`
750
- - Os testes existentes de `CreateUser` continuam validos, pois `Phone` e opcional (zero value "" e aceito)
751
- - Padrao table-driven deve ser usado para testes de validacao de telefone (conforme padrao existente)
752
-
753
- ---
754
-
755
- ## 8. Checklist Final
756
- - [ ] Implementada conforme SPEC
757
- - [ ] Testes unitarios criados/atualizados
758
- - [ ] Testes de integracao criados/atualizados
759
- - [ ] Aceite tecnico atendido
760
- - [ ] Revisada
761
- - [ ] Integrada a branch principal
762
-
763
- ---
764
- ---
765
-
766
- # T5 -- Atualizar proto com campo phone e endpoint UpdateUser
767
-
768
- ## 1. Identificacao
769
- - **ID**: T5
770
- - **Nome da Task**: Atualizar proto com campo phone e endpoint UpdateUser
771
- - **Responsavel**: N/A
772
- - **Status**: A Fazer
773
- - **Fase**: 3 -- Interface gRPC
774
- - **Dependencias**: Nenhuma
775
- - **User Stories Relacionadas**: US-10
776
-
777
- ---
778
-
779
- ## 2. Objetivo da Task
780
- Atualizar o arquivo `api/proto/v1/user.proto` para adicionar campo `phone` nas mensagens existentes, criar mensagens `UpdateUserRequest`/`UpdateUserResponse` e adicionar RPC `UpdateUser` ao service. Executar `make generate` para regenerar codigo.
781
-
782
- ---
783
-
784
- ## 3. Descricao Detalhada
785
-
786
- ### 3.1 Adicionar campo `phone` ao `CreateUserRequest`
787
- ```proto
788
- message CreateUserRequest {
789
- string name = 1;
790
- string email = 2;
791
- string password = 3;
792
- string phone = 4; // opcional
793
- }
794
- ```
795
-
796
- ### 3.2 Adicionar campo `phone` ao `CreateUserResponse`
797
- ```proto
798
- message CreateUserResponse {
799
- string id = 1;
800
- string name = 2;
801
- string email = 3;
802
- string created_at = 4;
803
- string phone = 5;
804
- }
805
- ```
806
-
807
- ### 3.3 Adicionar campo `phone` ao `GetUserResponse`
808
- ```proto
809
- message GetUserResponse {
810
- string id = 1;
811
- string name = 2;
812
- string email = 3;
813
- string created_at = 4;
814
- string updated_at = 5;
815
- string phone = 6;
816
- }
817
- ```
818
-
819
- ### 3.4 Criar mensagens `UpdateUserRequest` e `UpdateUserResponse`
820
- ```proto
821
- message UpdateUserRequest {
822
- string id = 1;
823
- string name = 2;
824
- string email = 3;
825
- string phone = 4;
826
- }
827
-
828
- message UpdateUserResponse {
829
- string id = 1;
830
- string name = 2;
831
- string email = 3;
832
- string phone = 4;
833
- string created_at = 5;
834
- string updated_at = 6;
835
- }
836
- ```
837
-
838
- ### 3.5 Adicionar RPC `UpdateUser` ao service
839
- ```proto
840
- service UserService {
841
- rpc CreateUser(CreateUserRequest) returns (CreateUserResponse);
842
- rpc GetUser(GetUserRequest) returns (GetUserResponse);
843
- rpc UpdateUser(UpdateUserRequest) returns (UpdateUserResponse);
844
- }
845
- ```
846
-
847
- ### 3.6 Regenerar codigo
848
- Executar `make generate` (buf generate) para regenerar `gen/proto/v1/`.
849
-
850
- ---
851
-
852
- ## 4. Aceite Tecnico (criterios objetivos)
853
- A task estara concluida quando:
854
- - [ ] Campo `phone` adicionado a `CreateUserRequest` (field number 4)
855
- - [ ] Campo `phone` adicionado a `CreateUserResponse` (field number 5)
856
- - [ ] Campo `phone` adicionado a `GetUserResponse` (field number 6)
857
- - [ ] Mensagens `UpdateUserRequest` e `UpdateUserResponse` criadas
858
- - [ ] RPC `UpdateUser` adicionado ao `UserService`
859
- - [ ] `make generate` executado com sucesso
860
- - [ ] Codigo gerado em `gen/proto/v1/` reflete as novas mensagens e RPC
861
- - [ ] Numeracao de campos nao reutiliza numeros existentes
862
-
863
- ---
864
-
865
- ## 5. Arquivos Impactados
866
-
867
- ### 5.1 Arquivos a Criar
868
- | Arquivo | Descricao |
869
- |---------|-----------|
870
- | Nenhum | N/A |
871
-
872
- ### 5.2 Arquivos a Modificar
873
- | Arquivo | Modificacao |
874
- |---------|------------|
875
- | `api/proto/v1/user.proto` | Adicionar campo phone em messages existentes, criar UpdateUser request/response, adicionar RPC UpdateUser |
876
-
877
- ### 5.3 Arquivos de Referencia
878
- | Arquivo | Motivo da Consulta |
879
- |---------|-------------------|
880
- | `buf.yaml` | Verificar regras de lint |
881
- | `buf.gen.yaml` | Verificar plugins de geracao |
882
-
883
- ---
884
-
885
- ## 6. Testes
886
-
887
- ### 6.1 Testes Unitarios
888
- N/A -- arquivo proto nao possui testes unitarios. Validacao e feita pelo buf lint.
889
-
890
- ### 6.2 Testes de Integracao
891
- N/A -- coberto pelos testes do handler.
892
-
893
- ### 6.3 Testes E2E
894
- N/A -- coberto pelos testes do handler.
895
-
896
- ### 6.4 Cenarios de Erro
897
- - [ ] Cenario: `buf lint` passa sem erros apos modificacoes
898
- - [ ] Cenario: `make generate` compila sem erros
899
-
900
- ---
901
-
902
- ## 7. Notas / Observacoes
903
- - Esta task pode rodar em paralelo com T1 (sao independentes)
904
- - NAO editar arquivos em `gen/` diretamente
905
- - Apenas editar `api/proto/v1/user.proto`
906
- - Apos editar, obrigatoriamente rodar `make generate`
907
- - Field numbers novos devem seguir sequencia existente sem reutilizar numeros
908
-
909
- ---
910
-
911
- ## 8. Checklist Final
912
- - [ ] Implementada conforme SPEC
913
- - [ ] Testes unitarios criados/atualizados
914
- - [ ] Testes de integracao criados/atualizados
915
- - [ ] Aceite tecnico atendido
916
- - [ ] Revisada
917
- - [ ] Integrada a branch principal
918
-
919
- ---
920
- ---
921
-
922
- # T6 -- Atualizar handler com campo phone e endpoint UpdateUser
923
-
924
- ## 1. Identificacao
925
- - **ID**: T6
926
- - **Nome da Task**: Atualizar handler com campo phone e endpoint UpdateUser
927
- - **Responsavel**: N/A
928
- - **Status**: A Fazer
929
- - **Fase**: 3 -- Interface gRPC
930
- - **Dependencias**: T4, T5
931
- - **User Stories Relacionadas**: US-10
932
-
933
- ---
934
-
935
- ## 2. Objetivo da Task
936
- Atualizar o handler gRPC `CreateUser` para incluir campo `phone`, implementar handler `UpdateUser`, atualizar `GetUser` para retornar `phone`, e atualizar o mapeamento de erros para incluir validacao de telefone. Registrar o endpoint `UpdateUser` no servidor gRPC.
937
-
938
- ---
939
-
940
- ## 3. Descricao Detalhada
941
-
942
- ### 3.1 Atualizar handler `CreateUser`
943
- Em `internal/handler/grpc/user_handler.go`, incluir campo `Phone` no input e na response:
944
-
945
- ```go
946
- func (h *UserHandler) CreateUser(ctx context.Context, req *pb.CreateUserRequest) (*pb.CreateUserResponse, error) {
947
- input := service.CreateUserInput{
948
- Name: req.GetName(),
949
- Email: req.GetEmail(),
950
- Password: req.GetPassword(),
951
- Phone: req.GetPhone(),
952
- }
953
- user, err := h.userService.CreateUser(ctx, input)
954
- if err != nil {
955
- return nil, mapServiceError(err)
956
- }
957
- return &pb.CreateUserResponse{
958
- Id: user.ID,
959
- Name: user.Name,
960
- Email: user.Email,
961
- Phone: user.Phone,
962
- CreatedAt: user.CreatedAt.Format(time.RFC3339),
963
- }, nil
964
- }
965
- ```
966
-
967
- ### 3.2 Atualizar handler `GetUser`
968
- Incluir campo `Phone` na response:
969
-
970
- ```go
971
- return &pb.GetUserResponse{
972
- // ... campos existentes ...
973
- Phone: user.Phone,
974
- }, nil
975
- ```
976
-
977
- ### 3.3 Implementar handler `UpdateUser`
978
- ```go
979
- func (h *UserHandler) UpdateUser(ctx context.Context, req *pb.UpdateUserRequest) (*pb.UpdateUserResponse, error) {
980
- input := service.UpdateUserInput{
981
- ID: req.GetId(),
982
- Name: req.GetName(),
983
- Email: req.GetEmail(),
984
- Phone: req.GetPhone(),
985
- }
986
- user, err := h.userService.UpdateUser(ctx, input)
987
- if err != nil {
988
- return nil, mapServiceError(err)
989
- }
990
- return &pb.UpdateUserResponse{
991
- Id: user.ID,
992
- Name: user.Name,
993
- Email: user.Email,
994
- Phone: user.Phone,
995
- CreatedAt: user.CreatedAt.Format(time.RFC3339),
996
- UpdatedAt: user.UpdatedAt.Format(time.RFC3339),
997
- }, nil
998
- }
999
- ```
1000
-
1001
- ### 3.4 Atualizar `mapServiceError`
1002
- Adicionar mapeamento para erro de telefone invalido (ja coberto pelo pattern "obrigatorio" existente, mas verificar se "deve ter entre" precisa de tratamento):
1003
-
1004
- O erro `ErrInvalidPhone` ("telefone deve ter entre 10 e 15 caracteres") deve ser mapeado para `codes.InvalidArgument`. Verificar se o pattern existente no `mapServiceError` cobre este caso. Se nao cobrir, adicionar verificacao.
1005
-
1006
- ### 3.5 Configurar autenticacao
1007
- Se `UpdateUser` deve ser protegido (requer autenticacao), NAO adicionar a `skip_methods` em `configs/config.yaml`. Se deve ser publico, adicionar. Conforme o SPEC_TECH, nao ha indicacao de que deva ser publico, entao sera protegido por padrao.
1008
-
1009
- ---
1010
-
1011
- ## 4. Aceite Tecnico (criterios objetivos)
1012
- A task estara concluida quando:
1013
- - [ ] Handler `CreateUser` passa campo `Phone` ao service e retorna na response
1014
- - [ ] Handler `GetUser` retorna campo `Phone` na response
1015
- - [ ] Handler `UpdateUser` implementado e funcional
1016
- - [ ] Mapeamento de erros atualizado para erro de telefone invalido
1017
- - [ ] Nenhuma quebra nos fluxos existentes
1018
- - [ ] Handler compila corretamente contra o proto gerado
1019
-
1020
- ---
1021
-
1022
- ## 5. Arquivos Impactados
1023
-
1024
- ### 5.1 Arquivos a Criar
1025
- | Arquivo | Descricao |
1026
- |---------|-----------|
1027
- | Nenhum | N/A |
1028
-
1029
- ### 5.2 Arquivos a Modificar
1030
- | Arquivo | Modificacao |
1031
- |---------|------------|
1032
- | `internal/handler/grpc/user_handler.go` | Atualizar CreateUser, GetUser e criar UpdateUser com campo phone. Atualizar mapServiceError. |
1033
-
1034
- ### 5.3 Arquivos de Referencia
1035
- | Arquivo | Motivo da Consulta |
1036
- |---------|-------------------|
1037
- | `gen/proto/v1/` (codigo gerado) | Verificar interfaces e structs geradas pelo proto |
1038
- | `internal/service/user_service.go` | Interface UserService atualizada |
1039
- | `configs/config.yaml` | Verificar skip_methods para autenticacao |
1040
-
1041
- ---
1042
-
1043
- ## 6. Testes
1044
-
1045
- ### 6.1 Testes Unitarios
1046
- - [ ] Teste: `CreateUser` com phone valido retorna response com campo phone preenchido
1047
- - [ ] Teste: `CreateUser` com phone vazio retorna response com phone vazio
1048
- - [ ] Teste: `CreateUser` com phone invalido retorna `codes.InvalidArgument`
1049
- - [ ] Teste: `GetUser` retorna campo phone na response
1050
- - [ ] Teste: `UpdateUser` com dados validos retorna response correta
1051
- - [ ] Teste: `UpdateUser` com phone valido retorna response com phone preenchido
1052
- - [ ] Teste: `UpdateUser` com phone vazio retorna response com phone vazio
1053
- - [ ] Teste: `UpdateUser` com phone invalido retorna `codes.InvalidArgument`
1054
- - [ ] Teste: `UpdateUser` com ID vazio retorna `codes.InvalidArgument`
1055
- - [ ] Teste: `UpdateUser` com usuario nao encontrado retorna `codes.NotFound`
1056
- - [ ] Teste: `UpdateUser` com erro interno retorna `codes.Internal`
1057
- - [ ] Teste: `UpdateUser` mapeamento de response (todos os campos corretos)
1058
-
1059
- ### 6.2 Testes de Integracao
1060
- N/A -- handler e testado com mocks do service (unitarios).
1061
-
1062
- ### 6.3 Testes E2E
1063
- N/A -- para esta feature simples, os testes unitarios do handler cobrem o fluxo completo.
1064
-
1065
- ### 6.4 Cenarios de Erro
1066
- - [ ] Cenario: Erro de validacao de telefone mapeado corretamente para `codes.InvalidArgument`
1067
- - [ ] Cenario: Erro "nao encontrado" do service mapeado para `codes.NotFound`
1068
- - [ ] Cenario: Erro generico do service mapeado para `codes.Internal`
1069
-
1070
- ### Testes existentes a modificar
1071
- | Arquivo | Modificacao |
1072
- |---------|------------|
1073
- | `internal/handler/grpc/user_handler_test.go` | Atualizar mock `MockUserService` para incluir metodo `UpdateUser`. Atualizar testes de `CreateUser` para validar campo `Phone` na response. Atualizar testes de `GetUser` para validar campo `Phone` na response. Adicionar novos testes para handler `UpdateUser`. |
1074
-
1075
- ---
1076
-
1077
- ## 7. Notas / Observacoes
1078
- - O mock `MockUserService` no arquivo de testes precisa ser atualizado para incluir o metodo `UpdateUser`
1079
- - Os testes existentes de `CreateUser` e `GetUser` precisam ser atualizados para incluir assertions do campo `Phone`
1080
- - O handler `UserHandler` ja implementa `UnimplementedUserServiceServer`, entao `UpdateUser` sera automaticamente parte da interface apos regenerar o proto
1081
- - Verificar se `mapServiceError` cobre o novo erro de telefone invalido
1082
-
1083
- ---
1084
-
1085
- ## 8. Checklist Final
1086
- - [ ] Implementada conforme SPEC
1087
- - [ ] Testes unitarios criados/atualizados
1088
- - [ ] Testes de integracao criados/atualizados
1089
- - [ ] Aceite tecnico atendido
1090
- - [ ] Revisada
1091
- - [ ] Integrada a branch principal
1092
-
1093
- ---
1094
- ---
1095
-
1096
- ## Resumo Final
1097
-
1098
- ### Arquivos que seriam salvos (simulacao -- nao salvos em docs/ conforme instrucoes do eval):
1099
- ```
1100
- docs/telefone-usuario/v1/task_plan.md
1101
- docs/telefone-usuario/v1/tasks/T1.md
1102
- docs/telefone-usuario/v1/tasks/T2.md
1103
- docs/telefone-usuario/v1/tasks/T3.md
1104
- docs/telefone-usuario/v1/tasks/T4.md
1105
- docs/telefone-usuario/v1/tasks/T5.md
1106
- docs/telefone-usuario/v1/tasks/T6.md
1107
- ```
1108
-
1109
- ### Ordem de execucao recomendada:
1110
- ```
1111
- Paralelo: T1 + T5
1112
- |
1113
- v
1114
- T2 (apos T1)
1115
- |
1116
- v
1117
- T3 (apos T2)
1118
- |
1119
- v
1120
- T4 (apos T3)
1121
- |
1122
- v
1123
- T6 (apos T4 + T5)
1124
- ```
1125
-
1126
- Task Plan aprovado para execucao? (sim/nao)