import { internalMutation, query } from "./_generated/server"; import { v } from "convex/values"; import { Id, Doc } from "./_generated/dataModel"; /** * Verificar duplicatas de matrícula */ export const verificarDuplicatas = query({ args: {}, returns: v.array( v.object({ matricula: v.string(), count: v.number(), usuarios: v.array( v.object({ _id: v.id("usuarios"), nome: v.string(), email: v.string(), }) ), }) ), handler: async (ctx) => { const usuarios = await ctx.db.query("usuarios").collect(); // Agrupar por matrícula const gruposPorMatricula = usuarios.reduce((acc, usuario) => { if (!acc[usuario.matricula]) { acc[usuario.matricula] = []; } acc[usuario.matricula].push({ _id: usuario._id, nome: usuario.nome, email: usuario.email || "", }); return acc; }, {} as Record; nome: string; email: string }>>); // Filtrar apenas duplicatas const duplicatas = Object.entries(gruposPorMatricula) .filter(([_, usuarios]) => usuarios.length > 1) .map(([matricula, usuarios]) => ({ matricula, count: usuarios.length, usuarios, })); return duplicatas; }, }); /** * Remover duplicatas mantendo apenas o mais recente */ export const removerDuplicatas = internalMutation({ args: {}, returns: v.object({ removidos: v.number(), matriculas: v.array(v.string()), }), handler: async (ctx) => { const usuarios = await ctx.db.query("usuarios").collect(); // Agrupar por matrícula const gruposPorMatricula = usuarios.reduce((acc, usuario) => { if (!acc[usuario.matricula]) { acc[usuario.matricula] = []; } acc[usuario.matricula].push(usuario); return acc; }, {} as Record[]>); let removidos = 0; const matriculasDuplicadas: string[] = []; // Para cada grupo com duplicatas for (const [matricula, usuariosGrupo] of Object.entries(gruposPorMatricula)) { if (usuariosGrupo.length > 1) { matriculasDuplicadas.push(matricula); // Ordenar por _creationTime (mais recente primeiro) usuariosGrupo.sort((a, b) => b._creationTime - a._creationTime); // Manter o primeiro (mais recente) e remover os outros for (let i = 1; i < usuariosGrupo.length; i++) { await ctx.db.delete(usuariosGrupo[i]._id); removidos++; console.log(`🗑️ Removido usuário duplicado: ${usuariosGrupo[i].nome} (matrícula: ${matricula})`); } console.log(`✅ Mantido usuário: ${usuariosGrupo[0].nome} (matrícula: ${matricula})`); } } return { removidos, matriculas: matriculasDuplicadas, }; }, });