diff --git a/apps/web/src/routes/(dashboard)/alterar-senha/+page.svelte b/apps/web/src/routes/(dashboard)/alterar-senha/+page.svelte index a2a96d1..f08ff8b 100644 --- a/apps/web/src/routes/(dashboard)/alterar-senha/+page.svelte +++ b/apps/web/src/routes/(dashboard)/alterar-senha/+page.svelte @@ -5,6 +5,7 @@ import { goto } from '$app/navigation'; import { resolve } from '$app/paths'; import { onMount } from 'svelte'; + import { Key, Eye, EyeOff, CheckCircle2, XCircle, Shield, Lock, AlertCircle, Info } from 'lucide-svelte'; const convex = useConvexClient(); const currentUser = useQuery(api.auth.getCurrentUser, {}); @@ -136,361 +137,288 @@ } -
- +
+
-
- - - -

Alterar Senha

+
+
+
+ +
+
+

Alterar Senha

+

+ Atualize sua senha de acesso ao sistema de forma segura +

+
+
+ + Seguro +
+
-

Atualize sua senha de acesso ao sistema

-
- - {#if notice} -
- - {#if notice.type === 'success'} - - {:else} - - {/if} - - {notice.message} +
+ {#if notice.type === 'success'} + + {:else} + + {/if} + {notice.message}
{/if} - -
-
-
- -
- -
- - +
+ +
+
+
+
+
+ +
+

Formulário de Alteração

-
- -
- -
- - -
-
- - Mínimo 8 caracteres, com letras maiúsculas, minúsculas, números e caracteres especiais - -
-
- - -
- -
- - -
-
- - -
- - - -
-

Requisitos de Senha:

-
    -
  • Mínimo de 8 caracteres
  • -
  • Pelo menos uma letra maiúscula (A-Z)
  • -
  • Pelo menos uma letra minúscula (a-z)
  • -
  • Pelo menos um número (0-9)
  • -
  • Pelo menos um caractere especial (!@#$%^&*...)
  • -
-
-
- - -
- - -
- -
-
+ +
+
- -
-
-

- - - - Dicas de Segurança -

-
    -
  • ✅ Nunca compartilhe sua senha com ninguém
  • -
  • ✅ Use uma senha única para cada sistema
  • -
  • ✅ Altere sua senha regularmente
  • -
  • ✅ Não use informações pessoais óbvias (nome, data de nascimento, etc.)
  • -
  • ✅ Considere usar um gerenciador de senhas
  • -
+ +
+ +
+ + +
+
+ + Mínimo 8 caracteres com maiúsculas, minúsculas, números e especiais + +
+
+ + +
+ +
+ + +
+
+ + +
+ + +
+ +
+
+
+ + +
+ +
+
+
+
+ +
+

Requisitos de Senha

+
+
    +
  • + + Mínimo de 8 caracteres +
  • +
  • + + Pelo menos uma letra maiúscula (A-Z) +
  • +
  • + + Pelo menos uma letra minúscula (a-z) +
  • +
  • + + Pelo menos um número (0-9) +
  • +
  • + + Pelo menos um caractere especial (!@#$%...) +
  • +
+
+
+ + +
+
+
+
+ +
+

Dicas de Segurança

+
+
    +
  • + + Nunca compartilhe sua senha +
  • +
  • + + Use uma senha única para cada sistema +
  • +
  • + + Altere sua senha regularmente +
  • +
  • + + Evite informações pessoais óbvias +
  • +
  • + + Considere usar um gerenciador de senhas +
  • +
+
+
+ + diff --git a/packages/backend/convex/_generated/api.d.ts b/packages/backend/convex/_generated/api.d.ts index 6035238..7312fc7 100644 --- a/packages/backend/convex/_generated/api.d.ts +++ b/packages/backend/convex/_generated/api.d.ts @@ -15,6 +15,7 @@ import type * as actions_smtp from "../actions/smtp.js"; import type * as actions_utils_nodeCrypto from "../actions/utils/nodeCrypto.js"; import type * as atestadosLicencas from "../atestadosLicencas.js"; import type * as ausencias from "../ausencias.js"; +import type * as autenticacao from "../autenticacao.js"; import type * as auth from "../auth.js"; import type * as auth_utils from "../auth/utils.js"; import type * as chamados from "../chamados.js"; @@ -63,6 +64,7 @@ declare const fullApi: ApiFromModules<{ "actions/utils/nodeCrypto": typeof actions_utils_nodeCrypto; atestadosLicencas: typeof atestadosLicencas; ausencias: typeof ausencias; + autenticacao: typeof autenticacao; auth: typeof auth; "auth/utils": typeof auth_utils; chamados: typeof chamados; diff --git a/packages/backend/convex/autenticacao.ts b/packages/backend/convex/autenticacao.ts new file mode 100644 index 0000000..bd83fe6 --- /dev/null +++ b/packages/backend/convex/autenticacao.ts @@ -0,0 +1,72 @@ +import { mutation } from './_generated/server'; +import { v } from 'convex/values'; +import { updatePassword } from './auth'; +import { authComponent } from './auth'; + +/** + * Alterar senha do usuário autenticado + */ +export const alterarSenha = mutation({ + args: { + token: v.string(), // Token não é usado, mas mantido para compatibilidade + senhaAtual: v.string(), + novaSenha: v.string() + }, + 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(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: any) { + // Capturar erros específicos do Better Auth + let mensagemErro = 'Erro ao alterar senha'; + + if (error?.message) { + mensagemErro = error.message; + } else if (typeof error === 'string') { + mensagemErro = error; + } + + // 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 + }; + } + } +}); +