rails_simple_event_sourcing 1.0.2 → 1.0.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: baad400eca4ab6e7629c1bc7a9d30f66841d2da8ee1d3ab1dd3225333bf9ea10
4
- data.tar.gz: dd2e881c3f8693aadae17ed44343acbb2633465eaf36d010934173793b91daf3
3
+ metadata.gz: be05ef0dea303db4860a86e10e0ed0d62b5e03de00e07ee80ad374f95e20cc1e
4
+ data.tar.gz: 3eaaf851f72b6a84358e7908a55c2ddc437217467786fac57d658edcc4c70b30
5
5
  SHA512:
6
- metadata.gz: c1ed4111dd95c2e6f0bba524606749e98d22c78d7803ea0b1dc2f0f03a27ef39e070d868d25b5ac2491389db08c154221432c2374d647d343299cd2469eb0656
7
- data.tar.gz: 44764791b5a57ad810562f1dbf32f5b17f59ee19c047092c19751db5470498cb56797e6c82aece230ddae68ac820dd6505a5ab8e86433d582bb002fef984c7a4
6
+ metadata.gz: e19d692f980963be17d5adb2a55678a57be33fb65b04046215d44a1bd48181abfebcc2f3ea8d8cfaf4946570bcf8fb25b0abbc48e28fe7b6a85d253f4b51ca71
7
+ data.tar.gz: 65ad82bb88d8feae84ea47514debdd95532144830e07d65b36c4482f07ad095de5d374e2e6fb77dcace25984a885b8cc63b79fc729a3854f041b95129e4b923b
@@ -10,14 +10,19 @@ module RailsSimpleEventSourcing
10
10
  belongs_to :eventable, polymorphic: true, optional: true
11
11
  alias aggregate eventable
12
12
 
13
+ # Validations
14
+ validates :version, presence: true, numericality: { only_integer: true, greater_than: 0 }
15
+ validates :version, uniqueness: { scope: :aggregate_id }, if: -> { aggregate_id.present? }
16
+
13
17
  # Callbacks for automatic aggregate lifecycle
14
18
  before_validation :setup_event_fields, on: :create
19
+ before_validation :set_version
15
20
  before_validation :apply_event_to_aggregate, on: :create, if: :aggregate_defined?
16
21
  before_save :persist_aggregate, if: :aggregate_defined?
17
22
 
18
23
  def apply(aggregate)
19
24
  payload.each do |key, value|
20
- aggregate.send("#{key}=", value) if aggregate.respond_to?("#{key}=") && value.present?
25
+ aggregate.send("#{key}=", value) if aggregate.respond_to?("#{key}=")
21
26
  end
22
27
  aggregate
23
28
  end
@@ -30,6 +35,17 @@ module RailsSimpleEventSourcing
30
35
  self.metadata = CurrentRequest.metadata&.compact&.presence
31
36
  end
32
37
 
38
+ def set_version
39
+ self.version ||= calculate_next_version
40
+ end
41
+
42
+ def calculate_next_version
43
+ return 1 unless aggregate_id
44
+
45
+ max_version = Event.where(aggregate_id:).maximum(:version) || 0
46
+ max_version + 1
47
+ end
48
+
33
49
  def apply_event_to_aggregate
34
50
  @aggregate_for_persistence = aggregate_repository.find_or_build(aggregate_id)
35
51
  self.eventable = @aggregate_for_persistence
@@ -7,6 +7,7 @@ class CreateRailsSimpleEventSourcingEvents < ActiveRecord::Migration[7.1]
7
7
  t.string :type, null: false
8
8
  t.string :event_type, null: false
9
9
  t.string :aggregate_id
10
+ t.integer :version, null: false
10
11
  t.jsonb :payload
11
12
  t.jsonb :metadata
12
13
 
@@ -15,6 +16,7 @@ class CreateRailsSimpleEventSourcingEvents < ActiveRecord::Migration[7.1]
15
16
  t.index :type
16
17
  t.index :event_type
17
18
  t.index :aggregate_id
19
+ t.index %i[aggregate_id version], unique: true, name: 'index_events_on_aggregate_id_and_version'
18
20
  t.index :payload, using: :gin
19
21
  t.index :metadata, using: :gin
20
22
  end
@@ -14,7 +14,7 @@ module RailsSimpleEventSourcing
14
14
  private
15
15
 
16
16
  def load_event_stream
17
- @aggregate.events.order(created_at: :asc)
17
+ @aggregate.events.order(version: :asc)
18
18
  end
19
19
 
20
20
  def apply_events(events)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsSimpleEventSourcing
4
- VERSION = '1.0.2'
4
+ VERSION = '1.0.3'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_simple_event_sourcing
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Damian Baćkowski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-01-12 00:00:00.000000000 Z
11
+ date: 2026-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pg