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

84 lines
2.5 KiB
TypeScript

import { v } from 'convex/values';
import { mutation, type MutationCtx } from './_generated/server';
import { authComponent, updatePassword } from './auth';
import type { GenericCtx } from '@convex-dev/better-auth';
import type { DataModel } from './_generated/dataModel';
/**
* Helper para converter MutationCtx para GenericCtx do better-auth
* Os tipos são estruturalmente compatíveis, apenas há diferença nas definições de tipo
*/
function toGenericCtx(ctx: MutationCtx): GenericCtx<DataModel> {
// Os tipos são estruturalmente idênticos, apenas há diferença nas definições de tipo
// entre a versão do Convex usada pelo projeto e a usada pelo @convex-dev/better-auth
return ctx as unknown as GenericCtx<DataModel>;
}
/**
* Alterar senha do usuário autenticado
* Token é opcional - autenticação é feita via contexto do Convex
*/
export const alterarSenha = mutation({
args: {
senhaAtual: v.string(),
novaSenha: v.string(),
token: v.optional(v.string()) // Token opcional - não é usado, mas mantido para compatibilidade
},
returns: v.union(
v.object({ sucesso: v.literal(true) }),
v.object({ sucesso: v.literal(false), erro: v.string() })
),
handler: async (ctx, args) => {
try {
// Verificar se o usuário está autenticado
const authUser = await authComponent.safeGetAuthUser(toGenericCtx(ctx));
if (!authUser) {
return {
sucesso: false as const,
erro: 'Usuário não autenticado'
};
}
// Validar que a nova senha não está vazia
if (!args.novaSenha || args.novaSenha.trim().length === 0) {
return {
sucesso: false as const,
erro: 'A nova senha não pode estar vazia'
};
}
// Chamar a função de atualização de senha
await updatePassword(ctx, {
currentPassword: args.senhaAtual,
newPassword: args.novaSenha
});
return {
sucesso: true as const
};
} catch (error: unknown) {
// Capturar erros específicos do Better Auth
let mensagemErro = 'Erro ao alterar senha';
if (error instanceof Error && 'message' in error) {
mensagemErro = error.message;
}
// Mensagens de erro mais amigáveis
if (
mensagemErro.toLowerCase().includes('password') ||
mensagemErro.toLowerCase().includes('senha') ||
mensagemErro.toLowerCase().includes('incorrect') ||
mensagemErro.toLowerCase().includes('incorreta')
) {
mensagemErro = 'Senha atual incorreta';
}
return {
sucesso: false as const,
erro: mensagemErro
};
}
}
});