Spaces:
Running
Running
| ; | |
| 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 }; | |
| } | |