Release 1.5.3

This commit is contained in:
2026-07-25 15:11:41 +01:00
parent 9ee938fd2f
commit 0e89892c94
89 changed files with 7660 additions and 542 deletions
+52
View File
@@ -1,4 +1,5 @@
const { PERMISSIONS, normalizePermissionKeys } = require('../../rbac');
const { fetchPagedRows } = require('../../data/utils');
function parseCsvIds(value) {
return String(value || '')
@@ -27,6 +28,21 @@ async function fetchRoles(pool) {
return rows || [];
}
async function fetchRolesPage(pool, page, pageSize) {
const paged = await fetchPagedRows(pool, {
selectSql: `SELECT r.id, r.role_key, r.name, r.description, r.created_at, r.modified_at,
(SELECT COUNT(*) FROM user_roles ur WHERE ur.role_id = r.id) AS user_count,
(SELECT COUNT(*) FROM role_permissions rp WHERE rp.role_id = r.id) AS permission_count
FROM roles r
ORDER BY r.name ASC`,
countSql: 'SELECT COUNT(*) AS count FROM roles',
page: page,
pageSize: pageSize
});
return Object.assign({ roles: paged.rows }, paged);
}
async function fetchRoleById(pool, roleId) {
const [rows] = await pool.query(
`SELECT r.id, r.role_key, r.name, r.description, r.created_at, r.modified_at,
@@ -106,6 +122,40 @@ async function fetchUsersWithRoles(pool) {
});
}
async function fetchUsersWithRolesPage(pool, page, pageSize) {
const paged = await fetchPagedRows(pool, {
selectSql: `SELECT u.id, u.name, u.username, u.created_at, u.modified_at,
COALESCE(role_data.role_names, '') AS role_names,
COALESCE(role_data.role_ids_csv, '') AS role_ids_csv
FROM users u
LEFT JOIN (
SELECT ur.user_id,
GROUP_CONCAT(DISTINCT r.name ORDER BY r.name SEPARATOR ', ') AS role_names,
GROUP_CONCAT(DISTINCT r.id ORDER BY r.name SEPARATOR ',') AS role_ids_csv
FROM user_roles ur
JOIN roles r ON r.id = ur.role_id
GROUP BY ur.user_id
) role_data ON role_data.user_id = u.id
ORDER BY u.id ASC`,
countSql: 'SELECT COUNT(*) AS count FROM users',
page: page,
pageSize: pageSize
});
return {
users: (paged.rows || []).map(function (row) {
return Object.assign({}, row, {
roleIds: parseCsvIds(row.role_ids_csv),
roleNames: String(row.role_names || '').trim()
});
}),
totalItems: paged.totalItems,
totalPages: paged.totalPages,
currentPage: paged.currentPage,
pageSize: paged.pageSize
};
}
async function fetchUserWithRoles(pool, userId) {
const [rows] = await pool.query(
`SELECT u.id, u.name, u.username, u.created_at, u.modified_at,
@@ -184,11 +234,13 @@ module.exports = {
PERMISSIONS,
fetchPermissions,
fetchRoles,
fetchRolesPage,
fetchRoleById,
fetchRolePermissionKeys,
fetchRoleUserIds,
fetchRolesForUser,
fetchUsersWithRoles,
fetchUsersWithRolesPage,
fetchUserWithRoles,
syncUserRoles,
syncRoleUsers,