adi_dev_workflow 1.1.1 → 1.3.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 -311
- package/frameworks/agents/qa-validation-expert.md +458 -458
- package/frameworks/agents/tech-review-conformance.md +200 -200
- 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 +2 -0
- package/frameworks/commands/taskcard/run-taskcard.md +2 -0
- package/frameworks/config/ai-framework-config.yaml +112 -0
- package/frameworks/skills/ministack-tasks-expert/SKILL.md +204 -204
- package/frameworks/skills/ministack-tasks-expert/templates/task_plan_template.md +78 -78
- package/frameworks/skills/ministack-tasks-expert/templates/task_template.md +103 -103
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/benchmark.json +99 -99
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/benchmark.md +64 -64
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/eval_metadata.json +12 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/outputs/response.md +134 -134
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/outputs/transcript.md +68 -68
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/timing.json +5 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/outputs/response.md +525 -525
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/outputs/transcript.md +30 -30
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/timing.json +5 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/eval_metadata.json +12 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/response.md +1126 -1126
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/transcript.md +131 -131
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/timing.json +5 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/outputs/response.md +452 -452
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/outputs/transcript.md +78 -78
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/timing.json +5 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/eval_metadata.json +12 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/outputs/response.md +101 -101
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/outputs/transcript.md +133 -133
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/timing.json +5 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/response.md +248 -248
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/transcript.md +49 -49
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/timing.json +5 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/review.html +1325 -1325
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/benchmark.json +94 -94
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/benchmark.md +67 -67
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/eval_metadata.json +12 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/outputs/response.md +117 -117
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/outputs/transcript.md +91 -91
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/timing.json +1 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/outputs/response.md +694 -694
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/outputs/transcript.md +45 -45
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/timing.json +1 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/eval_metadata.json +12 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/outputs/response.md +1087 -1087
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/outputs/transcript.md +124 -124
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/timing.json +1 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/outputs/response.md +458 -458
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/outputs/transcript.md +84 -84
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/timing.json +1 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/eval_metadata.json +12 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/outputs/response.md +70 -70
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/outputs/transcript.md +148 -148
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/timing.json +1 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/outputs/response.md +249 -249
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/outputs/transcript.md +80 -80
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/timing.json +1 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/review.html +1325 -1325
- package/frameworks/skills/sdd-tech-spec-expert/SKILL.md +317 -317
- package/frameworks/skills/sdd-tech-spec-expert/evals/evals.json +199 -199
- package/frameworks/skills/sdd-tech-spec-expert/templates/spec_tech_template.md +290 -290
- package/frameworks/skills/sdd-tech-spec-expert/templates/tech_direction-template.md +23 -23
- package/package.json +28 -28
- package/src/cli.js +121 -121
- package/src/installer.js +155 -136
- package/src/transformer.js +86 -86
|
@@ -1,452 +1,452 @@
|
|
|
1
|
-
# TASK PLAN — Adicionar Telefone ao Usuario v1
|
|
2
|
-
|
|
3
|
-
## 1. Identificacao
|
|
4
|
-
|
|
5
|
-
| Campo | Valor |
|
|
6
|
-
|-------|-------|
|
|
7
|
-
| **Feature** | Adicionar Telefone ao Modulo de Usuario |
|
|
8
|
-
| **Versao** | v1 |
|
|
9
|
-
| **Data** | 2026-03-07 |
|
|
10
|
-
| **SPEC_TECH** | docs/feature-telefone-usuario/v1/spec_tech.md |
|
|
11
|
-
| **Branch base** | user-feature |
|
|
12
|
-
|
|
13
|
-
## 2. Resumo
|
|
14
|
-
|
|
15
|
-
Adicionar o campo opcional `telefone` na tabela `usuarios` e propagar a mudanca por todas as camadas: migracao SQL, queries SQLC, repository, service, proto e handler gRPC. Inclui validacao opcional (10-15 caracteres quando informado) e testes unitarios.
|
|
16
|
-
|
|
17
|
-
## 3. Tarefas
|
|
18
|
-
|
|
19
|
-
### TASK-1: Criar migracao SQL para adicionar coluna telefone
|
|
20
|
-
|
|
21
|
-
**Camada:** Banco de Dados
|
|
22
|
-
**Arquivo a criar:** `internal/db/migrations/002_add_telefone_usuarios.sql`
|
|
23
|
-
**Descricao:**
|
|
24
|
-
Criar nova migracao com `ALTER TABLE usuarios ADD COLUMN telefone TEXT;`. Conforme regra de imutabilidade, nao editar a migracao 001 existente.
|
|
25
|
-
|
|
26
|
-
**Conteudo esperado:**
|
|
27
|
-
```sql
|
|
28
|
-
ALTER TABLE usuarios ADD COLUMN telefone TEXT;
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
**Criterio de aceite:**
|
|
32
|
-
- Arquivo criado em `internal/db/migrations/002_add_telefone_usuarios.sql`
|
|
33
|
-
- Migracao 001 inalterada
|
|
34
|
-
- Coluna `telefone` do tipo `TEXT` (nullable/opcional)
|
|
35
|
-
|
|
36
|
-
**Dependencias:** Nenhuma
|
|
37
|
-
|
|
38
|
-
---
|
|
39
|
-
|
|
40
|
-
### TASK-2: Atualizar queries SQLC para incluir telefone
|
|
41
|
-
|
|
42
|
-
**Camada:** SQLC Queries
|
|
43
|
-
**Arquivo a editar:** `internal/db/sqlc/queries/user.sql`
|
|
44
|
-
**Descricao:**
|
|
45
|
-
Adicionar a coluna `telefone` na query `CreateUser` (INSERT e parametros) e criar uma nova query `UpdateUser` que permita atualizar nome e telefone.
|
|
46
|
-
|
|
47
|
-
**Alteracoes esperadas:**
|
|
48
|
-
|
|
49
|
-
Query `CreateUser` atualizada:
|
|
50
|
-
```sql
|
|
51
|
-
-- name: CreateUser :one
|
|
52
|
-
INSERT INTO usuarios (id, nome, email, senha_hash, telefone, data_criacao, data_atualizacao)
|
|
53
|
-
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
54
|
-
RETURNING *;
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
Nova query `UpdateUser`:
|
|
58
|
-
```sql
|
|
59
|
-
-- name: UpdateUser :one
|
|
60
|
-
UPDATE usuarios SET nome = ?, telefone = ?, data_atualizacao = ?
|
|
61
|
-
WHERE id = ?
|
|
62
|
-
RETURNING *;
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
**Criterio de aceite:**
|
|
66
|
-
- Query `CreateUser` inclui coluna `telefone`
|
|
67
|
-
- Nova query `UpdateUser` criada
|
|
68
|
-
- Executar `make generate` (ou `make sqlc`) apos a edicao para regenerar codigo
|
|
69
|
-
|
|
70
|
-
**Dependencias:** TASK-1
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
### TASK-3: Regenerar codigo SQLC
|
|
75
|
-
|
|
76
|
-
**Camada:** Codigo Gerado
|
|
77
|
-
**Descricao:**
|
|
78
|
-
Executar `make generate` para que o SQLC regenere os arquivos Go em `internal/db/sqlc/` com a nova coluna `telefone` e a nova query `UpdateUser`.
|
|
79
|
-
|
|
80
|
-
**Comando:**
|
|
81
|
-
```bash
|
|
82
|
-
make generate
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
**Criterio de aceite:**
|
|
86
|
-
- Struct `Usuario` gerada inclui campo `Telefone`
|
|
87
|
-
- Struct `CreateUserParams` inclui campo `Telefone`
|
|
88
|
-
- Struct `UpdateUserParams` gerada
|
|
89
|
-
- Funcao `UpdateUser` gerada em queries
|
|
90
|
-
|
|
91
|
-
**Dependencias:** TASK-1, TASK-2
|
|
92
|
-
|
|
93
|
-
---
|
|
94
|
-
|
|
95
|
-
### TASK-4: Atualizar modelo e repository do usuario
|
|
96
|
-
|
|
97
|
-
**Camada:** Repository
|
|
98
|
-
**Arquivo a editar:** `internal/repository/user_repository.go`
|
|
99
|
-
**Descricao:**
|
|
100
|
-
Adicionar campo `Phone` ao modelo `User`. Atualizar o mapeamento na funcao `toUser` para converter `telefone` (banco) para `Phone` (Go). Atualizar `Create` para passar `telefone` nos parametros SQLC. Adicionar metodo `Update` na interface e implementacao.
|
|
101
|
-
|
|
102
|
-
**Alteracoes esperadas:**
|
|
103
|
-
|
|
104
|
-
1. Adicionar campo na struct:
|
|
105
|
-
```go
|
|
106
|
-
type User struct {
|
|
107
|
-
ID string
|
|
108
|
-
Name string
|
|
109
|
-
Email string
|
|
110
|
-
PasswordHash string
|
|
111
|
-
Phone string // novo campo
|
|
112
|
-
CreatedAt time.Time
|
|
113
|
-
UpdatedAt time.Time
|
|
114
|
-
}
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
2. Atualizar interface:
|
|
118
|
-
```go
|
|
119
|
-
type UserRepository interface {
|
|
120
|
-
Create(ctx context.Context, user *User) (*User, error)
|
|
121
|
-
GetByID(ctx context.Context, id string) (*User, error)
|
|
122
|
-
Update(ctx context.Context, user *User) (*User, error) // novo metodo
|
|
123
|
-
}
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
3. Atualizar `Create` para incluir `Telefone` nos params SQLC
|
|
127
|
-
4. Implementar metodo `Update` usando `r.queries.UpdateUser`
|
|
128
|
-
5. Atualizar funcao `toUser` para mapear `Telefone` -> `Phone`
|
|
129
|
-
|
|
130
|
-
**Criterio de aceite:**
|
|
131
|
-
- Campo `Phone` presente no modelo `User`
|
|
132
|
-
- Mapeamento `Telefone` <-> `Phone` funcional em `toUser`
|
|
133
|
-
- Metodo `Update` implementado
|
|
134
|
-
- `Create` passa `telefone` para o SQLC
|
|
135
|
-
|
|
136
|
-
**Dependencias:** TASK-3
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
### TASK-5: Atualizar service do usuario
|
|
141
|
-
|
|
142
|
-
**Camada:** Service
|
|
143
|
-
**Arquivo a editar:** `internal/service/user_service.go`
|
|
144
|
-
**Descricao:**
|
|
145
|
-
Adicionar campo `Phone` ao `CreateUserInput`. Criar struct `UpdateUserInput`. Adicionar metodo `UpdateUser` na interface e implementacao. Implementar validacao: se `phone` informado, deve ter entre 10 e 15 caracteres.
|
|
146
|
-
|
|
147
|
-
**Alteracoes esperadas:**
|
|
148
|
-
|
|
149
|
-
1. Atualizar input de criacao:
|
|
150
|
-
```go
|
|
151
|
-
type CreateUserInput struct {
|
|
152
|
-
Name string
|
|
153
|
-
Email string
|
|
154
|
-
Password string
|
|
155
|
-
Phone string // novo, opcional
|
|
156
|
-
}
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
2. Criar input de atualizacao:
|
|
160
|
-
```go
|
|
161
|
-
type UpdateUserInput struct {
|
|
162
|
-
ID string
|
|
163
|
-
Name string
|
|
164
|
-
Phone string // opcional
|
|
165
|
-
}
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
3. Atualizar interface:
|
|
169
|
-
```go
|
|
170
|
-
type UserService interface {
|
|
171
|
-
CreateUser(ctx context.Context, input CreateUserInput) (*repository.User, error)
|
|
172
|
-
GetUser(ctx context.Context, id string) (*repository.User, error)
|
|
173
|
-
UpdateUser(ctx context.Context, input UpdateUserInput) (*repository.User, error) // novo
|
|
174
|
-
}
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
4. Adicionar validacao de telefone (reutilizavel em Create e Update):
|
|
178
|
-
```go
|
|
179
|
-
func validatePhone(phone string) error {
|
|
180
|
-
if phone != "" && (len(phone) < 10 || len(phone) > 15) {
|
|
181
|
-
return errors.New("telefone deve ter entre 10 e 15 caracteres")
|
|
182
|
-
}
|
|
183
|
-
return nil
|
|
184
|
-
}
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
5. Chamar `validatePhone` em `CreateUser` e `UpdateUser`
|
|
188
|
-
6. Passar `Phone` para `repository.User` em `CreateUser`
|
|
189
|
-
7. Implementar `UpdateUser` com busca por ID + chamada ao repo
|
|
190
|
-
|
|
191
|
-
**Criterio de aceite:**
|
|
192
|
-
- Campo `Phone` aceito em `CreateUser`
|
|
193
|
-
- Metodo `UpdateUser` implementado
|
|
194
|
-
- Validacao de telefone (10-15 chars) funcional
|
|
195
|
-
- Telefone vazio e aceito (campo opcional)
|
|
196
|
-
|
|
197
|
-
**Dependencias:** TASK-4
|
|
198
|
-
|
|
199
|
-
---
|
|
200
|
-
|
|
201
|
-
### TASK-6: Atualizar definicao Proto
|
|
202
|
-
|
|
203
|
-
**Camada:** Proto/gRPC
|
|
204
|
-
**Arquivo a editar:** `api/proto/v1/user.proto`
|
|
205
|
-
**Descricao:**
|
|
206
|
-
Adicionar campo `string phone` nas mensagens `CreateUserRequest`, `CreateUserResponse`, `GetUserResponse`. Criar mensagens `UpdateUserRequest` e `UpdateUserResponse`. Adicionar RPC `UpdateUser` ao service.
|
|
207
|
-
|
|
208
|
-
**Alteracoes esperadas:**
|
|
209
|
-
|
|
210
|
-
1. Adicionar `string phone = 4;` em `CreateUserRequest`
|
|
211
|
-
2. Adicionar `string phone = 4;` em `CreateUserResponse` (apos `email`, ajustar numeracao de `created_at` para 5)
|
|
212
|
-
3. Adicionar `string phone = 4;` em `GetUserResponse` (apos `email`, ajustar numeracao: `phone=4`, `created_at=5`, `updated_at=6`)
|
|
213
|
-
|
|
214
|
-
> **ATENCAO:** A numeracao dos campos existentes NAO pode ser alterada sem quebrar compatibilidade. Verificar a numeracao atual antes de definir os novos numeros. Dado que `CreateUserResponse` ja usa campos 1-4 e `GetUserResponse` usa 1-5, o campo `phone` deve usar o proximo numero disponivel em cada mensagem.
|
|
215
|
-
|
|
216
|
-
Numeracao correta baseada no proto atual:
|
|
217
|
-
- `CreateUserRequest`: `string phone = 4;` (campos existentes: 1=name, 2=email, 3=password)
|
|
218
|
-
- `CreateUserResponse`: `string phone = 5;` (campos existentes: 1=id, 2=name, 3=email, 4=created_at)
|
|
219
|
-
- `GetUserResponse`: `string phone = 6;` (campos existentes: 1=id, 2=name, 3=email, 4=created_at, 5=updated_at)
|
|
220
|
-
|
|
221
|
-
4. Criar mensagens novas:
|
|
222
|
-
```proto
|
|
223
|
-
message UpdateUserRequest {
|
|
224
|
-
string id = 1;
|
|
225
|
-
string name = 2;
|
|
226
|
-
string phone = 3;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
message UpdateUserResponse {
|
|
230
|
-
string id = 1;
|
|
231
|
-
string name = 2;
|
|
232
|
-
string email = 3;
|
|
233
|
-
string phone = 4;
|
|
234
|
-
string updated_at = 5;
|
|
235
|
-
}
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
5. Adicionar ao service:
|
|
239
|
-
```proto
|
|
240
|
-
rpc UpdateUser(UpdateUserRequest) returns (UpdateUserResponse);
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
**Criterio de aceite:**
|
|
244
|
-
- Campo `phone` adicionado nas mensagens existentes com numeracao correta
|
|
245
|
-
- Mensagens `UpdateUserRequest`/`UpdateUserResponse` criadas
|
|
246
|
-
- RPC `UpdateUser` registrado no service
|
|
247
|
-
- Numeracao de campos existentes NAO alterada
|
|
248
|
-
|
|
249
|
-
**Dependencias:** Nenhuma (pode ser feita em paralelo com TASK-1 a TASK-5)
|
|
250
|
-
|
|
251
|
-
---
|
|
252
|
-
|
|
253
|
-
### TASK-7: Regenerar codigo Proto
|
|
254
|
-
|
|
255
|
-
**Camada:** Codigo Gerado
|
|
256
|
-
**Descricao:**
|
|
257
|
-
Executar `make generate` (buf generate) para regenerar o codigo Go em `gen/proto/v1/`.
|
|
258
|
-
|
|
259
|
-
**Comando:**
|
|
260
|
-
```bash
|
|
261
|
-
make generate
|
|
262
|
-
```
|
|
263
|
-
|
|
264
|
-
**Criterio de aceite:**
|
|
265
|
-
- Structs Go geradas incluem campo `Phone`
|
|
266
|
-
- Interface `UserServiceServer` inclui metodo `UpdateUser`
|
|
267
|
-
- Compilacao sem erros
|
|
268
|
-
|
|
269
|
-
**Dependencias:** TASK-6
|
|
270
|
-
|
|
271
|
-
---
|
|
272
|
-
|
|
273
|
-
### TASK-8: Atualizar handler gRPC do usuario
|
|
274
|
-
|
|
275
|
-
**Camada:** Handler
|
|
276
|
-
**Arquivo a editar:** `internal/handler/grpc/user_handler.go`
|
|
277
|
-
**Descricao:**
|
|
278
|
-
Atualizar `CreateUser` para passar `Phone` do request para o service input e incluir `phone` na response. Implementar metodo `UpdateUser`. Atualizar `GetUser` para incluir `phone` na response.
|
|
279
|
-
|
|
280
|
-
**Alteracoes esperadas:**
|
|
281
|
-
|
|
282
|
-
1. Em `CreateUser`:
|
|
283
|
-
- Adicionar `Phone: req.GetPhone()` ao `CreateUserInput`
|
|
284
|
-
- Adicionar `Phone: user.Phone` na response
|
|
285
|
-
|
|
286
|
-
2. Em `GetUser`:
|
|
287
|
-
- Adicionar `Phone: user.Phone` na response
|
|
288
|
-
|
|
289
|
-
3. Novo metodo `UpdateUser`:
|
|
290
|
-
```go
|
|
291
|
-
func (h *UserHandler) UpdateUser(ctx context.Context, req *pb.UpdateUserRequest) (*pb.UpdateUserResponse, error) {
|
|
292
|
-
input := service.UpdateUserInput{
|
|
293
|
-
ID: req.GetId(),
|
|
294
|
-
Name: req.GetName(),
|
|
295
|
-
Phone: req.GetPhone(),
|
|
296
|
-
}
|
|
297
|
-
user, err := h.userService.UpdateUser(ctx, input)
|
|
298
|
-
if err != nil {
|
|
299
|
-
return nil, mapServiceError(err)
|
|
300
|
-
}
|
|
301
|
-
return &pb.UpdateUserResponse{
|
|
302
|
-
Id: user.ID,
|
|
303
|
-
Name: user.Name,
|
|
304
|
-
Email: user.Email,
|
|
305
|
-
Phone: user.Phone,
|
|
306
|
-
UpdatedAt: user.UpdatedAt.Format(time.RFC3339),
|
|
307
|
-
}, nil
|
|
308
|
-
}
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
**Criterio de aceite:**
|
|
312
|
-
- `CreateUser` repassa e retorna `phone`
|
|
313
|
-
- `GetUser` retorna `phone`
|
|
314
|
-
- `UpdateUser` implementado e funcional
|
|
315
|
-
- Erros mapeados corretamente
|
|
316
|
-
|
|
317
|
-
**Dependencias:** TASK-5, TASK-7
|
|
318
|
-
|
|
319
|
-
---
|
|
320
|
-
|
|
321
|
-
### TASK-9: Configurar UpdateUser como rota protegida
|
|
322
|
-
|
|
323
|
-
**Camada:** Configuracao
|
|
324
|
-
**Arquivo a verificar:** `configs/config.yaml`
|
|
325
|
-
**Descricao:**
|
|
326
|
-
Verificar que `UpdateUser` NAO esta em `skip_methods` (ou seja, requer autenticacao). Apenas `CreateUser` deve ser publico. Se necessario, nenhuma alteracao e necessaria, apenas confirmar.
|
|
327
|
-
|
|
328
|
-
**Criterio de aceite:**
|
|
329
|
-
- `UpdateUser` exige autenticacao (Bearer token)
|
|
330
|
-
- Nenhuma rota protegida acidentalmente exposta
|
|
331
|
-
|
|
332
|
-
**Dependencias:** TASK-8
|
|
333
|
-
|
|
334
|
-
---
|
|
335
|
-
|
|
336
|
-
### TASK-10: Atualizar testes unitarios do service
|
|
337
|
-
|
|
338
|
-
**Camada:** Testes
|
|
339
|
-
**Arquivo a editar:** `internal/service/user_service_test.go`
|
|
340
|
-
**Descricao:**
|
|
341
|
-
Atualizar mock do repository para incluir metodo `Update`. Adicionar testes para:
|
|
342
|
-
|
|
343
|
-
1. `TestCreateUser_WithPhone_Success` — criacao com telefone valido
|
|
344
|
-
2. `TestCreateUser_WithInvalidPhone_TooShort` — telefone com menos de 10 chars
|
|
345
|
-
3. `TestCreateUser_WithInvalidPhone_TooLong` — telefone com mais de 15 chars
|
|
346
|
-
4. `TestCreateUser_WithEmptyPhone_Success` — telefone vazio (opcional)
|
|
347
|
-
5. `TestUpdateUser_Success` — atualizacao com dados validos
|
|
348
|
-
6. `TestUpdateUser_WithPhone_Success` — atualizacao com telefone valido
|
|
349
|
-
7. `TestUpdateUser_InvalidPhone` — telefone invalido na atualizacao
|
|
350
|
-
8. `TestUpdateUser_NotFound` — usuario nao encontrado
|
|
351
|
-
|
|
352
|
-
**Criterio de aceite:**
|
|
353
|
-
- Mock atualizado com metodo `Update`
|
|
354
|
-
- Todos os cenarios de telefone cobertos (valido, vazio, curto, longo)
|
|
355
|
-
- Testes de `UpdateUser` adicionados
|
|
356
|
-
- Todos os testes passam: `CGO_ENABLED=1 go test ./internal/service/... -v`
|
|
357
|
-
|
|
358
|
-
**Dependencias:** TASK-5
|
|
359
|
-
|
|
360
|
-
---
|
|
361
|
-
|
|
362
|
-
### TASK-11: Atualizar testes unitarios do handler
|
|
363
|
-
|
|
364
|
-
**Camada:** Testes
|
|
365
|
-
**Arquivo a editar:** `internal/handler/grpc/user_handler_test.go`
|
|
366
|
-
**Descricao:**
|
|
367
|
-
Atualizar mock do service para incluir metodo `UpdateUser`. Adicionar testes para:
|
|
368
|
-
|
|
369
|
-
1. `TestUserHandler_CreateUser_WithPhone` — verifica que phone e repassado e retornado
|
|
370
|
-
2. `TestUserHandler_GetUser_WithPhone` — verifica que phone e retornado
|
|
371
|
-
3. `TestUserHandler_UpdateUser_Success` — atualizacao com sucesso
|
|
372
|
-
4. `TestUserHandler_UpdateUser_NotFound` — usuario nao encontrado
|
|
373
|
-
5. `TestUserHandler_UpdateUser_InvalidPhone` — telefone invalido
|
|
374
|
-
|
|
375
|
-
**Criterio de aceite:**
|
|
376
|
-
- Mock atualizado com metodo `UpdateUser`
|
|
377
|
-
- Testes de phone no CreateUser e GetUser
|
|
378
|
-
- Testes de UpdateUser cobrindo sucesso e erros
|
|
379
|
-
- Todos os testes passam: `CGO_ENABLED=1 go test ./internal/handler/grpc/... -v`
|
|
380
|
-
|
|
381
|
-
**Dependencias:** TASK-8
|
|
382
|
-
|
|
383
|
-
---
|
|
384
|
-
|
|
385
|
-
### TASK-12: Teste de integracao e validacao final
|
|
386
|
-
|
|
387
|
-
**Camada:** Validacao
|
|
388
|
-
**Descricao:**
|
|
389
|
-
Executar build e suite completa de testes para garantir que tudo funciona junto.
|
|
390
|
-
|
|
391
|
-
**Comandos:**
|
|
392
|
-
```bash
|
|
393
|
-
make build
|
|
394
|
-
make test
|
|
395
|
-
```
|
|
396
|
-
|
|
397
|
-
**Criterio de aceite:**
|
|
398
|
-
- Build compila sem erros
|
|
399
|
-
- Todos os testes passam
|
|
400
|
-
- Nenhuma regressao nos testes existentes
|
|
401
|
-
|
|
402
|
-
**Dependencias:** TASK-10, TASK-11
|
|
403
|
-
|
|
404
|
-
---
|
|
405
|
-
|
|
406
|
-
## 4. Grafo de Dependencias
|
|
407
|
-
|
|
408
|
-
```
|
|
409
|
-
TASK-1 (migracao SQL)
|
|
410
|
-
└─> TASK-2 (queries SQLC)
|
|
411
|
-
└─> TASK-3 (make generate - SQLC)
|
|
412
|
-
└─> TASK-4 (repository)
|
|
413
|
-
└─> TASK-5 (service)
|
|
414
|
-
├─> TASK-8 (handler) [+ TASK-7]
|
|
415
|
-
└─> TASK-10 (testes service)
|
|
416
|
-
|
|
417
|
-
TASK-6 (proto) [paralelo com TASK-1..5]
|
|
418
|
-
└─> TASK-7 (make generate - proto)
|
|
419
|
-
└─> TASK-8 (handler)
|
|
420
|
-
├─> TASK-9 (config auth)
|
|
421
|
-
└─> TASK-11 (testes handler)
|
|
422
|
-
|
|
423
|
-
TASK-10 + TASK-11
|
|
424
|
-
└─> TASK-12 (validacao final)
|
|
425
|
-
```
|
|
426
|
-
|
|
427
|
-
## 5. Ordem de Execucao Sugerida
|
|
428
|
-
|
|
429
|
-
| Fase | Tasks | Descricao |
|
|
430
|
-
|------|-------|-----------|
|
|
431
|
-
| **Fase 1** | TASK-1, TASK-6 | Migracao SQL + Proto (paralelo) |
|
|
432
|
-
| **Fase 2** | TASK-2 | Queries SQLC |
|
|
433
|
-
| **Fase 3** | TASK-3, TASK-7 | Regenerar codigo (SQLC + Proto) — executar `make generate` uma unica vez |
|
|
434
|
-
| **Fase 4** | TASK-4 | Repository |
|
|
435
|
-
| **Fase 5** | TASK-5 | Service |
|
|
436
|
-
| **Fase 6** | TASK-8, TASK-9 | Handler + Config |
|
|
437
|
-
| **Fase 7** | TASK-10, TASK-11 | Testes (paralelo) |
|
|
438
|
-
| **Fase 8** | TASK-12 | Validacao final |
|
|
439
|
-
|
|
440
|
-
## 6. Riscos e Observacoes
|
|
441
|
-
|
|
442
|
-
1. **Numeracao Proto:** A numeracao dos campos proto existentes NAO pode ser alterada. O campo `phone` deve usar o proximo numero livre em cada mensagem. Isso e critico para compatibilidade.
|
|
443
|
-
|
|
444
|
-
2. **Migracao imutavel:** A migracao 001 NAO deve ser editada. Sempre criar nova migracao (002).
|
|
445
|
-
|
|
446
|
-
3. **Codigo gerado:** Nunca editar arquivos em `gen/` ou `internal/db/sqlc/*.go`. Sempre editar os fontes (`.proto`, `.sql`) e rodar `make generate`.
|
|
447
|
-
|
|
448
|
-
4. **Campo opcional:** O campo `telefone` e `TEXT` nullable no SQLite. No Go, o SQLC pode gerar como `sql.NullString` — verificar apos geracao e ajustar mapeamento no repository conforme necessario.
|
|
449
|
-
|
|
450
|
-
5. **UpdateUser e novo:** O proto atual nao tem `UpdateUser`. E necessario criar o RPC, mensagens e implementar em todas as camadas. A SPEC_TECH menciona "UpdateUser" mas o codebase atual nao possui esse endpoint.
|
|
451
|
-
|
|
452
|
-
6. **`make generate`:** Os comandos `make generate` das TASK-3 e TASK-7 podem ser executados em uma unica chamada se o Makefile gerar tanto SQLC quanto Proto.
|
|
1
|
+
# TASK PLAN — Adicionar Telefone ao Usuario v1
|
|
2
|
+
|
|
3
|
+
## 1. Identificacao
|
|
4
|
+
|
|
5
|
+
| Campo | Valor |
|
|
6
|
+
|-------|-------|
|
|
7
|
+
| **Feature** | Adicionar Telefone ao Modulo de Usuario |
|
|
8
|
+
| **Versao** | v1 |
|
|
9
|
+
| **Data** | 2026-03-07 |
|
|
10
|
+
| **SPEC_TECH** | docs/feature-telefone-usuario/v1/spec_tech.md |
|
|
11
|
+
| **Branch base** | user-feature |
|
|
12
|
+
|
|
13
|
+
## 2. Resumo
|
|
14
|
+
|
|
15
|
+
Adicionar o campo opcional `telefone` na tabela `usuarios` e propagar a mudanca por todas as camadas: migracao SQL, queries SQLC, repository, service, proto e handler gRPC. Inclui validacao opcional (10-15 caracteres quando informado) e testes unitarios.
|
|
16
|
+
|
|
17
|
+
## 3. Tarefas
|
|
18
|
+
|
|
19
|
+
### TASK-1: Criar migracao SQL para adicionar coluna telefone
|
|
20
|
+
|
|
21
|
+
**Camada:** Banco de Dados
|
|
22
|
+
**Arquivo a criar:** `internal/db/migrations/002_add_telefone_usuarios.sql`
|
|
23
|
+
**Descricao:**
|
|
24
|
+
Criar nova migracao com `ALTER TABLE usuarios ADD COLUMN telefone TEXT;`. Conforme regra de imutabilidade, nao editar a migracao 001 existente.
|
|
25
|
+
|
|
26
|
+
**Conteudo esperado:**
|
|
27
|
+
```sql
|
|
28
|
+
ALTER TABLE usuarios ADD COLUMN telefone TEXT;
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Criterio de aceite:**
|
|
32
|
+
- Arquivo criado em `internal/db/migrations/002_add_telefone_usuarios.sql`
|
|
33
|
+
- Migracao 001 inalterada
|
|
34
|
+
- Coluna `telefone` do tipo `TEXT` (nullable/opcional)
|
|
35
|
+
|
|
36
|
+
**Dependencias:** Nenhuma
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
### TASK-2: Atualizar queries SQLC para incluir telefone
|
|
41
|
+
|
|
42
|
+
**Camada:** SQLC Queries
|
|
43
|
+
**Arquivo a editar:** `internal/db/sqlc/queries/user.sql`
|
|
44
|
+
**Descricao:**
|
|
45
|
+
Adicionar a coluna `telefone` na query `CreateUser` (INSERT e parametros) e criar uma nova query `UpdateUser` que permita atualizar nome e telefone.
|
|
46
|
+
|
|
47
|
+
**Alteracoes esperadas:**
|
|
48
|
+
|
|
49
|
+
Query `CreateUser` atualizada:
|
|
50
|
+
```sql
|
|
51
|
+
-- name: CreateUser :one
|
|
52
|
+
INSERT INTO usuarios (id, nome, email, senha_hash, telefone, data_criacao, data_atualizacao)
|
|
53
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
54
|
+
RETURNING *;
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Nova query `UpdateUser`:
|
|
58
|
+
```sql
|
|
59
|
+
-- name: UpdateUser :one
|
|
60
|
+
UPDATE usuarios SET nome = ?, telefone = ?, data_atualizacao = ?
|
|
61
|
+
WHERE id = ?
|
|
62
|
+
RETURNING *;
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Criterio de aceite:**
|
|
66
|
+
- Query `CreateUser` inclui coluna `telefone`
|
|
67
|
+
- Nova query `UpdateUser` criada
|
|
68
|
+
- Executar `make generate` (ou `make sqlc`) apos a edicao para regenerar codigo
|
|
69
|
+
|
|
70
|
+
**Dependencias:** TASK-1
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
### TASK-3: Regenerar codigo SQLC
|
|
75
|
+
|
|
76
|
+
**Camada:** Codigo Gerado
|
|
77
|
+
**Descricao:**
|
|
78
|
+
Executar `make generate` para que o SQLC regenere os arquivos Go em `internal/db/sqlc/` com a nova coluna `telefone` e a nova query `UpdateUser`.
|
|
79
|
+
|
|
80
|
+
**Comando:**
|
|
81
|
+
```bash
|
|
82
|
+
make generate
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Criterio de aceite:**
|
|
86
|
+
- Struct `Usuario` gerada inclui campo `Telefone`
|
|
87
|
+
- Struct `CreateUserParams` inclui campo `Telefone`
|
|
88
|
+
- Struct `UpdateUserParams` gerada
|
|
89
|
+
- Funcao `UpdateUser` gerada em queries
|
|
90
|
+
|
|
91
|
+
**Dependencias:** TASK-1, TASK-2
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
### TASK-4: Atualizar modelo e repository do usuario
|
|
96
|
+
|
|
97
|
+
**Camada:** Repository
|
|
98
|
+
**Arquivo a editar:** `internal/repository/user_repository.go`
|
|
99
|
+
**Descricao:**
|
|
100
|
+
Adicionar campo `Phone` ao modelo `User`. Atualizar o mapeamento na funcao `toUser` para converter `telefone` (banco) para `Phone` (Go). Atualizar `Create` para passar `telefone` nos parametros SQLC. Adicionar metodo `Update` na interface e implementacao.
|
|
101
|
+
|
|
102
|
+
**Alteracoes esperadas:**
|
|
103
|
+
|
|
104
|
+
1. Adicionar campo na struct:
|
|
105
|
+
```go
|
|
106
|
+
type User struct {
|
|
107
|
+
ID string
|
|
108
|
+
Name string
|
|
109
|
+
Email string
|
|
110
|
+
PasswordHash string
|
|
111
|
+
Phone string // novo campo
|
|
112
|
+
CreatedAt time.Time
|
|
113
|
+
UpdatedAt time.Time
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
2. Atualizar interface:
|
|
118
|
+
```go
|
|
119
|
+
type UserRepository interface {
|
|
120
|
+
Create(ctx context.Context, user *User) (*User, error)
|
|
121
|
+
GetByID(ctx context.Context, id string) (*User, error)
|
|
122
|
+
Update(ctx context.Context, user *User) (*User, error) // novo metodo
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
3. Atualizar `Create` para incluir `Telefone` nos params SQLC
|
|
127
|
+
4. Implementar metodo `Update` usando `r.queries.UpdateUser`
|
|
128
|
+
5. Atualizar funcao `toUser` para mapear `Telefone` -> `Phone`
|
|
129
|
+
|
|
130
|
+
**Criterio de aceite:**
|
|
131
|
+
- Campo `Phone` presente no modelo `User`
|
|
132
|
+
- Mapeamento `Telefone` <-> `Phone` funcional em `toUser`
|
|
133
|
+
- Metodo `Update` implementado
|
|
134
|
+
- `Create` passa `telefone` para o SQLC
|
|
135
|
+
|
|
136
|
+
**Dependencias:** TASK-3
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
### TASK-5: Atualizar service do usuario
|
|
141
|
+
|
|
142
|
+
**Camada:** Service
|
|
143
|
+
**Arquivo a editar:** `internal/service/user_service.go`
|
|
144
|
+
**Descricao:**
|
|
145
|
+
Adicionar campo `Phone` ao `CreateUserInput`. Criar struct `UpdateUserInput`. Adicionar metodo `UpdateUser` na interface e implementacao. Implementar validacao: se `phone` informado, deve ter entre 10 e 15 caracteres.
|
|
146
|
+
|
|
147
|
+
**Alteracoes esperadas:**
|
|
148
|
+
|
|
149
|
+
1. Atualizar input de criacao:
|
|
150
|
+
```go
|
|
151
|
+
type CreateUserInput struct {
|
|
152
|
+
Name string
|
|
153
|
+
Email string
|
|
154
|
+
Password string
|
|
155
|
+
Phone string // novo, opcional
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
2. Criar input de atualizacao:
|
|
160
|
+
```go
|
|
161
|
+
type UpdateUserInput struct {
|
|
162
|
+
ID string
|
|
163
|
+
Name string
|
|
164
|
+
Phone string // opcional
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
3. Atualizar interface:
|
|
169
|
+
```go
|
|
170
|
+
type UserService interface {
|
|
171
|
+
CreateUser(ctx context.Context, input CreateUserInput) (*repository.User, error)
|
|
172
|
+
GetUser(ctx context.Context, id string) (*repository.User, error)
|
|
173
|
+
UpdateUser(ctx context.Context, input UpdateUserInput) (*repository.User, error) // novo
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
4. Adicionar validacao de telefone (reutilizavel em Create e Update):
|
|
178
|
+
```go
|
|
179
|
+
func validatePhone(phone string) error {
|
|
180
|
+
if phone != "" && (len(phone) < 10 || len(phone) > 15) {
|
|
181
|
+
return errors.New("telefone deve ter entre 10 e 15 caracteres")
|
|
182
|
+
}
|
|
183
|
+
return nil
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
5. Chamar `validatePhone` em `CreateUser` e `UpdateUser`
|
|
188
|
+
6. Passar `Phone` para `repository.User` em `CreateUser`
|
|
189
|
+
7. Implementar `UpdateUser` com busca por ID + chamada ao repo
|
|
190
|
+
|
|
191
|
+
**Criterio de aceite:**
|
|
192
|
+
- Campo `Phone` aceito em `CreateUser`
|
|
193
|
+
- Metodo `UpdateUser` implementado
|
|
194
|
+
- Validacao de telefone (10-15 chars) funcional
|
|
195
|
+
- Telefone vazio e aceito (campo opcional)
|
|
196
|
+
|
|
197
|
+
**Dependencias:** TASK-4
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
### TASK-6: Atualizar definicao Proto
|
|
202
|
+
|
|
203
|
+
**Camada:** Proto/gRPC
|
|
204
|
+
**Arquivo a editar:** `api/proto/v1/user.proto`
|
|
205
|
+
**Descricao:**
|
|
206
|
+
Adicionar campo `string phone` nas mensagens `CreateUserRequest`, `CreateUserResponse`, `GetUserResponse`. Criar mensagens `UpdateUserRequest` e `UpdateUserResponse`. Adicionar RPC `UpdateUser` ao service.
|
|
207
|
+
|
|
208
|
+
**Alteracoes esperadas:**
|
|
209
|
+
|
|
210
|
+
1. Adicionar `string phone = 4;` em `CreateUserRequest`
|
|
211
|
+
2. Adicionar `string phone = 4;` em `CreateUserResponse` (apos `email`, ajustar numeracao de `created_at` para 5)
|
|
212
|
+
3. Adicionar `string phone = 4;` em `GetUserResponse` (apos `email`, ajustar numeracao: `phone=4`, `created_at=5`, `updated_at=6`)
|
|
213
|
+
|
|
214
|
+
> **ATENCAO:** A numeracao dos campos existentes NAO pode ser alterada sem quebrar compatibilidade. Verificar a numeracao atual antes de definir os novos numeros. Dado que `CreateUserResponse` ja usa campos 1-4 e `GetUserResponse` usa 1-5, o campo `phone` deve usar o proximo numero disponivel em cada mensagem.
|
|
215
|
+
|
|
216
|
+
Numeracao correta baseada no proto atual:
|
|
217
|
+
- `CreateUserRequest`: `string phone = 4;` (campos existentes: 1=name, 2=email, 3=password)
|
|
218
|
+
- `CreateUserResponse`: `string phone = 5;` (campos existentes: 1=id, 2=name, 3=email, 4=created_at)
|
|
219
|
+
- `GetUserResponse`: `string phone = 6;` (campos existentes: 1=id, 2=name, 3=email, 4=created_at, 5=updated_at)
|
|
220
|
+
|
|
221
|
+
4. Criar mensagens novas:
|
|
222
|
+
```proto
|
|
223
|
+
message UpdateUserRequest {
|
|
224
|
+
string id = 1;
|
|
225
|
+
string name = 2;
|
|
226
|
+
string phone = 3;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
message UpdateUserResponse {
|
|
230
|
+
string id = 1;
|
|
231
|
+
string name = 2;
|
|
232
|
+
string email = 3;
|
|
233
|
+
string phone = 4;
|
|
234
|
+
string updated_at = 5;
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
5. Adicionar ao service:
|
|
239
|
+
```proto
|
|
240
|
+
rpc UpdateUser(UpdateUserRequest) returns (UpdateUserResponse);
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
**Criterio de aceite:**
|
|
244
|
+
- Campo `phone` adicionado nas mensagens existentes com numeracao correta
|
|
245
|
+
- Mensagens `UpdateUserRequest`/`UpdateUserResponse` criadas
|
|
246
|
+
- RPC `UpdateUser` registrado no service
|
|
247
|
+
- Numeracao de campos existentes NAO alterada
|
|
248
|
+
|
|
249
|
+
**Dependencias:** Nenhuma (pode ser feita em paralelo com TASK-1 a TASK-5)
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
### TASK-7: Regenerar codigo Proto
|
|
254
|
+
|
|
255
|
+
**Camada:** Codigo Gerado
|
|
256
|
+
**Descricao:**
|
|
257
|
+
Executar `make generate` (buf generate) para regenerar o codigo Go em `gen/proto/v1/`.
|
|
258
|
+
|
|
259
|
+
**Comando:**
|
|
260
|
+
```bash
|
|
261
|
+
make generate
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
**Criterio de aceite:**
|
|
265
|
+
- Structs Go geradas incluem campo `Phone`
|
|
266
|
+
- Interface `UserServiceServer` inclui metodo `UpdateUser`
|
|
267
|
+
- Compilacao sem erros
|
|
268
|
+
|
|
269
|
+
**Dependencias:** TASK-6
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
### TASK-8: Atualizar handler gRPC do usuario
|
|
274
|
+
|
|
275
|
+
**Camada:** Handler
|
|
276
|
+
**Arquivo a editar:** `internal/handler/grpc/user_handler.go`
|
|
277
|
+
**Descricao:**
|
|
278
|
+
Atualizar `CreateUser` para passar `Phone` do request para o service input e incluir `phone` na response. Implementar metodo `UpdateUser`. Atualizar `GetUser` para incluir `phone` na response.
|
|
279
|
+
|
|
280
|
+
**Alteracoes esperadas:**
|
|
281
|
+
|
|
282
|
+
1. Em `CreateUser`:
|
|
283
|
+
- Adicionar `Phone: req.GetPhone()` ao `CreateUserInput`
|
|
284
|
+
- Adicionar `Phone: user.Phone` na response
|
|
285
|
+
|
|
286
|
+
2. Em `GetUser`:
|
|
287
|
+
- Adicionar `Phone: user.Phone` na response
|
|
288
|
+
|
|
289
|
+
3. Novo metodo `UpdateUser`:
|
|
290
|
+
```go
|
|
291
|
+
func (h *UserHandler) UpdateUser(ctx context.Context, req *pb.UpdateUserRequest) (*pb.UpdateUserResponse, error) {
|
|
292
|
+
input := service.UpdateUserInput{
|
|
293
|
+
ID: req.GetId(),
|
|
294
|
+
Name: req.GetName(),
|
|
295
|
+
Phone: req.GetPhone(),
|
|
296
|
+
}
|
|
297
|
+
user, err := h.userService.UpdateUser(ctx, input)
|
|
298
|
+
if err != nil {
|
|
299
|
+
return nil, mapServiceError(err)
|
|
300
|
+
}
|
|
301
|
+
return &pb.UpdateUserResponse{
|
|
302
|
+
Id: user.ID,
|
|
303
|
+
Name: user.Name,
|
|
304
|
+
Email: user.Email,
|
|
305
|
+
Phone: user.Phone,
|
|
306
|
+
UpdatedAt: user.UpdatedAt.Format(time.RFC3339),
|
|
307
|
+
}, nil
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
**Criterio de aceite:**
|
|
312
|
+
- `CreateUser` repassa e retorna `phone`
|
|
313
|
+
- `GetUser` retorna `phone`
|
|
314
|
+
- `UpdateUser` implementado e funcional
|
|
315
|
+
- Erros mapeados corretamente
|
|
316
|
+
|
|
317
|
+
**Dependencias:** TASK-5, TASK-7
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
### TASK-9: Configurar UpdateUser como rota protegida
|
|
322
|
+
|
|
323
|
+
**Camada:** Configuracao
|
|
324
|
+
**Arquivo a verificar:** `configs/config.yaml`
|
|
325
|
+
**Descricao:**
|
|
326
|
+
Verificar que `UpdateUser` NAO esta em `skip_methods` (ou seja, requer autenticacao). Apenas `CreateUser` deve ser publico. Se necessario, nenhuma alteracao e necessaria, apenas confirmar.
|
|
327
|
+
|
|
328
|
+
**Criterio de aceite:**
|
|
329
|
+
- `UpdateUser` exige autenticacao (Bearer token)
|
|
330
|
+
- Nenhuma rota protegida acidentalmente exposta
|
|
331
|
+
|
|
332
|
+
**Dependencias:** TASK-8
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
### TASK-10: Atualizar testes unitarios do service
|
|
337
|
+
|
|
338
|
+
**Camada:** Testes
|
|
339
|
+
**Arquivo a editar:** `internal/service/user_service_test.go`
|
|
340
|
+
**Descricao:**
|
|
341
|
+
Atualizar mock do repository para incluir metodo `Update`. Adicionar testes para:
|
|
342
|
+
|
|
343
|
+
1. `TestCreateUser_WithPhone_Success` — criacao com telefone valido
|
|
344
|
+
2. `TestCreateUser_WithInvalidPhone_TooShort` — telefone com menos de 10 chars
|
|
345
|
+
3. `TestCreateUser_WithInvalidPhone_TooLong` — telefone com mais de 15 chars
|
|
346
|
+
4. `TestCreateUser_WithEmptyPhone_Success` — telefone vazio (opcional)
|
|
347
|
+
5. `TestUpdateUser_Success` — atualizacao com dados validos
|
|
348
|
+
6. `TestUpdateUser_WithPhone_Success` — atualizacao com telefone valido
|
|
349
|
+
7. `TestUpdateUser_InvalidPhone` — telefone invalido na atualizacao
|
|
350
|
+
8. `TestUpdateUser_NotFound` — usuario nao encontrado
|
|
351
|
+
|
|
352
|
+
**Criterio de aceite:**
|
|
353
|
+
- Mock atualizado com metodo `Update`
|
|
354
|
+
- Todos os cenarios de telefone cobertos (valido, vazio, curto, longo)
|
|
355
|
+
- Testes de `UpdateUser` adicionados
|
|
356
|
+
- Todos os testes passam: `CGO_ENABLED=1 go test ./internal/service/... -v`
|
|
357
|
+
|
|
358
|
+
**Dependencias:** TASK-5
|
|
359
|
+
|
|
360
|
+
---
|
|
361
|
+
|
|
362
|
+
### TASK-11: Atualizar testes unitarios do handler
|
|
363
|
+
|
|
364
|
+
**Camada:** Testes
|
|
365
|
+
**Arquivo a editar:** `internal/handler/grpc/user_handler_test.go`
|
|
366
|
+
**Descricao:**
|
|
367
|
+
Atualizar mock do service para incluir metodo `UpdateUser`. Adicionar testes para:
|
|
368
|
+
|
|
369
|
+
1. `TestUserHandler_CreateUser_WithPhone` — verifica que phone e repassado e retornado
|
|
370
|
+
2. `TestUserHandler_GetUser_WithPhone` — verifica que phone e retornado
|
|
371
|
+
3. `TestUserHandler_UpdateUser_Success` — atualizacao com sucesso
|
|
372
|
+
4. `TestUserHandler_UpdateUser_NotFound` — usuario nao encontrado
|
|
373
|
+
5. `TestUserHandler_UpdateUser_InvalidPhone` — telefone invalido
|
|
374
|
+
|
|
375
|
+
**Criterio de aceite:**
|
|
376
|
+
- Mock atualizado com metodo `UpdateUser`
|
|
377
|
+
- Testes de phone no CreateUser e GetUser
|
|
378
|
+
- Testes de UpdateUser cobrindo sucesso e erros
|
|
379
|
+
- Todos os testes passam: `CGO_ENABLED=1 go test ./internal/handler/grpc/... -v`
|
|
380
|
+
|
|
381
|
+
**Dependencias:** TASK-8
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
### TASK-12: Teste de integracao e validacao final
|
|
386
|
+
|
|
387
|
+
**Camada:** Validacao
|
|
388
|
+
**Descricao:**
|
|
389
|
+
Executar build e suite completa de testes para garantir que tudo funciona junto.
|
|
390
|
+
|
|
391
|
+
**Comandos:**
|
|
392
|
+
```bash
|
|
393
|
+
make build
|
|
394
|
+
make test
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
**Criterio de aceite:**
|
|
398
|
+
- Build compila sem erros
|
|
399
|
+
- Todos os testes passam
|
|
400
|
+
- Nenhuma regressao nos testes existentes
|
|
401
|
+
|
|
402
|
+
**Dependencias:** TASK-10, TASK-11
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
## 4. Grafo de Dependencias
|
|
407
|
+
|
|
408
|
+
```
|
|
409
|
+
TASK-1 (migracao SQL)
|
|
410
|
+
└─> TASK-2 (queries SQLC)
|
|
411
|
+
└─> TASK-3 (make generate - SQLC)
|
|
412
|
+
└─> TASK-4 (repository)
|
|
413
|
+
└─> TASK-5 (service)
|
|
414
|
+
├─> TASK-8 (handler) [+ TASK-7]
|
|
415
|
+
└─> TASK-10 (testes service)
|
|
416
|
+
|
|
417
|
+
TASK-6 (proto) [paralelo com TASK-1..5]
|
|
418
|
+
└─> TASK-7 (make generate - proto)
|
|
419
|
+
└─> TASK-8 (handler)
|
|
420
|
+
├─> TASK-9 (config auth)
|
|
421
|
+
└─> TASK-11 (testes handler)
|
|
422
|
+
|
|
423
|
+
TASK-10 + TASK-11
|
|
424
|
+
└─> TASK-12 (validacao final)
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
## 5. Ordem de Execucao Sugerida
|
|
428
|
+
|
|
429
|
+
| Fase | Tasks | Descricao |
|
|
430
|
+
|------|-------|-----------|
|
|
431
|
+
| **Fase 1** | TASK-1, TASK-6 | Migracao SQL + Proto (paralelo) |
|
|
432
|
+
| **Fase 2** | TASK-2 | Queries SQLC |
|
|
433
|
+
| **Fase 3** | TASK-3, TASK-7 | Regenerar codigo (SQLC + Proto) — executar `make generate` uma unica vez |
|
|
434
|
+
| **Fase 4** | TASK-4 | Repository |
|
|
435
|
+
| **Fase 5** | TASK-5 | Service |
|
|
436
|
+
| **Fase 6** | TASK-8, TASK-9 | Handler + Config |
|
|
437
|
+
| **Fase 7** | TASK-10, TASK-11 | Testes (paralelo) |
|
|
438
|
+
| **Fase 8** | TASK-12 | Validacao final |
|
|
439
|
+
|
|
440
|
+
## 6. Riscos e Observacoes
|
|
441
|
+
|
|
442
|
+
1. **Numeracao Proto:** A numeracao dos campos proto existentes NAO pode ser alterada. O campo `phone` deve usar o proximo numero livre em cada mensagem. Isso e critico para compatibilidade.
|
|
443
|
+
|
|
444
|
+
2. **Migracao imutavel:** A migracao 001 NAO deve ser editada. Sempre criar nova migracao (002).
|
|
445
|
+
|
|
446
|
+
3. **Codigo gerado:** Nunca editar arquivos em `gen/` ou `internal/db/sqlc/*.go`. Sempre editar os fontes (`.proto`, `.sql`) e rodar `make generate`.
|
|
447
|
+
|
|
448
|
+
4. **Campo opcional:** O campo `telefone` e `TEXT` nullable no SQLite. No Go, o SQLC pode gerar como `sql.NullString` — verificar apos geracao e ajustar mapeamento no repository conforme necessario.
|
|
449
|
+
|
|
450
|
+
5. **UpdateUser e novo:** O proto atual nao tem `UpdateUser`. E necessario criar o RPC, mensagens e implementar em todas as camadas. A SPEC_TECH menciona "UpdateUser" mas o codebase atual nao possui esse endpoint.
|
|
451
|
+
|
|
452
|
+
6. **`make generate`:** Os comandos `make generate` das TASK-3 e TASK-7 podem ser executados em uma unica chamada se o Makefile gerar tanto SQLC quanto Proto.
|