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 };