159 lines
No EOL
3.1 KiB
JavaScript
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
|
|
}; |