galleria_photo_face_rknn_op.../api_v1/userAccess.js
2026-10-03 12:16:58 +02:00

159 lines
No EOL
3.1 KiB
JavaScript

const fs = require('fs');
const path = require('path');
const usersPath = path.resolve(__dirname, 'users.json');
function normalize(value) {
return String(value ?? '').trim();
}
function unique(values) {
return [
...new Set(
values
.map(normalize)
.filter(Boolean)
)
];
}
function loadUsers() {
const raw = fs.readFileSync(usersPath, 'utf8');
const data = JSON.parse(raw);
if (!data || !Array.isArray(data.users)) {
throw new Error('Formato users.json non valido');
}
return data.users;
}
function findUserByName(userName) {
const requestedName = normalize(userName).toLowerCase();
if (!requestedName) {
return null;
}
return (
loadUsers().find((user) => {
return normalize(user.name).toLowerCase() === requestedName;
}) || null
);
}
function getUserAccess(userName) {
const user = findUserByName(userName);
if (!user) {
return null;
}
const devices = Array.isArray(user.devices)
? unique(user.devices)
: [];
const usersR = Array.isArray(user.usersR)
? unique(user.usersR)
: [];
const usersW = Array.isArray(user.usersW)
? unique(user.usersW)
: [];
return {
id: user.id,
name: normalize(user.name),
devices,
usersR,
usersW,
// Contenuti leggibili nella galleria
readableSources: unique([
...usersR,
...devices
]),
// Contenuti modificabili
writableSources: unique([
...usersW,
...devices
])
};
}
function getReadableSources(userName) {
const access = getUserAccess(userName);
return access
? access.readableSources
: [];
}
function getWritableSources(userName) {
const access = getUserAccess(userName);
return access
? access.writableSources
: [];
}
function filterReadableSources(userName, requestedSources) {
const readableSources = getReadableSources(userName);
if (!requestedSources) {
return readableSources;
}
const requested = Array.isArray(requestedSources)
? requestedSources
: [requestedSources];
const readableMap = new Map(
readableSources.map((source) => [
source.toLowerCase(),
source
])
);
return unique(requested)
.map((source) => {
return readableMap.get(source.toLowerCase());
})
.filter(Boolean);
}
function canRead(userName, sourceName) {
const source = normalize(sourceName).toLowerCase();
if (!source) {
return false;
}
return getReadableSources(userName).some((allowedSource) => {
return allowedSource.toLowerCase() === source;
});
}
function canWrite(userName, sourceName) {
const source = normalize(sourceName).toLowerCase();
if (!source) {
return false;
}
return getWritableSources(userName).some((allowedSource) => {
return allowedSource.toLowerCase() === source;
});
}
module.exports = {
loadUsers,
findUserByName,
getUserAccess,
getReadableSources,
getWritableSources,
filterReadableSources,
canRead,
canWrite
};