up
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
<?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');
|
||||
Reference in New Issue
Block a user