Files
sgse-app/packages/backend/convex/migrarUsuariosAdmin.ts

211 lines
5.5 KiB
TypeScript

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",
};
},
});