@hed-hog/core 0.0.273 → 0.0.275

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 CHANGED
@@ -1,3 +1,4 @@
1
+ ```markdown
1
2
  # @hed-hog/core
2
3
 
3
4
  ## 1. Visão geral do módulo
@@ -17,36 +18,36 @@ O módulo `@hed-hog/core` é o núcleo do monorepo HedHog, responsável por forn
17
18
 
18
19
  ### Módulo AI (`/ai`)
19
20
 
20
- | Método | Path | Autenticação | Descrição | Parâmetros / Body | Resposta | Erros Comuns |
21
- |--------|-----------------------|--------------|------------------------------------------------|--------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------|-------------------------------------|
22
- | POST | `/ai/chat` | Autenticada | Realiza chat com IA, podendo enviar arquivo. | Body: `ChatDTO` (message, provider?, model?, systemPrompt?, file_id?)<br>File: opcional | `{ provider, model, content }` | 400: Chave API não configurada |
23
- | POST | `/ai/agent` | Autenticada | Cria um agente AI. | Body: `CreateAgentDTO` (slug, provider?, model?, instructions?) | Objeto agente criado ou existente | 400: Slug já existe |
24
- | GET | `/ai/agent` | Autenticada | Lista agentes AI com paginação. | Query: paginação (page, pageSize, search) | Paginação com lista de agentes | - |
25
- | GET | `/ai/agent/id/:agentId` | Autenticada | Obtém agente AI por ID. | Path param: `agentId` (int) | Objeto agente | 404: Agente não encontrado |
26
- | GET | `/ai/agent/:slug` | Autenticada | Obtém agente AI por slug. | Path param: `slug` (string) | Objeto agente | 404: Agente não encontrado |
27
- | PATCH | `/ai/agent/:agentId` | Autenticada | Atualiza agente AI. | Path param: `agentId` (int)<br>Body: `UpdateAgentDTO` (slug?, provider?, model?, instructions?) | Objeto agente atualizado | 404: Agente não encontrado<br>400: Slug duplicado |
28
- | DELETE | `/ai/agent` | Autenticada | Deleta agentes AI em lote. | Body: `DeleteDTO` (ids: number[]) | `{ count: number }` | 404: Um ou mais agentes não encontrados |
29
- | POST | `/ai/agent/:slug/chat`| Autenticada | Chat com agente AI específico, com arquivo opcional. | Path param: `slug` (string)<br>Body: `ChatAgentDTO` (message, file_id?)<br>File: opcional | `{ slug, provider, model, content }` | 404: Agente não encontrado |
21
+ | Método | Path | Autenticação | Descrição | Parâmetros / Body | Resposta | Erros Comuns |
22
+ |--------|-------------------------|--------------|--------------------------------------------------|---------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------|-------------------------------------|
23
+ | POST | `/ai/chat` | Autenticada | Realiza chat com IA, podendo enviar arquivo. | Body: `ChatDTO` (message, provider?, model?, systemPrompt?, file_id?)<br>File: opcional | `{ provider, model, content }` | 400: Chave API não configurada |
24
+ | POST | `/ai/agent` | Autenticada | Cria um agente AI. | Body: `CreateAgentDTO` (slug, provider?, model?, instructions?) | Objeto agente criado ou existente | 400: Slug já existe |
25
+ | GET | `/ai/agent` | Autenticada | Lista agentes AI com paginação. | Query: paginação (page, pageSize, search) | Paginação com lista de agentes | - |
26
+ | GET | `/ai/agent/id/:agentId` | Autenticada | Obtém agente AI por ID. | Path param: `agentId` (int) | Objeto agente | 404: Agente não encontrado |
27
+ | GET | `/ai/agent/:slug` | Autenticada | Obtém agente AI por slug. | Path param: `slug` (string) | Objeto agente | 404: Agente não encontrado |
28
+ | PATCH | `/ai/agent/:agentId` | Autenticada | Atualiza agente AI. | Path param: `agentId` (int)<br>Body: `UpdateAgentDTO` (slug?, provider?, model?, instructions?) | Objeto agente atualizado | 404: Agente não encontrado<br>400: Slug duplicado |
29
+ | DELETE | `/ai/agent` | Autenticada | Deleta agentes AI em lote. | Body: `DeleteDTO` (ids: number[]) | `{ count: number }` | 404: Um ou mais agentes não encontrados |
30
+ | POST | `/ai/agent/:slug/chat` | Autenticada | Chat com agente AI específico, com arquivo opcional. | Path param: `slug` (string)<br>Body: `ChatAgentDTO` (message, file_id?)<br>File: opcional | `{ slug, provider, model, content }` | 404: Agente não encontrado |
30
31
 
31
32
  ### Módulo Auth (`/auth`)
32
33
 
33
- | Método | Path | Autenticação | Descrição | Parâmetros / Body | Resposta | Erros Comuns |
34
- |--------|-------------------------------|--------------|------------------------------------------------|--------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------|-------------------------------------|
35
- | GET | `/auth/verify` | Autenticada | Verifica usuário autenticado. | - | Dados do usuário autenticado | - |
36
- | GET | `/auth/roles` | Pública | Retorna roles do usuário (se autenticado). | - | `{ roles: string[] }` | - |
37
- | POST | `/auth/refresh` | Pública | Atualiza token de acesso usando refresh token. | Body: `{ refreshToken?: string }`<br>Cookies: `rt` opcional | `{ accessToken, refreshToken? }` | 400: Refresh token não fornecido |
38
- | POST | `/auth/login` | Pública | Login com email e senha. | Body: `LoginDTO` (email, password, refreshToken?) | Tokens de acesso e refresh ou MFA requerida | 400: Acesso negado |
39
- | POST | `/auth/login-email-verification` | Pública | Login via verificação por email e código. | Body: `LoginEmailVerificationDTO` (token, code) | Tokens de acesso e refresh | 400: Código inválido ou desafio não encontrado |
40
- | POST | `/auth/login-email-verification-resend` | Pública | Reenvia código de verificação por email. | Body: `LoginEmailVerificationResendDTO` (token) | Novo token para verificação | 400: Token inválido ou expirado |
41
- | POST | `/auth/signup` | Pública | Cadastro com email e senha. | Body: `CreateWithEmailAndPasswordDTO` | Usuário criado | - |
42
- | POST | `/auth/login-code` | Pública | Login com código MFA. | Body: `LoginWithCodeDTO` (token, code, methodType?) | Tokens de acesso e refresh | 400: Código MFA inválido |
43
- | POST | `/auth/login-recovery-code` | Pública | Login com código de recuperação MFA. | Body: `LoginWithRecoveryCodeDTO` (token, code) | Tokens de acesso e refresh | 400: Código de recuperação inválido|
44
- | POST | `/auth/resend-mfa-code` | Pública | Reenvia código MFA por email. | Body: `ResendMfaCodeDTO` (token) | `{ success: true, hasEmailMfa: true }` | 400: Nenhum método MFA por email |
45
- | POST | `/auth/webauthn/generate` | Pública | Gera opções para autenticação WebAuthn. | Body: `{ mfaToken: string }` | Opções WebAuthn | 400: WebAuthn não configurado |
46
- | POST | `/auth/webauthn/verify` | Pública | Verifica autenticação WebAuthn. | Body: `{ mfaToken: string, assertionResponse: any }` | Tokens de acesso e refresh | 400: Verificação falhou |
47
- | POST | `/auth/forgot` | Pública | Solicita recuperação de senha via email. | Body: `ForgetDTO` (email) | `{ success: true }` | - |
48
- | POST | `/auth/logout` | Pública | Logout e invalida refresh token. | Body: `{ refreshToken?: string }`<br>Cookies: `rt` opcional | `{ success: true }` | 400: Refresh token não fornecido |
49
- | POST | `/auth/forgot-reset` | Pública | Reseta senha via código de recuperação. | Body: `ResetDTO` (password, code) | Tokens de acesso e refresh | 400: Código inválido ou expirado |
34
+ | Método | Path | Autenticação | Descrição | Parâmetros / Body | Resposta | Erros Comuns |
35
+ |--------|-------------------------------------|--------------|--------------------------------------------------|--------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------|-------------------------------------|
36
+ | GET | `/auth/verify` | Autenticada | Verifica usuário autenticado. | - | Dados do usuário autenticado | - |
37
+ | GET | `/auth/roles` | Pública | Retorna roles do usuário (se autenticado). | - | `{ roles: string[] }` | - |
38
+ | POST | `/auth/refresh` | Pública | Atualiza token de acesso usando refresh token. | Body: `{ refreshToken?: string }`<br>Cookies: `rt` opcional | `{ accessToken, refreshToken? }` | 400: Refresh token não fornecido |
39
+ | POST | `/auth/login` | Pública | Login com email e senha. | Body: `LoginDTO` (email, password, refreshToken?) | Tokens de acesso e refresh ou MFA requerida | 400: Acesso negado |
40
+ | POST | `/auth/login-email-verification` | Pública | Login via verificação por email e código. | Body: `LoginEmailVerificationDTO` (token, code) | Tokens de acesso e refresh | 400: Código inválido ou desafio não encontrado |
41
+ | POST | `/auth/login-email-verification-resend` | Pública | Reenvia código de verificação por email. | Body: `LoginEmailVerificationResendDTO` (token) | Novo token para verificação | 400: Token inválido ou expirado |
42
+ | POST | `/auth/signup` | Pública | Cadastro com email e senha. | Body: `CreateWithEmailAndPasswordDTO` | Usuário criado | - |
43
+ | POST | `/auth/login-code` | Pública | Login com código MFA. | Body: `LoginWithCodeDTO` (token, code, methodType?) | Tokens de acesso e refresh | 400: Código MFA inválido |
44
+ | POST | `/auth/login-recovery-code` | Pública | Login com código de recuperação MFA. | Body: `LoginWithRecoveryCodeDTO` (token, code) | Tokens de acesso e refresh | 400: Código de recuperação inválido|
45
+ | POST | `/auth/resend-mfa-code` | Pública | Reenvia código MFA por email. | Body: `ResendMfaCodeDTO` (token) | `{ success: true, hasEmailMfa: true }` | 400: Nenhum método MFA por email |
46
+ | POST | `/auth/webauthn/generate` | Pública | Gera opções para autenticação WebAuthn. | Body: `{ mfaToken: string }` | Opções WebAuthn | 400: WebAuthn não configurado |
47
+ | POST | `/auth/webauthn/verify` | Pública | Verifica autenticação WebAuthn. | Body: `{ mfaToken: string, assertionResponse: any }` | Tokens de acesso e refresh | 400: Verificação falhou |
48
+ | POST | `/auth/forgot` | Pública | Solicita recuperação de senha via email. | Body: `ForgetDTO` (email) | `{ success: true }` | - |
49
+ | POST | `/auth/logout` | Pública | Logout e invalida refresh token. | Body: `{ refreshToken?: string }`<br>Cookies: `rt` opcional | `{ success: true }` | 400: Refresh token não fornecido |
50
+ | POST | `/auth/forgot-reset` | Pública | Reseta senha via código de recuperação. | Body: `ResetDTO` (password, code) | Tokens de acesso e refresh | 400: Código inválido ou expirado |
50
51
 
51
52
  ### Módulo System (`/system`)
52
53
 
@@ -54,6 +55,22 @@ O módulo `@hed-hog/core` é o núcleo do monorepo HedHog, responsável por forn
54
55
  |--------|------------|--------------|---------------------------------|-------------------|------------------------------------------------------------------------------------------|--------------|
55
56
  | GET | `/system` | Autenticada | Retorna informações do sistema. | - | Informações detalhadas do sistema operacional, hardware, banco de dados, módulos e usuários | - |
56
57
 
58
+ ### Módulo Dashboard Core (`/dashboard-core`)
59
+
60
+ | Método | Path | Autenticação | Descrição | Parâmetros / Body | Resposta | Erros Comuns |
61
+ |--------|---------------------------|--------------|--------------------------------------------------|---------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------|-------------------------------------|
62
+ | GET | `/dashboard-core/home` | Autenticada | Retorna dashboard home do usuário. | - | Objeto dashboard ou null | 400: Usuário não encontrado |
63
+ | GET | `/dashboard-core/stats/overview/users` | Autenticada | Estatísticas de usuários. | - | Estatísticas agregadas de usuários e sessões | - |
64
+ | GET | `/dashboard-core/stats/overview/mails` | Autenticada | Estatísticas de emails enviados. | - | Estatísticas agregadas de emails enviados | - |
65
+ | GET | `/dashboard-core/widgets/me` | Autenticada | Dados dos widgets para o usuário. | - | Dados agregados para widgets do usuário | - |
66
+ | GET | `/dashboard-core/user-dashboards` | Autenticada | Lista dashboards do usuário. | - | Lista de dashboards associados ao usuário | - |
67
+ | GET | `/dashboard-core/access/:slug` | Autenticada | Verifica acesso do usuário a dashboard. | Path param: `slug` (string) | `{ hasAccess: boolean, dashboard: object|null }` | - |
68
+ | GET | `/dashboard-core/layout/:slug` | Autenticada | Obtém layout do usuário para dashboard. | Path param: `slug` (string) | Array de widgets com posições e dimensões | - |
69
+ | POST | `/dashboard-core/layout/:slug` | Autenticada | Salva layout do usuário para dashboard. | Body: `{ layout: Array<{ i: string; x: number; y: number; w: number; h: number }> }` | `{ success: true }` | 403: Acesso negado |
70
+ | POST | `/dashboard-core/widget/:slug` | Autenticada | Adiciona widget ao dashboard do usuário. | Body: `{ componentSlug: string }` | Dados do widget adicionado | 403: Acesso negado |
71
+ | DELETE | `/dashboard-core/widget/:slug/:widgetId` | Autenticada | Remove widget do dashboard do usuário. | Path param: `slug` (string), `widgetId` (string) | Erro "Not implemented yet" | - |
72
+ | GET | `/dashboard-core/:slug` | Autenticada | Obtém itens do dashboard por slug. | Path param: `slug` (string), Query param: locale (string) | Lista de itens do dashboard | - |
73
+
57
74
  ## 4. Regras de autenticação e autorização
58
75
 
59
76
  - A maioria dos endpoints requer autenticação via token JWT.
@@ -184,6 +201,135 @@ O módulo `@hed-hog/core` é o núcleo do monorepo HedHog, responsável por forn
184
201
  }
185
202
  ```
186
203
 
204
+ ### DTOs principais do módulo Dashboard
205
+
206
+ - **CreateDashboardDTO**
207
+
208
+ ```ts
209
+ {
210
+ slug: string; // obrigatório
211
+ locale: Record<string, { name: string }>; // obrigatório
212
+ }
213
+ ```
214
+
215
+ - **UpdateDashboardDTO**
216
+
217
+ ```ts
218
+ {
219
+ slug?: string;
220
+ locale?: Record<string, { name: string }>;
221
+ }
222
+ ```
223
+
224
+ - **CreateDashboardComponentDTO**
225
+
226
+ ```ts
227
+ {
228
+ slug: string;
229
+ min_width?: number;
230
+ max_width?: number;
231
+ min_height?: number;
232
+ max_height?: number;
233
+ width: number;
234
+ height: number;
235
+ is_resizable?: boolean;
236
+ locale: Record<string, { name: string; description?: string }>;
237
+ }
238
+ ```
239
+
240
+ - **UpdateDashboardComponentDTO**
241
+
242
+ ```ts
243
+ {
244
+ slug?: string;
245
+ min_width?: number;
246
+ max_width?: number;
247
+ min_height?: number;
248
+ max_height?: number;
249
+ width?: number;
250
+ height?: number;
251
+ is_resizable?: boolean;
252
+ locale?: Record<string, { name: string; description?: string }>;
253
+ }
254
+ ```
255
+
256
+ - **CreateDashboardRoleDTO**
257
+
258
+ ```ts
259
+ {
260
+ dashboard_id: number;
261
+ role_id: number;
262
+ }
263
+ ```
264
+
265
+ - **CreateDashboardRoleBatchDTO**
266
+
267
+ ```ts
268
+ {
269
+ dashboard_id: number;
270
+ role_ids: number[];
271
+ }
272
+ ```
273
+
274
+ - **CreateDashboardComponentRoleDTO**
275
+
276
+ ```ts
277
+ {
278
+ component_id: number;
279
+ role_id: number;
280
+ }
281
+ ```
282
+
283
+ - **CreateDashboardComponentRoleBatchDTO**
284
+
285
+ ```ts
286
+ {
287
+ component_id: number;
288
+ role_ids: number[];
289
+ }
290
+ ```
291
+
292
+ - **CreateDashboardItemDTO**
293
+
294
+ ```ts
295
+ {
296
+ component_id: number;
297
+ dashboard_id: number;
298
+ width: number;
299
+ height: number;
300
+ x_axis: number;
301
+ y_axis: number;
302
+ }
303
+ ```
304
+
305
+ - **UpdateDashboardLayoutDTO**
306
+
307
+ ```ts
308
+ {
309
+ dashboard_id: number;
310
+ items: Array<{
311
+ id: number;
312
+ width: number;
313
+ height: number;
314
+ x_axis: number;
315
+ y_axis: number;
316
+ }>;
317
+ }
318
+ ```
319
+
320
+ - **UpdateDashboardItemDTO**
321
+
322
+ ```ts
323
+ {
324
+ component_id?: number;
325
+ dashboard_id?: number;
326
+ width?: number;
327
+ height?: number;
328
+ x_axis?: number;
329
+ y_axis?: number;
330
+ }
331
+ ```
332
+
187
333
  ## 6. Erros comuns
188
334
 
189
335
  - **400 Bad Request**
@@ -195,6 +341,7 @@ O módulo `@hed-hog/core` é o núcleo do monorepo HedHog, responsável por forn
195
341
  - Acesso negado por credenciais inválidas.
196
342
  - MFA não configurado ou código inválido.
197
343
  - Tentativa de deletar itens inexistentes.
344
+ - Requisição inválida para criação de relações duplicadas.
198
345
 
199
346
  - **404 Not Found**
200
347
 
@@ -237,31 +384,244 @@ enums:
237
384
  - provider: ['openai', 'gemini']
238
385
  ```
239
386
 
240
- ### user, user_mfa, user_identifier, user_session, user_activity, role, role_user, dashboard, dashboard_component, dashboard_role, dashboard_user, dashboard_item, dashboard_component_role
387
+ ### user
388
+
389
+ ```yaml
390
+ finalidade: Armazena usuários do sistema.
391
+ colunas:
392
+ - id: integer, PK, auto-increment
393
+ - name: string, não nulo
394
+ - photo_id: integer, nullable
395
+ - last_login_at: timestamp, nullable
396
+ - created_at: timestamp, não nulo, default NOW()
397
+ - updated_at: timestamp, não nulo, default NOW()
398
+ integridade:
399
+ - PK em id
400
+ indices:
401
+ - id (PK)
402
+ ```
403
+
404
+ ### user_mfa
405
+
406
+ ```yaml
407
+ finalidade: Armazena métodos de autenticação multifator dos usuários.
408
+ colunas:
409
+ - id: integer, PK, auto-increment
410
+ - user_id: integer, FK para user.id, não nulo
411
+ - name: string, não nulo
412
+ - type: enum('totp', 'email', 'webauthn'), não nulo
413
+ - verified_at: timestamp, nullable
414
+ - suspended_until: timestamp, nullable
415
+ - created_at: timestamp, não nulo, default NOW()
416
+ - updated_at: timestamp, não nulo, default NOW()
417
+ integridade:
418
+ - FK user_id referencia user.id
419
+ indices:
420
+ - id (PK)
421
+ enums:
422
+ - type: ['totp', 'email', 'webauthn']
423
+ ```
424
+
425
+ ### user_identifier
426
+
427
+ ```yaml
428
+ finalidade: Identificadores do usuário, como emails.
429
+ colunas:
430
+ - id: integer, PK, auto-increment
431
+ - user_id: integer, FK para user.id, não nulo
432
+ - type: string, não nulo (ex: 'email')
433
+ - value: string, não nulo
434
+ - verified_at: timestamp, nullable
435
+ - enabled: boolean, não nulo, default true
436
+ - created_at: timestamp, não nulo, default NOW()
437
+ - updated_at: timestamp, não nulo, default NOW()
438
+ integridade:
439
+ - FK user_id referencia user.id
440
+ indices:
441
+ - id (PK)
442
+ ```
443
+
444
+ ### user_session
445
+
446
+ ```yaml
447
+ finalidade: Sessões de usuários autenticados.
448
+ colunas:
449
+ - id: integer, PK, auto-increment
450
+ - user_id: integer, FK para user.id, não nulo
451
+ - token: string, não nulo
452
+ - ip_address: string, nullable
453
+ - user_agent: string, nullable
454
+ - created_at: timestamp, não nulo, default NOW()
455
+ - expires_at: timestamp, não nulo
456
+ - revoked_at: timestamp, nullable
457
+ integridade:
458
+ - FK user_id referencia user.id
459
+ indices:
460
+ - id (PK)
461
+ ```
462
+
463
+ ### user_activity
464
+
465
+ ```yaml
466
+ finalidade: Registro de atividades dos usuários.
467
+ colunas:
468
+ - id: integer, PK, auto-increment
469
+ - user_id: integer, FK para user.id, não nulo
470
+ - action: string, não nulo
471
+ - created_at: timestamp, não nulo, default NOW()
472
+ integridade:
473
+ - FK user_id referencia user.id
474
+ indices:
475
+ - id (PK)
476
+ ```
477
+
478
+ ### role
479
+
480
+ ```yaml
481
+ finalidade: Papéis (roles) do sistema para controle de acesso.
482
+ colunas:
483
+ - id: integer, PK, auto-increment
484
+ - slug: string, único, não nulo
485
+ - created_at: timestamp, não nulo, default NOW()
486
+ - updated_at: timestamp, não nulo, default NOW()
487
+ integridade:
488
+ - slug único
489
+ indices:
490
+ - id (PK)
491
+ - slug (único)
492
+ ```
493
+
494
+ ### role_user
495
+
496
+ ```yaml
497
+ finalidade: Relação muitos-para-muitos entre usuários e roles.
498
+ colunas:
499
+ - id: integer, PK, auto-increment
500
+ - user_id: integer, FK para user.id, não nulo
501
+ - role_id: integer, FK para role.id, não nulo
502
+ integridade:
503
+ - FK user_id referencia user.id
504
+ - FK role_id referencia role.id
505
+ indices:
506
+ - id (PK)
507
+ ```
508
+
509
+ ### dashboard
510
+
511
+ ```yaml
512
+ finalidade: Dashboards configuráveis do sistema.
513
+ colunas:
514
+ - id: integer, PK, auto-increment
515
+ - slug: string, único, não nulo
516
+ - created_at: timestamp, não nulo, default NOW()
517
+ - updated_at: timestamp, não nulo, default NOW()
518
+ integridade:
519
+ - slug único
520
+ indices:
521
+ - id (PK)
522
+ - slug (único)
523
+ ```
524
+
525
+ ### dashboard_component
241
526
 
242
- - Estruturas padrão para usuários, autenticação multifator, sessões, atividades, roles, dashboards e seus componentes, com relacionamentos muitos-para-muitos e suporte a internacionalização via tabelas de locale.
527
+ ```yaml
528
+ finalidade: Componentes que podem ser usados em dashboards.
529
+ colunas:
530
+ - id: integer, PK, auto-increment
531
+ - slug: string, único, não nulo
532
+ - min_width: integer, nullable
533
+ - max_width: integer, nullable
534
+ - min_height: integer, nullable
535
+ - max_height: integer, nullable
536
+ - width: integer, não nulo
537
+ - height: integer, não nulo
538
+ - is_resizable: boolean, não nulo, default true
539
+ - created_at: timestamp, não nulo, default NOW()
540
+ - updated_at: timestamp, não nulo, default NOW()
541
+ integridade:
542
+ - slug único
543
+ indices:
544
+ - id (PK)
545
+ - slug (único)
546
+ ```
547
+
548
+ ### dashboard_role
549
+
550
+ ```yaml
551
+ finalidade: Relação entre dashboards e roles para controle de acesso.
552
+ colunas:
553
+ - id: integer, PK, auto-increment
554
+ - dashboard_id: integer, FK para dashboard.id, não nulo
555
+ - role_id: integer, FK para role.id, não nulo
556
+ integridade:
557
+ - FK dashboard_id referencia dashboard.id
558
+ - FK role_id referencia role.id
559
+ indices:
560
+ - id (PK)
561
+ ```
562
+
563
+ ### dashboard_user
564
+
565
+ ```yaml
566
+ finalidade: Relação entre dashboards e usuários.
567
+ colunas:
568
+ - id: integer, PK, auto-increment
569
+ - dashboard_id: integer, FK para dashboard.id, não nulo
570
+ - user_id: integer, FK para user.id, não nulo
571
+ - is_home: boolean, não nulo, default false
572
+ integridade:
573
+ - FK dashboard_id referencia dashboard.id
574
+ - FK user_id referencia user.id
575
+ indices:
576
+ - id (PK)
577
+ ```
578
+
579
+ ### dashboard_item
243
580
 
244
- - Campos comuns incluem IDs, slugs, timestamps de criação e atualização, e campos específicos para configurações de MFA, tokens, e layouts de dashboards.
581
+ ```yaml
582
+ finalidade: Itens (widgets) dentro de dashboards.
583
+ colunas:
584
+ - id: integer, PK, auto-increment
585
+ - dashboard_id: integer, FK para dashboard.id, não nulo
586
+ - component_id: integer, FK para dashboard_component.id, não nulo
587
+ - width: integer, não nulo
588
+ - height: integer, não nulo
589
+ - x_axis: integer, não nulo
590
+ - y_axis: integer, não nulo
591
+ integridade:
592
+ - FK dashboard_id referencia dashboard.id
593
+ - FK component_id referencia dashboard_component.id
594
+ indices:
595
+ - id (PK)
596
+ ```
245
597
 
246
- - Integridade referencial garantida via chaves estrangeiras.
598
+ ### dashboard_component_role
599
+
600
+ ```yaml
601
+ finalidade: Relação entre componentes de dashboard e roles.
602
+ colunas:
603
+ - id: integer, PK, auto-increment
604
+ - component_id: integer, FK para dashboard_component.id, não nulo
605
+ - role_id: integer, FK para role.id, não nulo
606
+ integridade:
607
+ - FK component_id referencia dashboard_component.id
608
+ - FK role_id referencia role.id
609
+ indices:
610
+ - id (PK)
611
+ ```
247
612
 
248
613
  ## 8. Regras de negócio relevantes
249
614
 
250
615
  - Agentes AI podem ser criados, atualizados e deletados, com integração direta com APIs OpenAI e Gemini.
251
-
252
616
  - Chat com IA suporta anexos de arquivos, com extração de texto para PDFs e arquivos de texto.
253
-
254
617
  - MFA obrigatório pode ser configurado, com suporte a email, TOTP e WebAuthn.
255
-
256
618
  - Tokens de acesso e refresh são gerenciados com segurança, incluindo cookies HTTP-only.
257
-
258
619
  - Dashboards são personalizados por usuário, com controle de acesso baseado em roles.
259
-
260
620
  - Layouts de dashboards e widgets podem ser salvos e recuperados por usuário.
261
-
262
621
  - Sistema coleta estatísticas de uso, sessões, emails enviados e segurança da conta.
263
-
264
622
  - Validações rigorosas são aplicadas via DTOs e classes de validação.
623
+ - Operações de criação em batch evitam duplicações e retornam contagem de criados e ignorados.
624
+ - A remoção de widgets do dashboard do usuário ainda não está implementada.
265
625
 
266
626
  ## 9. Guia rápido de uso (exemplos)
267
627
 
@@ -400,3 +760,4 @@ Resposta (exemplo resumido):
400
760
  ---
401
761
 
402
762
  Este README documenta o módulo `@hed-hog/core` com base no código-fonte e definições atuais, fornecendo uma visão técnica detalhada para desenvolvedores e integradores do sistema.
763
+ ```
@@ -18,7 +18,7 @@
18
18
  pt: Mostra o número de e-mails enviados.
19
19
  - slug: mail-sent-chart
20
20
  width: 6
21
- height: 3
21
+ height: 5
22
22
  name:
23
23
  en: Mail Sent Chart
24
24
  pt: Gráfico de E-mails Enviados
@@ -36,7 +36,7 @@
36
36
  pt: Mostra as permissões do usuário atual.
37
37
  - slug: permissions-chart
38
38
  width: 6
39
- height: 3
39
+ height: 5
40
40
  name:
41
41
  en: Permissions Chart
42
42
  pt: Gráfico de Permissões
@@ -45,7 +45,7 @@
45
45
  pt: Mostra um gráfico das permissões do usuário atual.
46
46
  - slug: session-activity-chart
47
47
  width: 6
48
- height: 3
48
+ height: 5
49
49
  name:
50
50
  en: Session Activity Chart
51
51
  pt: Gráfico de Atividade de Sessão
@@ -63,7 +63,7 @@
63
63
  pt: Mostra um card das sessões de hoje.
64
64
  - slug: user-growth-chart
65
65
  width: 6
66
- height: 3
66
+ height: 5
67
67
  name:
68
68
  en: User Growth Chart
69
69
  pt: Gráfico de Crescimento de Usuários
@@ -90,7 +90,7 @@
90
90
  pt: Exibe os eventos recentes de atividade no sistema.
91
91
  - slug: email-notifications
92
92
  width: 7
93
- height: 3
93
+ height: 4
94
94
  name:
95
95
  en: Email Notifications
96
96
  pt: Notificações por E-mail
@@ -117,7 +117,7 @@
117
117
  pt: Exibe informações do perfil do usuário e ações rápidas.
118
118
  - slug: stat-online-time
119
119
  width: 3
120
- height: 1
120
+ height: 2
121
121
  name:
122
122
  en: Online Time
123
123
  pt: Tempo Online
@@ -126,7 +126,7 @@
126
126
  pt: Mostra há quanto tempo você está online na sessão atual.
127
127
  - slug: stat-actions-today
128
128
  width: 3
129
- height: 1
129
+ height: 2
130
130
  name:
131
131
  en: Actions Today
132
132
  pt: Ações Hoje
@@ -135,7 +135,7 @@
135
135
  pt: Mostra o número de ações realizadas hoje.
136
136
  - slug: stat-consecutive-days
137
137
  width: 3
138
- height: 1
138
+ height: 2
139
139
  name:
140
140
  en: Consecutive Days
141
141
  pt: Dias Consecutivos
@@ -144,7 +144,7 @@
144
144
  pt: Mostra quantos dias consecutivos você fez login.
145
145
  - slug: stat-access-level
146
146
  width: 3
147
- height: 1
147
+ height: 2
148
148
  name:
149
149
  en: Access Level
150
150
  pt: Nível de Acesso
@@ -189,7 +189,7 @@
189
189
  pt: Widget para configurar as definições de idioma e localização.
190
190
  - slug: oauth-config
191
191
  width: 6
192
- height: 4
192
+ height: 5
193
193
  name:
194
194
  en: OAuth Configuration
195
195
  pt: Configuração de OAuth
@@ -207,7 +207,7 @@
207
207
  pt: Widget para configurar as definições do provedor de armazenamento.
208
208
  - slug: theme-config
209
209
  width: 6
210
- height: 4
210
+ height: 5
211
211
  name:
212
212
  en: Theme Configuration
213
213
  pt: Configuração de Tema
@@ -16,7 +16,7 @@
16
16
  slug: default
17
17
  width: 2
18
18
  height: 2
19
- x_axis: 6
19
+ x_axis: 4
20
20
  y_axis: 0
21
21
  - component_id:
22
22
  where:
@@ -24,10 +24,10 @@
24
24
  dashboard_id:
25
25
  where:
26
26
  slug: default
27
- width: 2
28
- height: 2
27
+ width: 6
28
+ height: 5
29
29
  x_axis: 0
30
- y_axis: 1
30
+ y_axis: 2
31
31
  - component_id:
32
32
  where:
33
33
  slug: permissions-card
@@ -36,7 +36,7 @@
36
36
  slug: default
37
37
  width: 2
38
38
  height: 2
39
- x_axis: 9
39
+ x_axis: 6
40
40
  y_axis: 0
41
41
  - component_id:
42
42
  where:
@@ -45,9 +45,9 @@
45
45
  where:
46
46
  slug: default
47
47
  width: 6
48
- height: 3
48
+ height: 5
49
49
  x_axis: 6
50
- y_axis: 1
50
+ y_axis: 2
51
51
  - component_id:
52
52
  where:
53
53
  slug: session-activity-chart
@@ -55,9 +55,9 @@
55
55
  where:
56
56
  slug: default
57
57
  width: 6
58
- height: 3
58
+ height: 5
59
59
  x_axis: 0
60
- y_axis: 4
60
+ y_axis: 7
61
61
  - component_id:
62
62
  where:
63
63
  slug: sessions-today-card
@@ -66,7 +66,7 @@
66
66
  slug: default
67
67
  width: 2
68
68
  height: 2
69
- x_axis: 3
69
+ x_axis: 2
70
70
  y_axis: 0
71
71
  - component_id:
72
72
  where:
@@ -75,9 +75,9 @@
75
75
  where:
76
76
  slug: default
77
77
  width: 6
78
- height: 3
78
+ height: 5
79
79
  x_axis: 6
80
- y_axis: 4
80
+ y_axis: 7
81
81
 
82
82
  - component_id:
83
83
  where:
@@ -95,7 +95,7 @@
95
95
  dashboard_id:
96
96
  where:
97
97
  slug: user
98
- width: 2
98
+ width: 3
99
99
  height: 2
100
100
  x_axis: 0
101
101
  y_axis: 2
@@ -105,7 +105,7 @@
105
105
  dashboard_id:
106
106
  where:
107
107
  slug: user
108
- width: 2
108
+ width: 3
109
109
  height: 2
110
110
  x_axis: 3
111
111
  y_axis: 2
@@ -115,7 +115,7 @@
115
115
  dashboard_id:
116
116
  where:
117
117
  slug: user
118
- width: 2
118
+ width: 3
119
119
  height: 2
120
120
  x_axis: 6
121
121
  y_axis: 2
@@ -125,7 +125,7 @@
125
125
  dashboard_id:
126
126
  where:
127
127
  slug: user
128
- width: 2
128
+ width: 3
129
129
  height: 2
130
130
  x_axis: 9
131
131
  y_axis: 2
@@ -135,10 +135,10 @@
135
135
  dashboard_id:
136
136
  where:
137
137
  slug: user
138
- width: 6
138
+ width: 5
139
139
  height: 4
140
140
  x_axis: 0
141
- y_axis: 7
141
+ y_axis: 8
142
142
  - component_id:
143
143
  where:
144
144
  slug: login-history-chart
@@ -148,27 +148,27 @@
148
148
  width: 6
149
149
  height: 4
150
150
  x_axis: 0
151
- y_axis: 3
151
+ y_axis: 4
152
152
  - component_id:
153
153
  where:
154
154
  slug: email-notifications
155
155
  dashboard_id:
156
156
  where:
157
157
  slug: user
158
- width: 6
158
+ width: 7
159
159
  height: 4
160
- x_axis: 6
161
- y_axis: 7
160
+ x_axis: 5
161
+ y_axis: 8
162
162
  - component_id:
163
163
  where:
164
164
  slug: activity-timeline
165
165
  dashboard_id:
166
166
  where:
167
167
  slug: user
168
- width: 6
168
+ width: 5
169
169
  height: 2
170
- x_axis: 6
171
- y_axis: 5
170
+ x_axis: 7
171
+ y_axis: 12
172
172
  - component_id:
173
173
  where:
174
174
  slug: user-sessions
@@ -176,19 +176,19 @@
176
176
  where:
177
177
  slug: user
178
178
  width: 6
179
- height: 2
179
+ height: 4
180
180
  x_axis: 6
181
- y_axis: 3
181
+ y_axis: 4
182
182
  - component_id:
183
183
  where:
184
184
  slug: user-roles
185
185
  dashboard_id:
186
186
  where:
187
187
  slug: user
188
- width: 12
189
- height: 4
188
+ width: 6
189
+ height: 6
190
190
  x_axis: 0
191
- y_axis: 11
191
+ y_axis: 12
192
192
 
193
193
  - component_id:
194
194
  where:
@@ -207,9 +207,9 @@
207
207
  dashboard_id:
208
208
  where:
209
209
  slug: config
210
- width: 12
210
+ width: 6
211
211
  height: 6
212
- x_axis: 0
212
+ x_axis: 6
213
213
  y_axis: 9
214
214
 
215
215
  - component_id:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hed-hog/core",
3
- "version": "0.0.273",
3
+ "version": "0.0.275",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "dependencies": {
@@ -30,12 +30,12 @@
30
30
  "sharp": "^0.34.2",
31
31
  "speakeasy": "^2.0.0",
32
32
  "uuid": "^11.1.0",
33
- "@hed-hog/api-prisma": "0.0.5",
34
33
  "@hed-hog/api-pagination": "0.0.6",
35
- "@hed-hog/api-locale": "0.0.13",
34
+ "@hed-hog/api-prisma": "0.0.5",
35
+ "@hed-hog/api-mail": "0.0.8",
36
36
  "@hed-hog/api": "0.0.4",
37
37
  "@hed-hog/api-types": "0.0.1",
38
- "@hed-hog/api-mail": "0.0.8"
38
+ "@hed-hog/api-locale": "0.0.13"
39
39
  },
40
40
  "exports": {
41
41
  ".": {