@hed-hog/catalog 0.0.276 → 0.0.278
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 +269 -0
- package/package.json +6 -6
package/README.md
ADDED
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# @hed-hog/catalog
|
|
2
|
+
|
|
3
|
+
## 1. Visão geral do módulo
|
|
4
|
+
|
|
5
|
+
O módulo `@hed-hog/catalog` é responsável pela gestão centralizada dos recursos do catálogo, incluindo produtos, ofertas, marcas, atributos, comparações, imagens e regras relacionadas. Ele oferece uma API REST para operações CRUD, listagem paginada, estatísticas e manipulação de imagens de produtos, integrando-se com outros módulos do monorepo HedHog.
|
|
6
|
+
|
|
7
|
+
## 2. Escopo e responsabilidades
|
|
8
|
+
|
|
9
|
+
- Gerenciar recursos do catálogo como produtos, ofertas, marcas, atributos, comparações, imagens, entre outros.
|
|
10
|
+
- Fornecer endpoints para criação, leitura, atualização, exclusão e listagem paginada de recursos.
|
|
11
|
+
- Aplicar filtros e buscas sensíveis a campos configurados para cada recurso.
|
|
12
|
+
- Gerar estatísticas básicas dos recursos.
|
|
13
|
+
- Controlar imagens associadas a produtos.
|
|
14
|
+
- Garantir autenticação e autorização baseadas em papéis específicos.
|
|
15
|
+
- Integrar com serviços de paginação, localização e banco de dados Prisma.
|
|
16
|
+
|
|
17
|
+
## 3. Endpoints
|
|
18
|
+
|
|
19
|
+
### Listar imagens de um produto
|
|
20
|
+
|
|
21
|
+
- **Método:** GET
|
|
22
|
+
- **Path:** `/catalog/products/:id/images`
|
|
23
|
+
- **Autenticação:** Sim (roles: `admin`, `admin-catalog`)
|
|
24
|
+
- **Descrição:** Lista imagens associadas a um produto, com paginação e ordenação por `sort_order`.
|
|
25
|
+
- **Parâmetros:**
|
|
26
|
+
- `id` (path): ID numérico do produto
|
|
27
|
+
- Query params de paginação (ex: `page`, `limit`)
|
|
28
|
+
- Header `Accept-Language` para locale (ex: `pt-BR`)
|
|
29
|
+
- **Resposta:** Lista paginada de imagens do produto com campos conforme tabela `catalog_product_image`.
|
|
30
|
+
- **Erros:**
|
|
31
|
+
- 400 Bad Request: recurso não suportado
|
|
32
|
+
- 401 Unauthorized: acesso não autorizado
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
### Obter estatísticas de um recurso
|
|
37
|
+
|
|
38
|
+
- **Método:** GET
|
|
39
|
+
- **Path:** `/catalog/:resource/stats`
|
|
40
|
+
- **Autenticação:** Sim (roles: `admin`, `admin-catalog`)
|
|
41
|
+
- **Descrição:** Retorna estatísticas básicas do recurso, como total de registros e quantidade ativa (se aplicável).
|
|
42
|
+
- **Parâmetros:**
|
|
43
|
+
- `resource` (path): nome do recurso (ex: `product`, `brand`)
|
|
44
|
+
- Header `Accept-Language` para locale
|
|
45
|
+
- **Resposta:**
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"total": number,
|
|
49
|
+
"active": number (opcional)
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
- **Erros:**
|
|
53
|
+
- 400 Bad Request: recurso não suportado
|
|
54
|
+
- 401 Unauthorized
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
### Obter recurso por ID
|
|
59
|
+
|
|
60
|
+
- **Método:** GET
|
|
61
|
+
- **Path:** `/catalog/:resource/:id`
|
|
62
|
+
- **Autenticação:** Sim (roles: `admin`, `admin-catalog`)
|
|
63
|
+
- **Descrição:** Retorna um registro específico do recurso pelo ID.
|
|
64
|
+
- **Parâmetros:**
|
|
65
|
+
- `resource` (path): nome do recurso
|
|
66
|
+
- `id` (path): ID numérico do registro
|
|
67
|
+
- Header `Accept-Language` para locale
|
|
68
|
+
- **Resposta:** Objeto do recurso com campos conforme configuração.
|
|
69
|
+
- **Erros:**
|
|
70
|
+
- 400 Bad Request: recurso não suportado
|
|
71
|
+
- 404 Not Found: recurso não encontrado
|
|
72
|
+
- 401 Unauthorized
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
### Atualizar recurso por ID
|
|
77
|
+
|
|
78
|
+
- **Método:** PATCH
|
|
79
|
+
- **Path:** `/catalog/:resource/:id`
|
|
80
|
+
- **Autenticação:** Sim (roles: `admin`, `admin-catalog`)
|
|
81
|
+
- **Descrição:** Atualiza campos permitidos de um registro do recurso.
|
|
82
|
+
- **Parâmetros:**
|
|
83
|
+
- `resource` (path): nome do recurso
|
|
84
|
+
- `id` (path): ID do registro
|
|
85
|
+
- Body JSON: campos a atualizar (somente campos configurados para o recurso)
|
|
86
|
+
- Header `Accept-Language` para locale
|
|
87
|
+
- **Resposta:** Objeto atualizado do recurso.
|
|
88
|
+
- **Erros:**
|
|
89
|
+
- 400 Bad Request: recurso não suportado ou payload inválido
|
|
90
|
+
- 404 Not Found: recurso não encontrado
|
|
91
|
+
- 401 Unauthorized
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
### Deletar recurso por ID
|
|
96
|
+
|
|
97
|
+
- **Método:** DELETE
|
|
98
|
+
- **Path:** `/catalog/:resource/:id`
|
|
99
|
+
- **Autenticação:** Sim (roles: `admin`, `admin-catalog`)
|
|
100
|
+
- **Descrição:** Remove um registro do recurso pelo ID.
|
|
101
|
+
- **Parâmetros:**
|
|
102
|
+
- `resource` (path): nome do recurso
|
|
103
|
+
- `id` (path): ID do registro
|
|
104
|
+
- Header `Accept-Language` para locale
|
|
105
|
+
- **Resposta:** Objeto do recurso deletado.
|
|
106
|
+
- **Erros:**
|
|
107
|
+
- 400 Bad Request: recurso não suportado
|
|
108
|
+
- 404 Not Found: recurso não encontrado
|
|
109
|
+
- 401 Unauthorized
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
### Listar recursos com paginação e filtros
|
|
114
|
+
|
|
115
|
+
- **Método:** GET
|
|
116
|
+
- **Path:** `/catalog/:resource`
|
|
117
|
+
- **Autenticação:** Sim (roles: `admin`, `admin-catalog`)
|
|
118
|
+
- **Descrição:** Lista registros do recurso com paginação, ordenação e filtros configurados.
|
|
119
|
+
- **Parâmetros:**
|
|
120
|
+
- `resource` (path): nome do recurso
|
|
121
|
+
- Query params: filtros conforme campos configurados, paginação (`page`, `limit`)
|
|
122
|
+
- Header `Accept-Language` para locale
|
|
123
|
+
- **Resposta:** Lista paginada de registros do recurso.
|
|
124
|
+
- **Erros:**
|
|
125
|
+
- 400 Bad Request: recurso não suportado ou filtro inválido
|
|
126
|
+
- 401 Unauthorized
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
### Criar novo recurso
|
|
131
|
+
|
|
132
|
+
- **Método:** POST
|
|
133
|
+
- **Path:** `/catalog/:resource`
|
|
134
|
+
- **Autenticação:** Sim (roles: `admin`, `admin-catalog`)
|
|
135
|
+
- **Descrição:** Cria um novo registro do recurso com os campos permitidos.
|
|
136
|
+
- **Parâmetros:**
|
|
137
|
+
- `resource` (path): nome do recurso
|
|
138
|
+
- Body JSON: campos para criação (somente campos configurados para o recurso)
|
|
139
|
+
- Header `Accept-Language` para locale
|
|
140
|
+
- **Resposta:** Objeto criado do recurso.
|
|
141
|
+
- **Erros:**
|
|
142
|
+
- 400 Bad Request: recurso não suportado ou payload inválido
|
|
143
|
+
- 401 Unauthorized
|
|
144
|
+
|
|
145
|
+
## 4. Regras de autenticação e autorização
|
|
146
|
+
|
|
147
|
+
- Todos os endpoints são protegidos e requerem autenticação.
|
|
148
|
+
- Apenas usuários com os papéis `admin` ou `admin-catalog` podem acessar os endpoints do módulo.
|
|
149
|
+
- A autorização é baseada em roles definidas no sistema, conforme arquivo `hedhog/data/role.yaml`.
|
|
150
|
+
|
|
151
|
+
## 5. Estruturas de request/response
|
|
152
|
+
|
|
153
|
+
- **Request Body:**
|
|
154
|
+
- Campos aceitos são somente os definidos na configuração do recurso (`catalogResourceConfig`), ignorando campos extras.
|
|
155
|
+
- Valores booleanos podem ser enviados como strings `"true"` ou `"false"`.
|
|
156
|
+
- Valores numéricos podem ser enviados como strings numéricas e serão convertidos.
|
|
157
|
+
- **Response:**
|
|
158
|
+
- Objetos JSON com os campos do recurso conforme tabelas do banco.
|
|
159
|
+
- Listagens paginadas seguem o padrão do serviço de paginação do HedHog.
|
|
160
|
+
|
|
161
|
+
## 6. Erros comuns
|
|
162
|
+
|
|
163
|
+
- **400 Bad Request:** Recurso não suportado, payload inválido ou filtro inválido.
|
|
164
|
+
- **401 Unauthorized:** Usuário não autenticado ou sem permissão.
|
|
165
|
+
- **404 Not Found:** Registro não encontrado para o ID informado.
|
|
166
|
+
|
|
167
|
+
## 7. Banco de dados (tabelas YAML)
|
|
168
|
+
|
|
169
|
+
### Exemplo: `catalog_product`
|
|
170
|
+
|
|
171
|
+
- **Finalidade:** Armazena os produtos do catálogo.
|
|
172
|
+
- **Colunas principais:**
|
|
173
|
+
- `id` (PK)
|
|
174
|
+
- `brand_id` (FK para `catalog_brand`, nullable)
|
|
175
|
+
- `category_id` (FK para `category`)
|
|
176
|
+
- `slug` (varchar 255, único)
|
|
177
|
+
- `name` (varchar 255)
|
|
178
|
+
- `short_description` (varchar 500, nullable)
|
|
179
|
+
- `description` (text, nullable)
|
|
180
|
+
- `status` (enum: `draft`, `published`, `archived`, default `draft`)
|
|
181
|
+
- `comparison_status` (enum: `draft`, `ready`, `disabled`, default `draft`)
|
|
182
|
+
- `is_active` (boolean, default `true`)
|
|
183
|
+
- `created_at`, `updated_at` (timestamps)
|
|
184
|
+
- **Defaults:** Conforme descrito acima.
|
|
185
|
+
- **Nulabilidade:** Campos como `brand_id`, `short_description`, `description` são opcionais.
|
|
186
|
+
- **Integridade:** FK para `catalog_brand`, `category` e `content`.
|
|
187
|
+
- **Índices:**
|
|
188
|
+
- Único em `slug`
|
|
189
|
+
- Índices em `category_id` + `status`, `brand_id` + `status`, `is_active`
|
|
190
|
+
|
|
191
|
+
*(Outras tabelas seguem padrão similar, com chaves primárias, estrangeiras, enums e índices conforme arquivos YAML fornecidos.)*
|
|
192
|
+
|
|
193
|
+
## 8. Regras de negócio relevantes
|
|
194
|
+
|
|
195
|
+
- O módulo suporta múltiplos recursos configurados dinamicamente via `catalogResourceMap`.
|
|
196
|
+
- Campos de busca e filtro são configurados por recurso para permitir consultas eficientes.
|
|
197
|
+
- Campos booleanos e numéricos são normalizados automaticamente no payload.
|
|
198
|
+
- Exclusão e atualização verificam existência prévia do registro.
|
|
199
|
+
- Estatísticas incluem contagem total e contagem por status ativo quando aplicável.
|
|
200
|
+
- Imagens de produtos são ordenadas por `sort_order` e podem ter uma imagem primária.
|
|
201
|
+
- O sistema suporta múltiplos idiomas via parâmetro `locale`.
|
|
202
|
+
|
|
203
|
+
## 9. Guia rápido de uso (exemplos)
|
|
204
|
+
|
|
205
|
+
### Listar produtos com paginação e filtro por status
|
|
206
|
+
|
|
207
|
+
```http
|
|
208
|
+
GET /catalog/product?page=1&limit=10&status=published
|
|
209
|
+
Authorization: Bearer <token>
|
|
210
|
+
Accept-Language: pt-BR
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Criar uma nova marca
|
|
214
|
+
|
|
215
|
+
```http
|
|
216
|
+
POST /catalog/brand
|
|
217
|
+
Authorization: Bearer <token>
|
|
218
|
+
Content-Type: application/json
|
|
219
|
+
Accept-Language: pt-BR
|
|
220
|
+
|
|
221
|
+
{
|
|
222
|
+
"slug": "nova-marca",
|
|
223
|
+
"name": "Nova Marca",
|
|
224
|
+
"status": "active",
|
|
225
|
+
"website_url": "https://novamarca.com"
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Atualizar um produto
|
|
230
|
+
|
|
231
|
+
```http
|
|
232
|
+
PATCH /catalog/product/123
|
|
233
|
+
Authorization: Bearer <token>
|
|
234
|
+
Content-Type: application/json
|
|
235
|
+
Accept-Language: pt-BR
|
|
236
|
+
|
|
237
|
+
{
|
|
238
|
+
"name": "Nome Atualizado",
|
|
239
|
+
"status": "published"
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Deletar uma oferta
|
|
244
|
+
|
|
245
|
+
```http
|
|
246
|
+
DELETE /catalog/offer/456
|
|
247
|
+
Authorization: Bearer <token>
|
|
248
|
+
Accept-Language: pt-BR
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Obter estatísticas de ofertas
|
|
252
|
+
|
|
253
|
+
```http
|
|
254
|
+
GET /catalog/offer/stats
|
|
255
|
+
Authorization: Bearer <token>
|
|
256
|
+
Accept-Language: pt-BR
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### Listar imagens de um produto
|
|
260
|
+
|
|
261
|
+
```http
|
|
262
|
+
GET /catalog/products/123/images?page=1&limit=5
|
|
263
|
+
Authorization: Bearer <token>
|
|
264
|
+
Accept-Language: pt-BR
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
Este módulo deve ser utilizado por administradores do catálogo para gerenciar os dados essenciais do sistema de forma segura e consistente.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hed-hog/catalog",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.278",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"dependencies": {
|
|
@@ -9,14 +9,14 @@
|
|
|
9
9
|
"@nestjs/core": "^11",
|
|
10
10
|
"@nestjs/jwt": "^11",
|
|
11
11
|
"@nestjs/mapped-types": "*",
|
|
12
|
+
"@hed-hog/api-pagination": "0.0.6",
|
|
12
13
|
"@hed-hog/api-locale": "0.0.13",
|
|
14
|
+
"@hed-hog/core": "0.0.278",
|
|
13
15
|
"@hed-hog/api": "0.0.4",
|
|
14
|
-
"@hed-hog/
|
|
15
|
-
"@hed-hog/api-pagination": "0.0.6",
|
|
16
|
+
"@hed-hog/category": "0.0.278",
|
|
16
17
|
"@hed-hog/api-prisma": "0.0.5",
|
|
17
|
-
"@hed-hog/
|
|
18
|
-
"@hed-hog/
|
|
19
|
-
"@hed-hog/tag": "0.0.276"
|
|
18
|
+
"@hed-hog/content": "0.0.278",
|
|
19
|
+
"@hed-hog/tag": "0.0.278"
|
|
20
20
|
},
|
|
21
21
|
"exports": {
|
|
22
22
|
".": {
|