Skip to content

Commit 86e3ca6

Browse files
authored
Merge pull request #10625 from neinteractiveliterature/optimize_router_queries
Don't load all mappings sitewide when we only need a certain subset of domains
2 parents d970cea + 17d1d81 commit 86e3ca6

2 files changed

Lines changed: 33 additions & 9 deletions

File tree

app/jobs/sync_email_forwarding_for_domain_job.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# frozen_string_literal: true
22
class SyncEmailForwardingForDomainJob < ApplicationJob
33
def perform(domains)
4-
mappings_by_domain = EmailForwardingRouter.all_mappings.by_domain.slice(*domains)
4+
mappings_by_domain = EmailForwardingRouter.all_mappings_for_domains(Array(domains)).by_domain
55

66
return if ENV["FORWARDEMAIL_API_KEY"].blank?
77
SyncForwardEmailService.new(mappings_by_domain:).call!

app/services/email_forwarding_router.rb

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ def by_domain
6161
end
6262
end
6363

64-
def self.all_staff_position_mappings
64+
def self.all_staff_position_mappings(staff_position_scope = StaffPosition.all)
6565
MappingSet.new(
66-
StaffPosition
66+
staff_position_scope
6767
.includes(user_con_profiles: :user)
6868
.joins(:convention)
6969
.where("staff_positions.email ilike '%@' || conventions.domain")
@@ -73,9 +73,9 @@ def self.all_staff_position_mappings
7373
)
7474
end
7575

76-
def self.all_catch_all_mappings
76+
def self.all_catch_all_mappings(convention_scope = Convention.all)
7777
MappingSet.new(
78-
Convention
78+
convention_scope
7979
.where.not(catch_all_staff_position_id: nil)
8080
.filter_map do |convention|
8181
sp = convention.catch_all_staff_position
@@ -87,9 +87,9 @@ def self.all_catch_all_mappings
8787
)
8888
end
8989

90-
def self.all_team_member_mappings
90+
def self.all_team_member_mappings(event_scope = Event.all)
9191
MappingSet.new(
92-
Event
92+
event_scope
9393
.includes(:convention, team_members: { user_con_profile: :user })
9494
.joins(:convention)
9595
.where.not(conventions: { event_mailing_list_domain: nil })
@@ -104,9 +104,9 @@ def self.all_team_member_mappings
104104
)
105105
end
106106

107-
def self.all_email_route_mappings
107+
def self.all_email_route_mappings(email_route_scope = EmailRoute.all)
108108
MappingSet.new(
109-
EmailRoute
109+
email_route_scope
110110
.pluck(:receiver_address, :forward_addresses)
111111
.filter_map do |receiver_address, forward_addresses|
112112
if forward_addresses.blank?
@@ -125,6 +125,30 @@ def self.all_mappings
125125
.merge(all_email_route_mappings)
126126
end
127127

128+
def self.all_mappings_for_domains(domains)
129+
conventions = Convention.where("domain IN (:domains) OR event_mailing_list_domain IN (:domains)", domains:)
130+
131+
all_staff_position_mappings(StaffPosition.where(convention_id: conventions.select(:id)))
132+
.merge(all_catch_all_mappings(conventions))
133+
.merge(all_team_member_mappings(Event.where(convention_id: conventions.select(:id))))
134+
.merge(
135+
all_email_route_mappings(
136+
EmailRoute.where(
137+
domains.map { |_| "receiver_address ILIKE ?" }.join(" OR "),
138+
*domains.map { |domain| "%@#{domain}" }
139+
)
140+
)
141+
)
142+
end
143+
144+
def self.all_mappings_for_inbound_address(address)
145+
all_mappings[EmailRoute.normalize_address(address)]
146+
end
147+
148+
def self.all_mappings_for_destination_address(address)
149+
all_mappings.values.flatten.select { |mapping| mapping.destination_addresses.include?(address) }
150+
end
151+
128152
def self.all_inbound_addresses
129153
all_mappings.keys
130154
end

0 commit comments

Comments
 (0)