From 6f38c9c656a245a730120989d122a7c862d9d232 Mon Sep 17 00:00:00 2001 From: Emmyt24 Date: Thu, 12 Mar 2026 05:33:29 +0100 Subject: [PATCH 1/4] fix: update Rust version in Dockerfile to 1.85 for Cargo.lock v4 compatibility --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index f2c4fcd..3911009 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # ── Stage 1: Build ── -FROM rust:1.77-slim AS builder +FROM rust:1.85-slim AS builder RUN apt-get update && apt-get install -y pkg-config libssl-dev && rm -rf /var/lib/apt/lists/* From c5be8cb96351683604e26d585aa4917909ca4520 Mon Sep 17 00:00:00 2001 From: Emmyt24 Date: Thu, 12 Mar 2026 05:42:10 +0100 Subject: [PATCH 2/4] fix: use latest Rust image for Dockerfile build --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 3911009..e1c400f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # ── Stage 1: Build ── -FROM rust:1.85-slim AS builder +FROM rust:latest AS builder RUN apt-get update && apt-get install -y pkg-config libssl-dev && rm -rf /var/lib/apt/lists/* From ec0c3be42ff57555020d3b5c4f2f0b322aac421e Mon Sep 17 00:00:00 2001 From: Emmyt24 Date: Thu, 12 Mar 2026 07:13:59 +0100 Subject: [PATCH 3/4] redesign: simplify all email templates to minimal monospace style - Replaced gradient headers, colored badges, and rounded containers - New design uses Courier New monospace font, thin black borders, uppercase labels - Clean white background with simple bordered info boxes - Interview invitation now prominently displays the full venue address - Consistent minimal style across all 5 templates (welcome, interview, waitlist, enrollment, rejection) - Matches BuidlFlow landing page design aesthetic --- src/services/email_service.rs | 205 +++++++++++++++++++--------------- 1 file changed, 115 insertions(+), 90 deletions(-) diff --git a/src/services/email_service.rs b/src/services/email_service.rs index 9df1d28..dd0dcfa 100644 --- a/src/services/email_service.rs +++ b/src/services/email_service.rs @@ -113,10 +113,10 @@ impl EmailService { user_name: &str, role: &str, ) -> Result<(), AuthError> { - let subject = "Welcome to CourseFlow!"; + let subject = "Welcome to BuidlFlow!"; let html_body = EmailTemplate::welcome_email(user_name, role); let text_body = format!( - "Hello {},\n\nWelcome to CourseFlow! Your account has been created with role: {}.\n\nBest regards,\nCourseFlow Team", + "Hello {},\n\nWelcome to BuidlFlow! Your account has been created with role: {}.\n\nBest regards,\nCourseFlow Team", user_name, role ); @@ -134,7 +134,7 @@ impl EmailService { course_name: &str, interview_venue: &str, ) -> Result<(), AuthError> { - let subject = format!("CourseFlow: Interview Invitation for {}", course_name); + let subject = format!("BuidlFlow: Interview Invitation for {}", course_name); let html_body = EmailTemplate::interview_invitation(applicant_name, course_name, interview_venue); let text_body = format!( "Hello {},\n\nCongratulations! Your application for {} has been reviewed and we would like to invite you for an interview.\n\nInterview Venue: {}\n\nPlease check your email for further scheduling details.\n\nBest regards,\nCourseFlow Admissions Team", @@ -151,7 +151,7 @@ impl EmailService { applicant_name: &str, course_name: &str, ) -> Result<(), AuthError> { - let subject = format!("CourseFlow: You're on the Waitlist for {}", course_name); + let subject = format!("BuidlFlow: You're on the Waitlist for {}", course_name); let html_body = EmailTemplate::waitlist_notification(applicant_name, course_name); let text_body = format!( "Hello {},\n\nGreat news! After your interview, you have been added to the waitlist for {}.\n\nWe will notify you as soon as a spot becomes available.\n\nBest regards,\nCourseFlow Team", @@ -169,7 +169,7 @@ impl EmailService { course_name: &str, temp_password: &str, ) -> Result<(), AuthError> { - let subject = format!("CourseFlow: Welcome to {}!", course_name); + let subject = format!("BuidlFlow: Welcome to {}!", course_name); let login_url = env::var("LOGIN_URL") .unwrap_or_else(|_| "https://courseflow.com/login".to_string()); let html_body = EmailTemplate::enrollment_acceptance(applicant_name, course_name, temp_password, &login_url); @@ -188,7 +188,7 @@ impl EmailService { applicant_name: &str, course_name: &str, ) -> Result<(), AuthError> { - let subject = format!("CourseFlow: Update on Your {} Application", course_name); + let subject = format!("BuidlFlow: Update on Your {} Application", course_name); let html_body = EmailTemplate::rejection_email(applicant_name, course_name); let text_body = format!( "Hello {},\n\nThank you for your interest in {}. After careful consideration, we regret to inform you that we are unable to offer you a place in this cohort.\n\nWe encourage you to apply again in the future.\n\nBest regards,\nCourseFlow Team", @@ -202,6 +202,7 @@ impl EmailService { /// Email template generator pub struct EmailTemplate; + impl EmailTemplate { pub fn welcome_email(user_name: &str, role: &str) -> String { format!( @@ -211,29 +212,38 @@ impl EmailTemplate {
-

Welcome to CourseFlow

+
Welcome
+

Welcome to BuidlFlow

+

Your account has been successfully created.

Hello {},

-

Your account has been successfully created!

-

Your Role: {}

-

You can now log in to your account and start using CourseFlow.

+
+
Your Role
+
{}
+
+

You can now log in to your account and start using BuidlFlow.

If you have any questions, please contact our support team.

+

Best regards,
BuidlFlow Team

@@ -253,41 +263,44 @@ impl EmailTemplate {
+
Interview Invitation

Congratulations!

-

You've been invited for an interview

+

You've been invited for an interview.

Hello {},

-

We are thrilled to inform you that your application for {} has been reviewed and accepted! We would love to invite you for an interview.

-
+

We are pleased to inform you that your application for {} has been reviewed and accepted. We would like to invite you for an interview.

+
Interview Venue
-
{}
+
{}
-
- What to expect:
- Our admissions team will reach out to you with the exact date and time. Please keep an eye on your inbox for scheduling details. +
+
What to expect
+

Our admissions team will reach out to you with the exact date and time. Please keep an eye on your inbox for scheduling details.

-

We look forward to meeting you!

-

Best regards,
CourseFlow Admissions Team

+

We look forward to meeting you.

+

Best regards,
BuidlFlow Admissions Team

@@ -305,33 +318,37 @@ impl EmailTemplate {
-

You're on the Waitlist!

+
Application Update
+

You're on the Waitlist

+

Great news — you've passed the interview stage.

Hello {},

-

Great news! After your interview, you have been added to the waitlist for {}.

-
- What does this mean?
- You've passed the interview stage! We will notify you as soon as a spot becomes available in the course. +

After your interview, you have been added to the waitlist for {}.

+
+
What does this mean?
+

You've passed the interview stage. We will notify you as soon as a spot becomes available in the course.

-

Thank you for your patience. We appreciate your interest in CourseFlow!

-

Best regards,
CourseFlow Admissions Team

+

Thank you for your patience. We appreciate your interest in BuidlFlow.

+

Best regards,
BuidlFlow Admissions Team

@@ -349,38 +366,42 @@ impl EmailTemplate {
-

Welcome to CourseFlow!

+
Enrollment Confirmed
+

Welcome to BuidlFlow

+

You've been accepted and enrolled.

Hello {},

-

Congratulations! You have been accepted and enrolled in {}.

-
- Your Account Credentials:

- Temporary Password: {} +

Congratulations! You have been accepted and enrolled in {}.

+
+
Your Temporary Password
+
{}

Please change your password immediately after your first login.

Log In Now -

We're excited to have you on board!

-

Best regards,
CourseFlow Team

+

We're excited to have you on board.

+

Best regards,
BuidlFlow Team

@@ -398,34 +419,38 @@ impl EmailTemplate {
-

Application Update

+
Application Update
+

Application Status

+

An update on your application.

Hello {},

-

Thank you for your interest in {} and for taking the time to apply.

+

Thank you for your interest in {} and for taking the time to apply.

After careful review, we regret to inform you that we are unable to offer you a place in this cohort.

-
- Don't give up!
- We encourage you to continue developing your skills and to apply again for future cohorts. Many successful students applied multiple times before being accepted. +
+
Don't give up
+

We encourage you to continue developing your skills and to apply again for future cohorts. Many successful students applied multiple times before being accepted.

-

We wish you the best in your learning journey!

-

Best regards,
CourseFlow Admissions Team

+

We wish you the best in your learning journey.

+

Best regards,
BuidlFlow Admissions Team

From 8a6b4788467a0f255cafdc77f5be487b6ce7184c Mon Sep 17 00:00:00 2001 From: Emmyt24 Date: Thu, 12 Mar 2026 10:34:54 +0100 Subject: [PATCH 4/4] minor: clean up interview email template --- BACKEND_PLAN.md | 2 +- src/services/email_service.rs | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/BACKEND_PLAN.md b/BACKEND_PLAN.md index c859953..68c8a4f 100644 --- a/BACKEND_PLAN.md +++ b/BACKEND_PLAN.md @@ -11,7 +11,7 @@ | **ORM / Queries** | SQLx | | **Auth** | JWT (jsonwebtoken crate) | | **Password Hashing** | argon2 | -| **Email** | Lettre | +| **Email** | mailtrap | | **Serialization** | Serde | | **Validation** | validator crate | | **File Uploads** | axum-multipart | diff --git a/src/services/email_service.rs b/src/services/email_service.rs index dd0dcfa..6a3b28d 100644 --- a/src/services/email_service.rs +++ b/src/services/email_service.rs @@ -292,10 +292,7 @@ impl EmailTemplate {
Interview Venue
{}
-
-
What to expect
-

Our admissions team will reach out to you with the exact date and time. Please keep an eye on your inbox for scheduling details.

-
+

We look forward to meeting you.

Best regards,
BuidlFlow Admissions Team