// api_v1/scanner/scanActivity.js const path = require('path'); const { log } = require('./logger'); const scanActivityCartella = require('./scanActivityCartella'); const postWithAuth = require('./postWithAuth'); const createCleanupFunctions = require('./orphanCleanup'); const writeJsonAtomic = require('./writeJsonAtomic'); const { WEB_ROOT, SEND_PHOTOS, BASE_URL } = require('../config'); // --------------------------------------------------------- // FORMAT TIME // --------------------------------------------------------- function formatTime(ms) { const sec = Math.floor(ms / 1000); const h = String(Math.floor(sec / 3600)).padStart(2, '0'); const m = String(Math.floor((sec % 3600) / 60)).padStart(2, '0'); const s = String(sec % 60).padStart(2, '0'); return `${h}:${m}:${s}`; } // --------------------------------------------------------- // UPDATE STATUS FILE // --------------------------------------------------------- async function updateStatusFile(CURRENT, TOTAL_FILES, start) { const now = Date.now(); const elapsedMs = now - start; const avg = elapsedMs / Math.max(CURRENT.value, 1); const remainingMs = (TOTAL_FILES - CURRENT.value) * avg; const percent = TOTAL_FILES > 0 ? Number(((CURRENT.value / TOTAL_FILES) * 100).toFixed(2)) : 100; const status = { current: CURRENT.value, total: TOTAL_FILES, percent, eta: formatTime(remainingMs), elapsed: formatTime(elapsedMs) }; const statusPath = path.resolve( __dirname, '..', '..', 'public/activities/scan_status.json' ); await writeJsonAtomic(statusPath, status); } // --------------------------------------------------------- // SCAN UNA SOLA CARTELLA DI ATTIVITÀ // --------------------------------------------------------- async function scanActivity(dir, userName, db, CURRENT, TOTAL_FILES, start, onProgress) { const newActivities = []; const { deleteThumbsById, deleteFromDB } = createCleanupFunctions(db); const activitiesRoot = path.resolve(__dirname, '..', '..', WEB_ROOT, 'activities'); const userDir = path.join(activitiesRoot, userName, 'original'); const cartella = dir; const absCartella = path.join(userDir, cartella); log(`📁 [SCAN ACTIVITY CARTELLA] ${cartella}`); await scanActivityCartella( db, userName, cartella, absCartella, newActivities, updateStatusFile, CURRENT, TOTAL_FILES, start, deleteThumbsById, deleteFromDB, onProgress ); // --------------------------------------------------------- // INVIO AL SERVER REMOTO // --------------------------------------------------------- if (SEND_PHOTOS && BASE_URL && newActivities.length > 0) { log(`📤 [SEND START] newActivities=${newActivities.length}`); for (const a of newActivities) { try { a.user = userName; await postWithAuth(`${BASE_URL}/activities`, a); log(`📥 [SENT TO SERVER] ${a.file_name}`); } catch (err) { log(`❌ [SERVER SENT ERROR] ${a.file_name} → ${err.message}`); } } } else { log(`⚠️ [NO SEND] newActivities=${newActivities.length}`); } log('📌 [DEBUG] newActivities:', JSON.stringify(newActivities, null, 2)); return newActivities; } module.exports = scanActivity;