Files
whatsapp/api/lab/save_role.php
T
2026-03-10 18:42:51 -05:00

68 lines
2.1 KiB
PHP

<?php
/**
* POST /api/lab/save_role.php
* Crea o actualiza un rol y sus módulos.
* Solo admins.
*
* Body JSON:
* { id?, name, slug, description?, color?, modules: [slug, ...] }
*/
require_once __DIR__ . '/_helpers.php';
requireMethod('POST');
requireAdmin();
$body = inputJson();
$id = isset($body['id']) ? (int)$body['id'] : null;
$name = trim($body['name'] ?? '');
$slug = trim($body['slug'] ?? '');
$description = trim($body['description'] ?? '');
$color = trim($body['color'] ?? '#6c757d');
$modules = $body['modules'] ?? [];
if (!$name) jsonError('El nombre del rol es obligatorio');
if (!$slug) jsonError('El slug del rol es obligatorio');
if (!preg_match('/^[a-z0-9_\-]+$/', $slug)) jsonError('El slug solo puede contener letras minúsculas, números, guiones y guiones bajos');
if (!is_array($modules)) jsonError('modules debe ser un arreglo');
$db = Database::getInstance();
// Verificar duplicado de slug
$existing = $db->fetch("SELECT id, is_system FROM roles WHERE slug = ?", [$slug]);
if ($existing && (!$id || $existing['id'] !== $id)) {
jsonError('Ya existe un rol con ese slug');
}
if ($id) {
// Actualizar
$role = $db->fetch("SELECT id, is_system FROM roles WHERE id = ?", [$id]);
if (!$role) jsonError('Rol no encontrado', 404);
$db->query(
"UPDATE roles SET name=?, slug=?, description=?, color=?, updated_at=NOW() WHERE id=?",
[$name, $slug, $description, $color, $id]
);
// Reconstruir módulos solo si no es sistema, o siempre (admin puede editar módulos)
$db->query("DELETE FROM role_modules WHERE role_id = ?", [$id]);
} else {
// Crear
$db->query(
"INSERT INTO roles (name, slug, description, color) VALUES (?,?,?,?)",
[$name, $slug, $description, $color]
);
$id = $db->lastInsertId();
}
// Insertar módulos
foreach ($modules as $mod) {
$mod = trim((string)$mod);
if ($mod) {
$db->query(
"INSERT IGNORE INTO role_modules (role_id, module_slug) VALUES (?,?)",
[$id, $mod]
);
}
}
jsonOk(['id' => $id], $id ? 'Rol actualizado' : 'Rol creado');