Commita governance, user-wizard, operational-feed e catálogo RBAC; adiciona deploy-desk-full.sh, smoke-desk.sh e regra anti-deploy parcial; documenta credencial VM112 @betinplace. Co-authored-by: Cursor <cursoragent@cursor.com>
2.4 KiB
2.4 KiB
Contrato API — Governance (Spec 040)
Base URL: https://desk.ligbox.com.br/api/v1/governance
Auth: Authorization: Bearer {jwt}
Permissão: can_manage_users (role super_admin)
GET /modules
Lista módulos de access capabilities, níveis e grupos.
Response 200:
{
"modules": ["desk", "openpanel", "billing", "api", "security", "ai_agents"],
"levels": ["none", "read", "partial", "full"],
"groups": ["Comercial", "Externo", "Negócio", "Ops", "Plataforma"]
}
GET /users/stats
Response 200:
{
"total": 8,
"active": 6,
"frozen": 2,
"super_admin": 1
}
GET /users/{username}/meta
Response 200:
{
"meta": {
"username": "user@empresa.com",
"internal_id": "LB-A1B2C3D4",
"main_group": "Ops",
"secondary_groups": [],
"account_status": "active",
"module_permissions": { "desk": "partial" },
"invite_token": null
}
}
POST /users/wizard
Request body:
{
"display_name": "Ana Silva",
"email": "ana@empresa.com",
"phone": "+351900000000",
"password": "senha-inicial",
"account_status": "active",
"force_password_change": true,
"mfa_required": false,
"notifications_enabled": true,
"api_access": false,
"role": "technician",
"main_group": "Ops",
"secondary_groups": ["Comercial"],
"module_permissions": {
"desk": "partial",
"openpanel": "read",
"billing": "none",
"api": "none",
"security": "none",
"ai_agents": "none"
},
"notes": "Observações opcionais",
"send_invite_email": true,
"activate_account": true
}
Response 201:
{
"user": { "username": "ana@empresa.com", "role": "technician", "active": true },
"meta": { "internal_id": "LB-…" },
"audit": { "action": "user.created", "summary": "Created by Roger" },
"internal_id": "LB-…",
"invite_link": "https://desk.ligbox.com.br/register.html?invite=…",
"message": "Utilizador criado"
}
POST /users/{username}/freeze
Toggle activo/congelado + audit.
Response 200: { "user": {…}, "audit": {…} }
POST /users/{username}/reset-password
Response 200: { "ok": true, "generated_password": "…", "audit": {…} }
GET /audit
Query: target_type, target_id, limit (max 200)
Response 200: { "events": [ { "action", "summary", "actor_username", "created_at" } ] }