refactor: remove unused authentication files and dependencies; update package.json to streamline dependencies and improve project structure

This commit is contained in:
2025-10-29 18:57:05 -03:00
parent f219340cd8
commit 1058375a90
29 changed files with 1426 additions and 1542 deletions

View File

@@ -1,7 +1,14 @@
import { v } from "convex/values";
import { mutation, query, action, internalMutation } from "./_generated/server";
import {
mutation,
query,
action,
internalMutation,
internalQuery,
} from "./_generated/server";
import { Id } from "./_generated/dataModel";
import { renderizarTemplate } from "./templatesMensagens";
import { internal } from "./_generated/api";
/**
* Enfileirar email para envio
@@ -15,7 +22,10 @@ export const enfileirarEmail = mutation({
templateId: v.optional(v.id("templatesMensagens")),
enviadoPorId: v.id("usuarios"),
},
returns: v.object({ sucesso: v.boolean(), emailId: v.optional(v.id("notificacoesEmail")) }),
returns: v.object({
sucesso: v.boolean(),
emailId: v.optional(v.id("notificacoesEmail")),
}),
handler: async (ctx, args) => {
// Validar email
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
@@ -51,7 +61,10 @@ export const enviarEmailComTemplate = mutation({
variaveis: v.any(), // Record<string, string>
enviadoPorId: v.id("usuarios"),
},
returns: v.object({ sucesso: v.boolean(), emailId: v.optional(v.id("notificacoesEmail")) }),
returns: v.object({
sucesso: v.boolean(),
emailId: v.optional(v.id("notificacoesEmail")),
}),
handler: async (ctx, args) => {
// Buscar template
const template = await ctx.db
@@ -90,25 +103,32 @@ export const enviarEmailComTemplate = mutation({
*/
export const listarFilaEmails = query({
args: {
status: v.optional(v.union(
v.literal("pendente"),
v.literal("enviando"),
v.literal("enviado"),
v.literal("falha")
)),
status: v.optional(
v.union(
v.literal("pendente"),
v.literal("enviando"),
v.literal("enviado"),
v.literal("falha")
)
),
limite: v.optional(v.number()),
},
returns: v.array(v.any()),
handler: async (ctx, args) => {
let query = ctx.db.query("notificacoesEmail");
if (args.status) {
query = query.withIndex("by_status", (q) => q.eq("status", args.status));
} else {
query = query.withIndex("by_criado_em");
const emails = await ctx.db
.query("notificacoesEmail")
.withIndex("by_status", (q) => q.eq("status", args.status!))
.order("desc")
.take(args.limite ?? 100);
return emails;
}
const emails = await query.order("desc").take(args.limite || 100);
const emails = await ctx.db
.query("notificacoesEmail")
.withIndex("by_criado_em")
.order("desc")
.take(args.limite ?? 100);
return emails;
},
});
@@ -141,9 +161,68 @@ export const reenviarEmail = mutation({
/**
* Action para enviar email (será implementado com nodemailer)
*
*
* NOTA: Este é um placeholder. Implementação real requer nodemailer.
*/
export const getEmailById = internalQuery({
args: { emailId: v.id("notificacoesEmail") },
returns: v.union(v.any(), v.null()),
handler: async (ctx, args) => {
return await ctx.db.get(args.emailId);
},
});
export const getActiveEmailConfig = internalQuery({
args: {},
returns: v.union(v.any(), v.null()),
handler: async (ctx) => {
return await ctx.db
.query("configuracaoEmail")
.withIndex("by_ativo", (q) => q.eq("ativo", true))
.first();
},
});
export const markEmailEnviando = internalMutation({
args: { emailId: v.id("notificacoesEmail") },
returns: v.null(),
handler: async (ctx, args) => {
const email = await ctx.db.get(args.emailId);
await ctx.db.patch(args.emailId, {
status: "enviando",
tentativas: ((email as any)?.tentativas || 0) + 1,
ultimaTentativa: Date.now(),
});
return null;
},
});
export const markEmailEnviado = internalMutation({
args: { emailId: v.id("notificacoesEmail") },
returns: v.null(),
handler: async (ctx, args) => {
await ctx.db.patch(args.emailId, {
status: "enviado",
enviadoEm: Date.now(),
});
return null;
},
});
export const markEmailFalha = internalMutation({
args: { emailId: v.id("notificacoesEmail"), erro: v.string() },
returns: v.null(),
handler: async (ctx, args) => {
const email = await ctx.db.get(args.emailId);
await ctx.db.patch(args.emailId, {
status: "falha",
erroDetalhes: args.erro,
tentativas: ((email as any)?.tentativas || 0) + 1,
});
return null;
},
});
export const enviarEmailAction = action({
args: {
emailId: v.id("notificacoesEmail"),
@@ -151,11 +230,11 @@ export const enviarEmailAction = action({
returns: v.object({ sucesso: v.boolean(), erro: v.optional(v.string()) }),
handler: async (ctx, args) => {
// TODO: Implementar com nodemailer quando instalado
try {
// Buscar email da fila
const email = await ctx.runQuery(async (ctx) => {
return await ctx.db.get(args.emailId);
const email = await ctx.runQuery(internal.email.getEmailById, {
emailId: args.emailId,
});
if (!email) {
@@ -163,52 +242,41 @@ export const enviarEmailAction = action({
}
// Buscar configuração SMTP
const config = await ctx.runQuery(async (ctx) => {
return await ctx.db
.query("configuracaoEmail")
.withIndex("by_ativo", (q) => q.eq("ativo", true))
.first();
});
const config = await ctx.runQuery(
internal.email.getActiveEmailConfig,
{}
);
if (!config) {
return { sucesso: false, erro: "Configuração de email não encontrada" };
}
// Marcar como enviando
await ctx.runMutation(async (ctx) => {
await ctx.db.patch(args.emailId, {
status: "enviando",
tentativas: (email.tentativas || 0) + 1,
ultimaTentativa: Date.now(),
});
await ctx.runMutation(internal.email.markEmailEnviando, {
emailId: args.emailId,
});
// TODO: Enviar email real com nodemailer aqui
console.log("⚠️ AVISO: Envio de email simulado (nodemailer não instalado)");
console.log(" Para:", email.destinatario);
console.log(" Assunto:", email.assunto);
console.log(
"⚠️ AVISO: Envio de email simulado (nodemailer não instalado)"
);
console.log(" Para:", (email as any).destinatario);
console.log(" Assunto:", (email as any).assunto);
// Simular delay de envio
await new Promise((resolve) => setTimeout(resolve, 500));
// Marcar como enviado
await ctx.runMutation(async (ctx) => {
await ctx.db.patch(args.emailId, {
status: "enviado",
enviadoEm: Date.now(),
});
await ctx.runMutation(internal.email.markEmailEnviado, {
emailId: args.emailId,
});
return { sucesso: true };
} catch (error: any) {
// Marcar como falha
await ctx.runMutation(async (ctx) => {
const email = await ctx.db.get(args.emailId);
await ctx.db.patch(args.emailId, {
status: "falha",
erroDetalhes: error.message || "Erro desconhecido",
tentativas: (email?.tentativas || 0) + 1,
});
await ctx.runMutation(internal.email.markEmailFalha, {
emailId: args.emailId,
erro: error.message || "Erro ao enviar email",
});
return { sucesso: false, erro: error.message || "Erro ao enviar email" };
@@ -221,6 +289,7 @@ export const enviarEmailAction = action({
*/
export const processarFilaEmails = internalMutation({
args: {},
returns: v.object({ processados: v.number() }),
handler: async (ctx) => {
// Buscar emails pendentes (max 10 por execução)
const emailsPendentes = await ctx.db
@@ -255,5 +324,3 @@ export const processarFilaEmails = internalMutation({
return { processados };
},
});