Skip to content

Commit 91e376e

Browse files
authored
Integrate with outboxer (#56)
1 parent ebcb1e4 commit 91e376e

23 files changed

+419
-26
lines changed

Gemfile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
33

44
ruby "3.1.6"
55

6+
gem "concurrent-ruby", "1.3.4"
7+
68
gem "rails", "7.0.8.6"
79

810
gem "sinatra"
@@ -14,6 +16,8 @@ gem "activerecord"
1416

1517
gem "sidekiq"
1618

19+
gem "outboxer", git: 'https://github.com/fast-programmer/outboxer.git', branch: "master"
20+
1721
group :development do
1822
end
1923

Gemfile.lock

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
GIT
2+
remote: https://github.com/fast-programmer/outboxer.git
3+
revision: 0322c17658d7a1a0448c95a4570985d8d0b3158a
4+
branch: master
5+
specs:
6+
outboxer (1.0.0.pre.beta)
7+
activerecord (>= 7.0.8.6)
8+
19
GEM
210
remote: https://rubygems.org/
311
specs:
@@ -70,7 +78,7 @@ GEM
7078
builder (3.2.4)
7179
byebug (11.1.3)
7280
coderay (1.1.3)
73-
concurrent-ruby (1.2.3)
81+
concurrent-ruby (1.3.4)
7482
connection_pool (2.4.1)
7583
crass (1.0.6)
7684
database_cleaner-active_record (2.2.0)
@@ -87,7 +95,7 @@ GEM
8795
railties (>= 5.0.0)
8896
globalid (1.2.1)
8997
activesupport (>= 6.1)
90-
i18n (1.14.4)
98+
i18n (1.14.7)
9199
concurrent-ruby (~> 1.0)
92100
loofah (2.22.0)
93101
crass (~> 1.0.2)
@@ -101,7 +109,7 @@ GEM
101109
method_source (1.0.0)
102110
mini_mime (1.1.5)
103111
mini_portile2 (2.8.5)
104-
minitest (5.22.3)
112+
minitest (5.25.4)
105113
mustermann (3.0.3)
106114
ruby2_keywords (~> 0.0.1)
107115
net-imap (0.5.1)
@@ -210,8 +218,10 @@ PLATFORMS
210218

211219
DEPENDENCIES
212220
activerecord
221+
concurrent-ruby (= 1.3.4)
213222
database_cleaner-active_record
214223
factory_bot_rails
224+
outboxer!
215225
pg
216226
pry-byebug
217227
puma
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module OutboxerIntegration
2+
class CompleteTestJob
3+
include Sidekiq::Job
4+
5+
def perform(args)
6+
TestService.complete(event_id: args["event_id"])
7+
end
8+
end
9+
end
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
module OutboxerIntegration
2+
class PublishMessageJob
3+
include Sidekiq::Job
4+
5+
def perform(args)
6+
job_class_name = to_job_class_name(messageable_type: args["messageable_type"])
7+
job_class_name&.safe_constantize&.perform_async("event_id" => args["messageable_id"])
8+
end
9+
10+
def to_job_class_name(messageable_type:)
11+
captures = messageable_type.match(/\A(?:(\w+)::)?(\w+)Event\z/)&.captures
12+
return if captures.nil?
13+
14+
captures[0] ? "#{captures[0]}::#{captures[1]}Job" : "#{captures[1]}Job"
15+
end
16+
end
17+
end
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module OutboxerIntegration
2+
class TestStartedJob
3+
include Sidekiq::Job
4+
5+
def perform(args)
6+
CompleteTestJob.perform_async({ "event_id" => args["event_id"] })
7+
end
8+
end
9+
end

app/models/event.rb

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
class Event < ApplicationRecord
2-
self.table_name = 'events'
2+
self.table_name = "events"
33

44
# associations
55

66
belongs_to :eventable, polymorphic: true
77

88
# validations
99

10-
validates :user_id, presence: true
11-
validates :tenant_id, presence: true
12-
1310
validates :type, presence: true, length: { maximum: 255 }
1411

15-
validates :eventable_type, presence: true, length: { maximum: 255 },
16-
if: -> { eventable_id.present? }
12+
# callbacks
1713

18-
validates :eventable_id, presence: true, if: -> { eventable_type.present? }
14+
after_create do |event|
15+
Outboxer::Message.queue(messageable: event)
16+
end
1917
end
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module OutboxerIntegration
2+
class Test < ApplicationRecord
3+
self.table_name = "outboxer_integration_tests"
4+
5+
has_many :events, as: :eventable
6+
end
7+
end
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module OutboxerIntegration
2+
class TestCompletedEvent < Event
3+
end
4+
end
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module OutboxerIntegration
2+
class TestStartedEvent < Event
3+
end
4+
end
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
module OutboxerIntegration
2+
module TestService
3+
module_function
4+
5+
def start
6+
ActiveRecord::Base.transaction do
7+
test = Test.create!
8+
9+
event = TestStartedEvent.create!(
10+
eventable: test,
11+
body: {
12+
"test" => {
13+
"id" => test.id
14+
}
15+
})
16+
17+
{ id: test.id, events: [{ id: event.id, type: event.type }] }
18+
end
19+
end
20+
21+
def complete(event_id:)
22+
ActiveRecord::Base.transaction do
23+
started_event = TestStartedEvent.find(event_id)
24+
test = started_event.eventable
25+
test.touch
26+
27+
event = TestCompletedEvent.create!(
28+
eventable: test,
29+
body: {
30+
"test" => {
31+
"id" => test.id
32+
}
33+
})
34+
35+
{ id: test.id, events: [{ id: event.id, type: event.type }] }
36+
end
37+
end
38+
end
39+
end

0 commit comments

Comments
 (0)