114 lines
3.2 KiB
JavaScript
114 lines
3.2 KiB
JavaScript
// 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;
|