@hed-hog/category 0.0.270 → 0.0.273
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/README.md +332 -0
- package/package.json +4 -4
package/README.md
ADDED
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
# @hed-hog/category
|
|
2
|
+
|
|
3
|
+
## 1. Visão geral do módulo
|
|
4
|
+
|
|
5
|
+
O módulo `@hed-hog/category` é responsável pela gestão de categorias no sistema HedHog. Ele oferece funcionalidades para criação, leitura, atualização e exclusão (CRUD) de categorias, incluindo suporte a múltiplos idiomas via localizações, hierarquia de categorias (categorias pai e raiz), e controle de status (ativo/inativo). O módulo integra-se com serviços de paginação e localização para facilitar consultas e traduções.
|
|
6
|
+
|
|
7
|
+
## 2. Escopo e responsabilidades
|
|
8
|
+
|
|
9
|
+
- Gerenciar categorias com atributos como slug, cor, ícone, status e hierarquia.
|
|
10
|
+
- Suportar múltiplas localizações para o nome da categoria.
|
|
11
|
+
- Fornecer endpoints para consulta de categorias raiz, categorias por pai, estatísticas e listagem paginada.
|
|
12
|
+
- Validar dados de entrada e garantir integridade referencial.
|
|
13
|
+
- Controlar acesso via roles específicas para administração de categorias.
|
|
14
|
+
|
|
15
|
+
## 3. Endpoints
|
|
16
|
+
|
|
17
|
+
| Método | Path | Autenticação | Descrição |
|
|
18
|
+
|--------|-----------------------|--------------|------------------------------------------------|
|
|
19
|
+
| GET | `/category/root` | Autenticada | Retorna categorias raiz ativas no idioma solicitado. |
|
|
20
|
+
| GET | `/category/stats` | Autenticada | Retorna estatísticas gerais das categorias. |
|
|
21
|
+
| GET | `/category/:id` | Autenticada | Retorna categoria pelo ID com localizações. |
|
|
22
|
+
| GET | `/category/parent/:categoryId` | Autenticada | Retorna categorias filhas de uma categoria pai. |
|
|
23
|
+
| GET | `/category` | Autenticada | Lista categorias com paginação, filtro por status e categoria pai. |
|
|
24
|
+
| POST | `/category` | Autenticada | Cria uma nova categoria com localizações. |
|
|
25
|
+
| PATCH | `/category/:id` | Autenticada | Atualiza uma categoria existente parcialmente. |
|
|
26
|
+
| DELETE | `/category/:id` | Autenticada | Remove uma categoria pelo ID. |
|
|
27
|
+
|
|
28
|
+
### Detalhes dos endpoints
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
#### GET `/category/root`
|
|
33
|
+
|
|
34
|
+
- **Autenticação:** Necessária (roles: admin, admin-category)
|
|
35
|
+
- **Query:** Nenhuma
|
|
36
|
+
- **Resposta:** Lista de categorias raiz ativas com traduções no idioma solicitado.
|
|
37
|
+
- **Erros comuns:**
|
|
38
|
+
- 400 Bad Request: Locale inválido ou não encontrado.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
#### GET `/category/stats`
|
|
43
|
+
|
|
44
|
+
- **Autenticação:** Necessária (roles: admin, admin-category)
|
|
45
|
+
- **Resposta:**
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"total": number,
|
|
49
|
+
"totalActive": number,
|
|
50
|
+
"totalInactive": number,
|
|
51
|
+
"totalRoot": number
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
- **Erros comuns:** Nenhum específico.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
#### GET `/category/:id`
|
|
59
|
+
|
|
60
|
+
- **Autenticação:** Necessária (roles: admin, admin-category)
|
|
61
|
+
- **Parâmetros:**
|
|
62
|
+
- `id` (number, obrigatório): ID da categoria.
|
|
63
|
+
- **Resposta:** Objeto categoria com localizações.
|
|
64
|
+
- **Erros comuns:**
|
|
65
|
+
- 404 Not Found: Categoria não encontrada.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
#### GET `/category/parent/:categoryId`
|
|
70
|
+
|
|
71
|
+
- **Autenticação:** Necessária (roles: admin, admin-category)
|
|
72
|
+
- **Parâmetros:**
|
|
73
|
+
- `categoryId` (string, obrigatório): ID da categoria pai.
|
|
74
|
+
- **Resposta:** Lista de categorias filhas com localizações.
|
|
75
|
+
- **Erros comuns:**
|
|
76
|
+
- 400 Bad Request: Locale inválido.
|
|
77
|
+
- 404 Not Found: Categoria pai não encontrada ou sem filhos.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
#### GET `/category`
|
|
82
|
+
|
|
83
|
+
- **Autenticação:** Necessária (roles: admin, admin-category)
|
|
84
|
+
- **Query:**
|
|
85
|
+
- `status` (string, opcional): Filtra por status (`active`, `inactive`, `all`).
|
|
86
|
+
- `parent` (string, opcional): Filtra por categoria pai (`slug` ou `root` ou `all`).
|
|
87
|
+
- Parâmetros de paginação via cabeçalho ou query (padrão do módulo de paginação).
|
|
88
|
+
- **Resposta:** Objeto paginado com categorias e localizações.
|
|
89
|
+
- **Erros comuns:**
|
|
90
|
+
- 400 Bad Request: Locale inválido.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
#### POST `/category`
|
|
95
|
+
|
|
96
|
+
- **Autenticação:** Necessária (roles: admin, admin-category)
|
|
97
|
+
- **Body:**
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"slug": "string",
|
|
101
|
+
"category_id": "number (opcional)",
|
|
102
|
+
"color": "#hexadecimal (opcional)",
|
|
103
|
+
"icon": "string (opcional)",
|
|
104
|
+
"status": "active|inactive (opcional)",
|
|
105
|
+
"locale": {
|
|
106
|
+
"en": { "name": "string" },
|
|
107
|
+
"pt": { "name": "string" },
|
|
108
|
+
...
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
- **Resposta:** Objeto da categoria criada.
|
|
113
|
+
- **Erros comuns:**
|
|
114
|
+
- 400 Bad Request: Dados inválidos, locale ausente, categoria pai não encontrada.
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
#### PATCH `/category/:id`
|
|
119
|
+
|
|
120
|
+
- **Autenticação:** Necessária (roles: admin, admin-category)
|
|
121
|
+
- **Parâmetros:**
|
|
122
|
+
- `id` (number, obrigatório): ID da categoria.
|
|
123
|
+
- **Body:** Campos parciais do objeto de criação (mesma estrutura do POST, todos opcionais).
|
|
124
|
+
- **Resposta:** Objeto da categoria atualizada.
|
|
125
|
+
- **Erros comuns:**
|
|
126
|
+
- 400 Bad Request: Categoria pai não encontrada, locale inválido.
|
|
127
|
+
- 404 Not Found: Categoria não encontrada.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
#### DELETE `/category/:id`
|
|
132
|
+
|
|
133
|
+
- **Autenticação:** Necessária (roles: admin, admin-category)
|
|
134
|
+
- **Parâmetros:**
|
|
135
|
+
- `id` (number, obrigatório): ID da categoria.
|
|
136
|
+
- **Resposta:** Objeto da categoria deletada.
|
|
137
|
+
- **Erros comuns:**
|
|
138
|
+
- 404 Not Found: Categoria não encontrada.
|
|
139
|
+
|
|
140
|
+
## 4. Regras de autenticação e autorização
|
|
141
|
+
|
|
142
|
+
- Todos os endpoints requerem autenticação.
|
|
143
|
+
- Acesso restrito a usuários com roles `admin` ou `admin-category`.
|
|
144
|
+
- Controle de acesso definido via roles no arquivo `hedhog/data/role.yaml`.
|
|
145
|
+
|
|
146
|
+
## 5. Estruturas de request/response
|
|
147
|
+
|
|
148
|
+
### CategoryDTO (para criação e atualização)
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
{
|
|
152
|
+
slug: string; // obrigatório, string não vazia
|
|
153
|
+
category_id?: number; // opcional, ID da categoria pai
|
|
154
|
+
color?: string; // opcional, cor hexadecimal (#RRGGBB ou #RGB)
|
|
155
|
+
icon?: string; // opcional, string representando ícone
|
|
156
|
+
status?: 'active' | 'inactive'; // opcional, status da categoria
|
|
157
|
+
locale: { // obrigatório, objeto com chaves de código de idioma
|
|
158
|
+
[localeCode: string]: {
|
|
159
|
+
name: string; // nome da categoria no idioma
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Resposta padrão de categoria
|
|
166
|
+
|
|
167
|
+
Inclui campos:
|
|
168
|
+
|
|
169
|
+
- `id`: número identificador
|
|
170
|
+
- `slug`: string
|
|
171
|
+
- `icon`: string ou null
|
|
172
|
+
- `color`: string (hexadecimal)
|
|
173
|
+
- `category_id`: número ou null (categoria pai)
|
|
174
|
+
- `status`: 'active' | 'inactive'
|
|
175
|
+
- `category_locale`: array com traduções (nome e locale_id)
|
|
176
|
+
- `created_at`, `updated_at`: timestamps
|
|
177
|
+
|
|
178
|
+
## 6. Erros comuns
|
|
179
|
+
|
|
180
|
+
- **400 Bad Request**
|
|
181
|
+
- Locale inválido ou não encontrado.
|
|
182
|
+
- Dados obrigatórios ausentes (ex: slug, locale).
|
|
183
|
+
- Categoria pai referenciada não existe.
|
|
184
|
+
- Formato inválido para campos (ex: cor não hexadecimal).
|
|
185
|
+
- **404 Not Found**
|
|
186
|
+
- Categoria não encontrada para o ID informado.
|
|
187
|
+
- Categoria pai não encontrada.
|
|
188
|
+
- Nenhuma categoria filha encontrada para o pai informado.
|
|
189
|
+
|
|
190
|
+
## 7. Banco de dados (tabelas YAML)
|
|
191
|
+
|
|
192
|
+
### Tabela `category`
|
|
193
|
+
|
|
194
|
+
Finalidade: Armazenar categorias com hierarquia, status e atributos visuais.
|
|
195
|
+
|
|
196
|
+
```yaml
|
|
197
|
+
columns:
|
|
198
|
+
- type: pk
|
|
199
|
+
- type: slug
|
|
200
|
+
- name: icon
|
|
201
|
+
isNullable: true
|
|
202
|
+
- name: color
|
|
203
|
+
isNullable: true
|
|
204
|
+
default: '#000000'
|
|
205
|
+
- name: category_id
|
|
206
|
+
type: fk
|
|
207
|
+
isNullable: true
|
|
208
|
+
references:
|
|
209
|
+
table: category
|
|
210
|
+
column: id
|
|
211
|
+
onDelete: CASCADE
|
|
212
|
+
- name: status
|
|
213
|
+
type: enum
|
|
214
|
+
isNullable: true
|
|
215
|
+
values: [active, inactive]
|
|
216
|
+
default: active
|
|
217
|
+
- name: name
|
|
218
|
+
type: locale_varchar
|
|
219
|
+
length: 255
|
|
220
|
+
locale:
|
|
221
|
+
en: Name
|
|
222
|
+
pt: Nome
|
|
223
|
+
- type: created_at
|
|
224
|
+
- type: updated_at
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
- **Colunas:**
|
|
228
|
+
- `id` (PK): Identificador único.
|
|
229
|
+
- `slug`: Identificador textual único da categoria.
|
|
230
|
+
- `icon`: Ícone opcional da categoria.
|
|
231
|
+
- `color`: Cor hexadecimal, padrão `#000000`.
|
|
232
|
+
- `category_id`: FK para categoria pai, nullable, com deleção em cascata.
|
|
233
|
+
- `status`: Enum `active` ou `inactive`, padrão `active`.
|
|
234
|
+
- `name`: Campo localizado para o nome da categoria.
|
|
235
|
+
- `created_at`, `updated_at`: Timestamps automáticos.
|
|
236
|
+
|
|
237
|
+
- **Defaults:**
|
|
238
|
+
- `color`: `#000000`
|
|
239
|
+
- `status`: `active`
|
|
240
|
+
|
|
241
|
+
- **Nulabilidade:**
|
|
242
|
+
- `icon` e `category_id` são opcionais (nullable).
|
|
243
|
+
- Outros campos obrigatórios conforme tipo.
|
|
244
|
+
|
|
245
|
+
- **Integridade:**
|
|
246
|
+
- FK `category_id` referencia `category.id` com `onDelete: CASCADE`.
|
|
247
|
+
- `slug` deve ser único (implícito pelo tipo slug).
|
|
248
|
+
|
|
249
|
+
- **Índices:**
|
|
250
|
+
- Índice primário em `id`.
|
|
251
|
+
- Índice único em `slug` (implícito).
|
|
252
|
+
|
|
253
|
+
- **Enums:**
|
|
254
|
+
- `status`: valores possíveis `active`, `inactive`.
|
|
255
|
+
|
|
256
|
+
## 8. Regras de negócio relevantes
|
|
257
|
+
|
|
258
|
+
- Categorias podem ser hierárquicas, com categorias pai opcionais.
|
|
259
|
+
- Apenas categorias com status `active` são retornadas em listagens raiz.
|
|
260
|
+
- Ao criar ou atualizar, é obrigatório informar pelo menos uma localização válida.
|
|
261
|
+
- Atualizações de localizações são feitas por idioma, criando ou atualizando registros conforme necessário.
|
|
262
|
+
- Exclusão de categoria remove também suas categorias filhas devido à regra de deleção em cascata.
|
|
263
|
+
- Filtros de listagem permitem busca insensível por slug, status e categoria pai.
|
|
264
|
+
- Paginação é aplicada nas listagens para controle de volume de dados.
|
|
265
|
+
|
|
266
|
+
## 9. Guia rápido de uso (exemplos)
|
|
267
|
+
|
|
268
|
+
### Criar categoria
|
|
269
|
+
|
|
270
|
+
```http
|
|
271
|
+
POST /category
|
|
272
|
+
Authorization: Bearer <token>
|
|
273
|
+
Content-Type: application/json
|
|
274
|
+
|
|
275
|
+
{
|
|
276
|
+
"slug": "eletronicos",
|
|
277
|
+
"color": "#FF0000",
|
|
278
|
+
"icon": "tv",
|
|
279
|
+
"status": "active",
|
|
280
|
+
"locale": {
|
|
281
|
+
"en": { "name": "Electronics" },
|
|
282
|
+
"pt": { "name": "Eletrônicos" }
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Atualizar categoria
|
|
288
|
+
|
|
289
|
+
```http
|
|
290
|
+
PATCH /category/1
|
|
291
|
+
Authorization: Bearer <token>
|
|
292
|
+
Content-Type: application/json
|
|
293
|
+
|
|
294
|
+
{
|
|
295
|
+
"color": "#00FF00",
|
|
296
|
+
"locale": {
|
|
297
|
+
"pt": { "name": "Eletrônicos Atualizados" }
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### Listar categorias raiz
|
|
303
|
+
|
|
304
|
+
```http
|
|
305
|
+
GET /category/root?locale=pt
|
|
306
|
+
Authorization: Bearer <token>
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Obter estatísticas
|
|
310
|
+
|
|
311
|
+
```http
|
|
312
|
+
GET /category/stats
|
|
313
|
+
Authorization: Bearer <token>
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### Buscar categorias com filtro e paginação
|
|
317
|
+
|
|
318
|
+
```http
|
|
319
|
+
GET /category?status=active&parent=root&page=1&limit=10&locale=pt
|
|
320
|
+
Authorization: Bearer <token>
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### Deletar categoria
|
|
324
|
+
|
|
325
|
+
```http
|
|
326
|
+
DELETE /category/1
|
|
327
|
+
Authorization: Bearer <token>
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
Este módulo é essencial para a organização e categorização dos conteúdos e produtos no sistema HedHog, garantindo flexibilidade e suporte multilíngue com controle de acesso robusto.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hed-hog/category",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.273",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"dependencies": {
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
"@nestjs/jwt": "^11",
|
|
11
11
|
"@nestjs/mapped-types": "*",
|
|
12
12
|
"@hed-hog/api": "0.0.4",
|
|
13
|
+
"@hed-hog/core": "0.0.273",
|
|
14
|
+
"@hed-hog/api-pagination": "0.0.6",
|
|
13
15
|
"@hed-hog/api-prisma": "0.0.5",
|
|
14
|
-
"@hed-hog/api-locale": "0.0.13"
|
|
15
|
-
"@hed-hog/core": "0.0.270",
|
|
16
|
-
"@hed-hog/api-pagination": "0.0.6"
|
|
16
|
+
"@hed-hog/api-locale": "0.0.13"
|
|
17
17
|
},
|
|
18
18
|
"exports": {
|
|
19
19
|
".": {
|