Tom Butcher bce5afad7e Implement caching and permission checks for user permissions
This commit introduces a caching mechanism for user permissions using Redis, enhancing performance by reducing database queries. The `permissions.js` file has been updated to include functions for saving and retrieving user permissions from Redis, as well as middleware for checking permissions in various routes. Additionally, tests have been added to ensure the correctness of the permission logic and caching behavior, improving the overall security and efficiency of the application.
2026-08-20 19:35:15 +01:00

101 lines
3.0 KiB
JavaScript

import express from 'express';
import { isAuthenticated } from '../../keycloak.js';
import { checkPermissions } from '../../database/permissions.js';
import { getFilter, convertPropertiesString, getSort } from '../../utils.js';
const router = express.Router();
const listAllowedFilters = ['name', 'permissionSettings', 'createdAt', 'updatedAt', '_reference'];
const listAllowedSorters = ['name', 'createdAt', '_id', 'updatedAt'];
const propertiesAllowedFilters = ['name'];
import {
listUserGroupsRouteHandler,
getUserGroupRouteHandler,
editUserGroupRouteHandler,
newUserGroupRouteHandler,
deleteUserGroupRouteHandler,
listUserGroupsByPropertiesRouteHandler,
getUserGroupStatsRouteHandler,
getUserGroupHistoryRouteHandler,
searchUserGroupsRouteHandler,
getUserGroupPropertyValuesRouteHandler,
getUserGroupNeighborsRouteHandler,
} from '../../services/management/usergroups.js';
router.get('/', isAuthenticated, async (req, res) => {
const { page, limit, property, search, sort, order } = req.query;
const filter = await getFilter(req.query, listAllowedFilters);
listUserGroupsRouteHandler(
req,
res,
page,
limit,
property,
filter,
search,
getSort(sort, listAllowedSorters),
order
);
});
router.get('/properties', isAuthenticated, async (req, res) => {
let properties = convertPropertiesString(req.query.properties);
const filter = await getFilter(req.query, propertiesAllowedFilters, false);
var masterFilter = {};
if (req.query.masterFilter) {
masterFilter = JSON.parse(req.query.masterFilter);
}
listUserGroupsByPropertiesRouteHandler(req, res, properties, filter, masterFilter);
});
router.get('/values', isAuthenticated, async (req, res) => {
const { property } = req.query;
getUserGroupPropertyValuesRouteHandler(req, res, property);
});
router.get('/search', isAuthenticated, async (req, res) => {
const { search } = req.query;
searchUserGroupsRouteHandler(req, res, search);
});
router.post('/', isAuthenticated, checkPermissions('userGroup', 'new'), async (req, res) => {
newUserGroupRouteHandler(req, res);
});
router.get('/stats', isAuthenticated, async (req, res) => {
getUserGroupStatsRouteHandler(req, res);
});
router.get('/history', isAuthenticated, async (req, res) => {
getUserGroupHistoryRouteHandler(req, res);
});
router.get('/neighbors', isAuthenticated, async (req, res) => {
const { property, search, sort, order, id } = req.query;
const filter = await getFilter(req.query, listAllowedFilters);
getUserGroupNeighborsRouteHandler(
req,
res,
property,
filter,
search,
getSort(sort, listAllowedSorters),
order,
id
);
});
router.get('/:id', isAuthenticated, async (req, res) => {
getUserGroupRouteHandler(req, res);
});
router.put('/:id', isAuthenticated, checkPermissions('userGroup', 'edit'), async (req, res) => {
editUserGroupRouteHandler(req, res);
});
router.delete('/:id', isAuthenticated, async (req, res) => {
deleteUserGroupRouteHandler(req, res);
});
export default router;