// api_v1/scanner/parseActivityFile.js const path = require('path'); // Parser specifici const parseFit = require('./parsers/parseFit'); const parseGpx = require('./parsers/parseGpx'); const parseTcx = require('./parsers/parseTcx'); // --------------------------------------------------------- // parseActivityFile → rileva tipo e chiama parser specifico // --------------------------------------------------------- async function parseActivityFile(absPath) { const ext = path.extname(absPath).toLowerCase(); let parsed; if (ext === '.fit') { parsed = await parseFit(absPath); } else if (ext === '.gpx') { parsed = await parseGpx(absPath); } else if (ext === '.tcx') { parsed = await parseTcx(absPath); } else { throw new Error(`Formato attività non supportato: ${ext}`); } // --------------------------------------------------------- // Normalizzazione campi base // --------------------------------------------------------- const fileName = path.basename(absPath); const fileExtension = ext.replace('.', ''); return { file_name: fileName, file_extension: fileExtension, format: parsed.format || fileExtension.toUpperCase(), display_name: parsed.display_name || fileName, route_name: parsed.route_name || null, title: parsed.title || null, description: parsed.description || null, notes: parsed.notes || null, sport: parsed.sport || null, activity_type: parsed.activity_type || null, device_manufacturer: parsed.device_manufacturer || null, device_model: parsed.device_model || null, source_app: parsed.source_app || null, start_time_millis: parsed.start_time_millis ?? null, end_time_millis: parsed.end_time_millis ?? null, duration_millis: parsed.duration_millis ?? null, distance_meters: parsed.distance_meters ?? null, elevation_gain_meters: parsed.elevation_gain_meters ?? null, elevation_loss_meters: parsed.elevation_loss_meters ?? null, min_elevation_meters: parsed.min_elevation_meters ?? null, max_elevation_meters: parsed.max_elevation_meters ?? null, file_distance_meters: parsed.file_distance_meters ?? null, file_elevation_gain_meters: parsed.file_elevation_gain_meters ?? null, computed_distance_meters: parsed.computed_distance_meters ?? null, computed_elevation_gain_meters: parsed.computed_elevation_gain_meters ?? null, average_speed_mps: parsed.average_speed_mps ?? null, max_speed_mps: parsed.max_speed_mps ?? null, average_pace_sec_per_km: parsed.average_pace_sec_per_km ?? null, average_heart_rate: parsed.average_heart_rate ?? null, max_heart_rate: parsed.max_heart_rate ?? null, average_cadence: parsed.average_cadence ?? null, max_cadence: parsed.max_cadence ?? null, calories: parsed.calories ?? null, power_avg: parsed.power_avg ?? null, power_max: parsed.power_max ?? null, point_count: parsed.point_count ?? 0, segment_count: parsed.segment_count ?? 0, lap_count: parsed.lap_count ?? 0, min_latitude: parsed.min_latitude ?? null, max_latitude: parsed.max_latitude ?? null, min_longitude: parsed.min_longitude ?? null, max_longitude: parsed.max_longitude ?? null, center_latitude: parsed.center_latitude ?? null, center_longitude: parsed.center_longitude ?? null, tags: parsed.tags || [], // IMPORTANTISSIMO: preview percorso per thumb gallery track_preview: parsed.track_preview || [], diagnostics: parsed.diagnostics || null, }; } module.exports = parseActivityFile;