import { internalMutation, query } from "./_generated/server"; import { v } from "convex/values"; /** * Listar usuários usando o perfil "admin" antigo (nível 0) */ export const listarUsuariosAdminAntigo = query({ args: {}, returns: v.array( v.object({ _id: v.id("usuarios"), matricula: v.string(), nome: v.string(), email: v.string(), roleId: v.id("roles"), roleNome: v.string(), roleNivel: v.number(), }) ), handler: async (ctx) => { // Buscar todos os perfis "admin" const allAdmins = await ctx.db .query("roles") .filter((q) => q.eq(q.field("nome"), "admin")) .collect(); console.log("Perfis 'admin' encontrados:", allAdmins.length); // Identificar o admin antigo (nível 0) const adminAntigo = allAdmins.find((r) => r.nivel === 0); if (!adminAntigo) { console.log("Nenhum admin antigo (nível 0) encontrado"); return []; } console.log("Admin antigo encontrado:", adminAntigo); // Buscar usuários usando este perfil const usuarios = await ctx.db .query("usuarios") .withIndex("by_role", (q) => q.eq("roleId", adminAntigo._id)) .collect(); console.log("Usuários usando admin antigo:", usuarios.length); return usuarios.map((u) => ({ _id: u._id, matricula: u.matricula, nome: u.nome, email: u.email || "", roleId: u.roleId, roleNome: adminAntigo.nome, roleNivel: adminAntigo.nivel, })); }, }); /** * Migrar usuários do perfil "admin" antigo (nível 0) para o novo (nível 2) */ export const migrarUsuariosParaAdminNovo = internalMutation({ args: {}, returns: v.object({ migrados: v.number(), usuariosMigrados: v.array( v.object({ matricula: v.string(), nome: v.string(), roleAntigo: v.string(), roleNovo: v.string(), }) ), }), handler: async (ctx) => { // Buscar todos os perfis "admin" const allAdmins = await ctx.db .query("roles") .filter((q) => q.eq(q.field("nome"), "admin")) .collect(); // Identificar admin antigo (nível 0) e admin novo (nível 2) const adminAntigo = allAdmins.find((r) => r.nivel === 0); const adminNovo = allAdmins.find((r) => r.nivel === 2); if (!adminAntigo) { console.log("❌ Admin antigo (nível 0) não encontrado"); return { migrados: 0, usuariosMigrados: [] }; } if (!adminNovo) { console.log("❌ Admin novo (nível 2) não encontrado"); return { migrados: 0, usuariosMigrados: [] }; } console.log("✅ Admin antigo ID:", adminAntigo._id, "- Nível:", adminAntigo.nivel); console.log("✅ Admin novo ID:", adminNovo._id, "- Nível:", adminNovo.nivel); // Buscar usuários usando o admin antigo const usuarios = await ctx.db .query("usuarios") .withIndex("by_role", (q) => q.eq("roleId", adminAntigo._id)) .collect(); console.log(`📊 Encontrados ${usuarios.length} usuário(s) para migrar`); const usuariosMigrados: Array<{ matricula: string; nome: string; roleAntigo: string; roleNovo: string; }> = []; // Migrar cada usuário for (const usuario of usuarios) { await ctx.db.patch(usuario._id, { roleId: adminNovo._id, }); usuariosMigrados.push({ matricula: usuario.matricula, nome: usuario.nome, roleAntigo: `admin (nível 0) - ${adminAntigo._id}`, roleNovo: `admin (nível 2) - ${adminNovo._id}`, }); console.log( `✅ MIGRADO: ${usuario.nome} (${usuario.matricula}) → admin nível 2` ); } return { migrados: usuarios.length, usuariosMigrados, }; }, }); /** * Remover perfil "admin" antigo (nível 0) após migração */ export const removerAdminAntigo = internalMutation({ args: {}, returns: v.object({ sucesso: v.boolean(), mensagem: v.string(), }), handler: async (ctx) => { // Buscar todos os perfis "admin" const allAdmins = await ctx.db .query("roles") .filter((q) => q.eq(q.field("nome"), "admin")) .collect(); // Identificar admin antigo (nível 0) const adminAntigo = allAdmins.find((r) => r.nivel === 0); if (!adminAntigo) { return { sucesso: false, mensagem: "Admin antigo (nível 0) não encontrado", }; } // Verificar se ainda há usuários usando const usuarios = await ctx.db .query("usuarios") .withIndex("by_role", (q) => q.eq("roleId", adminAntigo._id)) .collect(); if (usuarios.length > 0) { return { sucesso: false, mensagem: `Ainda há ${usuarios.length} usuário(s) usando este perfil. Execute migrarUsuariosParaAdminNovo primeiro.`, }; } // Remover permissões associadas const permissoes = await ctx.db .query("rolePermissoes") .withIndex("by_role", (q) => q.eq("roleId", adminAntigo._id)) .collect(); for (const perm of permissoes) { await ctx.db.delete(perm._id); } // Remover menu permissões associadas const menuPerms = await ctx.db .query("menuPermissoes") .withIndex("by_role", (q) => q.eq("roleId", adminAntigo._id)) .collect(); for (const menuPerm of menuPerms) { await ctx.db.delete(menuPerm._id); } // Remover o perfil await ctx.db.delete(adminAntigo._id); console.log( `🗑️ REMOVIDO: Admin antigo (nível 0) - ${adminAntigo._id}` ); return { sucesso: true, mensagem: "Admin antigo removido com sucesso", }; }, });