From 4f1ff4a86bb22c8d7ee21a91063726d0ace3519f Mon Sep 17 00:00:00 2001 From: Max Wofford Date: Thu, 21 Aug 2025 15:22:49 -0400 Subject: [PATCH] Switch to instant mail queue for 7-day streak letter (#454) --- app/models/physical_mail.rb | 14 +++++++++++++- config/initializers/good_job.rb | 8 ++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/app/models/physical_mail.rb b/app/models/physical_mail.rb index d9e8304..dfb0ef8 100644 --- a/app/models/physical_mail.rb +++ b/app/models/physical_mail.rb @@ -14,6 +14,10 @@ class PhysicalMail < ApplicationRecord first_time_7_streak: 1 } + def self.instant_mission_types + %w[first_time_7_streak] + end + scope :pending_delivery, -> { where(status: :pending) .joins(:user) @@ -36,6 +40,11 @@ class PhysicalMail < ApplicationRecord return if status == :sent || theseus_id.present? slug = "hackatime-#{mission_type.to_s.gsub("_", "-")}" + endpoint = if self.class.instant_mission_types.include?(mission_type) + "https://mail.hackclub.com/api/v1/letter_queues/instant/#{slug}-instant" + else + "https://mail.hackclub.com/api/v1/letter_queues/#{slug}" + end flavors = FlavorText.compliment flavors.concat(FlavorText.rare_compliment) if rand(10) == 0 @@ -43,7 +52,7 @@ class PhysicalMail < ApplicationRecord return nil unless user.mailing_address.present? # authorization: Bearer - response = HTTP.auth("Bearer #{ENV["MAIL_HACKCLUB_TOKEN"]}").post("https://mail.hackclub.com/api/v1/letter_queues/#{slug}", json: { + response = HTTP.auth("Bearer #{ENV["MAIL_HACKCLUB_TOKEN"]}").post(endpoint, json: { recipient_email: user.email_addresses.first.email, address: { first_name: user.mailing_address.first_name, @@ -70,6 +79,9 @@ class PhysicalMail < ApplicationRecord update(status: :failed) raise "Failed to deliver physical mail: #{response.body}" end + rescue OpenSSL::SSL::SSLError => e + Rails.logger.warn "SSL error during mail delivery (request likely succeeded): #{e.message}" + update(status: :sent) rescue => e update(status: :failed) raise e diff --git a/config/initializers/good_job.rb b/config/initializers/good_job.rb index 313a035..fa395f2 100644 --- a/config/initializers/good_job.rb +++ b/config/initializers/good_job.rb @@ -124,10 +124,10 @@ Rails.application.configure do cron: "0 * * * *", # Run before AttemptToDeliverPhysicalMailJob class: "CheckStreakPhysicalMailJob" }, - # attempt_to_deliver_physical_mail: { - # cron: "5 * * * *", # Run after physical mail is created - # class: "AttemptToDeliverPhysicalMailJob" - # }, + attempt_to_deliver_physical_mail: { + cron: "5 * * * *", # Run after physical mail is created + class: "AttemptToDeliverPhysicalMailJob" + }, sync_neighborhood_from_airtable: { cron: "*/15 * * * *", class: "Neighborhood::SyncFromAirtableJob"