84 lines
2.5 KiB
TypeScript
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
|
|
};
|
|
}
|
|
}
|
|
});
|