server_photo_s85js/api_v1/scanner/scanActivity.js
2026-08-11 08:45:04 +02:00

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;