69 lines
2.2 KiB
PHP
69 lines
2.2 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');
|
|
$home_page = trim($body['home_page'] ?? '') ?: null;
|
|
$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=?, home_page=?, updated_at=NOW() WHERE id=?",
|
|
[$name, $slug, $description, $color, $home_page, $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, home_page) VALUES (?,?,?,?,?)",
|
|
[$name, $slug, $description, $color, $home_page]
|
|
);
|
|
$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');
|