// api_v1/scanner/scanActivitiesUser.js const path = require('path'); const fsp = require('fs/promises'); const scanActivity = require('./scanActivity'); const { log } = require('./logger'); const { WEB_ROOT, SUPPORTED_ACTIVITY_EXTS } = require('../config'); // --------------------------------------------------------- // PRIMA PASSATA: conta TUTTI i file reali ricorsivamente // --------------------------------------------------------- async function countActivityFilesUser(rootDir) { let count = 0; async function walk(dir) { let entries = []; try { entries = await fsp.readdir(dir, { withFileTypes: true }); } catch { return; } for (const e of entries) { const abs = path.join(dir, e.name); if (e.isDirectory()) { await walk(abs); } else { const ext = path.extname(e.name).toLowerCase(); if (SUPPORTED_ACTIVITY_EXTS.has(ext)) { count++; } } } } await walk(rootDir); return count; } // --------------------------------------------------------- // SECONDA PASSATA: scansiona SOLO le cartelle vere // --------------------------------------------------------- async function scanActivitiesUser(userName, db) { log(`🔵 Inizio scan ATTIVITÀ per user=${userName}`); const activitiesRoot = path.resolve(__dirname, '..', '..', WEB_ROOT, 'activities'); const userDir = path.join(activitiesRoot, userName, 'original'); let entries = []; try { entries = await fsp.readdir(userDir, { withFileTypes: true }); } catch { log(`❌ Nessuna directory attività per utente ${userName}`); return []; } // Filtra SOLO cartelle vere dentro "original" const folders = entries .filter(e => e.isDirectory()) .map(e => e.name); // --------------------------------------------------------- // RIMOZIONE CARTELLE CANCELLATE DAL FILESYSTEM // --------------------------------------------------------- const createDeleteFolderFunctions = require('./deleteFolder'); const { deleteFolderForUser } = createDeleteFolderFunctions(db); const dbFolders = await db('activities') .where({ user: userName }) .distinct('cartella') .pluck('cartella'); for (const dbFolder of dbFolders) { if (!folders.includes(dbFolder)) { log(`🗑️ Cartella attività rimossa dal filesystem: ${dbFolder}`); await deleteFolderForUser(userName, dbFolder); } } // PRIMA PASSATA: conta i file reali const TOTAL_FILES = await countActivityFilesUser(userDir); const CURRENT = { value: 0 }; const start = Date.now(); log(`📊 Attività totali da scansionare: ${TOTAL_FILES}`); const allNewActivities = []; // SECONDA PASSATA: UNA SOLA SCANSIONE PER CARTELLA for (const cartella of folders) { log(`📁 Scan cartella attività: ${cartella}`); const newActivities = await scanActivity( cartella, userName, db, CURRENT, TOTAL_FILES, start ); if (newActivities?.length) { allNewActivities.push(...newActivities); } } log(`🟣 Scan ATTIVITÀ COMPLETATO per user=${userName}. Nuove attività: ${allNewActivities.length}`); return allNewActivities; } module.exports = scanActivitiesUser;