event_store_client 0.1.4 → 0.1.5

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: 5dcca0e1322bc8037b475d5041c4134c959ad3a93aa3c28b2717b52706c6b679
4
- data.tar.gz: b9c1f859faa365ccc357c1ed5d4715482530a1c2e57695efa88ac247ab2f688f
3
+ metadata.gz: 7d057f39fbb77d08d7c29b5f56e38e3aee78d6b39578e472afc736ad5bbd9576
4
+ data.tar.gz: 3fa3ce102d2f8f6866bef59760e76fe21038ded6b1f022e78c79918753d6911b
5
5
  SHA512:
6
- metadata.gz: 764640b96af5c2ea298f9ca965243f015d23bd0c1ffae53e175fbce9322e66fd025cd1b6072d96694dbc0bfce9780bf6750cd00cff1019c89be19be289e3f0f4
7
- data.tar.gz: 7c55ede52abed9e3c42e10b03509e115d9a7fd204598dd4883dce6171764c25016f8a4dd01f386ac525f9136aa3da84f3dbb22021bacc6ceff5101ebce044a3e
6
+ metadata.gz: 91d278acb0560b2b1e5166a7ef0ecdbd398f9da524dd550edc496ddc41efeb260a056a43e6e4acde752e100321fef9d6120d2eeb50047072c428f374d504a309
7
+ data.tar.gz: f8e821b0ff1ca1f74bcc9252d31d83f84af2722c596651ca96e923ad701b13a2a97f7537fe57b86ac97a15790987bd762507b61eb707a8c70211e9ae11c54613
data/README.md CHANGED
@@ -57,7 +57,7 @@ class SomethingHappened < EventStoreClient::DeserializedEvent
57
57
  def schema
58
58
  Dry::Schema.Params do
59
59
  required(:user_id).value(:string)
60
- required(:email).value(:string)
60
+ required(:title).value(:string)
61
61
  end
62
62
  end
63
63
  end
@@ -124,6 +124,19 @@ client.publish(stream: 'newstream', events: events)
124
124
  client.stop_polling
125
125
  ```
126
126
 
127
+ ### Linking existing events to the streem
128
+
129
+ Event to be linked properly has to coantians original event id.
130
+ Real events could be mixed with linked events in the same stream.
131
+
132
+ ```ruby
133
+ exisiting_event1 = client.read('newstream').last
134
+ client.link_to(stream: 'anotherstream', events: [exisiting_event1, ...])
135
+ ```
136
+
137
+ When you read from stream where links are placed. By default Event Store Client always resolve links for you returning the event that points to the link. You can use the ES-ResolveLinkTos: false HTTP header during readin stream to tell Event Store Client to return you the actual link and to not resolve it.
138
+ More info: [ES-ResolveLinkTos](https://eventstore.org/docs/http-api/optional-http-headers/resolve-linkto/index.html?tabs=tabid-1%2Ctabid-3).
139
+
127
140
  ## Contributing
128
141
 
129
142
  Do you want to contribute? Welcome!
@@ -10,8 +10,8 @@ module EventStoreClient
10
10
  connection.publish(stream: stream, events: events, expected_version: expected_version)
11
11
  end
12
12
 
13
- def read(stream, direction: 'forward')
14
- connection.read(stream, direction: direction)
13
+ def read(stream, direction: 'forward', start: 0, all: false)
14
+ connection.read(stream, direction: direction, start: start, all: all)
15
15
  end
16
16
 
17
17
  def subscribe(subscriber, to: [], polling: true)
@@ -10,20 +10,11 @@ module EventStoreClient
10
10
  serialized_events
11
11
  end
12
12
 
13
- def read(stream, direction: 'forward', resolve_links: true)
14
- response =
15
- client.read(stream, start: 0, direction: direction, resolve_links: resolve_links)
16
- return [] if response.body.nil? || response.body.empty?
17
- JSON.parse(response.body)['entries'].map do |entry|
18
- event = EventStoreClient::Event.new(
19
- id: entry['eventId'],
20
- title: entry['title'],
21
- type: entry['eventType'],
22
- data: entry['data'],
23
- metadata: entry['metaData']
24
- )
25
- mapper.deserialize(event)
26
- end
13
+ def read(stream, direction:, start:, all:, resolve_links: true)
14
+ return read_all_from_stream(stream, start: start, resolve_links: resolve_links) if all
15
+ read_from_stream(
16
+ stream, direction: direction, start: start, resolve_links: resolve_links
17
+ )
27
18
  end
28
19
 
29
20
  def delete_stream(stream); end
@@ -79,5 +70,51 @@ module EventStoreClient
79
70
  host: host, port: port, per_page: per_page
80
71
  )
81
72
  end
73
+
74
+ def read_from_stream(stream, direction:, start:, resolve_links:)
75
+ response =
76
+ client.read(
77
+ stream, start: start, direction: direction, resolve_links: resolve_links
78
+ )
79
+ return [] if response.body.nil? || response.body.empty?
80
+ JSON.parse(response.body)['entries'].map do |entry|
81
+ deserialize_event(entry)
82
+ end.reverse
83
+ end
84
+
85
+ def read_all_from_stream(stream, start:, resolve_links:)
86
+ count = per_page
87
+ events = []
88
+ failed_requests_count = 0
89
+
90
+ while failed_requests_count < 3
91
+ begin
92
+ response =
93
+ client.read(stream, start: start, direction: 'forward', resolve_links: resolve_links)
94
+ failed_requests_count += 1 && next unless response.success?
95
+ rescue Faraday::ConnectionFailed
96
+ failed_requests_count += 1
97
+ next
98
+ end
99
+ failed_requests_count = 0
100
+ break if response.body.nil? || response.body.empty?
101
+ entries = JSON.parse(response.body)['entries']
102
+ break if entries.empty?
103
+ events += entries.map { |entry| deserialize_event(entry) }.reverse
104
+ start += count
105
+ end
106
+ events
107
+ end
108
+
109
+ def deserialize_event(entry)
110
+ event = EventStoreClient::Event.new(
111
+ id: entry['eventId'],
112
+ title: entry['title'],
113
+ type: entry['eventType'],
114
+ data: entry['data'],
115
+ metadata: entry['metaData']
116
+ )
117
+ mapper.deserialize(event)
118
+ end
82
119
  end
83
120
  end
@@ -24,10 +24,15 @@ module EventStoreClient
24
24
 
25
25
  def read(stream_name, direction: 'forward', start: 0, count: per_page, resolve_links: true)
26
26
  headers = {
27
- 'ES-ResolveLinkTos' => resolve_links.to_s
27
+ 'ES-ResolveLinkTos' => resolve_links.to_s,
28
+ 'Accept' => 'application/vnd.eventstore.atom+json'
28
29
  }
29
30
 
30
- make_request(:get, "/streams/#{stream_name}/#{start}/#{direction}/#{count}", headers: headers)
31
+ make_request(
32
+ :get,
33
+ "/streams/#{stream_name}/#{start}/#{direction}/#{count}",
34
+ headers: headers
35
+ )
31
36
  end
32
37
 
33
38
  def subscribe_to_stream(
@@ -3,6 +3,12 @@
3
3
  module EventStoreClient
4
4
  module StoreAdapter
5
5
  class InMemory
6
+ Response = Struct.new(:body, :status) do
7
+ def success?
8
+ status == 200
9
+ end
10
+ end
11
+
6
12
  attr_reader :event_store
7
13
 
8
14
  def append_to_stream(stream_name, events, expected_version: nil) # rubocop:disable Lint/UnusedMethodArgument,Metrics/LineLength
@@ -13,16 +19,21 @@ module EventStoreClient
13
19
  'eventId' => event.id,
14
20
  'data' => event.data,
15
21
  'eventType' => event.type,
16
- 'metadata' => event.metadata,
22
+ 'metaData' => event.metadata,
17
23
  'positionEventNumber' => event_store[stream_name].length
18
24
  )
19
25
  end
20
26
  end
21
27
 
22
- def read(stream_name, direction: 'forward', start: 0, count: per_page, resolve_links: nil)
23
- read_stream_forward(stream_name, start: start, count: count) if direction == 'forward'
28
+ def read(stream_name, direction: 'forward', start: 0, resolve_links: nil)
29
+ response =
30
+ if direction == 'forward'
31
+ read_stream_forward(stream_name, start: start)
32
+ else
33
+ read_stream_backward(stream_name, start: start)
34
+ end
24
35
 
25
- read_stream_backward(stream_name, start: start, count: count)
36
+ Response.new(response.to_json, 200)
26
37
  end
27
38
 
28
39
  def delete_stream(stream_name, hard_delete: false) # rubocop:disable Lint/UnusedMethodArgument
@@ -43,32 +54,32 @@ module EventStoreClient
43
54
  @event_store = {}
44
55
  end
45
56
 
46
- def read_stream_backward(stream_name, start: 0, count: per_page)
57
+ def read_stream_backward(stream_name, start: 0)
47
58
  return [] unless event_store.key?(stream_name)
48
59
 
49
- start = start.zero? ? event_store[stream_name].length - 1 : start
50
- last_index = start - count
60
+ start = start == 'head' ? event_store[stream_name].length - 1 : start
61
+ last_index = start - per_page
51
62
  entries = event_store[stream_name].select do |event|
52
63
  event['positionEventNumber'] > last_index &&
53
64
  event['positionEventNumber'] <= start
54
65
  end
55
66
  {
56
67
  'entries' => entries,
57
- 'links' => links(stream_name, last_index, 'next', entries, count)
68
+ 'links' => links(stream_name, last_index, 'next', entries, per_page)
58
69
  }
59
70
  end
60
71
 
61
- def read_stream_forward(stream_name, start: 0, count: per_page)
72
+ def read_stream_forward(stream_name, start: 0)
62
73
  return [] unless event_store.key?(stream_name)
63
74
 
64
- last_index = start + count
65
- entries = event_store[stream_name].reverse.select do |event|
75
+ last_index = start + per_page
76
+ entries = event_store[stream_name].select do |event|
66
77
  event['positionEventNumber'] < last_index &&
67
78
  event['positionEventNumber'] >= start
68
79
  end
69
80
  {
70
81
  'entries' => entries,
71
- 'links' => links(stream_name, last_index, 'previous', entries, count)
82
+ 'links' => links(stream_name, last_index, 'previous', entries, per_page)
72
83
  }
73
84
  end
74
85
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EventStoreClient
4
- VERSION = '0.1.4'
4
+ VERSION = '0.1.5'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: event_store_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastian Wilgosz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-10 00:00:00.000000000 Z
11
+ date: 2020-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-schema
@@ -144,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
144
144
  - !ruby/object:Gem::Version
145
145
  version: '0'
146
146
  requirements: []
147
- rubygems_version: 3.0.3
147
+ rubygems_version: 3.0.6
148
148
  signing_key:
149
149
  specification_version: 4
150
150
  summary: Ruby integration for https://eventstore.org