@hed-hog/address 0.0.270 → 0.0.272

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +453 -0
  2. package/package.json +4 -3
package/README.md ADDED
@@ -0,0 +1,453 @@
1
+ ```markdown
2
+ # @hed-hog/address
3
+
4
+ Módulo para gerenciamento de endereços no HedHog. Fornece endpoints para criar, listar, atualizar e deletar endereços, com suporte a múltiplos tipos de endereço e controle de endereço primário por tipo.
5
+
6
+ ## 1. Visão geral do módulo
7
+
8
+ Este módulo gerencia informações de endereços, permitindo operações CRUD (criar, ler, atualizar, deletar) com suporte a múltiplos tipos de endereço (residencial, comercial, correspondência, etc.). Possui controle para garantir que apenas um endereço por tipo seja marcado como primário. Suporta busca, paginação, ordenação e filtros nos endpoints.
9
+
10
+ ## 2. Escopo e responsabilidades
11
+
12
+ - Gerenciar dados de endereços com validação e consistência.
13
+ - Controlar endereço primário único por tipo.
14
+ - Suportar operações RESTful autenticadas.
15
+ - Fornecer respostas paginadas e filtradas.
16
+ - Garantir mensagens localizadas conforme idioma da requisição.
17
+ - Integrar com sistema de roles para autorização.
18
+
19
+ ## 3. Endpoints
20
+
21
+ ### 3.1 Listar Endereços
22
+
23
+ - **Método:** GET
24
+ - **Path:** `/address`
25
+ - **Autenticação:** Requerida (`@Role()`)
26
+ - **Descrição:** Retorna lista paginada de endereços com busca, ordenação e seleção de campos.
27
+ - **Query Parameters:**
28
+
29
+ | Parâmetro | Tipo | Obrigatório | Descrição |
30
+ |------------|----------------|-------------|---------------------------------------------------------------------------------------------|
31
+ | `page` | number | Não | Número da página (padrão: 1) |
32
+ | `pageSize` | number | Não | Quantidade de itens por página (padrão: 10) |
33
+ | `search` | string | Não | Busca por texto (procura em id, tipo, país, estado, cidade, CEP, linha1 e linha2) |
34
+ | `sortField`| string | Não | Campo para ordenação (padrão: id) |
35
+ | `sortOrder`| `asc` \| `desc`| Não | Ordem de classificação (padrão: desc) |
36
+ | `fields` | string | Não | Campos a retornar, separados por vírgula |
37
+
38
+ - **Resposta de Sucesso (200 OK):**
39
+
40
+ ```json
41
+ {
42
+ "data": [
43
+ {
44
+ "id": 1,
45
+ "address_type": "residential",
46
+ "country_code": "BR",
47
+ "state": "SP",
48
+ "city": "São Paulo",
49
+ "postal_code": "01234-567",
50
+ "line1": "Rua A, 123",
51
+ "line2": "Apartamento 101",
52
+ "is_primary": true,
53
+ "created_at": "2025-01-10T14:30:00Z",
54
+ "updated_at": "2025-01-10T14:30:00Z"
55
+ }
56
+ ],
57
+ "meta": {
58
+ "page": 1,
59
+ "pageSize": 10,
60
+ "total": 1,
61
+ "pageCount": 1,
62
+ "hasNextPage": false,
63
+ "hasPreviousPage": false
64
+ }
65
+ }
66
+ ```
67
+
68
+ - **Erros Comuns:** Nenhum específico além dos padrões de autenticação/autorização.
69
+
70
+ ---
71
+
72
+ ### 3.2 Obter Endereço por ID
73
+
74
+ - **Método:** GET
75
+ - **Path:** `/address/:id`
76
+ - **Autenticação:** Requerida (`@Role()`)
77
+ - **Descrição:** Retorna detalhes de um endereço pelo seu ID.
78
+ - **Path Parameters:**
79
+
80
+ | Parâmetro | Tipo | Descrição |
81
+ |-----------|--------|----------------------|
82
+ | `id` | number | ID único do endereço |
83
+
84
+ - **Resposta de Sucesso (200 OK):**
85
+
86
+ ```json
87
+ {
88
+ "id": 1,
89
+ "address_type": "residential",
90
+ "country_code": "BR",
91
+ "state": "SP",
92
+ "city": "São Paulo",
93
+ "postal_code": "01234-567",
94
+ "line1": "Rua A, 123",
95
+ "line2": "Apartamento 101",
96
+ "is_primary": true,
97
+ "created_at": "2025-01-10T14:30:00Z",
98
+ "updated_at": "2025-01-10T14:30:00Z"
99
+ }
100
+ ```
101
+
102
+ - **Erros Possíveis:**
103
+
104
+ - **404 Not Found:** Endereço com ID especificado não encontrado.
105
+
106
+ ---
107
+
108
+ ### 3.3 Criar Novo Endereço
109
+
110
+ - **Método:** POST
111
+ - **Path:** `/address`
112
+ - **Autenticação:** Requerida (`@Role()`)
113
+ - **Descrição:** Cria um novo endereço. Se `is_primary=true`, remove o status primário de outros endereços do mesmo tipo.
114
+ - **Request Body:**
115
+
116
+ | Campo | Tipo | Obrigatório | Descrição |
117
+ |---------------|---------|-------------|---------------------------------------------------------------------------------------------|
118
+ | `address_type`| enum | Sim | Tipo do endereço. Valores: `residential`, `commercial`, `correspondence`, `alternative`, `work`, `billing`, `shipping` |
119
+ | `country_code`| string | Sim | Código do país (ex: "BR", "US", "ES") |
120
+ | `state` | string | Sim | Nome do estado/província (ex: "SP", "RJ") |
121
+ | `city` | string | Sim | Nome da cidade |
122
+ | `postal_code` | string | Sim | CEP/código postal |
123
+ | `line1` | string | Sim | Linha de endereço principal (rua, número, etc) |
124
+ | `line2` | string | Não | Linha de endereço complementar (apartamento, complemento, etc) |
125
+ | `is_primary` | boolean | Não | Define como endereço primário do tipo (padrão: false) |
126
+
127
+ - **Exemplo de Requisição:**
128
+
129
+ ```bash
130
+ POST /address
131
+ Content-Type: application/json
132
+
133
+ {
134
+ "address_type": "residential",
135
+ "country_code": "BR",
136
+ "state": "SP",
137
+ "city": "São Paulo",
138
+ "postal_code": "01234-567",
139
+ "line1": "Rua A, 123",
140
+ "line2": "Apartamento 101",
141
+ "is_primary": true
142
+ }
143
+ ```
144
+
145
+ - **Resposta de Sucesso (201 Created):**
146
+
147
+ ```json
148
+ {
149
+ "id": 1,
150
+ "address_type": "residential",
151
+ "country_code": "BR",
152
+ "state": "SP",
153
+ "city": "São Paulo",
154
+ "postal_code": "01234-567",
155
+ "line1": "Rua A, 123",
156
+ "line2": "Apartamento 101",
157
+ "is_primary": true,
158
+ "created_at": "2025-01-10T14:30:00Z",
159
+ "updated_at": "2025-01-10T14:30:00Z"
160
+ }
161
+ ```
162
+
163
+ - **Erros Possíveis:**
164
+
165
+ - **400 Bad Request:** Validação de dados falhou ou erro ao criar endereço.
166
+
167
+ ---
168
+
169
+ ### 3.4 Atualizar Endereço
170
+
171
+ - **Método:** PATCH
172
+ - **Path:** `/address/:id`
173
+ - **Autenticação:** Requerida (`@Role()`)
174
+ - **Descrição:** Atualiza parcialmente um endereço existente. Ajusta o status primário conforme tipo e flag `is_primary`.
175
+ - **Path Parameters:**
176
+
177
+ | Parâmetro | Tipo | Descrição |
178
+ |-----------|--------|----------------------------|
179
+ | `id` | number | ID do endereço a atualizar |
180
+
181
+ - **Request Body:** (todos opcionais)
182
+
183
+ | Campo | Tipo | Descrição |
184
+ |---------------|---------|--------------------------------|
185
+ | `address_type`| enum | Novo tipo do endereço |
186
+ | `country_code`| string | Novo código do país |
187
+ | `state` | string | Novo estado/província |
188
+ | `city` | string | Nova cidade |
189
+ | `postal_code` | string | Novo CEP/código postal |
190
+ | `line1` | string | Nova linha de endereço principal |
191
+ | `line2` | string | Nova linha de endereço complementar |
192
+ | `is_primary` | boolean | Novo status de primário |
193
+
194
+ - **Exemplo de Requisição:**
195
+
196
+ ```bash
197
+ PATCH /address/1
198
+ Content-Type: application/json
199
+
200
+ {
201
+ "city": "Rio de Janeiro",
202
+ "state": "RJ",
203
+ "is_primary": false
204
+ }
205
+ ```
206
+
207
+ - **Resposta de Sucesso (200 OK):**
208
+
209
+ ```json
210
+ {
211
+ "id": 1,
212
+ "address_type": "residential",
213
+ "country_code": "BR",
214
+ "state": "RJ",
215
+ "city": "Rio de Janeiro",
216
+ "postal_code": "01234-567",
217
+ "line1": "Rua A, 123",
218
+ "line2": "Apartamento 101",
219
+ "is_primary": false,
220
+ "created_at": "2025-01-10T14:30:00Z",
221
+ "updated_at": "2025-01-11T10:15:00Z"
222
+ }
223
+ ```
224
+
225
+ - **Erros Possíveis:**
226
+
227
+ - **400 Bad Request:** Validação de dados falhou ou erro ao atualizar.
228
+ - **404 Not Found:** Endereço com ID especificado não encontrado.
229
+
230
+ ---
231
+
232
+ ### 3.5 Deletar Endereço(s)
233
+
234
+ - **Método:** DELETE
235
+ - **Path:** `/address`
236
+ - **Autenticação:** Requerida (`@Role()`)
237
+ - **Descrição:** Deleta um ou múltiplos endereços por seus IDs.
238
+ - **Request Body:**
239
+
240
+ | Campo | Tipo | Obrigatório | Descrição |
241
+ |-------|------------|-------------|-------------------------------|
242
+ | `ids` | number[] | Sim | Array com IDs dos endereços a deletar |
243
+
244
+ - **Exemplo de Requisição:**
245
+
246
+ ```bash
247
+ DELETE /address
248
+ Content-Type: application/json
249
+
250
+ {
251
+ "ids": [1, 2, 3]
252
+ }
253
+ ```
254
+
255
+ - **Resposta de Sucesso (200 OK):**
256
+
257
+ ```json
258
+ {
259
+ "count": 3
260
+ }
261
+ ```
262
+
263
+ - **Erros Possíveis:**
264
+
265
+ - **400 Bad Request:** Campo `ids` não fornecido ou vazio.
266
+ - **404 Not Found:** Um ou mais IDs especificados não encontrados.
267
+
268
+ ---
269
+
270
+ ## 4. Regras de autenticação e autorização
271
+
272
+ - Todos os endpoints requerem autenticação via JWT no header:
273
+
274
+ ```
275
+ Authorization: Bearer <seu_token_jwt>
276
+ ```
277
+
278
+ - A autorização é baseada em roles/funções, protegida pelo decorator `@Role()`.
279
+ - O usuário deve estar autenticado e possuir permissão para acessar a rota, conforme tabela `route` no banco.
280
+ - Role específica para acesso: `admin-address` (Administrador de Endereços).
281
+
282
+ ---
283
+
284
+ ## 5. Estruturas de request/response
285
+
286
+ ### CreateDTO (Criar Endereço)
287
+
288
+ | Campo | Tipo | Obrigatório | Descrição |
289
+ |---------------|---------|-------------|--------------------------------|
290
+ | `address_type`| enum | Sim | Tipo do endereço (ver seção Tipos de Endereço) |
291
+ | `country_code`| string | Sim | Código do país (ex: "BR") |
292
+ | `state` | string | Sim | Estado/província |
293
+ | `city` | string | Sim | Cidade |
294
+ | `postal_code` | string | Sim | CEP/código postal |
295
+ | `line1` | string | Sim | Linha principal do endereço |
296
+ | `line2` | string | Não | Linha complementar |
297
+ | `is_primary` | boolean | Não | Endereço primário do tipo (default: false) |
298
+
299
+ ### UpdateDTO (Atualizar Endereço)
300
+
301
+ - Todos os campos do CreateDTO são opcionais para atualização parcial.
302
+
303
+ ### DeleteDTO (Deletar Endereços)
304
+
305
+ | Campo | Tipo | Obrigatório | Descrição |
306
+ |-------|----------|-------------|-------------------------------|
307
+ | `ids` | number[] | Sim | IDs dos endereços a deletar |
308
+
309
+ ### Respostas
310
+
311
+ - Listagem: objeto com `data` (array de endereços) e `meta` (paginação).
312
+ - Obter, criar e atualizar: objeto com dados do endereço.
313
+ - Deletar: objeto com `count` de registros deletados.
314
+
315
+ ---
316
+
317
+ ## 6. Erros comuns
318
+
319
+ | Código | Descrição |
320
+ |--------|-----------------------------------------------------|
321
+ | 400 | Dados inválidos, campo obrigatório ausente ou erro na validação. |
322
+ | 404 | Endereço(s) não encontrado(s) para o(s) ID(s) informado(s). |
323
+ | 401/403| Falha na autenticação ou autorização (não documentado diretamente, mas implícito). |
324
+
325
+ Mensagens de erro são localizadas conforme header `Accept-Language`.
326
+
327
+ ---
328
+
329
+ ## 7. Banco de dados (tabelas YAML)
330
+
331
+ ### Tabela: `address`
332
+
333
+ - **Finalidade:** Armazenar informações de endereços com múltiplos tipos e controle de endereço primário.
334
+
335
+ | Coluna | Tipo | Nulável | Default | Descrição |
336
+ |---------------|------------|---------|-------------------|------------------------------------------------|
337
+ | `id` | INT (PK) | Não | auto-increment | Identificador único do endereço |
338
+ | `address_type`| ENUM | Não | - | Tipo do endereço (valores definidos abaixo) |
339
+ | `country_code`| VARCHAR | Não | - | Código do país (ISO 3166-1 alpha-2) |
340
+ | `state` | VARCHAR | Não | - | Estado ou província |
341
+ | `city` | VARCHAR | Não | - | Cidade |
342
+ | `postal_code` | VARCHAR | Não | - | CEP ou código postal |
343
+ | `line1` | VARCHAR | Não | - | Linha principal do endereço |
344
+ | `line2` | VARCHAR | Sim | NULL | Linha complementar |
345
+ | `is_primary` | BOOLEAN | Não | false | Indica se é o endereço primário do tipo |
346
+ | `created_at` | TIMESTAMP | Não | CURRENT_TIMESTAMP | Data e hora de criação |
347
+ | `updated_at` | TIMESTAMP | Não | CURRENT_TIMESTAMP | Data e hora da última atualização |
348
+
349
+ #### Índices
350
+
351
+ | Nome | Colunas | Único | Condição | Propósito |
352
+ |------------------------|-----------------------|-------|--------------------|--------------------------------------------------------|
353
+ | `idx_address_type_primary` | `address_type`, `is_primary` | Sim | `is_primary = true` | Garante apenas um endereço primário por tipo |
354
+
355
+ ---
356
+
357
+ ## 8. Regras de negócio relevantes
358
+
359
+ - **Endereço primário único por tipo:**
360
+ Ao criar ou atualizar um endereço com `is_primary=true`, o sistema automaticamente remove a flag `is_primary` de outros endereços do mesmo tipo, garantindo unicidade.
361
+
362
+ - **Busca:**
363
+ O parâmetro `search` realiza busca case-insensitive em múltiplos campos: `id` (se numérico), `address_type`, `country_code`, `state`, `city`, `postal_code`, `line1`, `line2`.
364
+
365
+ - **Localização:**
366
+ Mensagens de erro e validação são localizadas conforme o header `Accept-Language`.
367
+
368
+ - **Autorização:**
369
+ Acesso restrito a usuários autenticados com roles específicas, conforme tabela `route` e `role`.
370
+
371
+ ---
372
+
373
+ ## 9. Guia rápido de uso (exemplos)
374
+
375
+ ### Listar endereços com busca e paginação
376
+
377
+ ```bash
378
+ GET /address?page=1&pageSize=10&search=residential&sortField=city&sortOrder=asc
379
+ Authorization: Bearer <token>
380
+ ```
381
+
382
+ ### Obter endereço por ID
383
+
384
+ ```bash
385
+ GET /address/1
386
+ Authorization: Bearer <token>
387
+ ```
388
+
389
+ ### Criar novo endereço
390
+
391
+ ```bash
392
+ POST /address
393
+ Content-Type: application/json
394
+ Authorization: Bearer <token>
395
+
396
+ {
397
+ "address_type": "residential",
398
+ "country_code": "BR",
399
+ "state": "SP",
400
+ "city": "São Paulo",
401
+ "postal_code": "01234-567",
402
+ "line1": "Rua A, 123",
403
+ "line2": "Apartamento 101",
404
+ "is_primary": true
405
+ }
406
+ ```
407
+
408
+ ### Atualizar endereço parcialmente
409
+
410
+ ```bash
411
+ PATCH /address/1
412
+ Content-Type: application/json
413
+ Authorization: Bearer <token>
414
+
415
+ {
416
+ "city": "Rio de Janeiro",
417
+ "state": "RJ",
418
+ "is_primary": false
419
+ }
420
+ ```
421
+
422
+ ### Deletar múltiplos endereços
423
+
424
+ ```bash
425
+ DELETE /address
426
+ Content-Type: application/json
427
+ Authorization: Bearer <token>
428
+
429
+ {
430
+ "ids": [1, 2, 3]
431
+ }
432
+ ```
433
+
434
+ ---
435
+
436
+ ## Tipos de Endereço
437
+
438
+ | Valor | Descrição |
439
+ |----------------|--------------------------------|
440
+ | `residential` | Endereço residencial/doméstico |
441
+ | `commercial` | Endereço comercial/empresarial |
442
+ | `correspondence`| Endereço para correspondência |
443
+ | `alternative` | Endereço alternativo/secundário|
444
+ | `work` | Endereço de trabalho/empresa |
445
+ | `billing` | Endereço para faturamento |
446
+ | `shipping` | Endereço para entrega/despacho |
447
+
448
+ ---
449
+
450
+ ## Licença
451
+
452
+ Parte do projeto HedHog Lab v2.
453
+ ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hed-hog/address",
3
- "version": "0.0.270",
3
+ "version": "0.0.272",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "dependencies": {
@@ -9,11 +9,12 @@
9
9
  "@nestjs/core": "^11",
10
10
  "@nestjs/jwt": "^11",
11
11
  "@nestjs/mapped-types": "*",
12
+ "@hed-hog/core": "0.0.271",
12
13
  "@hed-hog/api": "0.0.4",
13
14
  "@hed-hog/api-pagination": "0.0.6",
14
- "@hed-hog/api-types": "0.0.1",
15
+ "@hed-hog/api-prisma": "0.0.5",
15
16
  "@hed-hog/api-locale": "0.0.13",
16
- "@hed-hog/api-prisma": "0.0.5"
17
+ "@hed-hog/api-types": "0.0.1"
17
18
  },
18
19
  "exports": {
19
20
  ".": {