Exocore-Backend / dist /utils /dedupe.js
ChoruYt's picture
Upload 38 files
a21d6a5 verified
Raw
History Blame Contribute Delete
1.81 kB
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.dedupeUsersByEmail = dedupeUsersByEmail;
const drive_1 = require("../services/drive");
/**
* Scans cached users. For every email that appears more than once,
* keeps the OLDEST account (lowest id / earliest createdAt) and queues
* the rest for deletion (cache + Drive sync). Returns a summary.
*/
async function dedupeUsersByEmail() {
const users = await (0, drive_1.getAllUsers)();
const records = [];
for (const u of users) {
if (!u.email)
continue;
const folderId = await (0, drive_1.getUserFolder)(u.username);
if (folderId)
records.push({ folderId, data: u });
}
const groups = new Map();
for (const r of records) {
const key = r.data.email.trim().toLowerCase();
if (!groups.has(key))
groups.set(key, []);
groups.get(key).push(r);
}
const removed = [];
for (const [email, list] of groups) {
if (list.length <= 1)
continue;
list.sort((a, b) => {
const ta = a.data.createdAt ?? a.data.id;
const tb = b.data.createdAt ?? b.data.id;
return ta - tb;
});
const toDelete = list.slice(1);
for (const dup of toDelete) {
try {
await (0, drive_1.deleteUserFolder)(dup.folderId);
removed.push({ email, username: dup.data.username });
console.log(`[dedupe] removed duplicate ${dup.data.username} (${email})`);
}
catch (e) {
console.error(`[dedupe] failed to delete ${dup.data.username}:`, e.message);
}
}
}
return { scanned: records.length, duplicatesRemoved: removed.length, removed };
}