@hed-hog/category 0.0.266 → 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 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.
@@ -16,8 +16,8 @@ export declare class CategoryController {
16
16
  id: number;
17
17
  created_at: Date;
18
18
  updated_at: Date;
19
- locale_id: number;
20
19
  category_id: number;
20
+ locale_id: number;
21
21
  }[];
22
22
  } & {
23
23
  id: number;
@@ -65,8 +65,8 @@ export declare class CategoryController {
65
65
  id: number;
66
66
  created_at: Date;
67
67
  updated_at: Date;
68
- locale_id: number;
69
68
  category_id: number;
69
+ locale_id: number;
70
70
  }[];
71
71
  } & {
72
72
  id: number;
@@ -19,8 +19,8 @@ export declare class CategoryService {
19
19
  id: number;
20
20
  created_at: Date;
21
21
  updated_at: Date;
22
- locale_id: number;
23
22
  category_id: number;
23
+ locale_id: number;
24
24
  }[];
25
25
  } & {
26
26
  id: number;
@@ -69,8 +69,8 @@ export declare class CategoryService {
69
69
  id: number;
70
70
  created_at: Date;
71
71
  updated_at: Date;
72
- locale_id: number;
73
72
  category_id: number;
73
+ locale_id: number;
74
74
  }[];
75
75
  } & {
76
76
  id: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hed-hog/category",
3
- "version": "0.0.266",
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/api-prisma": "0.0.5",
14
- "@hed-hog/api-locale": "0.0.13",
13
+ "@hed-hog/core": "0.0.273",
15
14
  "@hed-hog/api-pagination": "0.0.6",
16
- "@hed-hog/core": "0.0.266"
15
+ "@hed-hog/api-prisma": "0.0.5",
16
+ "@hed-hog/api-locale": "0.0.13"
17
17
  },
18
18
  "exports": {
19
19
  ".": {