forest_liana 7.0.0.beta.2 → 7.0.0.beta.6
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/app/controllers/forest_liana/actions_controller.rb +20 -18
- data/app/controllers/forest_liana/application_controller.rb +0 -9
- data/app/controllers/forest_liana/associations_controller.rb +2 -2
- data/app/controllers/forest_liana/resources_controller.rb +16 -6
- data/app/controllers/forest_liana/scopes_controller.rb +20 -0
- data/app/controllers/forest_liana/smart_actions_controller.rb +39 -6
- data/app/controllers/forest_liana/stats_controller.rb +5 -5
- data/app/services/forest_liana/apimap_sorter.rb +1 -0
- data/app/services/forest_liana/filters_parser.rb +8 -4
- data/app/services/forest_liana/has_many_dissociator.rb +2 -2
- data/app/services/forest_liana/has_many_getter.rb +2 -2
- data/app/services/forest_liana/leaderboard_stat_getter.rb +20 -14
- data/app/services/forest_liana/line_stat_getter.rb +5 -3
- data/app/services/forest_liana/permissions_checker.rb +42 -37
- data/app/services/forest_liana/permissions_formatter.rb +1 -1
- data/app/services/forest_liana/permissions_getter.rb +3 -6
- data/app/services/forest_liana/pie_stat_getter.rb +6 -3
- data/app/services/forest_liana/resource_getter.rb +6 -3
- data/app/services/forest_liana/resource_updater.rb +5 -2
- data/app/services/forest_liana/resources_getter.rb +6 -5
- data/app/services/forest_liana/scope_manager.rb +102 -0
- data/app/services/forest_liana/search_query_builder.rb +6 -3
- data/app/services/forest_liana/stat_getter.rb +2 -1
- data/app/services/forest_liana/token.rb +1 -0
- data/app/services/forest_liana/utils/beta_schema_utils.rb +1 -1
- data/app/services/forest_liana/value_stat_getter.rb +4 -2
- data/config/routes.rb +3 -1
- data/lib/forest_liana/bootstrapper.rb +4 -2
- data/lib/forest_liana/version.rb +1 -1
- data/spec/dummy/app/controllers/forest/islands_controller.rb +5 -0
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/dummy/lib/forest_liana/collections/island.rb +7 -0
- data/spec/lib/forest_liana/bootstrapper_spec.rb +12 -0
- data/spec/requests/actions_controller_spec.rb +144 -23
- data/spec/requests/authentications_spec.rb +2 -1
- data/spec/requests/resources_spec.rb +2 -0
- data/spec/services/forest_liana/apimap_sorter_spec.rb +6 -4
- data/spec/services/forest_liana/filters_parser_spec.rb +1 -1
- data/spec/services/forest_liana/has_many_getter_spec.rb +116 -0
- data/spec/services/forest_liana/line_stat_getter_spec.rb +14 -6
- data/spec/services/forest_liana/permissions_checker_acl_disabled_spec.rb +45 -71
- data/spec/services/forest_liana/permissions_checker_acl_enabled_spec.rb +39 -63
- data/spec/services/forest_liana/permissions_checker_live_queries_spec.rb +3 -3
- data/spec/services/forest_liana/permissions_formatter_spec.rb +11 -11
- data/spec/services/forest_liana/pie_stat_getter_spec.rb +114 -0
- data/spec/services/forest_liana/resource_updater_spec.rb +116 -0
- data/spec/services/forest_liana/resources_getter_spec.rb +68 -1
- data/spec/services/forest_liana/scope_manager_spec.rb +232 -0
- data/spec/services/forest_liana/value_stat_getter_spec.rb +96 -0
- metadata +125 -118
- data/app/services/forest_liana/scope_validator.rb +0 -98
- data/test/services/forest_liana/has_many_getter_test.rb +0 -75
- data/test/services/forest_liana/pie_stat_getter_test.rb +0 -29
- data/test/services/forest_liana/resource_updater_test.rb +0 -86
- data/test/services/forest_liana/scope_validator_test.rb +0 -185
- data/test/services/forest_liana/value_stat_getter_test.rb +0 -71
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0ebb1311a034cd61b964ed27bc2f3a515c6f3e8079b588a66f06ad9294c8e297
|
4
|
+
data.tar.gz: 9481f8aa066b3f9c852811f182bc593bd6ab884048e3faa3e339a662af2f205a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf40fea541629a9ded642a65c160560787a6f8a3854525dff31d0ebd638f2741db5bfe4d39cf09bfaf277f0bc61872f5199ae44e1c3fd46b2f5b069eb30d90c2
|
7
|
+
data.tar.gz: 34201435085c8d5b1caf06727d5c4b62cbaeefe4e9fd21a1fbb89e619cbf7bdb3085f36d0dd6653dd8ea9c89666df2e1df3e28fb0aba2ce1aed2a81093ce27f4
|
@@ -1,8 +1,13 @@
|
|
1
1
|
module ForestLiana
|
2
|
-
class ActionsController <
|
2
|
+
class ActionsController < ApplicationController
|
3
3
|
|
4
|
-
def
|
5
|
-
|
4
|
+
def get_smart_action_hook_request
|
5
|
+
begin
|
6
|
+
params[:data][:attributes]
|
7
|
+
rescue => error
|
8
|
+
FOREST_LOGGER.error "Smart Action hook request error: #{error}"
|
9
|
+
{}
|
10
|
+
end
|
6
11
|
end
|
7
12
|
|
8
13
|
def get_collection(collection_name)
|
@@ -12,19 +17,12 @@ module ForestLiana
|
|
12
17
|
def get_action(collection_name)
|
13
18
|
collection = get_collection(collection_name)
|
14
19
|
begin
|
15
|
-
|
20
|
+
collection.actions.find {|action| ActiveSupport::Inflector.parameterize(action.name) == params[:action_name]}
|
16
21
|
rescue => error
|
17
22
|
FOREST_LOGGER.error "Smart Action get action retrieval error: #{error}"
|
18
23
|
nil
|
19
24
|
end
|
20
25
|
end
|
21
|
-
|
22
|
-
def get_record
|
23
|
-
model = ForestLiana::SchemaUtils.find_model_from_collection_name(params[:collectionName])
|
24
|
-
redord_getter = ForestLiana::ResourceGetter.new(model, {:id => params[:recordIds][0]})
|
25
|
-
redord_getter.perform
|
26
|
-
redord_getter.record
|
27
|
-
end
|
28
26
|
|
29
27
|
def get_smart_action_load_ctx(fields)
|
30
28
|
fields = fields.map do |field|
|
@@ -32,7 +30,7 @@ module ForestLiana
|
|
32
30
|
field[:value] = nil unless field[:value]
|
33
31
|
field
|
34
32
|
end
|
35
|
-
{:
|
33
|
+
{:fields => fields, :params => params}
|
36
34
|
end
|
37
35
|
|
38
36
|
def get_smart_action_change_ctx(fields, field_changed)
|
@@ -42,7 +40,7 @@ module ForestLiana
|
|
42
40
|
ForestLiana::WidgetsHelper.set_field_widget(field)
|
43
41
|
field
|
44
42
|
end
|
45
|
-
{:
|
43
|
+
{:field_changed => found_field_changed, :fields => fields, :params => params}
|
46
44
|
end
|
47
45
|
|
48
46
|
def handle_result(result, action)
|
@@ -87,7 +85,9 @@ module ForestLiana
|
|
87
85
|
end
|
88
86
|
|
89
87
|
def load
|
90
|
-
|
88
|
+
load_request = get_smart_action_hook_request
|
89
|
+
|
90
|
+
action = get_action(load_request[:collection_name])
|
91
91
|
|
92
92
|
if !action
|
93
93
|
render status: 500, json: {error: 'Error in smart action load hook: cannot retrieve action from collection'}
|
@@ -103,18 +103,20 @@ module ForestLiana
|
|
103
103
|
end
|
104
104
|
|
105
105
|
def change
|
106
|
-
|
106
|
+
change_request = get_smart_action_hook_request
|
107
|
+
|
108
|
+
action = get_action(change_request[:collection_name])
|
107
109
|
|
108
110
|
if !action
|
109
111
|
return render status: 500, json: {error: 'Error in smart action change hook: cannot retrieve action from collection'}
|
110
|
-
elsif
|
112
|
+
elsif change_request[:fields].nil?
|
111
113
|
return render status: 500, json: {error: 'Error in smart action change hook: fields params is mandatory'}
|
112
|
-
elsif !
|
114
|
+
elsif !change_request[:fields].is_a?(Array)
|
113
115
|
return render status: 500, json: {error: 'Error in smart action change hook: fields params must be an array'}
|
114
116
|
end
|
115
117
|
|
116
118
|
# Get the smart action hook change context
|
117
|
-
context = get_smart_action_change_ctx(
|
119
|
+
context = get_smart_action_change_ctx(change_request[:fields], change_request[:changed_field])
|
118
120
|
|
119
121
|
field_changed_hook = context[:field_changed][:hook]
|
120
122
|
|
@@ -86,15 +86,6 @@ module ForestLiana
|
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
|
-
def get_smart_action_context
|
90
|
-
begin
|
91
|
-
params[:data][:attributes].values[0].to_hash.symbolize_keys
|
92
|
-
rescue => error
|
93
|
-
FOREST_LOGGER.error "Smart Action context retrieval error: #{error}"
|
94
|
-
{}
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
89
|
def internal_server_error
|
99
90
|
head :internal_server_error
|
100
91
|
end
|
@@ -10,7 +10,7 @@ module ForestLiana
|
|
10
10
|
|
11
11
|
def index
|
12
12
|
begin
|
13
|
-
getter = HasManyGetter.new(@resource, @association, params)
|
13
|
+
getter = HasManyGetter.new(@resource, @association, params, forest_user)
|
14
14
|
getter.perform
|
15
15
|
|
16
16
|
respond_to do |format|
|
@@ -25,7 +25,7 @@ module ForestLiana
|
|
25
25
|
|
26
26
|
def count
|
27
27
|
begin
|
28
|
-
getter = HasManyGetter.new(@resource, @association, params)
|
28
|
+
getter = HasManyGetter.new(@resource, @association, params, forest_user)
|
29
29
|
getter.count
|
30
30
|
|
31
31
|
render serializer: nil, json: { count: getter.records_count }
|
@@ -29,7 +29,7 @@ module ForestLiana
|
|
29
29
|
return head :forbidden unless checker.is_authorized?
|
30
30
|
end
|
31
31
|
|
32
|
-
getter = ForestLiana::ResourcesGetter.new(@resource, params)
|
32
|
+
getter = ForestLiana::ResourcesGetter.new(@resource, params, forest_user)
|
33
33
|
getter.perform
|
34
34
|
|
35
35
|
respond_to do |format|
|
@@ -63,7 +63,7 @@ module ForestLiana
|
|
63
63
|
)
|
64
64
|
return head :forbidden unless checker.is_authorized?
|
65
65
|
|
66
|
-
getter = ForestLiana::ResourcesGetter.new(@resource, params)
|
66
|
+
getter = ForestLiana::ResourcesGetter.new(@resource, params, forest_user)
|
67
67
|
getter.count
|
68
68
|
|
69
69
|
render serializer: nil, json: { count: getter.records_count }
|
@@ -89,10 +89,12 @@ module ForestLiana
|
|
89
89
|
checker = ForestLiana::PermissionsChecker.new(@resource, 'readEnabled', @rendering_id, user_id: forest_user['id'])
|
90
90
|
return head :forbidden unless checker.is_authorized?
|
91
91
|
|
92
|
-
getter = ForestLiana::ResourceGetter.new(@resource, params)
|
92
|
+
getter = ForestLiana::ResourceGetter.new(@resource, params, forest_user)
|
93
93
|
getter.perform
|
94
94
|
|
95
95
|
render serializer: nil, json: render_record_jsonapi(getter.record)
|
96
|
+
rescue ActiveRecord::RecordNotFound
|
97
|
+
render serializer: nil, json: { status: 404 }, status: :not_found
|
96
98
|
rescue => error
|
97
99
|
FOREST_LOGGER.error "Record Show error: #{error}\n#{format_stacktrace(error)}"
|
98
100
|
internal_server_error
|
@@ -127,7 +129,7 @@ module ForestLiana
|
|
127
129
|
checker = ForestLiana::PermissionsChecker.new(@resource, 'editEnabled', @rendering_id, user_id: forest_user['id'])
|
128
130
|
return head :forbidden unless checker.is_authorized?
|
129
131
|
|
130
|
-
updater = ForestLiana::ResourceUpdater.new(@resource, params)
|
132
|
+
updater = ForestLiana::ResourceUpdater.new(@resource, params, forest_user)
|
131
133
|
updater.perform
|
132
134
|
|
133
135
|
if updater.errors
|
@@ -149,7 +151,14 @@ module ForestLiana
|
|
149
151
|
checker = ForestLiana::PermissionsChecker.new(@resource, 'deleteEnabled', @rendering_id, user_id: forest_user['id'])
|
150
152
|
return head :forbidden unless checker.is_authorized?
|
151
153
|
|
152
|
-
|
154
|
+
collection_name = ForestLiana.name_for(@resource)
|
155
|
+
scoped_records = ForestLiana::ScopeManager.apply_scopes_on_records(@resource, forest_user, collection_name, params[:timezone])
|
156
|
+
|
157
|
+
unless scoped_records.exists?(params[:id])
|
158
|
+
return render serializer: nil, json: { status: 404 }, status: :not_found
|
159
|
+
end
|
160
|
+
|
161
|
+
scoped_records.destroy(params[:id])
|
153
162
|
|
154
163
|
head :no_content
|
155
164
|
rescue => error
|
@@ -161,7 +170,7 @@ module ForestLiana
|
|
161
170
|
checker = ForestLiana::PermissionsChecker.new(@resource, 'deleteEnabled', @rendering_id, user_id: forest_user['id'])
|
162
171
|
return head :forbidden unless checker.is_authorized?
|
163
172
|
|
164
|
-
ids = ForestLiana::ResourcesGetter.get_ids_from_request(params)
|
173
|
+
ids = ForestLiana::ResourcesGetter.get_ids_from_request(params, forest_user)
|
165
174
|
@resource.destroy(ids) if ids&.any?
|
166
175
|
|
167
176
|
head :no_content
|
@@ -249,6 +258,7 @@ module ForestLiana
|
|
249
258
|
{
|
250
259
|
user_id: user['id'],
|
251
260
|
filters: collection_list_request[:filters],
|
261
|
+
segmentQuery: collection_list_request[:segmentQuery],
|
252
262
|
}
|
253
263
|
end
|
254
264
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module ForestLiana
|
2
|
+
class ScopesController < ForestLiana::ApplicationController
|
3
|
+
def invalidate_scope_cache
|
4
|
+
begin
|
5
|
+
rendering_id = params[:renderingId]
|
6
|
+
|
7
|
+
unless rendering_id
|
8
|
+
FOREST_LOGGER.error 'Missing renderingId'
|
9
|
+
return render serializer: nil, json: { status: 400 }, status: :bad_request
|
10
|
+
end
|
11
|
+
|
12
|
+
ForestLiana::ScopeManager.invalidate_scope_cache(rendering_id)
|
13
|
+
return render serializer: nil, json: { status: 200 }, status: :ok
|
14
|
+
rescue => error
|
15
|
+
FOREST_LOGGER.error "Error during scope cache invalidation: #{error.message}"
|
16
|
+
render serializer: nil, json: {status: 500 }, status: :internal_server_error
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module ForestLiana
|
2
2
|
class SmartActionsController < ForestLiana::ApplicationController
|
3
3
|
if Rails::VERSION::MAJOR < 4
|
4
|
-
before_filter :
|
4
|
+
before_filter :smart_action_pre_perform_checks
|
5
5
|
else
|
6
|
-
before_action :
|
6
|
+
before_action :smart_action_pre_perform_checks
|
7
7
|
end
|
8
8
|
|
9
9
|
private
|
@@ -17,6 +17,41 @@ module ForestLiana
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
def smart_action_pre_perform_checks
|
21
|
+
check_permission_for_smart_route
|
22
|
+
ensure_record_ids_in_scope
|
23
|
+
end
|
24
|
+
|
25
|
+
def ensure_record_ids_in_scope
|
26
|
+
begin
|
27
|
+
attributes = get_smart_action_request
|
28
|
+
|
29
|
+
# if performing a `selectAll` let the `get_ids_from_request` handle the scopes
|
30
|
+
return if attributes[:all_records]
|
31
|
+
|
32
|
+
resource = find_resource(attributes[:collection_name])
|
33
|
+
|
34
|
+
# user is using the composite_primary_keys gem
|
35
|
+
if resource.primary_key.kind_of?(Array)
|
36
|
+
# TODO: handle primary keys
|
37
|
+
return
|
38
|
+
end
|
39
|
+
|
40
|
+
filter = JSON.generate({ 'field' => resource.primary_key, 'operator' => 'in', 'value' => attributes[:ids] })
|
41
|
+
|
42
|
+
resources_getter = ForestLiana::ResourcesGetter.new(resource, { :filters => filter, :timezone => attributes[:timezone] }, forest_user)
|
43
|
+
|
44
|
+
# resources getter will return records inside the scope. if the length differs then ids are out of scope
|
45
|
+
return if resources_getter.count == attributes[:ids].length
|
46
|
+
|
47
|
+
# target records are out of scope
|
48
|
+
render serializer: nil, json: { error: 'Smart Action: target record not found' }, status: :bad_request
|
49
|
+
rescue => error
|
50
|
+
FOREST_LOGGER.error "Smart Action: #{error}\n#{format_stacktrace(error)}"
|
51
|
+
render serializer: nil, json: { error: 'Smart Action: failed to evaluate permissions' }, status: :internal_server_error
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
20
55
|
def check_permission_for_smart_route
|
21
56
|
begin
|
22
57
|
|
@@ -57,11 +92,9 @@ module ForestLiana
|
|
57
92
|
|
58
93
|
# smart action permissions are retrieved from the action's endpoint and http_method
|
59
94
|
def get_smart_action_request_info
|
60
|
-
endpoint = request.fullpath
|
61
|
-
# Trim starting '/'
|
62
|
-
endpoint[0] = '' if endpoint[0] == '/'
|
63
95
|
{
|
64
|
-
|
96
|
+
# trim query params to get the endpoint
|
97
|
+
endpoint: request.fullpath.split('?').first,
|
65
98
|
http_method: request.request_method
|
66
99
|
}
|
67
100
|
end
|
@@ -27,15 +27,15 @@ module ForestLiana
|
|
27
27
|
def get
|
28
28
|
case params[:type]
|
29
29
|
when CHART_TYPE_VALUE
|
30
|
-
stat = ValueStatGetter.new(@resource, params)
|
30
|
+
stat = ValueStatGetter.new(@resource, params, forest_user)
|
31
31
|
when CHART_TYPE_PIE
|
32
|
-
stat = PieStatGetter.new(@resource, params)
|
32
|
+
stat = PieStatGetter.new(@resource, params, forest_user)
|
33
33
|
when CHART_TYPE_LINE
|
34
|
-
stat = LineStatGetter.new(@resource, params)
|
34
|
+
stat = LineStatGetter.new(@resource, params, forest_user)
|
35
35
|
when CHART_TYPE_OBJECTIVE
|
36
|
-
stat = ObjectiveStatGetter.new(@resource, params)
|
36
|
+
stat = ObjectiveStatGetter.new(@resource, params, forest_user)
|
37
37
|
when CHART_TYPE_LEADERBOARD
|
38
|
-
stat = LeaderboardStatGetter.new(@resource, params)
|
38
|
+
stat = LeaderboardStatGetter.new(@resource, params, forest_user)
|
39
39
|
end
|
40
40
|
|
41
41
|
stat.perform
|
@@ -109,13 +109,15 @@ module ForestLiana
|
|
109
109
|
parsed_value = parse_value(operator, value)
|
110
110
|
field_and_operator = "#{parsed_field} #{parsed_operator}"
|
111
111
|
|
112
|
+
# parenthesis around the parsed_value are required to make the `IN` operator work
|
113
|
+
# and have no side effects on other requests
|
112
114
|
if Rails::VERSION::MAJOR < 5
|
113
|
-
"#{field_and_operator} #{ActiveRecord::Base.sanitize(parsed_value)}"
|
115
|
+
"#{field_and_operator} (#{ActiveRecord::Base.sanitize(parsed_value)})"
|
114
116
|
# NOTICE: sanitize method as been removed in Rails 5.1 and sanitize_sql introduced in Rails 5.2.
|
115
117
|
elsif Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR == 1
|
116
|
-
"#{field_and_operator} #{ActiveRecord::Base.connection.quote(parsed_value)}"
|
118
|
+
"#{field_and_operator} (#{ActiveRecord::Base.connection.quote(parsed_value)})"
|
117
119
|
else
|
118
|
-
ActiveRecord::Base.sanitize_sql(["#{field_and_operator} ?", parsed_value])
|
120
|
+
ActiveRecord::Base.sanitize_sql(["#{field_and_operator} (?)", parsed_value])
|
119
121
|
end
|
120
122
|
end
|
121
123
|
|
@@ -147,6 +149,8 @@ module ForestLiana
|
|
147
149
|
'IS'
|
148
150
|
when 'present'
|
149
151
|
'IS NOT'
|
152
|
+
when 'in'
|
153
|
+
'IN'
|
150
154
|
else
|
151
155
|
raise_unknown_operator_error(operator)
|
152
156
|
end
|
@@ -154,7 +158,7 @@ module ForestLiana
|
|
154
158
|
|
155
159
|
def parse_value(operator, value)
|
156
160
|
case operator
|
157
|
-
when 'not', 'greater_than', 'less_than', 'not_equal', 'equal', 'before', 'after'
|
161
|
+
when 'not', 'greater_than', 'less_than', 'not_equal', 'equal', 'before', 'after', 'in'
|
158
162
|
value
|
159
163
|
when 'contains', 'not_contains'
|
160
164
|
"%#{value}%"
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module ForestLiana
|
2
|
-
class HasManyDissociator
|
2
|
+
class HasManyDissociator < ForestLiana::ApplicationController
|
3
3
|
def initialize(resource, association, params)
|
4
4
|
@resource = resource
|
5
5
|
@association = association
|
@@ -17,7 +17,7 @@ module ForestLiana
|
|
17
17
|
if @data.is_a?(Array)
|
18
18
|
record_ids = @data.map { |record| record[:id] }
|
19
19
|
elsif @data.dig('attributes').present?
|
20
|
-
record_ids = ForestLiana::ResourcesGetter.get_ids_from_request(@params)
|
20
|
+
record_ids = ForestLiana::ResourcesGetter.get_ids_from_request(@params, forest_user)
|
21
21
|
else
|
22
22
|
record_ids = Array.new
|
23
23
|
end
|
@@ -4,7 +4,7 @@ module ForestLiana
|
|
4
4
|
attr_reader :includes
|
5
5
|
attr_reader :records_count
|
6
6
|
|
7
|
-
def initialize(resource, association, params)
|
7
|
+
def initialize(resource, association, params, forest_user)
|
8
8
|
@resource = resource
|
9
9
|
@association = association
|
10
10
|
@params = params
|
@@ -13,7 +13,7 @@ module ForestLiana
|
|
13
13
|
@collection = get_collection(@collection_name)
|
14
14
|
compute_includes()
|
15
15
|
includes_symbols = @includes.map { |include| include.to_sym }
|
16
|
-
@search_query_builder = SearchQueryBuilder.new(@params, includes_symbols, @collection)
|
16
|
+
@search_query_builder = SearchQueryBuilder.new(@params, includes_symbols, @collection, forest_user)
|
17
17
|
|
18
18
|
prepare_query()
|
19
19
|
end
|
@@ -1,20 +1,22 @@
|
|
1
1
|
module ForestLiana
|
2
2
|
class LeaderboardStatGetter < StatGetter
|
3
|
-
def initialize(
|
4
|
-
@
|
5
|
-
|
6
|
-
@
|
7
|
-
|
8
|
-
@
|
9
|
-
@
|
10
|
-
@
|
11
|
-
@
|
12
|
-
@groub_by = "#{@resource.table_name}.#{@label_field}"
|
3
|
+
def initialize(parent_model, params, forest_user)
|
4
|
+
@scoped_parent_model = get_scoped_model(parent_model, forest_user, params[:timezone])
|
5
|
+
child_model = @scoped_parent_model.reflect_on_association(params[:relationship_field]).klass
|
6
|
+
@scoped_child_model = get_scoped_model(child_model, forest_user, params[:timezone])
|
7
|
+
@label_field = params[:label_field]
|
8
|
+
@aggregate = params[:aggregate].downcase
|
9
|
+
@aggregate_field = params[:aggregate_field]
|
10
|
+
@limit = params[:limit]
|
11
|
+
@groub_by = "#{@scoped_parent_model.table_name}.#{@label_field}"
|
13
12
|
end
|
14
13
|
|
15
14
|
def perform
|
16
|
-
|
17
|
-
|
15
|
+
includes = ForestLiana::QueryHelper.get_one_association_names_symbol(@scoped_child_model)
|
16
|
+
|
17
|
+
result = @scoped_child_model
|
18
|
+
.joins(includes)
|
19
|
+
.where({ @scoped_parent_model.name.downcase.to_sym => @scoped_parent_model })
|
18
20
|
.group(@groub_by)
|
19
21
|
.order(order)
|
20
22
|
.limit(@limit)
|
@@ -24,8 +26,12 @@ module ForestLiana
|
|
24
26
|
@record = Model::Stat.new(value: result)
|
25
27
|
end
|
26
28
|
|
27
|
-
def
|
28
|
-
|
29
|
+
def get_scoped_model(model, forest_user, timezone)
|
30
|
+
scope_filters = ForestLiana::ScopeManager.get_scope_for_user(forest_user, model.name, as_string: true)
|
31
|
+
|
32
|
+
return model.unscoped if scope_filters.blank?
|
33
|
+
|
34
|
+
FiltersParser.new(scope_filters, model, timezone).apply_filters
|
29
35
|
end
|
30
36
|
|
31
37
|
def order
|