Switch to instant mail queue for 7-day streak letter (#454)

This commit is contained in:
Max Wofford
2025-08-21 15:22:49 -04:00
committed by GitHub
parent 3676966aa0
commit 4f1ff4a86b
2 changed files with 17 additions and 5 deletions

View File

@@ -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 <token>
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

View File

@@ -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"