From a46402fd0811a26e9c433223fb1c584f3efac21d Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Mon, 12 May 2025 19:23:11 -0300 Subject: [PATCH 1/4] refactor(auth, email_service, user_service, templates): update email handling and improve base email template styling --- src/api/auth_routes.py | 3 +- src/services/email_service.py | 27 ++--- src/services/user_service.py | 8 +- src/templates/emails/base_email.html | 166 +++++++++++++++------------ 4 files changed, 114 insertions(+), 90 deletions(-) diff --git a/src/api/auth_routes.py b/src/api/auth_routes.py index 86a3548d..ee044337 100644 --- a/src/api/auth_routes.py +++ b/src/api/auth_routes.py @@ -54,8 +54,7 @@ async def register_user(user_data: UserCreate, db: Session = Depends(get_db)): Raises: HTTPException: If there is an error in registration """ - # TODO: remover o auto_verify temporariamente para teste - user, message = create_user(db, user_data, is_admin=False, auto_verify=True) + user, message = create_user(db, user_data, is_admin=False, auto_verify=False) if not user: logger.error(f"Error registering user: {message}") raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=message) diff --git a/src/services/email_service.py b/src/services/email_service.py index 9ea5bd04..e235eff9 100644 --- a/src/services/email_service.py +++ b/src/services/email_service.py @@ -1,6 +1,5 @@ import sendgrid from sendgrid.helpers.mail import Mail, Email, To, Content -from src.config.settings import settings import logging from datetime import datetime from jinja2 import Environment, FileSystemLoader, select_autoescape @@ -51,12 +50,12 @@ def send_verification_email(email: str, token: str) -> bool: bool: True if the email was sent successfully, False otherwise """ try: - sg = sendgrid.SendGridAPIClient(api_key=settings.SENDGRID_API_KEY) - from_email = Email(settings.EMAIL_FROM) + sg = sendgrid.SendGridAPIClient(api_key=os.getenv("SENDGRID_API_KEY")) + from_email = Email(os.getenv("EMAIL_FROM")) to_email = To(email) subject = "Email Verification - Evo AI" - verification_link = f"{settings.APP_URL}/api/v1/auth/verify-email/{token}" + verification_link = f"{os.getenv('APP_URL')}/security/verify-email?code={token}" html_content = _render_template( "verification_email", @@ -100,12 +99,12 @@ def send_password_reset_email(email: str, token: str) -> bool: bool: True if the email was sent successfully, False otherwise """ try: - sg = sendgrid.SendGridAPIClient(api_key=settings.SENDGRID_API_KEY) - from_email = Email(settings.EMAIL_FROM) + sg = sendgrid.SendGridAPIClient(api_key=os.getenv("SENDGRID_API_KEY")) + from_email = Email(os.getenv("EMAIL_FROM")) to_email = To(email) subject = "Password Reset - Evo AI" - reset_link = f"{settings.APP_URL}/reset-password?token={token}" + reset_link = f"{os.getenv('APP_URL')}/security/reset-password?token={token}" html_content = _render_template( "password_reset", @@ -149,12 +148,12 @@ def send_welcome_email(email: str, user_name: str = None) -> bool: bool: True if the email was sent successfully, False otherwise """ try: - sg = sendgrid.SendGridAPIClient(api_key=settings.SENDGRID_API_KEY) - from_email = Email(settings.EMAIL_FROM) + sg = sendgrid.SendGridAPIClient(api_key=os.getenv("SENDGRID_API_KEY")) + from_email = Email(os.getenv("EMAIL_FROM")) to_email = To(email) subject = "Welcome to Evo AI" - dashboard_link = f"{settings.APP_URL}/dashboard" + dashboard_link = f"{os.getenv('APP_URL')}/dashboard" html_content = _render_template( "welcome_email", @@ -200,12 +199,14 @@ def send_account_locked_email( bool: True if the email was sent successfully, False otherwise """ try: - sg = sendgrid.SendGridAPIClient(api_key=settings.SENDGRID_API_KEY) - from_email = Email(settings.EMAIL_FROM) + sg = sendgrid.SendGridAPIClient(api_key=os.getenv("SENDGRID_API_KEY")) + from_email = Email(os.getenv("EMAIL_FROM")) to_email = To(email) subject = "Security Alert - Account Locked" - reset_link = f"{settings.APP_URL}/reset-password?token={reset_token}" + reset_link = ( + f"{os.getenv('APP_URL')}/security/reset-password?token={reset_token}" + ) html_content = _render_template( "account_locked", diff --git a/src/services/user_service.py b/src/services/user_service.py index d1115598..0a3159b8 100644 --- a/src/services/user_service.py +++ b/src/services/user_service.py @@ -7,7 +7,7 @@ from src.services.email_service import ( send_verification_email, send_password_reset_email, ) -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone import uuid import logging from typing import Optional, Tuple @@ -295,7 +295,11 @@ def reset_password(db: Session, token: str, new_password: str) -> Tuple[bool, st return False, "Invalid password reset token" # Check if the token has expired - if user.password_reset_expiry < datetime.utcnow(): + now = datetime.now(timezone.utc) + expiry = user.password_reset_expiry + if expiry is not None and expiry.tzinfo is None: + expiry = expiry.replace(tzinfo=timezone.utc) + if expiry is None or expiry < now: logger.warning( f"Attempt to reset password with expired token for user: {user.email}" ) diff --git a/src/templates/emails/base_email.html b/src/templates/emails/base_email.html index c96d28d5..3d78487e 100644 --- a/src/templates/emails/base_email.html +++ b/src/templates/emails/base_email.html @@ -1,83 +1,103 @@ - - - + + + {% block title %}Evo AI{% endblock %} {% block additional_styles %}{% endblock %} - - + +
-
-

{% block header %}Evo AI{% endblock %}

-
-
- {% block content %}{% endblock %} -
- +
+

{% block header %}Evo AI{% endblock %}

+
+
{% block content %}{% endblock %}
+
- - \ No newline at end of file + + From fc61fb062ef9b2abb91a0176e5d265bdb22bbb3c Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Mon, 12 May 2025 19:36:43 -0300 Subject: [PATCH 2/4] style(templates): update base email template styles for improved aesthetics --- src/templates/emails/base_email.html | 32 ++++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/templates/emails/base_email.html b/src/templates/emails/base_email.html index 3d78487e..b7d253bb 100644 --- a/src/templates/emails/base_email.html +++ b/src/templates/emails/base_email.html @@ -7,28 +7,28 @@