Skip to content

Commit fe8398d

Browse files
UmairHundekarYashK2005
authored andcommitted
Adding email template update file and made images work
1 parent 03a0328 commit fe8398d

File tree

6 files changed

+62
-29
lines changed

6 files changed

+62
-29
lines changed

backend/app/routes/auth.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ async def send_email_verification(
130130

131131
# Log for debugging
132132
import logging
133+
133134
logger = logging.getLogger(__name__)
134135
logger.info(f"Sending email verification to {email} with language: {language}")
135136

@@ -138,6 +139,7 @@ async def send_email_verification(
138139
except Exception as e:
139140
# Log error but don't reveal if email exists or not for security reasons
140141
import logging
142+
141143
logger = logging.getLogger(__name__)
142144
logger.error(f"Error sending email verification: {str(e)}")
143145
# Always return success even if email doesn't exist

backend/app/services/implementations/auth_service.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,9 @@ def send_email_verification_link(self, email: str, language: str = None) -> None
8686
display_name = firebase_user.display_name.strip()
8787
first_name = display_name.split()[0] if display_name else None
8888
if first_name:
89-
self.logger.info(f"Found first name '{first_name}' from Firebase display_name for user {email}")
89+
self.logger.info(
90+
f"Found first name '{first_name}' from Firebase display_name for user {email}"
91+
)
9092
else:
9193
self.logger.debug(f"Firebase user exists but display_name is None for {email}")
9294
except Exception as firebase_error:
@@ -112,6 +114,7 @@ def send_email_verification_link(self, email: str, language: str = None) -> None
112114
# If not provided, check environment variable, otherwise default to English
113115
if not language:
114116
import os
117+
115118
language = os.getenv("EMAIL_LANGUAGE", "en").lower()
116119
else:
117120
language = language.lower()

backend/app/utilities/ses/ses_init.py

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ def load_file_content(file_path: str) -> str:
3131
return ""
3232

3333

34-
# Function to create SES template
35-
def create_ses_template(template_metadata, ses_client):
34+
# Function to create or update SES template
35+
def create_or_update_ses_template(template_metadata, ses_client, force_update=False):
3636
name = template_metadata["TemplateName"]
3737
try:
3838
text_part = load_file_content(template_metadata["TextPart"])
@@ -47,17 +47,29 @@ def create_ses_template(template_metadata, ses_client):
4747
"TextPart": text_part,
4848
"HtmlPart": html_part,
4949
}
50-
ses_client.create_template(Template=template)
51-
print(f"SES template '{name}' created successfully!")
50+
51+
# Check if template exists
52+
try:
53+
ses_client.get_template(TemplateName=name)
54+
# Template exists, update it
55+
if force_update:
56+
ses_client.update_template(Template=template)
57+
print(f"SES template '{name}' updated successfully!")
58+
else:
59+
print(f"SES template '{name}' already exists. Use force_update=True to update.")
60+
except ClientError as e:
61+
if e.response["Error"]["Code"] == "TemplateDoesNotExist":
62+
# Template doesn't exist, create it
63+
ses_client.create_template(Template=template)
64+
print(f"SES template '{name}' created successfully!")
65+
else:
66+
raise
5267
except ClientError as e:
53-
if e.response["Error"]["Code"] == "TemplateAlreadyExists":
54-
print(f"SES template '{name}' already exists.")
55-
else:
56-
print(f"An error occurred while creating the SES template: {e}")
68+
print(f"An error occurred while processing SES template '{name}': {e}")
5769

5870

5971
# Ensure SES templates are available at app startup
60-
def ensure_ses_templates():
72+
def ensure_ses_templates(force_update=False):
6173
templates_metadata = load_templates_metadata(TEMPLATES_FILE)
6274
aws_region = os.getenv("AWS_REGION")
6375
aws_access_key = os.getenv("AWS_ACCESS_KEY")
@@ -75,14 +87,4 @@ def ensure_ses_templates():
7587
)
7688

7789
for template_metadata in templates_metadata:
78-
name = template_metadata["TemplateName"]
79-
try:
80-
# Check if the template exists
81-
ses_client.get_template(TemplateName=name)
82-
print(f"SES template '{name}' already exists.")
83-
except ClientError as e:
84-
if e.response["Error"]["Code"] == "TemplateDoesNotExist":
85-
print(f"SES template '{name}' does not exist. Creating template...")
86-
create_ses_template(template_metadata, ses_client)
87-
else:
88-
print(f"An error occurred while checking the SES template: {e}")
90+
create_or_update_ses_template(template_metadata, ses_client, force_update=force_update)

backend/app/utilities/ses/template_files/email_verification_en.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
<tr>
3535
<td align="center" style="padding:0;">
3636
<img
37-
src="https://www.bloodcancers.ca/themes/custom/whirlwind-llsc/src/000_assets/logos/llsc-logo-en.svg"
37+
src="https://secure.llscanada.org/images/content/pagebuilder/logo-lls_en.png"
3838
alt="LLSC Logo"
3939
width="120"
4040
height="71"

backend/app/utilities/ses_email_service.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ def __init__(self):
1616
self.aws_access_key = os.getenv("AWS_ACCESS_KEY")
1717
self.aws_secret_key = os.getenv("AWS_SECRET_KEY")
1818
self.source_email_en = os.getenv("SES_SOURCE_EMAIL", "FirstConnections@bloodcancers.ca")
19-
self.source_email_fr = os.getenv("SES_SOURCE_EMAIL_FR", os.getenv("SES_SOURCE_EMAIL", "FirstConnections@bloodcancers.ca"))
19+
self.source_email_fr = os.getenv(
20+
"SES_SOURCE_EMAIL_FR", os.getenv("SES_SOURCE_EMAIL", "FirstConnections@bloodcancers.ca")
21+
)
2022

2123
# Use English source email as default for backwards compatibility
2224
self.source_email = self.source_email_en
@@ -57,7 +59,9 @@ def verify_email_address(self, email: str) -> bool:
5759
self.logger.error(f"Failed to verify email {email}: {error_code}")
5860
return False
5961

60-
def send_templated_email(self, to_email: str, template_name: str, template_data: Dict[str, Any], source_email: str = None) -> bool:
62+
def send_templated_email(
63+
self, to_email: str, template_name: str, template_data: Dict[str, Any], source_email: str = None
64+
) -> bool:
6165
"""
6266
Send a templated email using SES
6367
@@ -109,7 +113,9 @@ def send_templated_email(self, to_email: str, template_name: str, template_data:
109113
self.logger.error(f"Unexpected error sending email to {to_email}: {str(e)}")
110114
return False
111115

112-
def send_verification_email(self, to_email: str, verification_link: str, first_name: str = None, language: str = "en") -> bool:
116+
def send_verification_email(
117+
self, to_email: str, verification_link: str, first_name: str = None, language: str = "en"
118+
) -> bool:
113119
"""
114120
Send email verification email
115121
@@ -131,10 +137,7 @@ def send_verification_email(self, to_email: str, verification_link: str, first_n
131137
# Use appropriate source email based on language
132138
source_email = self.source_email_en if language == "en" else self.source_email_fr
133139

134-
template_data = {
135-
"verification_link": verification_link,
136-
"first_name": first_name if first_name else "there"
137-
}
140+
template_data = {"verification_link": verification_link, "first_name": first_name if first_name else "there"}
138141

139142
return self.send_templated_email(to_email, template_name, template_data, source_email)
140143

backend/update_ses_templates.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#!/usr/bin/env python3
2+
"""
3+
Script to update SES email templates in AWS.
4+
Run this script to update existing templates with the latest HTML/text content.
5+
"""
6+
import os
7+
import sys
8+
from dotenv import load_dotenv
9+
10+
# Change to backend directory for proper path resolution
11+
backend_dir = os.path.dirname(os.path.abspath(__file__))
12+
os.chdir(backend_dir)
13+
14+
# Load environment variables from .env file
15+
load_dotenv()
16+
17+
from app.utilities.ses.ses_init import ensure_ses_templates
18+
19+
if __name__ == "__main__":
20+
print("Updating SES templates...")
21+
ensure_ses_templates(force_update=True)
22+
print("Done!")
23+

0 commit comments

Comments
 (0)