Skip to content

Feat/notify#43

Merged
DevlTz merged 3 commits into
mainfrom
feat/notify
May 18, 2026
Merged

Feat/notify#43
DevlTz merged 3 commits into
mainfrom
feat/notify

Conversation

@DevlTz
Copy link
Copy Markdown
Owner

@DevlTz DevlTz commented May 18, 2026

Resumo da PR

Esta implementação introduz duas grandes melhorias de infraestrutura, segurança e engajamento ao ecossistema do HomeMatch:

  1. Recuperação e Atualização de Credenciais de Usuário: Fluxo completo e seguro de redefinição de senha (via tokens nativos com timeout) e um processo robusto de troca de e-mail validado por assinatura JWT com tempo de expiração. Inclui invalidação forçada de sessões e tokens antigos após a troca de e-mail.
  2. Sistema de Alertas por E-mail para Imóveis (Recurso de Retenção): Permite que usuários salvem seus critérios de busca quando uma pesquisa retornar zero ou poucos resultados, sendo notificados de forma automatizada por e-mail assim que um imóvel correspondente entrar na plataforma.

Funcionalidades Implementadas

Recuperação de Senha

  • POST /api/users/password-reset/: Recebe um payload JSON contendo { "email": "<email>" }. O sistema valida a solicitação de forma agnóstica (não revelando se o e-mail existe no banco por motivos de segurança), gera um token criptográfico único utilizando o PasswordResetTokenGenerator do Django e dispara um e-mail contendo o link com os parâmetros uid e token.
  • POST /api/users/password-reset/confirm/: Endpoint responsável por receber os parâmetros { "uid": ..., "token": ..., "new_password": ... }, validar a expiração e assinatura do token e definir a nova senha segura.
  • Segurança: O token de redefinição expira de forma estrita em 24 horas através da diretiva PASSWORD_RESET_TIMEOUT configurada no settings.py.

Troca de E-mail

  • POST /api/users/email-change/ (Requer Autenticação): Recebe { "new_email": "novo@email.com" }. Valida se o novo endereço já não está em uso por outra conta e gera um token JWT com tempo de vida (TTL) estrito de 24 horas, enviando o link de confirmação exclusivamente para o novo e-mail informado.
  • GET /api/users/email-change/confirm/?token=...: Endpoint público acionado pelo link do e-mail. Realiza o decode e validação da assinatura do JWT. Caso o token seja válido, o campo email do usuário é atualizado no banco de dados e a tabela de OutstandingToken é limpa, invalidando imediatamente todos os refresh tokens JWT antigos do usuário em circulação (forçando um novo login em todos os dispositivos).

Sistema de Alertas por E-mail ("Me Avise Quando Chegar")

  • Modelagem e Infraestrutura: Criado o modelo PropertyAlert contendo os campos user (FK), filters (JSONField), is_active (bool), created_at e last_notified_at. A migração correspondente cria e indexa a tabela property_alerts no banco PostgreSQL.
  • Endpoints RESTful integrados:
    • POST /api/users/alerts/ (Autenticado): Converte os filtros aplicados na busca atual do usuário e os salva como um alerta de monitoramento persistente.
    • GET /api/users/alerts/: Lista de forma limpa todos os alertas ativos cadastrados pelo usuário.
    • DELETE /api/users/alerts/{id}/: Remove ou desativa um alerta específico de monitoramento.
  • Automação Baseada em Eventos (Signals): Acoplado um signal post_save no modelo de Properties. Sempre que um proprietário ou anunciante cadastra um imóvel, o backend executa uma varredura em segundo plano avaliando as regras e filtros salvos em PropertyAlert. Caso haja correspondência exata de cidade, preço máximo e tipo, o sistema renderiza o template e dispara um e-mail para o buscador com o link direto e atualiza o campo last_notified_at para mitigar problemas de spam de notificações.

Ambiente de Desenvolvimento e Configurações

  • Variáveis de Ambiente (.env): O arquivo .env.example foi atualizado para conter os parâmetros de infraestrutura necessários para o disparo de mensagens (como EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USER, etc.) e a URL base do ecossistema cliente (FRONTEND_URL).
  • Templates de E-mail: Pasta de templates estruturada na raiz em templates/emails/ contendo os arquivos HTML estruturados para os fluxos de redefinição de senha (password_reset.html), alteração de e-mail (email_change_confirm.html) e alertas de novos imóveis.
  • Abstração do Backend de E-mail:
    • Em Desenvolvimento (Ambiente Local/Docker): O sistema está configurado com EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend". Isso garante que todo e-mail disparado seja impresso com formatação completa direto no terminal do container do Docker, dispensando configurações complexas de SMTP real em ambiente local.
    • Em Produção: Ativa-se o backend SMTP real integrado às variáveis de ambiente seguras do provedor de e-mail do time.
  • Celery: Para os testes iniciais e escopo de entrega da issue local, o signal executa o fluxo síncrono imediatamente após o salvamento, permitindo validação ágil das regras sem dependência obrigatória de workers Celery ativos na máquina do desenvolvedor.

Critérios de Aceitação Atendidos

  • Implementados endpoints de solicitação e confirmação de redefinição de senha.
  • Token de redefinição protegido com expiração de 24 horas.
  • Implementados endpoints de solicitação e confirmação de troca de e-mail.
  • Implementada a invalidação completa de tokens JWT antigos de sessões anteriores após a troca de e-mail bem-sucedida.
  • Criado o modelo de dados PropertyAlert junto com sua respectiva migration e endpoints para criação, listagem e exclusão de alertas (CRUD completo).
  • Signal em Properties configurado e validado para disparar e-mails assim que um imóvel se enquadra nos filtros monitorados.
  • Atualização automática de last_notified_at após cada envio para controle antifraude e antispam.
  • Configurações de SMTP isoladas via .env e suporte nativo a templates HTML de e-mail.
  • Mensagem de feedback textual validada e pronta para o frontend consumir: “Você será avisado por e-mail quando um imóvel com esses critérios for cadastrado”.

@DevlTz DevlTz merged commit a353668 into main May 18, 2026
1 check failed
@DevlTz DevlTz deleted the feat/notify branch May 18, 2026 22:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant