/home/techb158/workloadmatch.com/api/routes
Edit: /home/techb158/workloadmatch.com/api/routes/roles.php (8516B)
query("SELECT r.*, (SELECT COUNT(*) FROM role_permissions WHERE role_id = r.role_id) AS permission_count FROM roles r ORDER BY r.role_name");
$items = $result->fetch_all(MYSQLI_ASSOC);
$result->close();
// Get user count per role
foreach ($items as &$role) {
$role['user_count'] = 0;
$role['permissions'] = [];
$s = $mysqli->prepare("SELECT module, can_view, can_create, can_edit, can_delete, can_enable, can_disable FROM role_permissions WHERE role_id = ?");
$s->bind_param('i', $role['role_id']);
$s->execute();
$r = $s->get_result();
while ($perm = $r->fetch_assoc()) {
$role['permissions'][$perm['module']] = [
'view' => (bool)$perm['can_view'],
'create' => (bool)$perm['can_create'],
'edit' => (bool)$perm['can_edit'],
'delete' => (bool)$perm['can_delete'],
'enable' => (bool)$perm['can_enable'],
'disable' => (bool)$perm['can_disable'],
];
}
$s->close();
}
Response::success($items);
}
function getRole(string $id, mysqli $mysqli): void
{
Auth::requireRole('admin_profile');
$stmt = $mysqli->prepare("SELECT * FROM roles WHERE role_id = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
$item = $result->fetch_assoc();
$stmt->close();
if (!$item) Response::notFound('Role not found');
// Get permissions
$s = $mysqli->prepare("SELECT * FROM role_permissions WHERE role_id = ?");
$s->bind_param('i', $id);
$s->execute();
$r = $s->get_result();
$item['permissions'] = $r->fetch_all(MYSQLI_ASSOC);
$s->close();
Response::success($item);
}
function createRole(?array $body, mysqli $mysqli): void
{
Auth::requireRole('admin_profile');
$roleName = trim($body['role_name'] ?? '');
$description = trim($body['description'] ?? '');
if (!$roleName) Response::validationError(['role_name' => 'Required']);
$stmt = $mysqli->prepare("INSERT INTO roles (role_name, description) VALUES (?, ?)");
$stmt->bind_param('ss', $roleName, $description);
$stmt->execute();
$newId = $stmt->insert_id;
$stmt->close();
// If permissions provided, save them
if (!empty($body['permissions']) && is_array($body['permissions'])) {
saveRolePermissions($mysqli, $newId, $body['permissions']);
}
log_activity($mysqli, 'create', 'role', $newId, $roleName, 'Role created via API');
$stmt = $mysqli->prepare("SELECT * FROM roles WHERE role_id = ?");
$stmt->bind_param('i', $newId);
$stmt->execute();
$result = $stmt->get_result();
$item = $result->fetch_assoc();
$stmt->close();
Response::created($item);
}
function updateRole(?string $id, ?array $body, mysqli $mysqli): void
{
Auth::requireRole('admin_profile');
if (!$id) Response::error('Role ID required');
$stmt = $mysqli->prepare("SELECT * FROM roles WHERE role_id = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
$existing = $result->fetch_assoc();
$stmt->close();
if (!$existing) Response::notFound('Role not found');
$roleName = trim($body['role_name'] ?? $existing['role_name']);
$description = $body['description'] ?? $existing['description'];
$stmt = $mysqli->prepare("UPDATE roles SET role_name = ?, description = ? WHERE role_id = ?");
$stmt->bind_param('ssi', $roleName, $description, $id);
$stmt->execute();
$stmt->close();
log_activity($mysqli, 'update', 'role', $id, $roleName, 'Role updated via API');
$stmt = $mysqli->prepare("SELECT * FROM roles WHERE role_id = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
$item = $result->fetch_assoc();
$stmt->close();
Response::success($item, 'Role updated');
}
function deleteRole(?string $id, mysqli $mysqli): void
{
Auth::requireRole('admin_profile');
if (!$id) Response::error('Role ID required');
$stmt = $mysqli->prepare("SELECT role_name FROM roles WHERE role_id = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->bind_result($name);
$stmt->fetch();
$stmt->close();
if (!$name) Response::notFound('Role not found');
// Delete permissions first
$stmt = $mysqli->prepare("DELETE FROM role_permissions WHERE role_id = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->close();
$stmt = $mysqli->prepare("DELETE FROM roles WHERE role_id = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->close();
log_activity($mysqli, 'delete', 'role', $id, $name, 'Role deleted via API');
Response::success(null, 'Role deleted');
}
function updateRolePermissions(string $roleId, ?array $body, mysqli $mysqli): void
{
Auth::requireRole('admin_profile');
if (!isset($body['permissions']) || !is_array($body['permissions'])) {
Response::validationError(['permissions' => 'Array of permissions required']);
}
// Delete existing
$stmt = $mysqli->prepare("DELETE FROM role_permissions WHERE role_id = ?");
$stmt->bind_param('i', $roleId);
$stmt->execute();
$stmt->close();
saveRolePermissions($mysqli, $roleId, $body['permissions']);
log_activity($mysqli, 'update', 'role_permissions', $roleId, "Role $roleId permissions updated", 'Permissions updated via API');
Response::success(null, 'Permissions updated');
}
function saveRolePermissions(mysqli $mysqli, $roleId, array $permissions): void
{
$modules = get_permission_modules();
$actions = get_permission_actions();
foreach ($permissions as $module => $perms) {
if (!in_array($module, $modules)) continue;
$canView = (int)($perms['view'] ?? $perms['can_view'] ?? 0);
$canCreate = (int)($perms['create'] ?? $perms['can_create'] ?? 0);
$canEdit = (int)($perms['edit'] ?? $perms['can_edit'] ?? 0);
$canDelete = (int)($perms['delete'] ?? $perms['can_delete'] ?? 0);
$canEnable = (int)($perms['enable'] ?? $perms['can_enable'] ?? 0);
$canDisable = (int)($perms['disable'] ?? $perms['can_disable'] ?? 0);
$stmt = $mysqli->prepare("INSERT INTO role_permissions (role_id, module, can_view, can_create, can_edit, can_delete, can_enable, can_disable) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->bind_param('isiiiiii', $roleId, $module, $canView, $canCreate, $canEdit, $canDelete, $canEnable, $canDisable);
$stmt->execute();
$stmt->close();
}
}
function listPermissions(mysqli $mysqli): void
{
Auth::requireRole('admin_profile');
$modules = get_permission_modules();
$actions = get_permission_actions();
$result = $mysqli->query("SELECT * FROM role_permissions ORDER BY role_id, module");
$dbPerms = [];
while ($row = $result->fetch_assoc()) {
$dbPerms[$row['role_id']][$row['module']] = $row;
}
$result->close();
$roles = [];
$r = $mysqli->query("SELECT * FROM roles");
while ($row = $r->fetch_assoc()) {
$roles[] = $row;
}
$r->close();
Response::success([
'modules' => $modules,
'actions' => $actions,
'roles' => $roles,
'permissions' => $dbPerms,
]);
}