Class: EventStoreClient::StoreAdapter::Api::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/event_store_client/store_adapter/api/client.rb

Constant Summary collapse

WrongExpectedEventVersion =
Class.new(StandardError)

Instance Method Summary collapse

Instance Method Details

#ack(url) ⇒ Object



112
113
114
# File 'lib/event_store_client/store_adapter/api/client.rb', line 112

def ack(url)
  make_request(:post, url)
end

#append_to_stream(stream_name, events, expected_version: nil) ⇒ Object



9
10
11
12
13
14
15
16
17
18
# File 'lib/event_store_client/store_adapter/api/client.rb', line 9

def append_to_stream(stream_name, events, expected_version: nil)
  headers = {
    'ES-ExpectedVersion' => expected_version&.to_s
  }.reject { |_key, val| val.nil? || val.empty? }

  data = build_events_data(events)
  response = make_request(:post, "/streams/#{stream_name}", body: data, headers: headers)
  validate_response(response, expected_version)
  response
end

#consume_feed(stream_name, subscription_name, count: 1, long_poll: 0, resolve_links: true) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/event_store_client/store_adapter/api/client.rb', line 77

def consume_feed(
  stream_name,
  subscription_name,
  count: 1,
  long_poll: 0,
  resolve_links: true
)
  headers = long_poll.positive? ? { 'ES-LongPoll' => long_poll.to_s } : {}
  headers['Content-Type'] = 'application/vnd.eventstore.competingatom+json'
  headers['Accept'] = 'application/vnd.eventstore.competingatom+json'
  headers['ES-ResolveLinkTos'] = resolve_links.to_s

  make_request(
    :get,
    "/subscriptions/#{stream_name}/#{subscription_name}/#{count}",
    headers: headers
  )
end

#delete_stream(stream_name, hard_delete) ⇒ Object



20
21
22
23
24
25
26
# File 'lib/event_store_client/store_adapter/api/client.rb', line 20

def delete_stream(stream_name, hard_delete)
  headers = {
    'ES-HardDelete' => hard_delete.to_s
  }.reject { |_key, val| val.empty? }

  make_request(:delete, "/streams/#{stream_name}", body: {}, headers: headers)
end

#join_streams(name, streams) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/event_store_client/store_adapter/api/client.rb', line 41

def join_streams(name, streams)
  data = "    fromStreams(\#{streams})\n    .when({\n      $any: function(s,e) {\n        linkTo(\"\#{name}\", e)\n      }\n    })\n  STRING\n\n  make_request(\n    :post,\n    \"/projections/continuous?name=\#{name}&type=js&enabled=true&emit=true%26trackemittedstreams=true\", # rubocop:disable Metrics/LineLength\n    body: data,\n    headers: {}\n  )\nend\n"


96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/event_store_client/store_adapter/api/client.rb', line 96

def link_to(stream_name, events, expected_version: nil)
  data = build_linkig_data(events)
  headers = {
    'ES-ExpectedVersion' => expected_version&.to_s
  }.reject { |_key, val| val.nil? || val.empty? }

  response = make_request(
    :post,
    "/streams/#{stream_name}",
    body: data,
    headers: headers
  )
  validate_response(response, expected_version)
  response
end

#read(stream_name, direction: 'forward', start: 0, count: per_page, resolve_links: true) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/event_store_client/store_adapter/api/client.rb', line 28

def read(stream_name, direction: 'forward', start: 0, count: per_page, resolve_links: true)
  headers = {
    'ES-ResolveLinkTos' => resolve_links.to_s,
    'Accept' => 'application/vnd.eventstore.atom+json'
  }

  make_request(
    :get,
    "/streams/#{stream_name}/#{start}/#{direction}/#{count}",
    headers: headers
  )
end

#subscribe_to_stream(stream_name, subscription_name, stats: true, start_from: 0, retries: 5) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/event_store_client/store_adapter/api/client.rb', line 59

def subscribe_to_stream(
  stream_name, subscription_name, stats: true, start_from: 0, retries: 5
)
  make_request(
    :put,
    "/subscriptions/#{stream_name}/#{subscription_name}",
    body: {
      extraStatistics: stats,
      startFrom: start_from,
      maxRetryCount: retries,
      resolveLinktos: true
    },
    headers: {
      'Content-Type' => 'application/json'
    }
  )
end