From 0a4f46283c5ebb301c43bb4c33dbdc414ad122af Mon Sep 17 00:00:00 2001 From: Max Wofford Date: Mon, 17 Mar 2025 10:48:00 -0400 Subject: [PATCH] Speed up sign-in mail sending --- app/controllers/sessions_controller.rb | 13 +++++-------- app/jobs/handle_email_signin_job.rb | 14 ++++++++++++++ app/mailers/loops_mailer.rb | 23 +++++++++++++---------- 3 files changed, 32 insertions(+), 18 deletions(-) create mode 100644 app/jobs/handle_email_signin_job.rb diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index acc7fbf..d3bedf6 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -36,16 +36,13 @@ class SessionsController < ApplicationController def email email = params[:email].downcase - # Use a transaction to ensure both user and email are created atomically - email_address = ActiveRecord::Base.transaction do - EmailAddress.find_by(email: email) || begin - user = User.create! - user.email_addresses.create!(email: email) - end + if Rails.env.production? + HandleEmailSigninJob.perform_later(email) + else + HandleEmailSigninJob.perform_now(email) end - LoopsMailer.sign_in_email(email_address).deliver_later - redirect_to root_path(sign_in_email: true) + redirect_to root_path(sign_in_email: true), notice: "Check your email for a sign-in link!" end def token diff --git a/app/jobs/handle_email_signin_job.rb b/app/jobs/handle_email_signin_job.rb new file mode 100644 index 0000000..e28ea3e --- /dev/null +++ b/app/jobs/handle_email_signin_job.rb @@ -0,0 +1,14 @@ +class HandleEmailSigninJob < ApplicationJob + queue_as :default + + def perform(email) + email_address = ActiveRecord::Base.transaction do + EmailAddress.find_by(email: email) || begin + user = User.create! + user.email_addresses.create!(email: email) + end + end + + LoopsMailer.sign_in_email(email_address).deliver_now + end +end diff --git a/app/mailers/loops_mailer.rb b/app/mailers/loops_mailer.rb index 688f194..94a33bf 100644 --- a/app/mailers/loops_mailer.rb +++ b/app/mailers/loops_mailer.rb @@ -1,14 +1,17 @@ class LoopsMailer < ApplicationMailer - # Override the default mailer settings to use Loops.so SMTP - self.delivery_method = :smtp - self.smtp_settings = { - address: "smtp.loops.so", - port: 587, - user_name: "loops", - password: ENV["LOOPS_API_KEY"], - authentication: "plain", - enable_starttls: true - } + if Rails.env.development? && ENV["LOOPS_API_KEY"].nil? + self.delivery_method = :letter_opener + else + self.delivery_method = :smtp + self.smtp_settings = { + address: "smtp.loops.so", + port: 587, + user_name: "loops", + password: ENV["LOOPS_API_KEY"], + authentication: "plain", + enable_starttls: true + } + end def sign_in_email(email_address) @email = email_address.email