eventsimple 1.2.1 → 1.2.2
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 +4 -4
- data/CHANGELOG.md +4 -0
- data/Gemfile.lock +2 -2
- data/app/controllers/eventsimple/entities_controller.rb +4 -0
- data/app/controllers/eventsimple/models_controller.rb +37 -2
- data/app/views/eventsimple/shared/_header.html.erb +12 -18
- data/app/views/layouts/eventsimple/application.html.erb +0 -6
- data/lib/eventsimple/entity.rb +4 -1
- data/lib/eventsimple/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 73a860de275fa7998ed8048ee53ac70ec2b7b5872456bd1c03422cb4218847cb
|
|
4
|
+
data.tar.gz: 0aee5f6d22f2630d1a513f3847441fb8e1f28399512f9046be161c65c4cb49f2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a92575ecbabbbf572beb4c61c7f46fff241e339b737d224ee93bf78b24df6dbedeab28a8fa7721d3a213b833e5f799b0a31e76234b41f7c903ea208ff04db2f9
|
|
7
|
+
data.tar.gz: 358feb4234563044b7609e46130913c161cdd2fa555cbfba7be4faea1e5e3bf3e26b83f546da72ab46142b1de5097976e13dfec56b44105077e80e33609e1f8e
|
data/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
6
6
|
|
|
7
7
|
## Unreleased
|
|
8
8
|
|
|
9
|
+
## 1.2.2 - 2023-11-29
|
|
10
|
+
### Changed
|
|
11
|
+
- Add support for filtering events by aggregate model attributes.
|
|
12
|
+
|
|
9
13
|
## 1.2.1 - 2023-11-18
|
|
10
14
|
### Changed
|
|
11
15
|
- Allow timestamp data in events to override default timestamps update.
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
eventsimple (1.2.
|
|
4
|
+
eventsimple (1.2.2)
|
|
5
5
|
dry-struct (~> 1.6)
|
|
6
6
|
dry-types (~> 1.7)
|
|
7
7
|
pg (~> 1.4)
|
|
@@ -158,7 +158,7 @@ GEM
|
|
|
158
158
|
mini_mime (1.1.5)
|
|
159
159
|
minitest (5.20.0)
|
|
160
160
|
nenv (0.3.0)
|
|
161
|
-
net-imap (0.4.
|
|
161
|
+
net-imap (0.4.7)
|
|
162
162
|
date
|
|
163
163
|
net-protocol
|
|
164
164
|
net-pop (0.1.2)
|
|
@@ -8,6 +8,10 @@ module Eventsimple
|
|
|
8
8
|
@event_id = params[:e] || -1
|
|
9
9
|
@tab_id = (params[:t] == 'event') ? 'event' : 'entity'
|
|
10
10
|
|
|
11
|
+
filter_columns = @model_class._filter_attributes
|
|
12
|
+
params_filters = params.permit(filters: {})[:filters] || {}
|
|
13
|
+
@filters = filter_columns.to_h { |column| [column, params_filters[column]] }
|
|
14
|
+
|
|
11
15
|
primary_key = @model_class.event_class._aggregate_id
|
|
12
16
|
@entity = @model_class.find_by!(primary_key => @aggregate_id)
|
|
13
17
|
@entity_event_history = @entity.events.reverse
|
|
@@ -2,9 +2,44 @@ module Eventsimple
|
|
|
2
2
|
class ModelsController < ApplicationController
|
|
3
3
|
def show
|
|
4
4
|
@model_name = params[:name]
|
|
5
|
+
model_class = event_classes.find { |d| d.name == @model_name }
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
scope = apply_filter(model_class, model_class.event_class)
|
|
8
|
+
|
|
9
|
+
@latest_entities = scope.last(20).reverse
|
|
10
|
+
|
|
11
|
+
check_redirect_to_entity
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
def apply_filter(model_class, model_event_class)
|
|
17
|
+
filter_columns = model_class._filter_attributes
|
|
18
|
+
|
|
19
|
+
params_filters = params.permit(filters: {})[:filters] || {}
|
|
20
|
+
@filters = filter_columns.to_h { |column| [column, params_filters[column]] }
|
|
21
|
+
|
|
22
|
+
return model_event_class unless @filters.any?
|
|
23
|
+
|
|
24
|
+
aggregate_class_symbol = model_event_class._aggregate_klass.model_name.element.to_sym
|
|
25
|
+
model_event_class = model_event_class.joins(aggregate_class_symbol)
|
|
26
|
+
@filters.each do |key, value|
|
|
27
|
+
next if value.blank?
|
|
28
|
+
key = model_event_class._aggregate_id if key == :aggregate_id
|
|
29
|
+
model_event_class = model_event_class.where({ aggregate_class_symbol => { key => value } })
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
model_event_class
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def check_redirect_to_entity
|
|
36
|
+
return unless @latest_entities.any?
|
|
37
|
+
|
|
38
|
+
first_aggregate_id = @latest_entities.first.aggregate_id
|
|
39
|
+
|
|
40
|
+
return unless @latest_entities.all? { |entity| entity.aggregate_id == first_aggregate_id }
|
|
41
|
+
|
|
42
|
+
redirect_to model_entity_path(@model_name, first_aggregate_id, filters: @filters)
|
|
8
43
|
end
|
|
9
44
|
end
|
|
10
45
|
end
|
|
@@ -1,26 +1,20 @@
|
|
|
1
1
|
<!-- Header Search Start -->
|
|
2
2
|
<header class="container mb-4">
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
<
|
|
6
|
-
<
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
<option value="<%= model_path(klass) %>" <%= is_active %>><%= klass %></option>
|
|
10
|
-
<% end %>
|
|
11
|
-
</select>
|
|
12
|
-
</div>
|
|
13
|
-
|
|
14
|
-
<% if @model_name %>
|
|
15
|
-
<div class="col col-sm-7">
|
|
16
|
-
<%= form_with url: model_entity_path(@model_name, ''), id: 'model-search' do |f| %>
|
|
17
|
-
<%= f.search_field :event_id, class: 'form-control', placeholder: 'Canonical identifier', value: @aggregate_id, required: true, aria: { label: 'Entity canonical identifier' } %>
|
|
3
|
+
<% if @model_name %>
|
|
4
|
+
<%= form_with scope: :filters, url: model_path(@model_name), method: :get, id: 'model-filter' do |f| %>
|
|
5
|
+
<div class="row">
|
|
6
|
+
<label for="filters_keys[keys]" class="col-sm-2 col-form-label">Filter attribute</label>
|
|
7
|
+
<div class="form-group col-sm-3">
|
|
8
|
+
<%= select :filters_keys, :keys, @filters.keys, { selected: @filters.compact.keys&.first }, { class:"form-select", onchange: "document.getElementById('model-filter-value').name=`filters[${this.value}]`" } %>
|
|
18
9
|
</div>
|
|
19
|
-
<div class="
|
|
10
|
+
<div class="form-group col-sm-5">
|
|
11
|
+
<%= f.search_field @filters.compact.keys&.first || @filters.keys.first, id: 'model-filter-value', value: @filters.compact.values&.first, class:"form-control", placeholder: "Filter value" %>
|
|
12
|
+
</div>
|
|
13
|
+
<div class="form-group col-sm-2">
|
|
20
14
|
<%= f.submit 'Search', class: 'btn btn-primary' %>
|
|
21
|
-
|
|
15
|
+
</div>
|
|
22
16
|
</div>
|
|
23
17
|
<% end %>
|
|
24
|
-
|
|
18
|
+
<% end %>
|
|
25
19
|
</header>
|
|
26
20
|
<!-- Header Search End -->
|
|
@@ -62,12 +62,6 @@
|
|
|
62
62
|
query.set(param, value);
|
|
63
63
|
link.attr("href",window.location.pathname + '?' + query.toString());
|
|
64
64
|
});
|
|
65
|
-
|
|
66
|
-
$('#model-search').on('submit', (event) => {
|
|
67
|
-
event.preventDefault();
|
|
68
|
-
const form = $(event.currentTarget);
|
|
69
|
-
window.location = form.attr('action') + form.children('#event_id').val();
|
|
70
|
-
});
|
|
71
65
|
});
|
|
72
66
|
</script>
|
|
73
67
|
|
data/lib/eventsimple/entity.rb
CHANGED
|
@@ -2,7 +2,7 @@ module Eventsimple
|
|
|
2
2
|
module Entity
|
|
3
3
|
DEFAULT_IGNORE_PROPS = %w[id lock_version].freeze
|
|
4
4
|
|
|
5
|
-
def event_driven_by(event_klass, aggregate_id:)
|
|
5
|
+
def event_driven_by(event_klass, aggregate_id:, filter_attributes: [])
|
|
6
6
|
has_many :events, class_name: event_klass.name.to_s,
|
|
7
7
|
foreign_key: :aggregate_id,
|
|
8
8
|
primary_key: aggregate_id,
|
|
@@ -13,6 +13,9 @@ module Eventsimple
|
|
|
13
13
|
|
|
14
14
|
class_attribute :ignored_for_projection, default: []
|
|
15
15
|
|
|
16
|
+
class_attribute :_filter_attributes
|
|
17
|
+
self._filter_attributes = [aggregate_id] | Array.wrap(filter_attributes)
|
|
18
|
+
|
|
16
19
|
# disable automatic timestamp updates
|
|
17
20
|
self.record_timestamps = false
|
|
18
21
|
|
data/lib/eventsimple/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: eventsimple
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.2.
|
|
4
|
+
version: 1.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Zulfiqar Ali
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-
|
|
11
|
+
date: 2023-12-07 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: dry-struct
|