photo_server_json_flutter_c.../api_v1/scanner/scanUser.js
2026-03-05 17:07:30 +01:00

64 lines
No EOL
1.8 KiB
JavaScript

// scanner/scanUser.js
const path = require('path');
const fsp = require('fs/promises');
const scanCartella = require('./scanCartella');
const processFile = require('./processFile');
const { sha256 } = require('./utils');
const { SUPPORTED_EXTS } = require('../config');
/**
* Scansiona la root dell'utente (p.es. .../<user>/original) e:
* - indicizza i file direttamente al root (cartella virtuale "_root")
* - per ogni sottocartella, chiama scanCartella
*/
async function scanUserRoot(userName, userDir, previousIndex) {
const results = [];
const entries = await fsp.readdir(userDir, { withFileTypes: true });
// 1) File direttamente al root (virtual folder "_root")
for (const e of entries) {
if (e.isDirectory()) continue;
const ext = path.extname(e.name).toLowerCase();
if (!SUPPORTED_EXTS.has(ext)) continue;
const absPath = path.join(userDir, e.name);
const st = await fsp.stat(absPath);
const fileRelPath = e.name;
const cartella = '_root';
const id = sha256(`${userName}/${cartella}/${fileRelPath}`);
const prev = previousIndex[id];
const unchanged =
prev &&
prev.size_bytes === st.size &&
prev.mtimeMs === st.mtimeMs;
if (unchanged) continue;
const meta = await processFile(
userName,
cartella,
fileRelPath,
absPath,
ext,
st
);
meta.id = id;
results.push(meta);
}
// 2) Sottocartelle (comportamento classico)
for (const e of entries) {
if (!e.isDirectory()) continue;
const cartella = e.name;
const absCartella = path.join(userDir, cartella);
const files = await scanCartella(userName, cartella, absCartella, previousIndex);
results.push(...files);
}
return results;
}
module.exports = scanUserRoot;