obsidian-vault/ligbox-ops-platform/specs/015-desk-module-registry/spec.md
2026-06-19 17:26:42 +00:00

67 lines
2.1 KiB
Markdown

# Feature Specification: Registry de Módulos Desk (015)
**Criado:** 2026-06-16
**Solicitado por:** Roger
**Status:** Implementação
**Prioridade:** P0 (infraestrutura para evolução modular)
---
## Resumo
Cada funcionalidade nova do Ligbox Ops Desk passa a ser um **módulo** registado. O root pode **activar/desactivar** módulos no menu **Módulos**; código desactivado não corre na UI nem enriquece APIs — **sem quebrar** o núcleo.
---
## Módulos (MVP)
| ID | Label | Locked | Nav / efeito |
|----|-------|--------|----------------|
| `core` | Núcleo | sim | Dashboard, Tickets, Conta, Auth |
| `overview` | Audit Overview | não | menu Overview |
| `overview-home` | Overview Home | não | menu Overview Home |
| `infra` | Infra | não | menu Infra |
| `infra2-soc` | Infra 2 SOC | não | menu Infra 2 |
| `funnel-timing` | Relógio por fase | não | enriquece timeline/audit |
| `wazuh-soc` | Wazuh SOC Overview | não | card/modal VM104 no Overview |
| `leads` | Leads abandonados | não | menu Leads |
| `events` | Eventos webhook | não | menu Eventos |
| `tenants` | Tenants | não | menu Tenants |
| `messages` | Mensagens cadastro | não | menu Mensagens |
| `admin-users` | Administradores | não | menu Administradores |
---
## Persistência
- Ficheiro: `/data/desk_modules.json` (volume Docker)
- Default: todos activos excepto definido em `registry.py`
- Override env: `DESK_MODULES_DISABLED=infra2-soc,funnel-timing` (opcional)
---
## API
| Método | Path | Role |
|--------|------|------|
| GET | `/api/v1/modules` | autenticado |
| PATCH | `/api/v1/modules/{module_id}` | `super_admin` |
Body PATCH: `{ "enabled": true|false }`
---
## Frontend
- Nav items com `data-module="module-id"`
- Boot: `GET /api/v1/modules``applyModuleVisibility()`
- `refresh()` ignora views de módulos desactivados
- Menu **Módulos** (só root): toggles + descrição
---
## Princípio de não-regressão
- Módulo OFF → rotas API opcionais devolvem payload **sem** campos do módulo
- Módulo OFF → `render*` do módulo não é chamado
- Núcleo nunca depende de módulos opcionais