Class: RubyEventStore::Browser::Stream

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_event_store/browser/stream.rb

Constant Summary collapse

HEAD =
Object.new

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(event_store:, params:, url_builder:) ⇒ Stream

Returns a new instance of Stream.



8
9
10
11
12
# File 'lib/ruby_event_store/browser/stream.rb', line 8

def initialize(event_store:, params:, url_builder:)
  @event_store = event_store
  @params      = params
  @url_builder = url_builder
end

Instance Attribute Details

#event_storeObject (readonly)

Returns the value of attribute event_store.



6
7
8
# File 'lib/ruby_event_store/browser/stream.rb', line 6

def event_store
  @event_store
end

#paramsObject (readonly)

Returns the value of attribute params.



6
7
8
# File 'lib/ruby_event_store/browser/stream.rb', line 6

def params
  @params
end

#url_builderObject (readonly)

Returns the value of attribute url_builder.



6
7
8
# File 'lib/ruby_event_store/browser/stream.rb', line 6

def url_builder
  @url_builder
end

Instance Method Details

#as_jsonObject



14
15
16
17
18
19
# File 'lib/ruby_event_store/browser/stream.rb', line 14

def as_json
  {
    data:  events.map { |e| JsonApiEvent.new(e).to_h },
    links: links
  }
end

#countObject



84
85
86
# File 'lib/ruby_event_store/browser/stream.rb', line 84

def count
  Integer(params.fetch(:count, PAGE_SIZE))
end

#directionObject



88
89
90
91
92
93
94
95
# File 'lib/ruby_event_store/browser/stream.rb', line 88

def direction
  case params[:direction]
  when 'forward'
    :forward
  else
    :backward
  end
end

#eventsObject



21
22
23
24
25
26
27
28
# File 'lib/ruby_event_store/browser/stream.rb', line 21

def events
  @events ||= case direction
              when :forward
                events_forward(position).reverse
              when :backward
                events_backward(position)
              end
end

#events_backward(position) ⇒ Object



51
52
53
54
55
56
# File 'lib/ruby_event_store/browser/stream.rb', line 51

def events_backward(position)
  spec = event_store.read.limit(count).backward
  spec = spec.stream(stream_name) unless stream_name.eql?(SERIALIZED_GLOBAL_STREAM_NAME)
  spec = spec.from(position)      unless position.equal?(HEAD)
  spec.to_a
end

#events_forward(position) ⇒ Object



44
45
46
47
48
49
# File 'lib/ruby_event_store/browser/stream.rb', line 44

def events_forward(position)
  spec = event_store.read.limit(count)
  spec = spec.stream(stream_name) unless stream_name.eql?(SERIALIZED_GLOBAL_STREAM_NAME)
  spec = spec.from(position)      unless position.equal?(HEAD)
  spec.to_a
end


76
77
78
# File 'lib/ruby_event_store/browser/stream.rb', line 76

def first_page_link
  url_builder.call(id: stream_name, position: :head, direction: :backward, count: count)
end


80
81
82
# File 'lib/ruby_event_store/browser/stream.rb', line 80

def last_page_link
  url_builder.call(id: stream_name, position: :head, direction: :forward, count: count)
end


30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/ruby_event_store/browser/stream.rb', line 30

def links
  @links ||= {}.tap do |h|
    if prev_event?
      h[:prev] = prev_page_link(events.first.event_id)
      h[:first] = first_page_link
    end

    if next_event?
      h[:next] = next_page_link(events.last.event_id)
      h[:last] = last_page_link
    end
  end
end

#next_event?Boolean

Returns:

  • (Boolean)


58
59
60
61
# File 'lib/ruby_event_store/browser/stream.rb', line 58

def next_event?
  return if events.empty?
  events_backward(events.last.event_id).any?
end


72
73
74
# File 'lib/ruby_event_store/browser/stream.rb', line 72

def next_page_link(event_id)
  url_builder.call(id: stream_name, position: event_id, direction: :backward, count: count)
end

#positionObject



97
98
99
100
101
102
103
104
# File 'lib/ruby_event_store/browser/stream.rb', line 97

def position
  case params[:position]
  when 'head', nil
    HEAD
  else
    params.fetch(:position)
  end
end

#prev_event?Boolean

Returns:

  • (Boolean)


63
64
65
66
# File 'lib/ruby_event_store/browser/stream.rb', line 63

def prev_event?
  return if events.empty?
  events_forward(events.first.event_id).any?
end


68
69
70
# File 'lib/ruby_event_store/browser/stream.rb', line 68

def prev_page_link(event_id)
  url_builder.call(id: stream_name, position: event_id, direction: :forward, count: count)
end

#stream_nameObject



106
107
108
# File 'lib/ruby_event_store/browser/stream.rb', line 106

def stream_name
  params.fetch(:id)
end