feat(router): rilevamento duplicati pre-smistamento e instradamento in duplicati

This commit is contained in:
2026-03-16 10:27:12 +01:00
parent 3a567c390c
commit 5e4e03a103
4 changed files with 180 additions and 23 deletions

View File

@@ -2,18 +2,21 @@ const unzipper = require('unzipper');
const fs = require('fs-extra');
const path = require('path');
const { pipeline } = require('stream/promises');
const { getDestinationDecision, isCadFile } = require('./router');
const { getDestinationDecision, getCadInfo } = require('./router');
const { buildDestinationIndex } = require('./destinationIndex');
const { getUnroutedTarget } = require('./unrouted');
const { buildExistingCadKeyIndex, toCadKey } = require('./duplicateIndex');
const { getUnroutedTarget, getDuplicateTarget } = require('./unrouted');
async function processZip(zipPath, config) {
const stream = fs.createReadStream(zipPath).pipe(unzipper.Parse({ forceStream: true }));
const destinationIndex = await buildDestinationIndex(config?.destination);
const existingCadKeys = await buildExistingCadKeyIndex(config?.destination);
const result = {
scanned: 0,
copied: 0,
skipped: 0,
unrouted: 0,
duplicates: 0,
details: [],
};
@@ -27,12 +30,27 @@ async function processZip(zipPath, config) {
const baseName = path.basename(file);
result.scanned += 1;
if (!isCadFile(baseName)) {
const cadInfo = getCadInfo(baseName);
if (!cadInfo) {
result.skipped += 1;
entry.autodrain();
continue;
}
if (existingCadKeys.has(toCadKey(cadInfo))) {
const duplicateTarget = await getDuplicateTarget(baseName);
await pipeline(entry, fs.createWriteStream(duplicateTarget.destinationPath));
result.copied += 1;
result.duplicates += 1;
result.details.push({
file: baseName,
destination: duplicateTarget.destinationDir,
reason: 'Duplicato gia presente prima dello smistamento',
});
continue;
}
const decision = getDestinationDecision(baseName, config, destinationIndex);
const destDir = decision.destination;