auction_fun_core 0.8.5 → 0.8.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +25 -0
  3. data/auction_fun_core.gemspec +1 -0
  4. data/db/migrate/20240229143000_create_auctions.rb +1 -0
  5. data/db/seeds.rb +87 -36
  6. data/i18n/en-US/contracts/contracts.en-US.yml +9 -0
  7. data/i18n/en-US/mail/application.en-US.yml +59 -0
  8. data/i18n/en-US/mail/auction_context/post_auction/participant.en-US.yml +13 -0
  9. data/i18n/en-US/mail/auction_context/post_auction/winner.en-US.yml +13 -0
  10. data/i18n/pt-BR/contracts/contracts.pt-BR.yml +9 -0
  11. data/i18n/pt-BR/mail/application.pt-BR.yml +59 -0
  12. data/i18n/pt-BR/mail/auction_context/post_auction/participant.pt-BR.yml +13 -0
  13. data/i18n/pt-BR/mail/auction_context/post_auction/winner.pt-BR.yml +13 -0
  14. data/i18n/pt-BR/mail/user_context/registration.pt-BR.yml +0 -4
  15. data/lib/auction_fun_core/contracts/auction_context/post_auction/participant_contract.rb +42 -0
  16. data/lib/auction_fun_core/contracts/auction_context/post_auction/winner_contract.rb +41 -0
  17. data/lib/auction_fun_core/contracts/auction_context/processor/finish/closed_contract.rb +47 -0
  18. data/lib/auction_fun_core/contracts/auction_context/processor/finish/penny_contract.rb +48 -0
  19. data/lib/auction_fun_core/contracts/auction_context/processor/finish/standard_contract.rb +48 -0
  20. data/lib/auction_fun_core/entities/auction.rb +6 -0
  21. data/lib/auction_fun_core/operations/auction_context/create_operation.rb +12 -2
  22. data/lib/auction_fun_core/operations/auction_context/post_auction/participant_operation.rb +52 -0
  23. data/lib/auction_fun_core/operations/auction_context/post_auction/winner_operation.rb +51 -0
  24. data/lib/auction_fun_core/operations/auction_context/processor/finish/closed_operation.rb +100 -0
  25. data/lib/auction_fun_core/operations/auction_context/processor/finish/penny_operation.rb +100 -0
  26. data/lib/auction_fun_core/operations/auction_context/processor/finish/standard_operation.rb +102 -0
  27. data/lib/auction_fun_core/operations/auction_context/processor/start_operation.rb +23 -11
  28. data/lib/auction_fun_core/operations/bid_context/create_bid_penny_operation.rb +57 -7
  29. data/lib/auction_fun_core/operations/staff_context/registration_operation.rb +10 -0
  30. data/lib/auction_fun_core/relations/auctions.rb +167 -26
  31. data/lib/auction_fun_core/relations/staffs.rb +1 -1
  32. data/lib/auction_fun_core/services/mail/auction_context/post_auction/participant_mailer.rb +31 -0
  33. data/lib/auction_fun_core/services/mail/auction_context/post_auction/winner_mailer.rb +31 -0
  34. data/lib/auction_fun_core/services/mail/templates/auction_context/post_auction/participant.html.erb +173 -0
  35. data/lib/auction_fun_core/services/mail/templates/auction_context/post_auction/winner.html.erb +174 -0
  36. data/lib/auction_fun_core/services/mail/templates/user_context/registration.html.erb +2 -2
  37. data/lib/auction_fun_core/version.rb +1 -1
  38. data/lib/auction_fun_core/workers/application_job.rb +2 -0
  39. data/lib/auction_fun_core/workers/operations/auction_context/post_auction/participant_operation_job.rb +33 -0
  40. data/lib/auction_fun_core/workers/operations/auction_context/post_auction/winner_operation_job.rb +33 -0
  41. data/lib/auction_fun_core/workers/operations/auction_context/processor/finish/closed_operation_job.rb +34 -0
  42. data/lib/auction_fun_core/workers/operations/auction_context/processor/finish/penny_operation_job.rb +37 -0
  43. data/lib/auction_fun_core/workers/operations/auction_context/processor/finish/standard_operation_job.rb +34 -0
  44. data/lib/auction_fun_core/workers/services/mail/auction_context/post_auction/participant_mailer_job.rb +51 -0
  45. data/lib/auction_fun_core/workers/services/mail/auction_context/post_auction/winner_mailer_job.rb +51 -0
  46. data/system/providers/background_job.rb +19 -0
  47. metadata +43 -5
  48. data/lib/auction_fun_core/contracts/auction_context/processor/finish_contract.rb +0 -27
  49. data/lib/auction_fun_core/operations/auction_context/processor/finish_operation.rb +0 -61
  50. data/lib/auction_fun_core/workers/operations/auction_context/processor/finish_operation_job.rb +0 -32
@@ -0,0 +1,174 @@
1
+ <table align="center" border="0" cellpadding="0" cellspacing="0" style="width:600px;" width="600">
2
+ <tr>
3
+ <td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
4
+ <div style="margin:0px auto;max-width:600px;">
5
+ <table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
6
+ <tbody>
7
+ <tr>
8
+ <td style="direction:ltr;font-size:0px;padding:20px 0;padding-bottom:0px;text-align:center;">
9
+ <table role="presentation" border="0" cellpadding="0" cellspacing="0">
10
+ <tr>
11
+ <td style="vertical-align:top;width:600px;">
12
+ <div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
13
+ <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
14
+ <tbody>
15
+ <tr>
16
+ <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
17
+ <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-collapse:collapse;border-spacing:0px;">
18
+ <tbody>
19
+ <tr>
20
+ <td style="width:50px;">
21
+ <img alt="image description" height="auto" src="https://codedmails.com/images/logo-circle.png" style="border:0;display:block;outline:none;text-decoration:none;height:auto;width:100%;font-size:14px;" width="50" />
22
+ </td>
23
+ </tr>
24
+ </tbody>
25
+ </table>
26
+ </td>
27
+ </tr>
28
+ <tr>
29
+ <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
30
+ <div style="font-family:Helvetica, Arial, sans-serif;font-size:18px;font-weight:400;line-height:24px;text-align:left;color:#434245;">
31
+ <h1 style="margin: 0; font-size: 24px; line-height: normal; font-weight: bold;">
32
+ <%= I18n.t("mail.general.hello", name: @winner.name) %>,
33
+ </h1>
34
+ </div>
35
+ </td>
36
+ </tr>
37
+ </tbody>
38
+ </table>
39
+ </div>
40
+ </td>
41
+ </tr>
42
+ </table>
43
+ </td>
44
+ </tr>
45
+ </tbody>
46
+ </table>
47
+ </div>
48
+ </td>
49
+ </tr>
50
+ </table>
51
+ <table align="center" border="0" cellpadding="0" cellspacing="0" style="width:600px;" width="600">
52
+ <tr>
53
+ <td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
54
+ <div style="margin:0px auto;max-width:600px;">
55
+ <table align="center" border="0" cellpadding="0" cellspacing="0" role="presentation" style="width:100%;">
56
+ <tbody>
57
+ <tr>
58
+ <td style="direction:ltr;font-size:0px;padding:20px 0;text-align:center;">
59
+ <table role="presentation" border="0" cellpadding="0" cellspacing="0">
60
+ <tr>
61
+ <td style="vertical-align:top;width:600px;">
62
+ <div class="mj-column-per-100 mj-outlook-group-fix" style="font-size:0px;text-align:left;direction:ltr;display:inline-block;vertical-align:top;width:100%;">
63
+ <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="vertical-align:top;" width="100%">
64
+ <tbody>
65
+ <tr>
66
+ <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
67
+ <div style="font-family:Helvetica, Arial, sans-serif;font-size:18px;font-weight:400;line-height:24px;text-align:left;color:#434245;">
68
+ <%= raw I18n.t("mail.auction_context.post_auction.winner_mailer.body.description", title: @auction.title) %>
69
+ </div>
70
+ </td>
71
+ </tr>
72
+ <tr>
73
+ <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
74
+ <div style="font-family:Helvetica, Arial, sans-serif;font-size:18px;font-weight:400;line-height:24px;text-align:left;color:#434245;">
75
+ <ul>
76
+ <li><%= raw I18n.t("mail.auction_context.post_auction.winner_mailer.body.item.title", title: @auction.title) %></li>
77
+ <li><%= I18n.t("mail.auction_context.post_auction.winner_mailer.body.item.winner_bid", winner_bid: @statistics.winner_bid) %></li>
78
+ <li><%= I18n.t("mail.auction_context.post_auction.winner_mailer.body.item.auction_total_bids", auction_total_bids: @statistics.auction_total_bids) %></li>
79
+ <li><%= I18n.t("mail.auction_context.post_auction.winner_mailer.body.item.auction_date") %>: <%= I18n.l(@statistics.auction_date, format: :default) %></li>
80
+ </ul>
81
+ </td>
82
+ </tr>
83
+ <tr>
84
+ <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
85
+ <div style="font-family:Helvetica, Arial, sans-serif;font-size:18px;font-weight:bold;line-height:24px;text-align:left;color:#434245;">
86
+ <%= I18n.t("application.general.team") %>
87
+ </div>
88
+ </td>
89
+ </tr>
90
+ <tr>
91
+ <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
92
+ <table align="left" border="0" cellpadding="0" cellspacing="0" role="presentation">
93
+ <tr>
94
+ <td>
95
+ <table align="left" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
96
+ <tbody>
97
+ <tr>
98
+ <td style="padding:4px;">
99
+ <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:18px;">
100
+ <tbody>
101
+ <tr>
102
+ <td style="font-size:0;height:18px;vertical-align:middle;width:18px;">
103
+ <a href="https://twitter.com/auctionfun" target="_blank" style="color: #2e58ff; text-decoration: none;">
104
+ <img alt="twitter-logo" height="18" src="https://codedmails.com/images/social/black/twitter-logo-transparent-black.png" style="border-radius:3px;display:block;" width="18" />
105
+ </a>
106
+ </td>
107
+ </tr>
108
+ </tbody>
109
+ </table>
110
+ </td>
111
+ </tr>
112
+ </tbody>
113
+ </table>
114
+ </td>
115
+ <td>
116
+ <table align="left" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
117
+ <tbody>
118
+ <tr>
119
+ <td style="padding:4px;">
120
+ <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:18px;">
121
+ <tbody>
122
+ <tr>
123
+ <td style="font-size:0;height:18px;vertical-align:middle;width:18px;">
124
+ <a href="https://facebook.com/auctionfun" target="_blank" style="color: #2e58ff; text-decoration: none;">
125
+ <img alt="facebook-logo" height="18" src="https://codedmails.com/images/social/black/facebook-logo-transparent-black.png" style="border-radius:3px;display:block;" width="18" />
126
+ </a>
127
+ </td>
128
+ </tr>
129
+ </tbody>
130
+ </table>
131
+ </td>
132
+ </tr>
133
+ </tbody>
134
+ </table>
135
+ </td>
136
+ <td>
137
+ <table align="left" border="0" cellpadding="0" cellspacing="0" role="presentation" style="float:none;display:inline-table;">
138
+ <tbody>
139
+ <tr>
140
+ <td style="padding:4px;">
141
+ <table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-radius:3px;width:18px;">
142
+ <tbody>
143
+ <tr>
144
+ <td style="font-size:0;height:18px;vertical-align:middle;width:18px;">
145
+ <a href="https://instagram.com/auctionfun" target="_blank" style="color: #2e58ff; text-decoration: none;">
146
+ <img alt="instagram-logo" height="18" src="https://codedmails.com/images/social/black/instagram-logo-transparent-black.png" style="border-radius:3px;display:block;" width="18" />
147
+ </a>
148
+ </td>
149
+ </tr>
150
+ </tbody>
151
+ </table>
152
+ </td>
153
+ </tr>
154
+ </tbody>
155
+ </table>
156
+ </td>
157
+ </tr>
158
+ </table>
159
+ </td>
160
+ </tr>
161
+ </tbody>
162
+ </table>
163
+ </div>
164
+ </td>
165
+ </tr>
166
+ </table>
167
+ </td>
168
+ </tr>
169
+ </tbody>
170
+ </table>
171
+ </div>
172
+ </td>
173
+ </tr>
174
+ </table>
@@ -29,7 +29,7 @@
29
29
  <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
30
30
  <div style="font-family:Helvetica, Arial, sans-serif;font-size:18px;font-weight:400;line-height:24px;text-align:left;color:#434245;">
31
31
  <h1 style="margin: 0; font-size: 24px; line-height: normal; font-weight: bold;">
32
- <%= I18n.t("mail.general.hello", name: @user.name) %>,
32
+ <%= I18n.t("application.general.hello", name: @user.name) %>,
33
33
  </h1>
34
34
  </div>
35
35
  </td>
@@ -79,7 +79,7 @@
79
79
  <tr>
80
80
  <td align="left" style="font-size:0px;padding:10px 25px;word-break:break-word;">
81
81
  <div style="font-family:Helvetica, Arial, sans-serif;font-size:18px;font-weight:bold;line-height:24px;text-align:left;color:#434245;">
82
- <%= I18n.t("mail.general.team") %>
82
+ <%= I18n.t("application.general.team") %>
83
83
  </div>
84
84
  </td>
85
85
  </tr>
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AuctionFunCore
4
- VERSION = "0.8.5"
4
+ VERSION = "0.8.7"
5
5
 
6
6
  # Required class module is a gem dependency
7
7
  class Version; end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "sidekiq"
4
+
3
5
  module AuctionFunCore
4
6
  module Workers
5
7
  # Abstract base class for background jobs.
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AuctionFunCore
4
+ module Workers
5
+ module Operations
6
+ module AuctionContext
7
+ module PostAuction
8
+ ##
9
+ # BackgroundJob class for call finish auction operation.
10
+ class ParticipantOperationJob < Workers::ApplicationJob
11
+ include Import["repos.user_context.user_repository"]
12
+ include Import["repos.auction_context.auction_repository"]
13
+ include Import["operations.auction_context.post_auction.participant_operation"]
14
+
15
+ # @todo Add detailed documentation
16
+ def perform(auction_id, participant_id, retry_count = 0)
17
+ auction = auction_repository.by_id!(auction_id)
18
+ participant = user_repository.by_id!(participant_id)
19
+
20
+ participant_operation.call(auction_id: auction.id, participant_id: participant.id)
21
+ rescue => e
22
+ capture_exception(e, {auction_id: auction_id, participant_id: participant_id, retry_count: retry_count})
23
+ raise if retry_count >= MAX_RETRIES
24
+
25
+ interval = backoff_exponential_job(retry_count)
26
+ self.class.perform_at(interval, auction_id, participant_id, retry_count + 1)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AuctionFunCore
4
+ module Workers
5
+ module Operations
6
+ module AuctionContext
7
+ module PostAuction
8
+ ##
9
+ # BackgroundJob class for call finish auction operation.
10
+ class WinnerOperationJob < Workers::ApplicationJob
11
+ include Import["repos.user_context.user_repository"]
12
+ include Import["repos.auction_context.auction_repository"]
13
+ include Import["operations.auction_context.post_auction.winner_operation"]
14
+
15
+ # @todo Add detailed documentation
16
+ def perform(auction_id, winner_id, retry_count = 0)
17
+ auction = auction_repository.by_id!(auction_id)
18
+ winner = user_repository.by_id!(winner_id)
19
+
20
+ winner_operation.call(auction_id: auction.id, winner_id: winner.id)
21
+ rescue => e
22
+ capture_exception(e, {auction_id: auction_id, winner_id: winner_id, retry_count: retry_count})
23
+ raise if retry_count >= MAX_RETRIES
24
+
25
+ interval = backoff_exponential_job(retry_count)
26
+ self.class.perform_at(interval, auction_id, winner_id, retry_count + 1)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AuctionFunCore
4
+ module Workers
5
+ module Operations
6
+ module AuctionContext
7
+ module Processor
8
+ module Finish
9
+ ##
10
+ # BackgroundJob class for call finish closed auction operation.
11
+ #
12
+ class ClosedOperationJob < Workers::ApplicationJob
13
+ include Import["repos.auction_context.auction_repository"]
14
+ include Import["operations.auction_context.processor.finish.closed_operation"]
15
+
16
+ # @todo Add detailed documentation
17
+ def perform(auction_id, retry_count = 0)
18
+ auction = auction_repository.by_id!(auction_id)
19
+
20
+ closed_operation.call(auction_id: auction.id)
21
+ rescue => e
22
+ capture_exception(e, {auction_id: auction_id, retry_count: retry_count})
23
+ raise if retry_count >= MAX_RETRIES
24
+
25
+ interval = backoff_exponential_job(retry_count)
26
+ self.class.perform_at(interval, auction_id, retry_count + 1)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AuctionFunCore
4
+ module Workers
5
+ module Operations
6
+ module AuctionContext
7
+ module Processor
8
+ module Finish
9
+ ##
10
+ # BackgroundJob class for call finish penny auction operation.
11
+ #
12
+ class PennyOperationJob < Workers::ApplicationJob
13
+ include Sidekiq::Worker
14
+ include Import["repos.auction_context.auction_repository"]
15
+ include Import["operations.auction_context.processor.finish.penny_operation"]
16
+
17
+ sidekiq_options queue: "default", lock: :until_executed, on_conflict: :replace
18
+
19
+ # @todo Add detailed documentation
20
+ def perform(auction_id, retry_count = 0)
21
+ auction = auction_repository.by_id!(auction_id)
22
+
23
+ penny_operation.call(auction_id: auction.id)
24
+ rescue => e
25
+ capture_exception(e, {auction_id: auction_id, retry_count: retry_count})
26
+ raise if retry_count >= MAX_RETRIES
27
+
28
+ interval = backoff_exponential_job(retry_count)
29
+ self.class.perform_at(interval, auction_id, retry_count + 1)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AuctionFunCore
4
+ module Workers
5
+ module Operations
6
+ module AuctionContext
7
+ module Processor
8
+ module Finish
9
+ ##
10
+ # BackgroundJob class for call finish standard auction operation.
11
+ #
12
+ class StandardOperationJob < Workers::ApplicationJob
13
+ include Import["repos.auction_context.auction_repository"]
14
+ include Import["operations.auction_context.processor.finish.standard_operation"]
15
+
16
+ # @todo Add detailed documentation
17
+ def perform(auction_id, retry_count = 0)
18
+ auction = auction_repository.by_id!(auction_id)
19
+
20
+ standard_operation.call(auction_id: auction.id)
21
+ rescue => e
22
+ capture_exception(e, {auction_id: auction_id, retry_count: retry_count})
23
+ raise if retry_count >= MAX_RETRIES
24
+
25
+ interval = backoff_exponential_job(retry_count)
26
+ self.class.perform_at(interval, auction_id, retry_count + 1)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AuctionFunCore
4
+ module Workers
5
+ module Services
6
+ module Mail
7
+ module AuctionContext
8
+ module PostAuction
9
+ ##
10
+ # Background job class responsible for adding emails to the queue.
11
+ #
12
+ class ParticipantMailerJob < AuctionFunCore::Workers::ApplicationJob
13
+ include Import["repos.user_context.user_repository"]
14
+ include Import["repos.auction_context.auction_repository"]
15
+
16
+ # @param auction_id [Integer] auction ID
17
+ # @param participant_id [Integer] user ID
18
+ def perform(auction_id, participant_id, retry_count = 0)
19
+ auction = auction_repository.by_id!(auction_id)
20
+ participant = user_repository.by_id!(participant_id)
21
+
22
+ statistics = relation.load_participant_statistics.call(auction.id, participant.id).first
23
+
24
+ participant_mailer.new(auction, participant, statistics).deliver
25
+ rescue => e
26
+ capture_exception(e, {auction_id: auction_id, participant_id: participant_id, retry_count: retry_count})
27
+ raise e if retry_count >= MAX_RETRIES
28
+
29
+ interval = backoff_exponential_job(retry_count)
30
+ self.class.perform_at(interval, auction_id, participant_id, retry_count + 1)
31
+ end
32
+
33
+ private
34
+
35
+ # Since the shipping code structure does not follow project conventions,
36
+ # making the default injection dependency would be more complicated.
37
+ # Therefore, here I directly explain the class to be called.
38
+ def participant_mailer
39
+ AuctionFunCore::Services::Mail::AuctionContext::PostAuction::ParticipantMailer
40
+ end
41
+
42
+ def relation
43
+ AuctionFunCore::Application[:container].relations[:auctions]
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AuctionFunCore
4
+ module Workers
5
+ module Services
6
+ module Mail
7
+ module AuctionContext
8
+ module PostAuction
9
+ ##
10
+ # Background job class responsible for adding emails to the queue.
11
+ #
12
+ class WinnerMailerJob < AuctionFunCore::Workers::ApplicationJob
13
+ include Import["repos.user_context.user_repository"]
14
+ include Import["repos.auction_context.auction_repository"]
15
+
16
+ # @param auction_id [Integer] auction ID
17
+ # @param winner_id [Integer] user ID
18
+ def perform(auction_id, winner_id, retry_count = 0)
19
+ auction = auction_repository.by_id!(auction_id)
20
+ winner = user_repository.by_id!(winner_id)
21
+
22
+ statistics = relation.load_winner_statistics.call(auction_id, winner_id).first
23
+
24
+ winner_mailer.new(auction, winner, statistics).deliver
25
+ rescue => e
26
+ capture_exception(e, {auction_id: auction_id, winner_id: winner_id, retry_count: retry_count})
27
+ raise e if retry_count >= MAX_RETRIES
28
+
29
+ interval = backoff_exponential_job(retry_count)
30
+ self.class.perform_at(interval, auction_id, winner_id, retry_count + 1)
31
+ end
32
+
33
+ private
34
+
35
+ # Since the shipping code structure does not follow project conventions,
36
+ # making the default injection dependency would be more complicated.
37
+ # Therefore, here I directly explain the class to be called.
38
+ def winner_mailer
39
+ AuctionFunCore::Services::Mail::AuctionContext::PostAuction::WinnerMailer
40
+ end
41
+
42
+ def relation
43
+ AuctionFunCore::Application[:container].relations[:auctions]
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -3,13 +3,32 @@
3
3
  AuctionFunCore::Application.register_provider(:background_job) do
4
4
  prepare do
5
5
  require "sidekiq"
6
+ require "sidekiq-unique-jobs"
6
7
  end
7
8
 
8
9
  start do
9
10
  Sidekiq.configure_server do |config|
11
+ config.redis = {url: target[:settings].redis_url}
10
12
  config.logger = target[:settings].logger
11
13
  config.average_scheduled_poll_interval = 3
14
+
15
+ config.client_middleware do |chain|
16
+ chain.add SidekiqUniqueJobs::Middleware::Client
17
+ end
18
+
19
+ config.server_middleware do |chain|
20
+ chain.add SidekiqUniqueJobs::Middleware::Server
21
+ end
22
+
23
+ SidekiqUniqueJobs::Server.configure(config)
24
+ end
25
+
26
+ Sidekiq.configure_client do |config|
12
27
  config.redis = {url: target[:settings].redis_url}
28
+
29
+ config.client_middleware do |chain|
30
+ chain.add SidekiqUniqueJobs::Middleware::Client
31
+ end
13
32
  end
14
33
  end
15
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: auction_fun_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.5
4
+ version: 0.8.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ricardo Pacheco
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-04-03 00:00:00.000000000 Z
11
+ date: 2024-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -234,6 +234,20 @@ dependencies:
234
234
  - - '='
235
235
  - !ruby/object:Gem::Version
236
236
  version: 7.2.2
237
+ - !ruby/object:Gem::Dependency
238
+ name: sidekiq-unique-jobs
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - '='
242
+ - !ruby/object:Gem::Version
243
+ version: 8.0.10
244
+ type: :runtime
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - '='
249
+ - !ruby/object:Gem::Version
250
+ version: 8.0.10
237
251
  - !ruby/object:Gem::Dependency
238
252
  name: yard
239
253
  requirement: !ruby/object:Gem::Requirement
@@ -295,8 +309,14 @@ files:
295
309
  - db/migrate/20240304144422_create_bids.rb
296
310
  - db/seeds.rb
297
311
  - i18n/en-US/contracts/contracts.en-US.yml
312
+ - i18n/en-US/mail/application.en-US.yml
313
+ - i18n/en-US/mail/auction_context/post_auction/participant.en-US.yml
314
+ - i18n/en-US/mail/auction_context/post_auction/winner.en-US.yml
298
315
  - i18n/en-US/mail/user_context/registration.en-US.yml
299
316
  - i18n/pt-BR/contracts/contracts.pt-BR.yml
317
+ - i18n/pt-BR/mail/application.pt-BR.yml
318
+ - i18n/pt-BR/mail/auction_context/post_auction/participant.pt-BR.yml
319
+ - i18n/pt-BR/mail/auction_context/post_auction/winner.pt-BR.yml
300
320
  - i18n/pt-BR/mail/user_context/registration.pt-BR.yml
301
321
  - lib/auction_fun_core.rb
302
322
  - lib/auction_fun_core/business/configuration.rb
@@ -311,7 +331,11 @@ files:
311
331
  - lib/auction_fun_core/commands/user_context/create_user.rb
312
332
  - lib/auction_fun_core/contracts/application_contract.rb
313
333
  - lib/auction_fun_core/contracts/auction_context/create_contract.rb
314
- - lib/auction_fun_core/contracts/auction_context/processor/finish_contract.rb
334
+ - lib/auction_fun_core/contracts/auction_context/post_auction/participant_contract.rb
335
+ - lib/auction_fun_core/contracts/auction_context/post_auction/winner_contract.rb
336
+ - lib/auction_fun_core/contracts/auction_context/processor/finish/closed_contract.rb
337
+ - lib/auction_fun_core/contracts/auction_context/processor/finish/penny_contract.rb
338
+ - lib/auction_fun_core/contracts/auction_context/processor/finish/standard_contract.rb
315
339
  - lib/auction_fun_core/contracts/auction_context/processor/pause_contract.rb
316
340
  - lib/auction_fun_core/contracts/auction_context/processor/start_contract.rb
317
341
  - lib/auction_fun_core/contracts/auction_context/processor/unpause_contract.rb
@@ -331,7 +355,11 @@ files:
331
355
  - lib/auction_fun_core/events/app.rb
332
356
  - lib/auction_fun_core/events/listener.rb
333
357
  - lib/auction_fun_core/operations/auction_context/create_operation.rb
334
- - lib/auction_fun_core/operations/auction_context/processor/finish_operation.rb
358
+ - lib/auction_fun_core/operations/auction_context/post_auction/participant_operation.rb
359
+ - lib/auction_fun_core/operations/auction_context/post_auction/winner_operation.rb
360
+ - lib/auction_fun_core/operations/auction_context/processor/finish/closed_operation.rb
361
+ - lib/auction_fun_core/operations/auction_context/processor/finish/penny_operation.rb
362
+ - lib/auction_fun_core/operations/auction_context/processor/finish/standard_operation.rb
335
363
  - lib/auction_fun_core/operations/auction_context/processor/pause_operation.rb
336
364
  - lib/auction_fun_core/operations/auction_context/processor/start_operation.rb
337
365
  - lib/auction_fun_core/operations/auction_context/processor/unpause_operation.rb
@@ -353,13 +381,23 @@ files:
353
381
  - lib/auction_fun_core/repos/bid_context/bid_repository.rb
354
382
  - lib/auction_fun_core/repos/staff_context/staff_repository.rb
355
383
  - lib/auction_fun_core/repos/user_context/user_repository.rb
384
+ - lib/auction_fun_core/services/mail/auction_context/post_auction/participant_mailer.rb
385
+ - lib/auction_fun_core/services/mail/auction_context/post_auction/winner_mailer.rb
386
+ - lib/auction_fun_core/services/mail/templates/auction_context/post_auction/participant.html.erb
387
+ - lib/auction_fun_core/services/mail/templates/auction_context/post_auction/winner.html.erb
356
388
  - lib/auction_fun_core/services/mail/templates/layout.html.erb
357
389
  - lib/auction_fun_core/services/mail/templates/user_context/registration.html.erb
358
390
  - lib/auction_fun_core/services/mail/user_context/registration_mailer.rb
359
391
  - lib/auction_fun_core/version.rb
360
392
  - lib/auction_fun_core/workers/application_job.rb
361
- - lib/auction_fun_core/workers/operations/auction_context/processor/finish_operation_job.rb
393
+ - lib/auction_fun_core/workers/operations/auction_context/post_auction/participant_operation_job.rb
394
+ - lib/auction_fun_core/workers/operations/auction_context/post_auction/winner_operation_job.rb
395
+ - lib/auction_fun_core/workers/operations/auction_context/processor/finish/closed_operation_job.rb
396
+ - lib/auction_fun_core/workers/operations/auction_context/processor/finish/penny_operation_job.rb
397
+ - lib/auction_fun_core/workers/operations/auction_context/processor/finish/standard_operation_job.rb
362
398
  - lib/auction_fun_core/workers/operations/auction_context/processor/start_operation_job.rb
399
+ - lib/auction_fun_core/workers/services/mail/auction_context/post_auction/participant_mailer_job.rb
400
+ - lib/auction_fun_core/workers/services/mail/auction_context/post_auction/winner_mailer_job.rb
363
401
  - lib/auction_fun_core/workers/services/mail/user_context/registration_mailer_job.rb
364
402
  - lib/tasks/database.rake
365
403
  - system/providers/background_job.rb