cyclone_lariat 0.3.10 → 1.0.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/gem-push.yml +4 -4
  3. data/.gitignore +6 -0
  4. data/.rubocop.yml +30 -1
  5. data/CHANGELOG.md +11 -1
  6. data/Gemfile.lock +137 -30
  7. data/Guardfile +42 -0
  8. data/README.md +715 -143
  9. data/Rakefile +2 -5
  10. data/bin/cyclone_lariat +206 -0
  11. data/cyclone_lariat.gemspec +13 -2
  12. data/lib/cyclone_lariat/clients/abstract.rb +40 -0
  13. data/lib/cyclone_lariat/clients/sns.rb +163 -0
  14. data/lib/cyclone_lariat/clients/sqs.rb +114 -0
  15. data/lib/cyclone_lariat/core.rb +21 -0
  16. data/lib/cyclone_lariat/errors.rb +38 -0
  17. data/lib/cyclone_lariat/fake.rb +19 -0
  18. data/lib/cyclone_lariat/generators/command.rb +53 -0
  19. data/lib/cyclone_lariat/generators/event.rb +52 -0
  20. data/lib/cyclone_lariat/generators/queue.rb +30 -0
  21. data/lib/cyclone_lariat/generators/topic.rb +29 -0
  22. data/lib/cyclone_lariat/messages/v1/abstract.rb +139 -0
  23. data/lib/cyclone_lariat/messages/v1/command.rb +20 -0
  24. data/lib/cyclone_lariat/messages/v1/event.rb +20 -0
  25. data/lib/cyclone_lariat/messages/v1/validator.rb +31 -0
  26. data/lib/cyclone_lariat/messages/v2/abstract.rb +149 -0
  27. data/lib/cyclone_lariat/messages/v2/command.rb +20 -0
  28. data/lib/cyclone_lariat/messages/v2/event.rb +20 -0
  29. data/lib/cyclone_lariat/messages/v2/validator.rb +39 -0
  30. data/lib/cyclone_lariat/middleware.rb +9 -5
  31. data/lib/cyclone_lariat/migration.rb +151 -0
  32. data/lib/cyclone_lariat/options.rb +52 -0
  33. data/lib/cyclone_lariat/presenters/graph.rb +54 -0
  34. data/lib/cyclone_lariat/presenters/queues.rb +41 -0
  35. data/lib/cyclone_lariat/presenters/subscriptions.rb +34 -0
  36. data/lib/cyclone_lariat/presenters/topics.rb +40 -0
  37. data/lib/cyclone_lariat/publisher.rb +25 -0
  38. data/lib/cyclone_lariat/repo/active_record/messages.rb +92 -0
  39. data/lib/cyclone_lariat/repo/active_record/versions.rb +28 -0
  40. data/lib/cyclone_lariat/repo/messages.rb +43 -0
  41. data/lib/cyclone_lariat/repo/messages_mapper.rb +49 -0
  42. data/lib/cyclone_lariat/repo/sequel/messages.rb +73 -0
  43. data/lib/cyclone_lariat/repo/sequel/versions.rb +28 -0
  44. data/lib/cyclone_lariat/repo/versions.rb +42 -0
  45. data/lib/cyclone_lariat/resources/queue.rb +167 -0
  46. data/lib/cyclone_lariat/resources/topic.rb +132 -0
  47. data/lib/cyclone_lariat/services/migrate.rb +51 -0
  48. data/lib/cyclone_lariat/services/rollback.rb +51 -0
  49. data/lib/cyclone_lariat/version.rb +1 -1
  50. data/lib/cyclone_lariat.rb +4 -10
  51. data/lib/tasks/console.rake +13 -0
  52. data/lib/tasks/cyclone_lariat.rake +42 -0
  53. data/lib/tasks/db.rake +0 -15
  54. metadata +161 -20
  55. data/config/db.example.rb +0 -9
  56. data/db/migrate/01_add_uuid_extensions.rb +0 -15
  57. data/db/migrate/02_add_events.rb +0 -19
  58. data/docs/_imgs/diagram.png +0 -0
  59. data/docs/_imgs/lariat.jpg +0 -0
  60. data/lib/cyclone_lariat/abstract/client.rb +0 -106
  61. data/lib/cyclone_lariat/abstract/message.rb +0 -83
  62. data/lib/cyclone_lariat/command.rb +0 -13
  63. data/lib/cyclone_lariat/configure.rb +0 -15
  64. data/lib/cyclone_lariat/event.rb +0 -13
  65. data/lib/cyclone_lariat/messages_mapper.rb +0 -46
  66. data/lib/cyclone_lariat/messages_repo.rb +0 -60
  67. data/lib/cyclone_lariat/sns_client.rb +0 -38
  68. data/lib/cyclone_lariat/sqs_client.rb +0 -39
metadata CHANGED
@@ -1,15 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cyclone_lariat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.10
4
+ version: 1.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Kudrin
8
8
  - Philip Sorokin
9
+ - Kirill Drozdov
10
+ - Vitaly Perminov
9
11
  autorequire:
10
12
  bindir: bin
11
13
  cert_chain: []
12
- date: 2022-10-06 00:00:00.000000000 Z
14
+ date: 2023-01-30 00:00:00.000000000 Z
13
15
  dependencies:
14
16
  - !ruby/object:Gem::Dependency
15
17
  name: aws-sdk-sns
@@ -39,6 +41,34 @@ dependencies:
39
41
  - - ">="
40
42
  - !ruby/object:Gem::Version
41
43
  version: '0'
44
+ - !ruby/object:Gem::Dependency
45
+ name: dry-cli
46
+ requirement: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - "~>"
49
+ - !ruby/object:Gem::Version
50
+ version: '0.6'
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '0.6'
58
+ - !ruby/object:Gem::Dependency
59
+ name: dry-validation
60
+ requirement: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - "~>"
63
+ - !ruby/object:Gem::Version
64
+ version: '1.5'
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '1.5'
42
72
  - !ruby/object:Gem::Dependency
43
73
  name: luna_park
44
74
  requirement: !ruby/object:Gem::Requirement
@@ -53,6 +83,20 @@ dependencies:
53
83
  - - "~>"
54
84
  - !ruby/object:Gem::Version
55
85
  version: '0.11'
86
+ - !ruby/object:Gem::Dependency
87
+ name: terminal-table
88
+ requirement: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - "~>"
91
+ - !ruby/object:Gem::Version
92
+ version: '3.0'
93
+ type: :runtime
94
+ prerelease: false
95
+ version_requirements: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '3.0'
56
100
  - !ruby/object:Gem::Dependency
57
101
  name: bundler
58
102
  requirement: !ruby/object:Gem::Requirement
@@ -81,6 +125,20 @@ dependencies:
81
125
  - - "~>"
82
126
  - !ruby/object:Gem::Version
83
127
  version: '11.1'
128
+ - !ruby/object:Gem::Dependency
129
+ name: database_cleaner-active_record
130
+ requirement: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ type: :development
136
+ prerelease: false
137
+ version_requirements: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
84
142
  - !ruby/object:Gem::Dependency
85
143
  name: database_cleaner-sequel
86
144
  requirement: !ruby/object:Gem::Requirement
@@ -95,6 +153,62 @@ dependencies:
95
153
  - - "~>"
96
154
  - !ruby/object:Gem::Version
97
155
  version: '2.0'
156
+ - !ruby/object:Gem::Dependency
157
+ name: guard
158
+ requirement: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ type: :development
164
+ prerelease: false
165
+ version_requirements: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ - !ruby/object:Gem::Dependency
171
+ name: guard-bundler
172
+ requirement: !ruby/object:Gem::Requirement
173
+ requirements:
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
177
+ type: :development
178
+ prerelease: false
179
+ version_requirements: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - ">="
182
+ - !ruby/object:Gem::Version
183
+ version: '0'
184
+ - !ruby/object:Gem::Dependency
185
+ name: guard-rspec
186
+ requirement: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - ">="
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
191
+ type: :development
192
+ prerelease: false
193
+ version_requirements: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - ">="
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ - !ruby/object:Gem::Dependency
199
+ name: guard-rubocop
200
+ requirement: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: '0'
205
+ type: :development
206
+ prerelease: false
207
+ version_requirements: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: '0'
98
212
  - !ruby/object:Gem::Dependency
99
213
  name: pg
100
214
  requirement: !ruby/object:Gem::Requirement
@@ -238,7 +352,8 @@ dependencies:
238
352
  description:
239
353
  email:
240
354
  - kudrin.alexander@gmail.com
241
- executables: []
355
+ executables:
356
+ - cyclone_lariat
242
357
  extensions: []
243
358
  extra_rdoc_files: []
244
359
  files:
@@ -252,32 +367,57 @@ files:
252
367
  - Dockerfile
253
368
  - Gemfile
254
369
  - Gemfile.lock
370
+ - Guardfile
255
371
  - README.md
256
372
  - Rakefile
373
+ - bin/cyclone_lariat
257
374
  - bin/docker/diff
258
375
  - bin/docker/init
259
376
  - bin/docker/privatekey
260
377
  - bin/docker/rm
261
- - config/db.example.rb
262
378
  - cyclone_lariat.gemspec
263
- - db/migrate/01_add_uuid_extensions.rb
264
- - db/migrate/02_add_events.rb
265
379
  - docker-compose.yml
266
- - docs/_imgs/diagram.png
267
- - docs/_imgs/lariat.jpg
268
380
  - lib/cyclone_lariat.rb
269
- - lib/cyclone_lariat/abstract/client.rb
270
- - lib/cyclone_lariat/abstract/message.rb
271
- - lib/cyclone_lariat/command.rb
272
- - lib/cyclone_lariat/configure.rb
381
+ - lib/cyclone_lariat/clients/abstract.rb
382
+ - lib/cyclone_lariat/clients/sns.rb
383
+ - lib/cyclone_lariat/clients/sqs.rb
384
+ - lib/cyclone_lariat/core.rb
273
385
  - lib/cyclone_lariat/errors.rb
274
- - lib/cyclone_lariat/event.rb
275
- - lib/cyclone_lariat/messages_mapper.rb
276
- - lib/cyclone_lariat/messages_repo.rb
386
+ - lib/cyclone_lariat/fake.rb
387
+ - lib/cyclone_lariat/generators/command.rb
388
+ - lib/cyclone_lariat/generators/event.rb
389
+ - lib/cyclone_lariat/generators/queue.rb
390
+ - lib/cyclone_lariat/generators/topic.rb
391
+ - lib/cyclone_lariat/messages/v1/abstract.rb
392
+ - lib/cyclone_lariat/messages/v1/command.rb
393
+ - lib/cyclone_lariat/messages/v1/event.rb
394
+ - lib/cyclone_lariat/messages/v1/validator.rb
395
+ - lib/cyclone_lariat/messages/v2/abstract.rb
396
+ - lib/cyclone_lariat/messages/v2/command.rb
397
+ - lib/cyclone_lariat/messages/v2/event.rb
398
+ - lib/cyclone_lariat/messages/v2/validator.rb
277
399
  - lib/cyclone_lariat/middleware.rb
278
- - lib/cyclone_lariat/sns_client.rb
279
- - lib/cyclone_lariat/sqs_client.rb
400
+ - lib/cyclone_lariat/migration.rb
401
+ - lib/cyclone_lariat/options.rb
402
+ - lib/cyclone_lariat/presenters/graph.rb
403
+ - lib/cyclone_lariat/presenters/queues.rb
404
+ - lib/cyclone_lariat/presenters/subscriptions.rb
405
+ - lib/cyclone_lariat/presenters/topics.rb
406
+ - lib/cyclone_lariat/publisher.rb
407
+ - lib/cyclone_lariat/repo/active_record/messages.rb
408
+ - lib/cyclone_lariat/repo/active_record/versions.rb
409
+ - lib/cyclone_lariat/repo/messages.rb
410
+ - lib/cyclone_lariat/repo/messages_mapper.rb
411
+ - lib/cyclone_lariat/repo/sequel/messages.rb
412
+ - lib/cyclone_lariat/repo/sequel/versions.rb
413
+ - lib/cyclone_lariat/repo/versions.rb
414
+ - lib/cyclone_lariat/resources/queue.rb
415
+ - lib/cyclone_lariat/resources/topic.rb
416
+ - lib/cyclone_lariat/services/migrate.rb
417
+ - lib/cyclone_lariat/services/rollback.rb
280
418
  - lib/cyclone_lariat/version.rb
419
+ - lib/tasks/console.rake
420
+ - lib/tasks/cyclone_lariat.rake
281
421
  - lib/tasks/db.rake
282
422
  homepage: https://am-team.github.io/cyclone_lariat/#/
283
423
  licenses:
@@ -295,11 +435,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
295
435
  version: 2.4.0
296
436
  required_rubygems_version: !ruby/object:Gem::Requirement
297
437
  requirements:
298
- - - ">="
438
+ - - ">"
299
439
  - !ruby/object:Gem::Version
300
- version: '0'
440
+ version: 1.3.1
301
441
  requirements: []
302
- rubygems_version: 3.0.3.1
442
+ rubyforge_project:
443
+ rubygems_version: 2.6.14.4
303
444
  signing_key:
304
445
  specification_version: 4
305
446
  summary: Shoryuken middleware for LunaPark based application.
data/config/db.example.rb DELETED
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- DB_CONF = {
4
- adapter: 'postgresql',
5
- host: ENV.fetch('DB_HOST', 'host'),
6
- username: ENV.fetch('DB_USER', 'postgres'),
7
- password: ENV.fetch('DB_PASSWORD', 'password'),
8
- database: ENV.fetch('DB_NAME', 'cyclone-lariat-test')
9
- }.freeze
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- Sequel.migration do
4
- up do
5
- run <<-SQL
6
- CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
7
- SQL
8
- end
9
-
10
- down do
11
- run <<-SQL
12
- DROP EXTENSION IF EXISTS "uuid-ossp";
13
- SQL
14
- end
15
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- Sequel.migration do
4
- change do
5
- create_table :async_messages do
6
- column :uuid, :uuid, primary_key: true
7
- String :kind, null: false
8
- String :type, null: false
9
- Integer :version, null: false
10
- String :publisher, null: false
11
- column :data, :json, null: false
12
- String :client_error_message, null: true, default: nil
13
- column :client_error_details, :json, null: true, default: nil
14
- DateTime :sent_at, null: true, default: nil
15
- DateTime :received_at, null: false, default: Sequel::CURRENT_TIMESTAMP
16
- DateTime :processed_at, null: true, default: nil
17
- end
18
- end
19
- end
Binary file
Binary file
@@ -1,106 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # require 'aws-sdk-sns'
4
- require 'luna_park/extensions/injector'
5
- require_relative '../event'
6
- require_relative '../command'
7
- require_relative '../errors'
8
-
9
- module CycloneLariat
10
- module Abstract
11
- class Client
12
- include LunaPark::Extensions::Injector
13
-
14
- dependency(:aws_client_class) { raise ArgumentError, 'Client class should be defined' }
15
- dependency(:aws_credentials_class) { Aws::Credentials }
16
-
17
- def initialize(key: nil, secret_key: nil, region: nil, version: nil, publisher: nil, instance: nil, client_id: nil)
18
- @key = key
19
- @secret_key = secret_key
20
- @region = region
21
- @version = version
22
- @publisher = publisher
23
- @instance = instance
24
- @client_id = client_id
25
- end
26
-
27
- def event(type, data: {}, version: self.version, uuid: SecureRandom.uuid)
28
- Event.wrap(
29
- uuid: uuid,
30
- type: type,
31
- sent_at: Time.now.iso8601,
32
- version: version,
33
- publisher: publisher,
34
- data: data
35
- )
36
- end
37
-
38
- def command(type, data: {}, version: self.version, uuid: SecureRandom.uuid)
39
- Command.wrap(
40
- uuid: uuid,
41
- type: type,
42
- sent_at: Time.now.iso8601,
43
- version: version,
44
- publisher: publisher,
45
- data: data
46
- )
47
- end
48
-
49
- def publish
50
- raise LunaPark::Errors::AbstractMethod, 'Publish method should be defined'
51
- end
52
-
53
- class << self
54
- def version(version = nil)
55
- version.nil? ? @version || CycloneLariat.default_version : @version = version
56
- end
57
-
58
- def instance(instance = nil)
59
- instance.nil? ? @instance || CycloneLariat.default_instance || (raise 'You should define instance') : @instance = instance
60
- end
61
-
62
- def publisher(publisher = nil)
63
- publisher.nil? ? @publisher || CycloneLariat.publisher || (raise 'You should define publisher') : @publisher = publisher
64
- end
65
- end
66
-
67
- def version
68
- @version ||= self.class.version
69
- end
70
-
71
- def publisher
72
- @publisher ||= self.class.publisher
73
- end
74
-
75
- def instance
76
- @instance ||= self.class.instance
77
- end
78
-
79
- def key
80
- @key ||= CycloneLariat.aws_key
81
- end
82
-
83
- def secret_key
84
- @secret_key ||= CycloneLariat.aws_secret_key
85
- end
86
-
87
- def region
88
- @region ||= CycloneLariat.aws_default_region
89
- end
90
-
91
- def client_id
92
- @client_id ||= CycloneLariat.aws_client_id
93
- end
94
-
95
- private
96
-
97
- def aws_client
98
- @aws_client ||= aws_client_class.new(credentials: aws_credentials, region: region)
99
- end
100
-
101
- def aws_credentials
102
- @aws_credentials ||= aws_credentials_class.new(key, secret_key)
103
- end
104
- end
105
- end
106
- end
@@ -1,83 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'luna_park/entities/attributable'
4
- require_relative '../errors'
5
-
6
- module CycloneLariat
7
- module Abstract
8
- class Message < LunaPark::Entities::Attributable
9
- attr :uuid, String, :new
10
- attr :publisher, String, :new
11
- attr :type, String, :new
12
- attrs :client_error, :version, :data,
13
- :sent_at, :processed_at, :received_at
14
-
15
- def kind
16
- raise LunaPark::Errors::AbstractMethod
17
- end
18
-
19
- def version=(value)
20
- @version = Integer(value)
21
- end
22
-
23
- def sent_at=(value)
24
- @sent_at = wrap_time(value)
25
- end
26
-
27
- def received_at=(value)
28
- @received_at = wrap_time(value)
29
- end
30
-
31
- def processed_at=(value)
32
- @processed_at = wrap_time(value)
33
- end
34
-
35
- def processed?
36
- !@processed_at.nil?
37
- end
38
-
39
- def client_error_message=(txt)
40
- return unless txt
41
-
42
- @client_error ||= Errors::ClientError.new
43
- @client_error.message = txt
44
- end
45
-
46
- def client_error_details=(details)
47
- return unless details
48
-
49
- @client_error ||= Errors::ClientError.new
50
- @client_error.details = details
51
- end
52
-
53
- def ==(other)
54
- kind == other.kind &&
55
- uuid == other.uuid &&
56
- publisher == other.publisher &&
57
- type == other.type &&
58
- client_error&.message == other.client_error&.message &&
59
- version == other.version &&
60
- sent_at.to_i == other.sent_at.to_i &&
61
- received_at.to_i == other.received_at.to_i &&
62
- processed_at.to_i == other.processed_at.to_i
63
- end
64
-
65
- def to_json(*args)
66
- hash = serialize
67
- hash[:type] = [kind, hash[:type]].join '_'
68
- hash.to_json(*args)
69
- end
70
-
71
- private
72
-
73
- def wrap_time(value)
74
- case value
75
- when String then Time.parse(value)
76
- when Time then value
77
- when NilClass then nil
78
- else raise ArgumentError, "Unknown type `#{value.class}`"
79
- end
80
- end
81
- end
82
- end
83
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'abstract/message'
4
-
5
- module CycloneLariat
6
- class Command < Abstract::Message
7
- KIND = 'command'
8
-
9
- def kind
10
- KIND
11
- end
12
- end
13
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module CycloneLariat
4
- class << self
5
- DEFAULT_VERSION = 1
6
-
7
- attr_accessor :aws_key, :aws_secret_key, :publisher, :aws_default_region, :default_instance,
8
- :aws_client_id
9
- attr_writer :default_version
10
-
11
- def default_version
12
- @default_version ||= DEFAULT_VERSION
13
- end
14
- end
15
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'abstract/message'
4
-
5
- module CycloneLariat
6
- class Event < Abstract::Message
7
- KIND = 'event'
8
-
9
- def kind
10
- KIND
11
- end
12
- end
13
- end
@@ -1,46 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module CycloneLariat
4
- class MessagesMapper
5
- class << self
6
- def from_row(row)
7
- return if row.nil?
8
-
9
- row[:data] = hash_from_json_column(row[:data])
10
- row[:client_error_details] = hash_from_json_column(row[:client_error_details]) if row[:client_error_details]
11
- row
12
- end
13
-
14
- def to_row(input)
15
- {
16
- uuid: input.uuid,
17
- kind: input.kind,
18
- type: input.type,
19
- publisher: input.publisher,
20
- data: JSON.generate(input.data),
21
- client_error_message: input.client_error&.message,
22
- client_error_details: JSON.generate(input.client_error&.details),
23
- version: input.version,
24
- sent_at: input.sent_at
25
- }
26
- end
27
-
28
- private
29
-
30
- def hash_from_json_column(data)
31
- return JSON.parse(data) if data.is_a?(String)
32
-
33
- if pg_json_extension_enabled?
34
- return data.to_h if data.is_a?(Sequel::Postgres::JSONHash)
35
- return JSON.parse(data.to_s) if data.is_a?(Sequel::Postgres::JSONString)
36
- end
37
-
38
- raise ArgumentError, "Unknown type of `#{data}`"
39
- end
40
-
41
- def pg_json_extension_enabled?
42
- Object.const_defined?('Sequel::Postgres::JSONHash')
43
- end
44
- end
45
- end
46
- end
@@ -1,60 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'event'
4
- require_relative 'messages_mapper'
5
-
6
- module CycloneLariat
7
- class MessagesRepo
8
- attr_reader :dataset
9
-
10
- def initialize(dataset)
11
- @dataset = dataset
12
- end
13
-
14
- def create(msg)
15
- dataset.insert MessagesMapper.to_row(msg)
16
- end
17
-
18
- def exists?(uuid:)
19
- dataset.where(uuid: uuid).limit(1).any?
20
- end
21
-
22
- def processed!(uuid:, error: nil)
23
- data = { processed_at: Sequel.function(:NOW) }
24
- data.merge!(client_error_message: error.message, client_error_details: JSON.generate(error.details)) if error
25
-
26
- !dataset.where(uuid: uuid).update(data).zero?
27
- end
28
-
29
- def find(uuid:)
30
- row = dataset.where(uuid: uuid).first
31
- return if row.nil?
32
-
33
- build MessagesMapper.from_row(row)
34
- end
35
-
36
- def each_unprocessed
37
- dataset.where(processed_at: nil).each do |row|
38
- msg = build MessagesMapper.from_row(row)
39
- yield(msg)
40
- end
41
- end
42
-
43
- def each_with_client_errors
44
- dataset.where { (processed_at !~ nil) & (client_error_message !~ nil) }.each do |row|
45
- msg = build MessagesMapper.from_row(row)
46
- yield(msg)
47
- end
48
- end
49
-
50
- private
51
-
52
- def build(raw)
53
- case kind = raw.delete(:kind)
54
- when 'event' then Event.wrap raw
55
- when 'command' then Command.wrap raw
56
- else raise ArgumentError, "Unknown kind `#{kind}` of message"
57
- end
58
- end
59
- end
60
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'aws-sdk-sns'
4
- require_relative 'abstract/client'
5
-
6
- module CycloneLariat
7
- class SnsClient < Abstract::Client
8
- include LunaPark::Extensions::Injector
9
-
10
- dependency(:aws_client_class) { Aws::SNS::Client }
11
-
12
- SNS_SUFFIX = :fanout
13
-
14
- def publish(msg, topic: nil)
15
- topic ||= get_topic(msg.kind, msg.type)
16
- arn = get_arn(topic)
17
- aws_client.publish(topic_arn: arn, message: msg.to_json)
18
- end
19
-
20
- def publish_event(type, data: {}, version: self.version, uuid: SecureRandom.uuid, topic: nil)
21
- publish event(type, data: data, version: version, uuid: uuid), topic: topic
22
- end
23
-
24
- def publish_command(type, data: {}, version: self.version, uuid: SecureRandom.uuid, topic: nil)
25
- publish command(type, data: data, version: version, uuid: uuid), topic: topic
26
- end
27
-
28
- private
29
-
30
- def get_arn(topic)
31
- ['arn', 'aws', 'sns', region, client_id, topic].join ':'
32
- end
33
-
34
- def get_topic(kind, type)
35
- [instance, kind, SNS_SUFFIX, publisher, type].join '-'
36
- end
37
- end
38
- end