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,1087 +0,0 @@
|
|
|
1
|
-
# Simulacao Completa do Fluxo TASK PLAN — Adicionar Telefone ao Usuario
|
|
2
|
-
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
## Passo 1: Receber SPEC_TECH e Extrair Nome
|
|
6
|
-
|
|
7
|
-
**Nome extraido da secao "1. Identificacao":** Adicionar Telefone ao Modulo de Usuario
|
|
8
|
-
|
|
9
|
-
**Pergunta que eu faria ao usuario:**
|
|
10
|
-
|
|
11
|
-
> Obrigado! Vamos iniciar o TASK PLAN para **Adicionar Telefone ao Modulo de Usuario**. Podemos iniciar a definicao macro das fases?
|
|
12
|
-
|
|
13
|
-
**Resposta simulada do usuario:** Sim, pode iniciar.
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## Passo 2: Analise Obrigatoria do Projeto (Resumo)
|
|
18
|
-
|
|
19
|
-
### Rules Lidas
|
|
20
|
-
- `CLAUDE.md` — arquitetura em camadas, comandos, convencoes
|
|
21
|
-
- `.claude/rules/code-conventions.md` — codigo em ingles, banco/logs/erros em portugues
|
|
22
|
-
- `.claude/rules/database.md` — SQLite WAL, migracoes imutaveis, nomenclatura PT-BR
|
|
23
|
-
- `.claude/rules/fx-di.md` — Uber FX para DI
|
|
24
|
-
- `.claude/rules/grpc.md` — handlers, mapeamento de erros, registro de handlers
|
|
25
|
-
- `.claude/rules/protobuf.md` — Buf, convencoes de go_package, mensagens
|
|
26
|
-
- `.claude/rules/repository.md` — interface + impl nao exportada, UUID no repo, mapeamento PT->EN
|
|
27
|
-
- `.claude/rules/service.md` — validacao, logging, erros exportados
|
|
28
|
-
- `.claude/rules/sqlc.md` — queries editaveis em `internal/db/sqlc/queries/`, codigo gerado NAO editar
|
|
29
|
-
|
|
30
|
-
### Codebase Explorado — O que ja existe
|
|
31
|
-
|
|
32
|
-
| Camada | Arquivo | Estado Atual |
|
|
33
|
-
|--------|---------|-------------|
|
|
34
|
-
| Migration 1 | `internal/db/migrations/001_create_usuarios.sql` | Tabela `usuarios` com id, nome, email, senha_hash, data_criacao, data_atualizacao |
|
|
35
|
-
| Migration 2 | `internal/db/migrations/002_add_endereco_usuarios.sql` | `ALTER TABLE usuarios ADD COLUMN endereco TEXT NOT NULL DEFAULT ''` |
|
|
36
|
-
| SQLC Queries | `internal/db/sqlc/queries/user.sql` | CreateUser, GetUserByID, GetUserByEmail, UpdateUser — **sem coluna `telefone`** |
|
|
37
|
-
| SQLC Config | `internal/db/sqlc/sqlc.yaml` | Engine SQLite, queries em `queries/`, schema em `../migrations/` |
|
|
38
|
-
| Repository | `internal/repository/user_repository.go` | Struct `User` com campos ID, Name, Email, PasswordHash, Address, CreatedAt, UpdatedAt. Interface com Create, GetByID, GetByEmail, Update. Mapeamento via `toUser()` |
|
|
39
|
-
| Service | `internal/service/user_service.go` | `CreateUserInput` com Name, Email, Password, Address. `UpdateUserInput` com Name*, Email*, Address*, NewPassword*, CurrentPassword*. Validacoes e regras de negocio |
|
|
40
|
-
| Handler | `internal/handler/grpc/user_handler.go` | Handlers CreateUser, Login, GetUserLogged, UpdateUser. Funcao `domainUserToProto()` e `mapServiceError()` |
|
|
41
|
-
| Handler FX | `internal/handler/grpc/fx.go` | Registra UserHandler como pb.UserServiceServer |
|
|
42
|
-
| Proto | `api/proto/v1/user.proto` | Mensagem User com id(1), name(2), email(3), address(4), created_at(5), updated_at(6). CreateUserRequest com name(1), email(2), password(3), address(4). UpdateUserRequest com optional name(1), email(2), address(3), new_password(4), current_password(5) |
|
|
43
|
-
| gRPC Server | `internal/infra/grpc/server.go` | Registra UserServiceServer |
|
|
44
|
-
| Testes Service | `internal/service/user_service_test.go` | Testes table-driven com mock de UserRepository via testify/mock |
|
|
45
|
-
| Testes Handler | `internal/handler/grpc/user_handler_test.go` | Mock de UserService, testes de todos os endpoints |
|
|
46
|
-
| Testes Repository | `internal/repository/user_repository_integration_test.go` | Testes de integracao com SQLite in-memory |
|
|
47
|
-
|
|
48
|
-
### Descobertas Importantes para o Planejamento
|
|
49
|
-
|
|
50
|
-
1. **Proxima migracao sera `003_add_telefone_usuarios.sql`** (sequencial apos 002)
|
|
51
|
-
2. **Queries SQLC precisam ser atualizadas** em `internal/db/sqlc/queries/user.sql` — depois rodar `make sqlc`
|
|
52
|
-
3. **Repository struct `User`** precisa de novo campo `Phone string`
|
|
53
|
-
4. **Service `CreateUserInput`** e `UpdateUserInput`** precisam de campo `Phone`
|
|
54
|
-
5. **Proto `user.proto`**: campo `phone` sera field number `7` na mensagem `User`, `5` em `CreateUserRequest`, e `6` em `UpdateUserRequest`
|
|
55
|
-
6. **Mock de repository** em `user_service_test.go` precisa do campo `Phone`
|
|
56
|
-
7. **Mock de service** em `user_handler_test.go` precisa do campo `Phone` no input
|
|
57
|
-
8. **Nenhum campo `telefone` existe atualmente** em qualquer camada — tudo precisa ser criado do zero
|
|
58
|
-
9. **Arquivo `configs/config.yaml`** nao precisa de alteracao (nao ha skip_methods novo)
|
|
59
|
-
10. **Nota sobre nomenclatura de migracao**: o projeto usa `001_create_usuarios.sql` sem `.up.sql`/`.down.sql` — apenas arquivo unico
|
|
60
|
-
|
|
61
|
-
---
|
|
62
|
-
|
|
63
|
-
## Passo 3: Proposta de Fases
|
|
64
|
-
|
|
65
|
-
**Pergunta que eu faria ao usuario:**
|
|
66
|
-
|
|
67
|
-
> Com base na analise do SPEC_TECH e do codebase, proponho as seguintes macro-fases:
|
|
68
|
-
>
|
|
69
|
-
> **Fase 1 — Banco de Dados e Queries (Fundacao)**
|
|
70
|
-
> - Nova migracao para adicionar coluna `telefone`
|
|
71
|
-
> - Atualizar queries SQLC para incluir `telefone`
|
|
72
|
-
> - Executar `make sqlc` para regenerar codigo
|
|
73
|
-
>
|
|
74
|
-
> **Fase 2 — Camadas de Negocio (Repository + Service)**
|
|
75
|
-
> - Adicionar campo `Phone` ao modelo e mapeamento no repository
|
|
76
|
-
> - Adicionar campo `Phone` nos inputs do service e validacao
|
|
77
|
-
>
|
|
78
|
-
> **Fase 3 — Interface gRPC (Proto + Handler)**
|
|
79
|
-
> - Atualizar `user.proto` com campo `phone`
|
|
80
|
-
> - Executar `make proto` para regenerar
|
|
81
|
-
> - Atualizar handler para mapear campo `phone`
|
|
82
|
-
>
|
|
83
|
-
> **Fase 4 — Testes**
|
|
84
|
-
> - Atualizar testes existentes em todas as camadas
|
|
85
|
-
> - Adicionar testes especificos para o campo telefone
|
|
86
|
-
>
|
|
87
|
-
> Podemos prosseguir com esta estrutura de fases?
|
|
88
|
-
|
|
89
|
-
**Resposta simulada do usuario:** Sim, aprovado. Pode destrinchar as tasks.
|
|
90
|
-
|
|
91
|
-
---
|
|
92
|
-
|
|
93
|
-
## Passo 4: Destrinchar Tasks — Fase por Fase
|
|
94
|
-
|
|
95
|
-
### Pergunta Fase 1:
|
|
96
|
-
|
|
97
|
-
> Podemos destrinchar as tasks da Fase 1 — Banco de Dados e Queries?
|
|
98
|
-
|
|
99
|
-
**Resposta simulada:** Sim.
|
|
100
|
-
|
|
101
|
-
### Pergunta Fase 2:
|
|
102
|
-
|
|
103
|
-
> Podemos destrinchar as tasks da Fase 2 — Camadas de Negocio?
|
|
104
|
-
|
|
105
|
-
**Resposta simulada:** Sim.
|
|
106
|
-
|
|
107
|
-
### Pergunta Fase 3:
|
|
108
|
-
|
|
109
|
-
> Podemos destrinchar as tasks da Fase 3 — Interface gRPC?
|
|
110
|
-
|
|
111
|
-
**Resposta simulada:** Sim.
|
|
112
|
-
|
|
113
|
-
### Pergunta Fase 4:
|
|
114
|
-
|
|
115
|
-
> Podemos destrinchar as tasks da Fase 4 — Testes?
|
|
116
|
-
|
|
117
|
-
**Resposta simulada:** Sim.
|
|
118
|
-
|
|
119
|
-
---
|
|
120
|
-
|
|
121
|
-
## Passo 5: Tasks Individuais (conteudo completo)
|
|
122
|
-
|
|
123
|
-
Abaixo estao as tasks completas que seriam salvas em `docs/telefone-usuario/v1/tasks/TN.md`:
|
|
124
|
-
|
|
125
|
-
---
|
|
126
|
-
|
|
127
|
-
# T1.md — Criar migracao para adicionar coluna telefone
|
|
128
|
-
|
|
129
|
-
## 1. Identificacao
|
|
130
|
-
- **ID**: T1
|
|
131
|
-
- **Nome da Task**: Criar migracao para adicionar coluna telefone na tabela usuarios
|
|
132
|
-
- **Responsavel**: —
|
|
133
|
-
- **Status**: A Fazer
|
|
134
|
-
- **Fase**: Fase 1 — Banco de Dados e Queries
|
|
135
|
-
- **Dependencias**: Nenhuma
|
|
136
|
-
- **User Stories Relacionadas**: US-10
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
## 2. Objetivo da Task
|
|
141
|
-
Criar nova migracao SQL que adiciona a coluna `telefone` (TEXT, opcional/nullable) a tabela `usuarios`.
|
|
142
|
-
|
|
143
|
-
---
|
|
144
|
-
|
|
145
|
-
## 3. Descricao Detalhada
|
|
146
|
-
|
|
147
|
-
Criar o arquivo `internal/db/migrations/003_add_telefone_usuarios.sql` com o seguinte conteudo:
|
|
148
|
-
|
|
149
|
-
```sql
|
|
150
|
-
ALTER TABLE usuarios ADD COLUMN telefone TEXT;
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
**Decisoes tecnicas:**
|
|
154
|
-
- A coluna `telefone` e `TEXT` sem `NOT NULL`, tornando-a opcional (nullable)
|
|
155
|
-
- Seguir o padrao do projeto: nome do arquivo sequencial (`003_`), descritivo, sem `.up.sql`/`.down.sql` (projeto usa arquivo unico de migracao)
|
|
156
|
-
- Coluna em portugues conforme convencao do projeto (`telefone`, nao `phone`)
|
|
157
|
-
- Sem valor DEFAULT, pois o campo e opcional e usuarios existentes terao `NULL`
|
|
158
|
-
|
|
159
|
-
**IMPORTANTE**: Nao editar migracoes existentes (001, 002). Apenas criar nova.
|
|
160
|
-
|
|
161
|
-
---
|
|
162
|
-
|
|
163
|
-
## 4. Aceite Tecnico (criterios objetivos)
|
|
164
|
-
- [ ] Arquivo `003_add_telefone_usuarios.sql` criado em `internal/db/migrations/`
|
|
165
|
-
- [ ] SQL sintaticamente correto para SQLite
|
|
166
|
-
- [ ] Coluna `telefone` e TEXT nullable (sem NOT NULL)
|
|
167
|
-
- [ ] Migracao nao altera tabelas existentes alem de adicionar a coluna
|
|
168
|
-
- [ ] Migracao aplica sem erro em banco limpo (junto com 001 e 002)
|
|
169
|
-
- [ ] Nenhuma migracao existente foi editada
|
|
170
|
-
|
|
171
|
-
---
|
|
172
|
-
|
|
173
|
-
## 5. Arquivos Impactados
|
|
174
|
-
|
|
175
|
-
### 5.1 Arquivos a Criar
|
|
176
|
-
| Arquivo | Descricao |
|
|
177
|
-
|---------|-----------|
|
|
178
|
-
| `internal/db/migrations/003_add_telefone_usuarios.sql` | Migracao ALTER TABLE para adicionar coluna telefone |
|
|
179
|
-
|
|
180
|
-
### 5.2 Arquivos a Modificar
|
|
181
|
-
| Arquivo | Modificacao |
|
|
182
|
-
|---------|------------|
|
|
183
|
-
| Nenhum | — |
|
|
184
|
-
|
|
185
|
-
### 5.3 Arquivos de Referencia
|
|
186
|
-
| Arquivo | Motivo da Consulta |
|
|
187
|
-
|---------|-------------------|
|
|
188
|
-
| `internal/db/migrations/001_create_usuarios.sql` | Referencia de schema existente |
|
|
189
|
-
| `internal/db/migrations/002_add_endereco_usuarios.sql` | Referencia de padrao de ALTER TABLE no projeto |
|
|
190
|
-
|
|
191
|
-
---
|
|
192
|
-
|
|
193
|
-
## 6. Testes
|
|
194
|
-
|
|
195
|
-
### 6.1 Testes Unitarios
|
|
196
|
-
- N/A — migracao SQL nao possui logica testavel unitariamente
|
|
197
|
-
|
|
198
|
-
### 6.2 Testes de Integracao
|
|
199
|
-
- [ ] Teste: verificar que a coluna `telefone` existe na tabela `usuarios` apos migracao (PRAGMA table_info) — adicionar em `internal/repository/user_repository_integration_test.go` seguindo o padrao de `TestRunMigrations_TableSchema_IncludesEndereco`
|
|
200
|
-
- [ ] Teste: verificar que a coluna `telefone` aceita NULL (inserir usuario sem telefone e consultar)
|
|
201
|
-
- [ ] Teste: verificar que a coluna `telefone` aceita valor TEXT (inserir usuario com telefone e consultar)
|
|
202
|
-
|
|
203
|
-
### 6.3 Testes E2E
|
|
204
|
-
- N/A — sera coberto nas tasks de camadas superiores
|
|
205
|
-
|
|
206
|
-
### 6.4 Cenarios de Erro
|
|
207
|
-
- [ ] Cenario: migracao aplicada em banco que ja tem a coluna (idempotencia via golang-migrate)
|
|
208
|
-
|
|
209
|
-
---
|
|
210
|
-
|
|
211
|
-
## 7. Notas / Observacoes
|
|
212
|
-
- O padrao do projeto para migracoes usa arquivo unico (sem separacao up/down), conforme observado em `001_create_usuarios.sql` e `002_add_endereco_usuarios.sql`
|
|
213
|
-
- A migracao 002 usou `NOT NULL DEFAULT ''` para `endereco` (campo obrigatorio). Para `telefone` o SPEC define como opcional, portanto `TEXT` sem `NOT NULL`
|
|
214
|
-
|
|
215
|
-
---
|
|
216
|
-
|
|
217
|
-
## 8. Checklist Final
|
|
218
|
-
- [ ] Implementada conforme SPEC
|
|
219
|
-
- [ ] Testes de integracao criados/atualizados
|
|
220
|
-
- [ ] Aceite tecnico atendido
|
|
221
|
-
- [ ] Revisada
|
|
222
|
-
- [ ] Integrada a branch principal
|
|
223
|
-
|
|
224
|
-
---
|
|
225
|
-
---
|
|
226
|
-
|
|
227
|
-
# T2.md — Atualizar queries SQLC para incluir coluna telefone
|
|
228
|
-
|
|
229
|
-
## 1. Identificacao
|
|
230
|
-
- **ID**: T2
|
|
231
|
-
- **Nome da Task**: Atualizar queries SQLC para incluir coluna telefone
|
|
232
|
-
- **Responsavel**: —
|
|
233
|
-
- **Status**: A Fazer
|
|
234
|
-
- **Fase**: Fase 1 — Banco de Dados e Queries
|
|
235
|
-
- **Dependencias**: T1
|
|
236
|
-
- **User Stories Relacionadas**: US-10
|
|
237
|
-
|
|
238
|
-
---
|
|
239
|
-
|
|
240
|
-
## 2. Objetivo da Task
|
|
241
|
-
Atualizar as queries `CreateUser` e `UpdateUser` no arquivo de queries SQLC para incluir a coluna `telefone`, e regenerar o codigo SQLC.
|
|
242
|
-
|
|
243
|
-
---
|
|
244
|
-
|
|
245
|
-
## 3. Descricao Detalhada
|
|
246
|
-
|
|
247
|
-
Editar o arquivo `internal/db/sqlc/queries/user.sql`:
|
|
248
|
-
|
|
249
|
-
**Query `CreateUser`** — adicionar `telefone` na lista de colunas e valores:
|
|
250
|
-
```sql
|
|
251
|
-
-- name: CreateUser :one
|
|
252
|
-
INSERT INTO usuarios (id, nome, email, senha_hash, endereco, telefone, data_criacao, data_atualizacao)
|
|
253
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
254
|
-
RETURNING *;
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
**Query `UpdateUser`** — adicionar `telefone` no SET:
|
|
258
|
-
```sql
|
|
259
|
-
-- name: UpdateUser :one
|
|
260
|
-
UPDATE usuarios
|
|
261
|
-
SET nome = ?,
|
|
262
|
-
email = ?,
|
|
263
|
-
senha_hash = ?,
|
|
264
|
-
endereco = ?,
|
|
265
|
-
telefone = ?,
|
|
266
|
-
data_atualizacao = ?
|
|
267
|
-
WHERE id = ?
|
|
268
|
-
RETURNING *;
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
**Queries `GetUserByID` e `GetUserByEmail`** — usam `SELECT *`, portanto ja incluirao `telefone` automaticamente apos a migracao. Nao precisam de alteracao.
|
|
272
|
-
|
|
273
|
-
Apos editar, executar `make sqlc` para regenerar o codigo em `internal/db/sqlc/`.
|
|
274
|
-
|
|
275
|
-
**IMPORTANTE**: NAO editar arquivos em `internal/db/sqlc/` diretamente — apenas os arquivos em `internal/db/sqlc/queries/`.
|
|
276
|
-
|
|
277
|
-
---
|
|
278
|
-
|
|
279
|
-
## 4. Aceite Tecnico (criterios objetivos)
|
|
280
|
-
- [ ] Query `CreateUser` inclui coluna `telefone` e parametro correspondente
|
|
281
|
-
- [ ] Query `UpdateUser` inclui `telefone` no SET
|
|
282
|
-
- [ ] `make sqlc` executa sem erros
|
|
283
|
-
- [ ] Struct `Usuario` gerada em `internal/db/sqlc/` contém campo `Telefone`
|
|
284
|
-
- [ ] Params `CreateUserParams` inclui campo `Telefone`
|
|
285
|
-
- [ ] Params `UpdateUserParams` inclui campo `Telefone`
|
|
286
|
-
- [ ] Queries SELECT continuam funcionando (retornando `telefone`)
|
|
287
|
-
|
|
288
|
-
---
|
|
289
|
-
|
|
290
|
-
## 5. Arquivos Impactados
|
|
291
|
-
|
|
292
|
-
### 5.1 Arquivos a Criar
|
|
293
|
-
| Arquivo | Descricao |
|
|
294
|
-
|---------|-----------|
|
|
295
|
-
| Nenhum | — |
|
|
296
|
-
|
|
297
|
-
### 5.2 Arquivos a Modificar
|
|
298
|
-
| Arquivo | Modificacao |
|
|
299
|
-
|---------|------------|
|
|
300
|
-
| `internal/db/sqlc/queries/user.sql` | Adicionar `telefone` nas queries CreateUser e UpdateUser |
|
|
301
|
-
|
|
302
|
-
### 5.3 Arquivos de Referencia
|
|
303
|
-
| Arquivo | Motivo da Consulta |
|
|
304
|
-
|---------|-------------------|
|
|
305
|
-
| `internal/db/sqlc/sqlc.yaml` | Verificar configuracao SQLC (engine, paths) |
|
|
306
|
-
| `internal/db/migrations/003_add_telefone_usuarios.sql` | Verificar tipo da coluna (TEXT nullable) |
|
|
307
|
-
|
|
308
|
-
---
|
|
309
|
-
|
|
310
|
-
## 6. Testes
|
|
311
|
-
|
|
312
|
-
### 6.1 Testes Unitarios
|
|
313
|
-
- N/A — queries SQL e codigo gerado SQLC nao possuem logica testavel unitariamente
|
|
314
|
-
|
|
315
|
-
### 6.2 Testes de Integracao
|
|
316
|
-
- [ ] Teste: `CreateUser` com campo `telefone` preenchido retorna valor correto — sera coberto na task T3/T4 (repository)
|
|
317
|
-
- [ ] Teste: `CreateUser` com campo `telefone` NULL funciona corretamente — sera coberto na task T3/T4
|
|
318
|
-
- [ ] Teste: `UpdateUser` com campo `telefone` atualiza valor corretamente — sera coberto na task T3/T4
|
|
319
|
-
|
|
320
|
-
### 6.3 Testes E2E
|
|
321
|
-
- N/A
|
|
322
|
-
|
|
323
|
-
### 6.4 Cenarios de Erro
|
|
324
|
-
- [ ] Cenario: `make sqlc` gera codigo sem erros de compilacao (validar com `make build`)
|
|
325
|
-
|
|
326
|
-
---
|
|
327
|
-
|
|
328
|
-
## 7. Notas / Observacoes
|
|
329
|
-
- O tipo do campo `Telefone` no codigo gerado sera `sql.NullString` pois a coluna e nullable
|
|
330
|
-
- As queries SELECT usam `SELECT *` e portanto capturarao a coluna automaticamente
|
|
331
|
-
- Executar `make sqlc` e obrigatorio apos editar queries — o codigo gerado em `internal/db/sqlc/` sera atualizado automaticamente
|
|
332
|
-
|
|
333
|
-
---
|
|
334
|
-
|
|
335
|
-
## 8. Checklist Final
|
|
336
|
-
- [ ] Implementada conforme SPEC
|
|
337
|
-
- [ ] Codigo SQLC regenerado com sucesso
|
|
338
|
-
- [ ] Aceite tecnico atendido
|
|
339
|
-
- [ ] Revisada
|
|
340
|
-
- [ ] Integrada a branch principal
|
|
341
|
-
|
|
342
|
-
---
|
|
343
|
-
---
|
|
344
|
-
|
|
345
|
-
# T3.md — Adicionar campo Phone ao repository e atualizar mapeamento
|
|
346
|
-
|
|
347
|
-
## 1. Identificacao
|
|
348
|
-
- **ID**: T3
|
|
349
|
-
- **Nome da Task**: Adicionar campo Phone ao modelo User do repository e atualizar mapeamento
|
|
350
|
-
- **Responsavel**: —
|
|
351
|
-
- **Status**: A Fazer
|
|
352
|
-
- **Fase**: Fase 2 — Camadas de Negocio
|
|
353
|
-
- **Dependencias**: T2
|
|
354
|
-
- **User Stories Relacionadas**: US-10
|
|
355
|
-
|
|
356
|
-
---
|
|
357
|
-
|
|
358
|
-
## 2. Objetivo da Task
|
|
359
|
-
Adicionar o campo `Phone` (opcional, ponteiro `*string`) ao modelo `User` do repository, e atualizar as funcoes `Create`, `Update` e `toUser` para mapear `telefone` (banco) para `Phone` (Go).
|
|
360
|
-
|
|
361
|
-
---
|
|
362
|
-
|
|
363
|
-
## 3. Descricao Detalhada
|
|
364
|
-
|
|
365
|
-
Editar `internal/repository/user_repository.go`:
|
|
366
|
-
|
|
367
|
-
**1. Adicionar campo na struct `User`:**
|
|
368
|
-
```go
|
|
369
|
-
type User struct {
|
|
370
|
-
ID string
|
|
371
|
-
Name string
|
|
372
|
-
Email string
|
|
373
|
-
PasswordHash string
|
|
374
|
-
Address string
|
|
375
|
-
Phone *string // novo campo - ponteiro pois e opcional (nullable no banco)
|
|
376
|
-
CreatedAt time.Time
|
|
377
|
-
UpdatedAt time.Time
|
|
378
|
-
}
|
|
379
|
-
```
|
|
380
|
-
|
|
381
|
-
**2. Atualizar funcao `Create`** — mapear `Phone` para `Telefone` nos params SQLC:
|
|
382
|
-
```go
|
|
383
|
-
params := sqlc.CreateUserParams{
|
|
384
|
-
// ... campos existentes ...
|
|
385
|
-
Telefone: toNullString(user.Phone),
|
|
386
|
-
// ...
|
|
387
|
-
}
|
|
388
|
-
```
|
|
389
|
-
|
|
390
|
-
**3. Atualizar funcao `Update`** — mapear `Phone` para `Telefone` nos params SQLC:
|
|
391
|
-
```go
|
|
392
|
-
params := sqlc.UpdateUserParams{
|
|
393
|
-
// ... campos existentes ...
|
|
394
|
-
Telefone: toNullString(user.Phone),
|
|
395
|
-
// ...
|
|
396
|
-
}
|
|
397
|
-
```
|
|
398
|
-
|
|
399
|
-
**4. Atualizar funcao `toUser`** — mapear `Telefone` (sqlc) para `Phone` (dominio):
|
|
400
|
-
```go
|
|
401
|
-
func toUser(u sqlc.Usuario) *User {
|
|
402
|
-
return &User{
|
|
403
|
-
// ... campos existentes ...
|
|
404
|
-
Phone: fromNullString(u.Telefone),
|
|
405
|
-
// ...
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
```
|
|
409
|
-
|
|
410
|
-
**5. Criar funcoes helper** para conversao `*string` <-> `sql.NullString`:
|
|
411
|
-
```go
|
|
412
|
-
func toNullString(s *string) sql.NullString {
|
|
413
|
-
if s == nil {
|
|
414
|
-
return sql.NullString{}
|
|
415
|
-
}
|
|
416
|
-
return sql.NullString{String: *s, Valid: true}
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
func fromNullString(ns sql.NullString) *string {
|
|
420
|
-
if !ns.Valid {
|
|
421
|
-
return nil
|
|
422
|
-
}
|
|
423
|
-
return &ns.String
|
|
424
|
-
}
|
|
425
|
-
```
|
|
426
|
-
|
|
427
|
-
**Decisoes tecnicas:**
|
|
428
|
-
- `Phone` e `*string` (ponteiro) no modelo de dominio para representar campo nullable
|
|
429
|
-
- Funcoes helper `toNullString`/`fromNullString` para converter entre `*string` e `sql.NullString`
|
|
430
|
-
- Mapeamento: `telefone` (coluna banco, portugues) -> `Phone` (struct Go, ingles)
|
|
431
|
-
|
|
432
|
-
---
|
|
433
|
-
|
|
434
|
-
## 4. Aceite Tecnico (criterios objetivos)
|
|
435
|
-
- [ ] Struct `User` possui campo `Phone *string`
|
|
436
|
-
- [ ] Funcao `Create` mapeia `Phone` para `Telefone` no SQLC params
|
|
437
|
-
- [ ] Funcao `Update` mapeia `Phone` para `Telefone` no SQLC params
|
|
438
|
-
- [ ] Funcao `toUser` mapeia `Telefone` (sqlc) para `Phone` (dominio)
|
|
439
|
-
- [ ] Funcoes helper `toNullString`/`fromNullString` implementadas
|
|
440
|
-
- [ ] Codigo compila sem erros (`make build`)
|
|
441
|
-
- [ ] Fluxos existentes (sem telefone) continuam funcionando — campo e opcional
|
|
442
|
-
|
|
443
|
-
---
|
|
444
|
-
|
|
445
|
-
## 5. Arquivos Impactados
|
|
446
|
-
|
|
447
|
-
### 5.1 Arquivos a Criar
|
|
448
|
-
| Arquivo | Descricao |
|
|
449
|
-
|---------|-----------|
|
|
450
|
-
| Nenhum | — |
|
|
451
|
-
|
|
452
|
-
### 5.2 Arquivos a Modificar
|
|
453
|
-
| Arquivo | Modificacao |
|
|
454
|
-
|---------|------------|
|
|
455
|
-
| `internal/repository/user_repository.go` | Adicionar campo Phone a struct User, atualizar Create, Update, toUser, adicionar helpers |
|
|
456
|
-
|
|
457
|
-
### 5.3 Arquivos de Referencia
|
|
458
|
-
| Arquivo | Motivo da Consulta |
|
|
459
|
-
|---------|-------------------|
|
|
460
|
-
| `internal/db/sqlc/` (codigo gerado) | Verificar nomes dos campos gerados (Telefone, sql.NullString) |
|
|
461
|
-
|
|
462
|
-
---
|
|
463
|
-
|
|
464
|
-
## 6. Testes
|
|
465
|
-
|
|
466
|
-
### 6.1 Testes Unitarios
|
|
467
|
-
- N/A — repository nao possui logica testavel unitariamente (depende de banco)
|
|
468
|
-
|
|
469
|
-
### 6.2 Testes de Integracao
|
|
470
|
-
Atualizar `internal/repository/user_repository_integration_test.go`:
|
|
471
|
-
|
|
472
|
-
- [ ] Teste: `TestUserRepository_Create_WithPhone` — criar usuario com telefone e verificar que o valor e persistido e retornado
|
|
473
|
-
- [ ] Teste: `TestUserRepository_Create_WithoutPhone` — criar usuario sem telefone (nil) e verificar que `Phone` retorna nil
|
|
474
|
-
- [ ] Teste: `TestUserRepository_Update_Phone` — atualizar telefone de usuario existente e verificar
|
|
475
|
-
- [ ] Teste: `TestUserRepository_Update_PhoneToNil` — limpar telefone (setar nil) e verificar
|
|
476
|
-
- [ ] Teste: atualizar `createTestUser` para incluir campo `Phone` (pode ser nil por padrao)
|
|
477
|
-
- [ ] Teste: verificar que testes existentes continuam passando (campo `Phone` nil por padrao)
|
|
478
|
-
|
|
479
|
-
### 6.3 Testes E2E
|
|
480
|
-
- N/A
|
|
481
|
-
|
|
482
|
-
### 6.4 Cenarios de Erro
|
|
483
|
-
- [ ] Cenario: criar usuario com `Phone` nil nao gera erro
|
|
484
|
-
- [ ] Cenario: update com `Phone` nil nao sobrescreve valor existente indevidamente (depende da logica do service, mas repository deve aceitar nil)
|
|
485
|
-
|
|
486
|
-
---
|
|
487
|
-
|
|
488
|
-
## 7. Notas / Observacoes
|
|
489
|
-
- O campo `Telefone` no codigo gerado pelo SQLC sera `sql.NullString` porque a coluna e nullable no banco
|
|
490
|
-
- Os helpers `toNullString`/`fromNullString` podem ser reutilizados por outros campos opcionais no futuro
|
|
491
|
-
- O helper `createTestUser` nos testes de integracao precisa ser atualizado para incluir `Phone` (pode ser `nil` para manter compatibilidade)
|
|
492
|
-
|
|
493
|
-
---
|
|
494
|
-
|
|
495
|
-
## 8. Checklist Final
|
|
496
|
-
- [ ] Implementada conforme SPEC
|
|
497
|
-
- [ ] Testes de integracao criados/atualizados
|
|
498
|
-
- [ ] Aceite tecnico atendido
|
|
499
|
-
- [ ] Revisada
|
|
500
|
-
- [ ] Integrada a branch principal
|
|
501
|
-
|
|
502
|
-
---
|
|
503
|
-
---
|
|
504
|
-
|
|
505
|
-
# T4.md — Adicionar campo Phone ao service com validacao
|
|
506
|
-
|
|
507
|
-
## 1. Identificacao
|
|
508
|
-
- **ID**: T4
|
|
509
|
-
- **Nome da Task**: Adicionar campo Phone ao service com validacao
|
|
510
|
-
- **Responsavel**: —
|
|
511
|
-
- **Status**: A Fazer
|
|
512
|
-
- **Fase**: Fase 2 — Camadas de Negocio
|
|
513
|
-
- **Dependencias**: T3
|
|
514
|
-
- **User Stories Relacionadas**: US-10
|
|
515
|
-
|
|
516
|
-
---
|
|
517
|
-
|
|
518
|
-
## 2. Objetivo da Task
|
|
519
|
-
Adicionar o campo `Phone` (opcional) nos inputs `CreateUserInput` e `UpdateUserInput` do service, implementar validacao de tamanho (10 a 15 caracteres) e integrar com o repository.
|
|
520
|
-
|
|
521
|
-
---
|
|
522
|
-
|
|
523
|
-
## 3. Descricao Detalhada
|
|
524
|
-
|
|
525
|
-
Editar `internal/service/user_service.go`:
|
|
526
|
-
|
|
527
|
-
**1. Adicionar erro de validacao:**
|
|
528
|
-
```go
|
|
529
|
-
var (
|
|
530
|
-
// ... erros existentes ...
|
|
531
|
-
ErrInvalidPhone = errors.New("telefone deve ter entre 10 e 15 caracteres")
|
|
532
|
-
)
|
|
533
|
-
```
|
|
534
|
-
|
|
535
|
-
**2. Adicionar campo em `CreateUserInput`:**
|
|
536
|
-
```go
|
|
537
|
-
type CreateUserInput struct {
|
|
538
|
-
Name string
|
|
539
|
-
Email string
|
|
540
|
-
Password string
|
|
541
|
-
Address string
|
|
542
|
-
Phone *string // opcional
|
|
543
|
-
}
|
|
544
|
-
```
|
|
545
|
-
|
|
546
|
-
**3. Adicionar campo em `UpdateUserInput`:**
|
|
547
|
-
```go
|
|
548
|
-
type UpdateUserInput struct {
|
|
549
|
-
Name *string
|
|
550
|
-
Email *string
|
|
551
|
-
Address *string
|
|
552
|
-
Phone *string // opcional
|
|
553
|
-
NewPassword *string
|
|
554
|
-
CurrentPassword *string
|
|
555
|
-
}
|
|
556
|
-
```
|
|
557
|
-
|
|
558
|
-
**4. Adicionar validacao em `CreateUser`:**
|
|
559
|
-
Apos as validacoes existentes, antes de criar o usuario:
|
|
560
|
-
```go
|
|
561
|
-
if input.Phone != nil {
|
|
562
|
-
if len(*input.Phone) < 10 || len(*input.Phone) > 15 {
|
|
563
|
-
return nil, ErrInvalidPhone
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
```
|
|
567
|
-
|
|
568
|
-
E mapear para o repository:
|
|
569
|
-
```go
|
|
570
|
-
user := &repository.User{
|
|
571
|
-
// ... campos existentes ...
|
|
572
|
-
Phone: input.Phone,
|
|
573
|
-
// ...
|
|
574
|
-
}
|
|
575
|
-
```
|
|
576
|
-
|
|
577
|
-
**5. Adicionar validacao e mapeamento em `UpdateUser`:**
|
|
578
|
-
Na secao de campos opcionais:
|
|
579
|
-
```go
|
|
580
|
-
if input.Phone != nil {
|
|
581
|
-
if len(*input.Phone) < 10 || len(*input.Phone) > 15 {
|
|
582
|
-
return nil, ErrInvalidPhone
|
|
583
|
-
}
|
|
584
|
-
currentUser.Phone = input.Phone
|
|
585
|
-
}
|
|
586
|
-
```
|
|
587
|
-
|
|
588
|
-
E atualizar a verificacao de "nenhum campo":
|
|
589
|
-
```go
|
|
590
|
-
if input.Name == nil && input.Email == nil && input.Address == nil && input.Phone == nil && input.NewPassword == nil {
|
|
591
|
-
return nil, ErrNoFieldsToUpdate
|
|
592
|
-
}
|
|
593
|
-
```
|
|
594
|
-
|
|
595
|
-
---
|
|
596
|
-
|
|
597
|
-
## 4. Aceite Tecnico (criterios objetivos)
|
|
598
|
-
- [ ] `CreateUserInput` possui campo `Phone *string`
|
|
599
|
-
- [ ] `UpdateUserInput` possui campo `Phone *string`
|
|
600
|
-
- [ ] Erro `ErrInvalidPhone` exportado com mensagem em portugues
|
|
601
|
-
- [ ] Validacao: se `Phone` informado, deve ter entre 10 e 15 caracteres
|
|
602
|
-
- [ ] Validacao: `Phone` nil e aceito sem erro (campo opcional)
|
|
603
|
-
- [ ] `CreateUser` mapeia `Phone` para `repository.User`
|
|
604
|
-
- [ ] `UpdateUser` mapeia `Phone` para `currentUser` quando informado
|
|
605
|
-
- [ ] `UpdateUser` aceita `Phone` como campo unico para update (verificacao de "nenhum campo")
|
|
606
|
-
- [ ] Codigo compila sem erros
|
|
607
|
-
|
|
608
|
-
---
|
|
609
|
-
|
|
610
|
-
## 5. Arquivos Impactados
|
|
611
|
-
|
|
612
|
-
### 5.1 Arquivos a Criar
|
|
613
|
-
| Arquivo | Descricao |
|
|
614
|
-
|---------|-----------|
|
|
615
|
-
| Nenhum | — |
|
|
616
|
-
|
|
617
|
-
### 5.2 Arquivos a Modificar
|
|
618
|
-
| Arquivo | Modificacao |
|
|
619
|
-
|---------|------------|
|
|
620
|
-
| `internal/service/user_service.go` | Adicionar ErrInvalidPhone, campo Phone nos inputs, validacao e mapeamento |
|
|
621
|
-
|
|
622
|
-
### 5.3 Arquivos de Referencia
|
|
623
|
-
| Arquivo | Motivo da Consulta |
|
|
624
|
-
|---------|-------------------|
|
|
625
|
-
| `internal/repository/user_repository.go` | Verificar struct User com campo Phone |
|
|
626
|
-
|
|
627
|
-
---
|
|
628
|
-
|
|
629
|
-
## 6. Testes
|
|
630
|
-
|
|
631
|
-
### 6.1 Testes Unitarios
|
|
632
|
-
Atualizar `internal/service/user_service_test.go`:
|
|
633
|
-
|
|
634
|
-
**Testes novos:**
|
|
635
|
-
- [ ] Teste: `TestCreateUser_WithPhone_Success` — criar usuario com telefone valido (ex: "11987654321", 11 chars)
|
|
636
|
-
- [ ] Teste: `TestCreateUser_WithoutPhone_Success` — criar usuario sem telefone (nil) — validar que nao gera erro
|
|
637
|
-
- [ ] Teste: `TestCreateUser_PhoneTooShort` — telefone com 9 caracteres retorna `ErrInvalidPhone`
|
|
638
|
-
- [ ] Teste: `TestCreateUser_PhoneTooLong` — telefone com 16 caracteres retorna `ErrInvalidPhone`
|
|
639
|
-
- [ ] Teste: `TestCreateUser_PhoneExactly10Chars` — limite inferior aceito
|
|
640
|
-
- [ ] Teste: `TestCreateUser_PhoneExactly15Chars` — limite superior aceito
|
|
641
|
-
- [ ] Teste: `TestUpdateUser_PhoneOnly` — atualizar apenas telefone com sucesso
|
|
642
|
-
- [ ] Teste: `TestUpdateUser_PhoneInvalid` — telefone invalido retorna `ErrInvalidPhone`
|
|
643
|
-
- [ ] Teste: `TestUpdateUser_PhoneWithOtherFields` — atualizar telefone junto com outros campos
|
|
644
|
-
|
|
645
|
-
**Testes existentes a atualizar:**
|
|
646
|
-
- [ ] Atualizar `MockUserRepository` se necessario (interface nao muda, mas `User` struct ganha campo)
|
|
647
|
-
- [ ] Atualizar `returnUser` em testes existentes para incluir `Phone` (pode ser nil)
|
|
648
|
-
- [ ] Garantir que testes existentes continuam passando
|
|
649
|
-
|
|
650
|
-
### 6.2 Testes de Integracao
|
|
651
|
-
- N/A — coberto pelos testes unitarios com mock
|
|
652
|
-
|
|
653
|
-
### 6.3 Testes E2E
|
|
654
|
-
- N/A
|
|
655
|
-
|
|
656
|
-
### 6.4 Cenarios de Erro
|
|
657
|
-
- [ ] Cenario: telefone com 9 caracteres -> `ErrInvalidPhone`
|
|
658
|
-
- [ ] Cenario: telefone com 16 caracteres -> `ErrInvalidPhone`
|
|
659
|
-
- [ ] Cenario: telefone vazio string ("") -> `ErrInvalidPhone` (len < 10)
|
|
660
|
-
- [ ] Cenario: telefone nil -> aceito sem erro
|
|
661
|
-
|
|
662
|
-
---
|
|
663
|
-
|
|
664
|
-
## 7. Notas / Observacoes
|
|
665
|
-
- A validacao de telefone e simples: apenas tamanho entre 10 e 15 chars, conforme SPEC
|
|
666
|
-
- Nao ha validacao de formato (apenas digitos, por exemplo) — se necessario, criar US separada
|
|
667
|
-
- O campo `Phone` no `UpdateUserInput` participa da verificacao de "nenhum campo para atualizar"
|
|
668
|
-
|
|
669
|
-
---
|
|
670
|
-
|
|
671
|
-
## 8. Checklist Final
|
|
672
|
-
- [ ] Implementada conforme SPEC
|
|
673
|
-
- [ ] Testes unitarios criados/atualizados
|
|
674
|
-
- [ ] Aceite tecnico atendido
|
|
675
|
-
- [ ] Revisada
|
|
676
|
-
- [ ] Integrada a branch principal
|
|
677
|
-
|
|
678
|
-
---
|
|
679
|
-
---
|
|
680
|
-
|
|
681
|
-
# T5.md — Atualizar proto e handler gRPC para incluir campo phone
|
|
682
|
-
|
|
683
|
-
## 1. Identificacao
|
|
684
|
-
- **ID**: T5
|
|
685
|
-
- **Nome da Task**: Atualizar proto e handler gRPC para incluir campo phone
|
|
686
|
-
- **Responsavel**: —
|
|
687
|
-
- **Status**: A Fazer
|
|
688
|
-
- **Fase**: Fase 3 — Interface gRPC
|
|
689
|
-
- **Dependencias**: T4
|
|
690
|
-
- **User Stories Relacionadas**: US-10
|
|
691
|
-
|
|
692
|
-
---
|
|
693
|
-
|
|
694
|
-
## 2. Objetivo da Task
|
|
695
|
-
Adicionar campo `phone` nas mensagens proto (User, CreateUserRequest, UpdateUserRequest), regenerar codigo, e atualizar o handler gRPC para mapear o campo.
|
|
696
|
-
|
|
697
|
-
---
|
|
698
|
-
|
|
699
|
-
## 3. Descricao Detalhada
|
|
700
|
-
|
|
701
|
-
### 3.1 Atualizar Proto
|
|
702
|
-
|
|
703
|
-
Editar `api/proto/v1/user.proto`:
|
|
704
|
-
|
|
705
|
-
**Mensagem `User`** — adicionar campo `phone` com field number 7:
|
|
706
|
-
```proto
|
|
707
|
-
message User {
|
|
708
|
-
string id = 1;
|
|
709
|
-
string name = 2;
|
|
710
|
-
string email = 3;
|
|
711
|
-
string address = 4;
|
|
712
|
-
string created_at = 5;
|
|
713
|
-
string updated_at = 6;
|
|
714
|
-
optional string phone = 7;
|
|
715
|
-
}
|
|
716
|
-
```
|
|
717
|
-
|
|
718
|
-
**Mensagem `CreateUserRequest`** — adicionar campo `phone` com field number 5:
|
|
719
|
-
```proto
|
|
720
|
-
message CreateUserRequest {
|
|
721
|
-
string name = 1;
|
|
722
|
-
string email = 2;
|
|
723
|
-
string password = 3;
|
|
724
|
-
string address = 4;
|
|
725
|
-
optional string phone = 5;
|
|
726
|
-
}
|
|
727
|
-
```
|
|
728
|
-
|
|
729
|
-
**Mensagem `UpdateUserRequest`** — adicionar campo `phone` com field number 6:
|
|
730
|
-
```proto
|
|
731
|
-
message UpdateUserRequest {
|
|
732
|
-
optional string name = 1;
|
|
733
|
-
optional string email = 2;
|
|
734
|
-
optional string address = 3;
|
|
735
|
-
optional string new_password = 4;
|
|
736
|
-
optional string current_password = 5;
|
|
737
|
-
optional string phone = 6;
|
|
738
|
-
}
|
|
739
|
-
```
|
|
740
|
-
|
|
741
|
-
Executar `make proto` (ou `buf generate`) para regenerar codigo em `gen/`.
|
|
742
|
-
|
|
743
|
-
### 3.2 Atualizar Handler
|
|
744
|
-
|
|
745
|
-
Editar `internal/handler/grpc/user_handler.go`:
|
|
746
|
-
|
|
747
|
-
**Funcao `CreateUser`** — mapear `Phone` do request para input:
|
|
748
|
-
```go
|
|
749
|
-
input := service.CreateUserInput{
|
|
750
|
-
Name: req.GetName(),
|
|
751
|
-
Email: req.GetEmail(),
|
|
752
|
-
Password: req.GetPassword(),
|
|
753
|
-
Address: req.GetAddress(),
|
|
754
|
-
Phone: req.Phone, // optional -> *string
|
|
755
|
-
}
|
|
756
|
-
```
|
|
757
|
-
|
|
758
|
-
**Funcao `UpdateUser`** — adicionar mapeamento de phone:
|
|
759
|
-
```go
|
|
760
|
-
if req.Phone != nil {
|
|
761
|
-
input.Phone = req.Phone
|
|
762
|
-
}
|
|
763
|
-
```
|
|
764
|
-
|
|
765
|
-
**Funcao `domainUserToProto`** — mapear `Phone` para proto:
|
|
766
|
-
```go
|
|
767
|
-
func domainUserToProto(user *repository.User) *pb.User {
|
|
768
|
-
return &pb.User{
|
|
769
|
-
// ... campos existentes ...
|
|
770
|
-
Phone: user.Phone,
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
```
|
|
774
|
-
|
|
775
|
-
**Funcao `mapServiceError`** — adicionar mapeamento de `ErrInvalidPhone`:
|
|
776
|
-
```go
|
|
777
|
-
case errors.Is(err, service.ErrInvalidPhone):
|
|
778
|
-
return status.Errorf(codes.InvalidArgument, "%v", err)
|
|
779
|
-
```
|
|
780
|
-
Adicionar na clausula `switch` junto com os outros erros de `InvalidArgument`.
|
|
781
|
-
|
|
782
|
-
---
|
|
783
|
-
|
|
784
|
-
## 4. Aceite Tecnico (criterios objetivos)
|
|
785
|
-
- [ ] Proto `user.proto` inclui campo `phone` em User (field 7), CreateUserRequest (field 5), UpdateUserRequest (field 6)
|
|
786
|
-
- [ ] `make proto` executa sem erros
|
|
787
|
-
- [ ] Handler `CreateUser` mapeia `Phone` do request para service input
|
|
788
|
-
- [ ] Handler `UpdateUser` mapeia `Phone` do request para service input
|
|
789
|
-
- [ ] Funcao `domainUserToProto` mapeia `Phone` do dominio para proto
|
|
790
|
-
- [ ] `mapServiceError` trata `ErrInvalidPhone` como `InvalidArgument`
|
|
791
|
-
- [ ] Codigo compila sem erros (`make build`)
|
|
792
|
-
- [ ] Endpoint `CreateUser` aceita e persiste telefone
|
|
793
|
-
- [ ] Endpoint `UpdateUser` aceita e atualiza telefone
|
|
794
|
-
- [ ] Endpoint `GetUserLogged` retorna telefone
|
|
795
|
-
|
|
796
|
-
---
|
|
797
|
-
|
|
798
|
-
## 5. Arquivos Impactados
|
|
799
|
-
|
|
800
|
-
### 5.1 Arquivos a Criar
|
|
801
|
-
| Arquivo | Descricao |
|
|
802
|
-
|---------|-----------|
|
|
803
|
-
| Nenhum | — |
|
|
804
|
-
|
|
805
|
-
### 5.2 Arquivos a Modificar
|
|
806
|
-
| Arquivo | Modificacao |
|
|
807
|
-
|---------|------------|
|
|
808
|
-
| `api/proto/v1/user.proto` | Adicionar campo `phone` em User, CreateUserRequest, UpdateUserRequest |
|
|
809
|
-
| `internal/handler/grpc/user_handler.go` | Mapear campo Phone em CreateUser, UpdateUser, domainUserToProto, mapServiceError |
|
|
810
|
-
|
|
811
|
-
### 5.3 Arquivos de Referencia
|
|
812
|
-
| Arquivo | Motivo da Consulta |
|
|
813
|
-
|---------|-------------------|
|
|
814
|
-
| `gen/proto/v1/` (codigo gerado) | Verificar nomes de campos gerados apos `make proto` |
|
|
815
|
-
| `internal/service/user_service.go` | Verificar nomes dos campos nos inputs e erro ErrInvalidPhone |
|
|
816
|
-
|
|
817
|
-
---
|
|
818
|
-
|
|
819
|
-
## 6. Testes
|
|
820
|
-
|
|
821
|
-
### 6.1 Testes Unitarios
|
|
822
|
-
Atualizar `internal/handler/grpc/user_handler_test.go`:
|
|
823
|
-
|
|
824
|
-
**Testes novos:**
|
|
825
|
-
- [ ] Teste: `TestUserHandler_CreateUser_WithPhone` — enviar CreateUserRequest com phone e verificar que o input service recebe o valor
|
|
826
|
-
- [ ] Teste: `TestUserHandler_CreateUser_WithoutPhone` — enviar sem phone e verificar que funciona normalmente
|
|
827
|
-
- [ ] Teste: `TestUserHandler_CreateUser_InvalidPhone` — service retorna `ErrInvalidPhone`, verificar que handler retorna `InvalidArgument`
|
|
828
|
-
- [ ] Teste: `TestUserHandler_UpdateUser_PhoneOnly` — atualizar apenas telefone via gRPC
|
|
829
|
-
- [ ] Teste: `TestUserHandler_UpdateUser_InvalidPhone` — telefone invalido retorna `InvalidArgument`
|
|
830
|
-
- [ ] Teste: `TestUserHandler_GetUserLogged_ReturnsPhone` — verificar que GetUserLogged retorna o campo phone no proto
|
|
831
|
-
- [ ] Teste: atualizar `TestDomainUserToProto` para verificar campo `Phone`
|
|
832
|
-
- [ ] Teste: atualizar `TestMapServiceError_AllErrors` para incluir `ErrInvalidPhone`
|
|
833
|
-
|
|
834
|
-
**Testes existentes a atualizar:**
|
|
835
|
-
- [ ] Atualizar `MockUserService` se a interface mudou (adicionar `Phone` nos inputs)
|
|
836
|
-
- [ ] Atualizar testes existentes de CreateUser para incluir `Phone` no input (pode ser nil)
|
|
837
|
-
- [ ] Atualizar testes existentes de UpdateUser para incluir `Phone` no input (pode ser nil)
|
|
838
|
-
- [ ] Garantir que todos os testes existentes continuam passando
|
|
839
|
-
|
|
840
|
-
### 6.2 Testes de Integracao
|
|
841
|
-
- N/A
|
|
842
|
-
|
|
843
|
-
### 6.3 Testes E2E
|
|
844
|
-
- N/A — testes do handler com mock cobrem a integracao proto<->service
|
|
845
|
-
|
|
846
|
-
### 6.4 Cenarios de Erro
|
|
847
|
-
- [ ] Cenario: `ErrInvalidPhone` -> gRPC `InvalidArgument`
|
|
848
|
-
- [ ] Cenario: phone nil no request -> nao gera erro
|
|
849
|
-
- [ ] Cenario: phone vazio no UpdateUser -> nao inclui no input (req.Phone seria nil)
|
|
850
|
-
|
|
851
|
-
---
|
|
852
|
-
|
|
853
|
-
## 7. Notas / Observacoes
|
|
854
|
-
- O campo `optional string phone` no proto gera `*string` no Go, o que e compativel com o tipo `*string` no service e repository
|
|
855
|
-
- Os field numbers escolhidos (7 para User, 5 para CreateUserRequest, 6 para UpdateUserRequest) sao os proximos disponiveis em cada mensagem
|
|
856
|
-
- `make proto` deve ser executado ANTES de compilar o handler, pois o handler depende do codigo gerado
|
|
857
|
-
- A mensagem `CreateUserResponse` e `LoginResponse` NAO incluem phone (conforme estrutura atual do proto — elas retornam campos especificos, nao a mensagem User)
|
|
858
|
-
|
|
859
|
-
---
|
|
860
|
-
|
|
861
|
-
## 8. Checklist Final
|
|
862
|
-
- [ ] Implementada conforme SPEC
|
|
863
|
-
- [ ] Testes unitarios criados/atualizados
|
|
864
|
-
- [ ] Aceite tecnico atendido
|
|
865
|
-
- [ ] Revisada
|
|
866
|
-
- [ ] Integrada a branch principal
|
|
867
|
-
|
|
868
|
-
---
|
|
869
|
-
---
|
|
870
|
-
|
|
871
|
-
# T6.md — Validacao cruzada e testes end-to-end da feature completa
|
|
872
|
-
|
|
873
|
-
## 1. Identificacao
|
|
874
|
-
- **ID**: T6
|
|
875
|
-
- **Nome da Task**: Validacao cruzada e testes end-to-end da feature completa
|
|
876
|
-
- **Responsavel**: —
|
|
877
|
-
- **Status**: A Fazer
|
|
878
|
-
- **Fase**: Fase 4 — Testes e Validacao
|
|
879
|
-
- **Dependencias**: T5
|
|
880
|
-
- **User Stories Relacionadas**: US-10
|
|
881
|
-
|
|
882
|
-
---
|
|
883
|
-
|
|
884
|
-
## 2. Objetivo da Task
|
|
885
|
-
Garantir que toda a stack funciona de ponta a ponta: migracao aplica, queries funcionam, repository persiste e recupera, service valida, handler expoe via gRPC. Executar todos os testes existentes e validar que nenhum fluxo existente foi quebrado.
|
|
886
|
-
|
|
887
|
-
---
|
|
888
|
-
|
|
889
|
-
## 3. Descricao Detalhada
|
|
890
|
-
|
|
891
|
-
**1. Executar suite completa de testes:**
|
|
892
|
-
```bash
|
|
893
|
-
make test
|
|
894
|
-
```
|
|
895
|
-
Verificar que TODOS os testes passam — tanto os novos quanto os existentes.
|
|
896
|
-
|
|
897
|
-
**2. Executar build completo:**
|
|
898
|
-
```bash
|
|
899
|
-
make build
|
|
900
|
-
```
|
|
901
|
-
Verificar que nao ha erros de compilacao.
|
|
902
|
-
|
|
903
|
-
**3. Validar cenarios manualmente (se aplicavel):**
|
|
904
|
-
- Subir servidor com `make run`
|
|
905
|
-
- Testar via grpcurl ou cliente gRPC:
|
|
906
|
-
- CreateUser com telefone
|
|
907
|
-
- CreateUser sem telefone
|
|
908
|
-
- UpdateUser adicionando telefone
|
|
909
|
-
- UpdateUser removendo telefone (setar vazio / nil)
|
|
910
|
-
- GetUserLogged retornando telefone
|
|
911
|
-
- CreateUser com telefone invalido (< 10 chars)
|
|
912
|
-
|
|
913
|
-
**4. Verificar que testes de regressao passam:**
|
|
914
|
-
- Testes de service (unitarios com mock)
|
|
915
|
-
- Testes de handler (unitarios com mock)
|
|
916
|
-
- Testes de repository (integracao com SQLite)
|
|
917
|
-
|
|
918
|
-
---
|
|
919
|
-
|
|
920
|
-
## 4. Aceite Tecnico (criterios objetivos)
|
|
921
|
-
- [ ] `make test` passa sem falhas
|
|
922
|
-
- [ ] `make build` compila sem erros
|
|
923
|
-
- [ ] Nenhum teste existente quebrado
|
|
924
|
-
- [ ] Novos testes (de T3, T4, T5) incluidos e passando
|
|
925
|
-
- [ ] Campo `phone` flui corretamente de gRPC request -> handler -> service -> repository -> banco -> retorno
|
|
926
|
-
|
|
927
|
-
---
|
|
928
|
-
|
|
929
|
-
## 5. Arquivos Impactados
|
|
930
|
-
|
|
931
|
-
### 5.1 Arquivos a Criar
|
|
932
|
-
| Arquivo | Descricao |
|
|
933
|
-
|---------|-----------|
|
|
934
|
-
| Nenhum | — |
|
|
935
|
-
|
|
936
|
-
### 5.2 Arquivos a Modificar
|
|
937
|
-
| Arquivo | Modificacao |
|
|
938
|
-
|---------|------------|
|
|
939
|
-
| Nenhum | Task de validacao — apenas execucao de testes |
|
|
940
|
-
|
|
941
|
-
### 5.3 Arquivos de Referencia
|
|
942
|
-
| Arquivo | Motivo da Consulta |
|
|
943
|
-
|---------|-------------------|
|
|
944
|
-
| Todos os arquivos de teste | Verificar que passam |
|
|
945
|
-
| `Makefile` | Verificar comandos make test, make build |
|
|
946
|
-
|
|
947
|
-
---
|
|
948
|
-
|
|
949
|
-
## 6. Testes
|
|
950
|
-
|
|
951
|
-
### 6.1 Testes Unitarios
|
|
952
|
-
- [ ] Executar `CGO_ENABLED=1 go test ./internal/service/... -v` — todos devem passar
|
|
953
|
-
- [ ] Executar `CGO_ENABLED=1 go test ./internal/handler/grpc/... -v` — todos devem passar
|
|
954
|
-
|
|
955
|
-
### 6.2 Testes de Integracao
|
|
956
|
-
- [ ] Executar `CGO_ENABLED=1 go test ./internal/repository/... -v` — todos devem passar
|
|
957
|
-
|
|
958
|
-
### 6.3 Testes E2E
|
|
959
|
-
- [ ] (Opcional) Teste manual via grpcurl: CreateUser com phone, GetUserLogged retorna phone
|
|
960
|
-
|
|
961
|
-
### 6.4 Cenarios de Erro
|
|
962
|
-
- [ ] Cenario: nenhum teste existente quebrado (regressao zero)
|
|
963
|
-
|
|
964
|
-
---
|
|
965
|
-
|
|
966
|
-
## 7. Notas / Observacoes
|
|
967
|
-
- Esta task e de validacao final — nao cria codigo novo
|
|
968
|
-
- Se algum teste falhar, a correcao deve ser feita na task correspondente (T1-T5)
|
|
969
|
-
- O objetivo e garantir integridade antes de considerar a feature completa
|
|
970
|
-
|
|
971
|
-
---
|
|
972
|
-
|
|
973
|
-
## 8. Checklist Final
|
|
974
|
-
- [ ] `make test` sem falhas
|
|
975
|
-
- [ ] `make build` sem erros
|
|
976
|
-
- [ ] Aceite tecnico atendido
|
|
977
|
-
- [ ] Revisada
|
|
978
|
-
- [ ] Integrada a branch principal
|
|
979
|
-
|
|
980
|
-
---
|
|
981
|
-
---
|
|
982
|
-
|
|
983
|
-
# task_plan.md — Documento de Referencia
|
|
984
|
-
|
|
985
|
-
# TASK PLAN -- Adicionar Telefone ao Modulo de Usuario
|
|
986
|
-
|
|
987
|
-
## 1. Identificacao
|
|
988
|
-
- **Feature/Projeto**: Adicionar Telefone ao Modulo de Usuario
|
|
989
|
-
- **Responsavel (Tech Lead)**: —
|
|
990
|
-
- **Data**: 2026-03-08
|
|
991
|
-
- **Status**: Rascunho
|
|
992
|
-
- **SPEC Relacionado**: docs/feature-telefone-usuario/v1/spec_tech.md (referencia inline no SPEC_TECH fornecido)
|
|
993
|
-
- **PRD Relacionado**: docs/feature-telefone-usuario/v1/prd.md
|
|
994
|
-
|
|
995
|
-
---
|
|
996
|
-
|
|
997
|
-
## 2. Objetivo do Task Plan
|
|
998
|
-
Adicionar o campo `telefone` (opcional) ao modulo de usuario em todas as camadas da aplicacao: banco de dados, queries SQLC, repository, service (com validacao de 10-15 caracteres), proto e handler gRPC. Ao final, o campo telefone estara disponivel nos endpoints CreateUser, UpdateUser e GetUserLogged.
|
|
999
|
-
|
|
1000
|
-
---
|
|
1001
|
-
|
|
1002
|
-
## 3. Macro-Fases (alto nivel)
|
|
1003
|
-
- **Fase 1 -- Banco de Dados e Queries**
|
|
1004
|
-
- Objetivo: Criar a infraestrutura de dados para suportar o campo telefone
|
|
1005
|
-
- Tasks: T1, T2
|
|
1006
|
-
- **Fase 2 -- Camadas de Negocio (Repository + Service)**
|
|
1007
|
-
- Objetivo: Integrar o campo telefone nas camadas de dominio com mapeamento e validacao
|
|
1008
|
-
- Tasks: T3, T4
|
|
1009
|
-
- **Fase 3 -- Interface gRPC (Proto + Handler)**
|
|
1010
|
-
- Objetivo: Expor o campo telefone via API gRPC
|
|
1011
|
-
- Tasks: T5
|
|
1012
|
-
- **Fase 4 -- Testes e Validacao**
|
|
1013
|
-
- Objetivo: Garantir integridade da feature e regressao zero
|
|
1014
|
-
- Tasks: T6
|
|
1015
|
-
|
|
1016
|
-
---
|
|
1017
|
-
|
|
1018
|
-
## 4. Lista de Tasks (visao macro)
|
|
1019
|
-
| ID | Nome da Task | Arquivo | Fase | Dependencias | Pode Rodar em Paralelo? | Status |
|
|
1020
|
-
| --- | ------------ | ------- | ---- | ------------ | ----------------------- | ------ |
|
|
1021
|
-
| T1 | Criar migracao para adicionar coluna telefone | [T1](tasks/T1.md) | Fase 1 | Nenhuma | Sim (inicio) | A Fazer |
|
|
1022
|
-
| T2 | Atualizar queries SQLC para incluir coluna telefone | [T2](tasks/T2.md) | Fase 1 | T1 | Nao | A Fazer |
|
|
1023
|
-
| T3 | Adicionar campo Phone ao repository e atualizar mapeamento | [T3](tasks/T3.md) | Fase 2 | T2 | Nao | A Fazer |
|
|
1024
|
-
| T4 | Adicionar campo Phone ao service com validacao | [T4](tasks/T4.md) | Fase 2 | T3 | Nao | A Fazer |
|
|
1025
|
-
| T5 | Atualizar proto e handler gRPC para incluir campo phone | [T5](tasks/T5.md) | Fase 3 | T4 | Nao | A Fazer |
|
|
1026
|
-
| T6 | Validacao cruzada e testes end-to-end da feature completa | [T6](tasks/T6.md) | Fase 4 | T5 | Nao | A Fazer |
|
|
1027
|
-
|
|
1028
|
-
---
|
|
1029
|
-
|
|
1030
|
-
## 5. Rastreabilidade: User Stories -> Tasks
|
|
1031
|
-
|
|
1032
|
-
| User Story (PRD) | Definicao Tecnica (SPEC) | Tasks Relacionadas | Status |
|
|
1033
|
-
| ---------------- | ------------------------ | ------------------ | ------ |
|
|
1034
|
-
| US-10: Informar telefone para receber SMS | 3.1 Banco (migracao), 3.2 SQLC (queries), 3.3 Repository (campo Phone), 3.4 Service (validacao), 3.5 Handler (mapeamento), 3.6 Proto (campo phone) | T1, T2, T3, T4, T5, T6 | A Fazer |
|
|
1035
|
-
|
|
1036
|
-
> Todas as user stories do SPEC_TECH foram decompostas em tasks.
|
|
1037
|
-
|
|
1038
|
-
---
|
|
1039
|
-
|
|
1040
|
-
## 6. Dependencias Gerais
|
|
1041
|
-
|
|
1042
|
-
- **Cadeia sequencial**: T1 -> T2 -> T3 -> T4 -> T5 -> T6
|
|
1043
|
-
- As tasks sao sequenciais pois cada camada depende da anterior (banco -> SQLC -> repository -> service -> handler)
|
|
1044
|
-
- **Ferramentas externas necessarias**: `buf` (proto), `sqlc` (queries) — devem estar instaladas
|
|
1045
|
-
- **Prerequisito**: `CGO_ENABLED=1` para compilacao (dependencia go-sqlite3)
|
|
1046
|
-
- Nao ha dependencia de tasks de outras features
|
|
1047
|
-
- Nao ha paralelismo possivel nesta feature (cadeia linear de dependencias por camada)
|
|
1048
|
-
|
|
1049
|
-
---
|
|
1050
|
-
|
|
1051
|
-
## 7. Criterios de Conclusao da Feature
|
|
1052
|
-
A feature sera considerada concluida quando:
|
|
1053
|
-
- [x] Todas as tasks estiverem completas (T1-T6)
|
|
1054
|
-
- [ ] Testes validados (`make test` sem falhas)
|
|
1055
|
-
- [ ] Criterios tecnicos do SPEC atendidos (campo telefone opcional, validacao 10-15 chars)
|
|
1056
|
-
- [ ] Nenhum comportamento divergente do PRD
|
|
1057
|
-
- [ ] Todas as User Stories cobertas (US-10)
|
|
1058
|
-
- [ ] Build aprovado (`make build` sem erros)
|
|
1059
|
-
|
|
1060
|
-
---
|
|
1061
|
-
|
|
1062
|
-
## 8. Riscos & Mitigacoes
|
|
1063
|
-
- **Risco**: Migracao SQLite com ALTER TABLE pode ter limitacoes -> **Mitigacao**: ALTER TABLE ADD COLUMN e suportado sem restricoes no SQLite
|
|
1064
|
-
- **Risco**: Campo `telefone` nullable gera `sql.NullString` no SQLC, adicionando complexidade -> **Mitigacao**: Funcoes helper `toNullString`/`fromNullString` encapsulam a conversao
|
|
1065
|
-
- **Risco**: Testes existentes quebram por mudanca na struct User -> **Mitigacao**: Campo `Phone` e ponteiro (`*string`), valor zero e nil, testes existentes nao precisam setar
|
|
1066
|
-
|
|
1067
|
-
---
|
|
1068
|
-
|
|
1069
|
-
## 9. Checklist Final
|
|
1070
|
-
- [x] Task Plan completo
|
|
1071
|
-
- [x] Tasks mapeadas (T1-T6)
|
|
1072
|
-
- [x] Dependencias validadas (cadeia sequencial)
|
|
1073
|
-
- [x] Rastreabilidade User Stories -> Tasks preenchida (US-10 -> T1-T6)
|
|
1074
|
-
- [x] Pronto para execucao
|
|
1075
|
-
|
|
1076
|
-
---
|
|
1077
|
-
|
|
1078
|
-
Arquivos que seriam salvos:
|
|
1079
|
-
- `docs/telefone-usuario/v1/task_plan.md`
|
|
1080
|
-
- `docs/telefone-usuario/v1/tasks/T1.md`
|
|
1081
|
-
- `docs/telefone-usuario/v1/tasks/T2.md`
|
|
1082
|
-
- `docs/telefone-usuario/v1/tasks/T3.md`
|
|
1083
|
-
- `docs/telefone-usuario/v1/tasks/T4.md`
|
|
1084
|
-
- `docs/telefone-usuario/v1/tasks/T5.md`
|
|
1085
|
-
- `docs/telefone-usuario/v1/tasks/T6.md`
|
|
1086
|
-
|
|
1087
|
-
Task Plan aprovado para execucao? (sim/nao)
|