adi_dev_workflow 1.1.0 → 1.2.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/bin/index.js +8 -8
- package/frameworks/agents/qa-staff-engineer.md +311 -0
- package/frameworks/agents/qa-validation-expert.md +458 -0
- package/frameworks/agents/tech-review-conformance.md +200 -0
- package/frameworks/commands/generate-prompt.md +33 -100
- package/frameworks/commands/ministack/README.md +2 -0
- package/frameworks/commands/ministack/code-review.md +2 -0
- package/frameworks/commands/ministack/generate-intent.md +2 -0
- package/frameworks/commands/ministack/generate-scope.md +2 -0
- package/frameworks/commands/ministack/generate-tasks.md +2 -0
- package/frameworks/commands/ministack/generate-tech-direction.md +2 -0
- package/frameworks/commands/ministack/run-ministack-tasks.md +3 -0
- package/frameworks/commands/ministack/run-ministack-withlinear.md +2 -0
- package/frameworks/commands/ministack/status.md +2 -0
- package/frameworks/commands/sdd/code-review.md +2 -0
- package/frameworks/commands/sdd/generate-prd.md +2 -0
- package/frameworks/commands/sdd/generate-task-plan.md +2 -0
- package/frameworks/commands/sdd/generate-tech-direction.md +2 -0
- package/frameworks/commands/sdd/generate-tech-spec.md +2 -0
- package/frameworks/commands/sdd/generate-tests.md +2 -0
- package/frameworks/commands/sdd/run_tasks.md +3 -0
- package/frameworks/commands/sdd/run_tasks_withlinear.md +2 -0
- package/frameworks/commands/sdd/status.md +2 -0
- package/frameworks/commands/sdd/validate-sdd.md +2 -0
- package/frameworks/commands/sync-tasks-to-linear.md +2 -0
- package/frameworks/commands/taskcard/generate-taskcard.md +106 -33
- package/frameworks/commands/taskcard/run-taskcard.md +2 -0
- package/frameworks/config/ai-framework-config.yaml +112 -0
- package/frameworks/skills/ministack-intent-expert/SKILL.md +15 -1
- package/frameworks/skills/ministack-scope-expert/SKILL.md +17 -1
- package/frameworks/skills/sdd-prd-expert/SKILL.md +14 -0
- package/frameworks/skills/sdd-task-plan-expert/SKILL.md +14 -0
- package/frameworks/skills/taskcard-expert/SKILL.md +30 -11
- package/frameworks/templates/prompt_template.md +207 -0
- package/package.json +28 -28
- package/src/cli.js +121 -121
- package/src/installer.js +155 -136
- package/src/transformer.js +86 -86
- package/frameworks/skills/ministack-tasks-expert/SKILL.md +0 -192
- package/frameworks/skills/ministack-tasks-expert/templates/task_plan_template.md +0 -78
- package/frameworks/skills/ministack-tasks-expert/templates/task_template.md +0 -103
- package/frameworks/skills/ministack-tech-direction-expert/SKILL.md +0 -218
- package/frameworks/skills/ministack-tech-direction-expert/evals/evals.json +0 -1
- package/frameworks/skills/ministack-tech-direction-expert/templates/tech_direction-template.md +0 -17
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/benchmark.json +0 -99
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/benchmark.md +0 -64
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/eval_metadata.json +0 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/outputs/response.md +0 -134
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/outputs/transcript.md +0 -68
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/timing.json +0 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/outputs/response.md +0 -525
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/outputs/transcript.md +0 -30
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/timing.json +0 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/eval_metadata.json +0 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/response.md +0 -1126
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/transcript.md +0 -131
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/timing.json +0 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/outputs/response.md +0 -452
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/outputs/transcript.md +0 -78
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/timing.json +0 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/eval_metadata.json +0 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/outputs/response.md +0 -101
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/outputs/transcript.md +0 -133
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/timing.json +0 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/response.md +0 -248
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/transcript.md +0 -49
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/timing.json +0 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/review.html +0 -1325
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/benchmark.json +0 -94
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/benchmark.md +0 -67
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/eval_metadata.json +0 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/outputs/response.md +0 -117
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/outputs/transcript.md +0 -91
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/timing.json +0 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/outputs/response.md +0 -694
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/outputs/transcript.md +0 -45
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/timing.json +0 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/eval_metadata.json +0 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/outputs/response.md +0 -1087
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/outputs/transcript.md +0 -124
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/timing.json +0 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/outputs/response.md +0 -458
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/outputs/transcript.md +0 -84
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/timing.json +0 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/eval_metadata.json +0 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/outputs/response.md +0 -70
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/outputs/transcript.md +0 -148
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/timing.json +0 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/outputs/response.md +0 -249
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/outputs/transcript.md +0 -80
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/timing.json +0 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/review.html +0 -1325
- package/frameworks/skills/sdd-tech-direction-expert/SKILL.md +0 -223
- package/frameworks/skills/sdd-tech-direction-expert/evals/evals.json +0 -1
- package/frameworks/skills/sdd-tech-direction-expert/templates/tech_direction-template.md +0 -23
- package/frameworks/skills/sdd-tech-spec-expert/SKILL.md +0 -304
- package/frameworks/skills/sdd-tech-spec-expert/evals/evals.json +0 -199
- package/frameworks/skills/sdd-tech-spec-expert/templates/spec_tech_template.md +0 -290
- package/frameworks/skills/sdd-tech-spec-expert/templates/tech_direction-template.md +0 -23
|
@@ -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)
|