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 { // 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; } /** * 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 }; } } });