11class CreateBroadcastDeliveriesJob < ApplicationJob
22 Recipient = Struct . new ( :sponsorship , :email , :email_ccs , keyword_init : true )
33
4+ module Filters
5+ class Base
6+ def initialize ( broadcast :, params :)
7+ @broadcast = broadcast
8+ @params = params
9+ end
10+
11+ attr_reader :broadcast , :params
12+
13+ def recipients
14+ raise NotImplementedError
15+ end
16+
17+ private def status_scope
18+ case params [ :status ]
19+ when 'all' , nil
20+ Sponsorship . all
21+ when 'not_accepted'
22+ Sponsorship . not_accepted
23+ when 'pending'
24+ Sponsorship . pending
25+ when 'accepted'
26+ Sponsorship . accepted
27+ when 'active'
28+ Sponsorship . active
29+ when 'withdrawn'
30+ Sponsorship . withdrawn
31+ else
32+ Sponsorship . none
33+ end
34+ end
35+
36+ private def plan_scope
37+ if params [ :plan_id ] . present?
38+ plan = @broadcast . conference . plans . where ( id : params [ :plan_id ] ) . first
39+ if plan
40+ return Sponsorship . where ( plan :)
41+ end
42+ end
43+ nil
44+ end
45+
46+ private def locale_scope
47+ if params [ :locale ] . present?
48+ Sponsorship . where ( locale : params [ :locale ] )
49+ else
50+ nil
51+ end
52+ end
53+
54+ private def exhibitor_scope
55+ if params [ :exhibitors ] . present?
56+ Sponsorship . exhibitor
57+ else
58+ nil
59+ end
60+ end
61+
62+ private def scope_sponsorships ( scope )
63+ [
64+ status_scope ,
65+ plan_scope ,
66+ locale_scope ,
67+ exhibitor_scope ,
68+ ] . inject ( scope ) do |r , i |
69+ i ? r . merge ( i ) : r
70+ end
71+ end
72+
73+ private def sponsorships_to_recipients ( scope )
74+ scope . map do |sponsorship |
75+ Recipient . new (
76+ sponsorship : sponsorship ,
77+ email : sponsorship . contact . email ,
78+ email_ccs : sponsorship . contact . email_ccs ,
79+ )
80+ end
81+ end
82+ end
83+
84+ class All < Base
85+ def recipients
86+ scope = scope_sponsorships ( @broadcast . conference . sponsorships . includes ( :contact ) )
87+ sponsorships_to_recipients ( scope )
88+ end
89+ end
90+
91+ class PastSponsors < Base
92+ def recipients
93+ conference = Conference . find_by! ( id : params [ :id ] )
94+ scope = scope_sponsorships ( conference . sponsorships . includes ( :contact ) )
95+ sponsorships_to_recipients ( scope )
96+ end
97+ end
98+
99+ class Manual < Base
100+ def recipients
101+ scope = Sponsorship . where ( id : [ *params [ :sponsorship_ids ] ] )
102+ if params [ :exclude_current_sponsors ] . present?
103+ scope = scope . where . not ( organization_id : @broadcast . conference . sponsorships . pluck ( :organization_id ) )
104+ end
105+ sponsorships_to_recipients ( scope )
106+ end
107+ end
108+
109+ class Raw < Base
110+ def recipients
111+ [ *params [ :emails ] ] . flatten . flat_map do |email_lines |
112+ email_lines . to_s . each_line . map do |email |
113+ Recipient . new (
114+ email : email . chomp ,
115+ email_ccs : [ ] ,
116+ )
117+ end
118+ end
119+ end
120+ end
121+ end
122+
4123 def perform ( broadcast , recipient_filter_params )
5124 ApplicationRecord . transaction do
6125 @broadcast = broadcast
@@ -17,16 +136,16 @@ def perform(broadcast, recipient_filter_params)
17136 raise "Invalid state for CreateBroadcastDeliveriesJob (broadcast_id=#{ broadcast . id } , state=#{ broadcast . status } )"
18137 end
19138
20- existing_emails = broadcast . deliveries . pluck ( :recipient )
139+ existing_emails = broadcast . deliveries . pluck ( :recipient ) . tally
21140 recipients = recipient_filter_params . flat_map do |filter |
22141 filter = filter . dup
23- kind = filter . delete ( 'kind' ) || target . delete ( :kind )
142+ kind = filter . delete ( 'kind' )
24143
25144 filter_recipients ( kind , filter )
26145 end
27146
28147 recipients . map do |recipient |
29- next if existing_emails . include? ( recipient . email )
148+ next if existing_emails [ recipient . email ]
30149 broadcast . deliveries . create! (
31150 status : :ready ,
32151 sponsorship : recipient . sponsorship ,
@@ -45,65 +164,13 @@ def perform(broadcast, recipient_filter_params)
45164 def filter_recipients ( kind , params )
46165 case kind . to_s
47166 when 'all'
48- scope = @broadcast . conference . sponsorships . not_withdrawn . includes ( :contact )
49- scope = scope . where ( plan : @broadcast . conference . plans . find_by! ( id : params [ :plan_id ] ) ) if params [ :plan_id ] . present?
50- scope = scope . where ( locale : params [ :locale ] ) if params [ :locale ] . present?
51- scope = scope . exhibitor if params [ :exhibitors ] . present?
52- case params [ :status ]
53- when 'all'
54- # do nothing
55- when 'not_accepted'
56- scope = scope . where ( accepted_at : nil )
57- when 'accepted'
58- scope = scope . accepted
59- end
60-
61- scope . map do |sponsorship |
62- Recipient . new (
63- sponsorship : sponsorship ,
64- email : sponsorship . contact . email ,
65- email_ccs : sponsorship . contact . email_ccs ,
66- )
67- end
167+ Filters ::All . new ( broadcast : @broadcast , params : params ) . recipients
68168 when 'past_sponsors'
69- conference = Conference . find_by! ( id : params [ :id ] )
70- scope = conference . sponsorships . not_withdrawn . includes ( :contact )
71- scope = scope . where ( locale : params [ :locale ] ) if params [ :locale ] . present?
72- scope = scope . where . not ( organization_id : @broadcast . conference . sponsorships . pluck ( :organization_id ) ) if params [ :exclude_current_sponsors ]
73- case params [ :status ]
74- when 'all'
75- # do nothing
76- when 'not_accepted'
77- scope = scope . where ( accepted_at : nil )
78- when 'accepted'
79- scope = scope . accepted
80- end
81-
82- scope . map do |sponsorship |
83- Recipient . new (
84- sponsorship : sponsorship ,
85- email : sponsorship . contact . email ,
86- email_ccs : sponsorship . contact . email_ccs ,
87- )
88- end
169+ Filters ::PastSponsors . new ( broadcast : @broadcast , params : params ) . recipients
89170 when 'raw'
90- [ *params [ :emails ] ] . flatten . flat_map do |email_lines |
91- email_lines . to_s . each_line . map do |email |
92- Recipient . new (
93- email : email . chomp ,
94- email_ccs : [ ] ,
95- )
96- end
97- end
171+ Filters ::Raw . new ( broadcast : @broadcast , params : params ) . recipients
98172 when 'manual'
99- scope = Sponsorship . where ( id : [ *params [ :sponsorship_ids ] ] )
100- scope . map do |sponsorship |
101- Recipient . new (
102- sponsorship : sponsorship ,
103- email : sponsorship . contact . email ,
104- email_ccs : sponsorship . contact . email_ccs ,
105- )
106- end
173+ Filters ::Manual . new ( broadcast : @broadcast , params : params ) . recipients
107174 when 'none'
108175 [ ]
109176 else
0 commit comments