forest_admin_agent 1.0.0.pre.beta.40 → 1.0.0.pre.beta.41
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/forest_admin_agent/builder/agent_factory.rb +6 -0
- data/lib/forest_admin_agent/facades/container.rb +4 -0
- data/lib/forest_admin_agent/http/router.rb +13 -12
- data/lib/forest_admin_agent/routes/charts/api_chart_collection.rb +70 -0
- data/lib/forest_admin_agent/routes/charts/api_chart_datasource.rb +62 -0
- data/lib/forest_admin_agent/routes/charts/charts.rb +5 -5
- data/lib/forest_admin_agent/serializer/forest_chart_serializer.rb +1 -1
- data/lib/forest_admin_agent/services/logger_service.rb +19 -3
- data/lib/forest_admin_agent/utils/condition_tree_parser.rb +2 -3
- data/lib/forest_admin_agent/utils/schema/schema_emitter.rb +1 -1
- data/lib/forest_admin_agent/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4cf2cf28452f96556dff2a234ba9583c9ee7dfd737e7a5b9950dc173e8806c40
|
4
|
+
data.tar.gz: 99e9e3c1c7f3a490a6c92048951d698a6bf39401728db22caf4aec7a6020438c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb7093defaccc0c4e7cf6424a5605687501e763fd6b0fa74cfa931685084f344522c16d04797b0c59c448bf1bdbb5d8b80ba6215d52f585216f007c235f6e5ec
|
7
|
+
data.tar.gz: dfeb108f3cf907718032c1817011805366ddc406f95f8b36485eb4871edc68549ab2e05100de4f27dc3a7caa418ed418236ec98fedfe531fc304fe19e697fde8
|
@@ -6,7 +6,7 @@ module ForestAdminAgent
|
|
6
6
|
def self.routes
|
7
7
|
[
|
8
8
|
actions_routes,
|
9
|
-
|
9
|
+
api_charts_routes,
|
10
10
|
System::HealthCheck.new.routes,
|
11
11
|
Security::Authentication.new.routes,
|
12
12
|
Charts::Charts.new.routes,
|
@@ -36,17 +36,18 @@ module ForestAdminAgent
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def self.api_charts_routes
|
39
|
-
routes =
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
39
|
+
routes = {}
|
40
|
+
Facades::Container.datasource.collections.each_value do |collection|
|
41
|
+
collection.schema[:charts].each do |chart_name|
|
42
|
+
routes.merge!(Charts::ApiChartCollection.new(collection, chart_name).routes)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
Facades::Container.datasource.schema[:charts].each do |chart_name|
|
47
|
+
routes.merge!(Charts::ApiChartDatasource.new(chart_name).routes)
|
48
|
+
end
|
49
|
+
|
50
|
+
routes
|
50
51
|
end
|
51
52
|
end
|
52
53
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'jsonapi-serializers'
|
2
|
+
require 'active_support/inflector'
|
3
|
+
|
4
|
+
module ForestAdminAgent
|
5
|
+
module Routes
|
6
|
+
module Charts
|
7
|
+
class ApiChartCollection < AbstractAuthenticatedRoute
|
8
|
+
include ForestAdminAgent::Utils
|
9
|
+
|
10
|
+
def initialize(collection, chart_name)
|
11
|
+
@chart_name = chart_name
|
12
|
+
@collection = collection
|
13
|
+
|
14
|
+
super()
|
15
|
+
end
|
16
|
+
|
17
|
+
def setup_routes
|
18
|
+
# Mount both GET and POST, respectively for smart and api charts.
|
19
|
+
collection_name = @collection.name
|
20
|
+
slug = @chart_name.parameterize
|
21
|
+
|
22
|
+
add_route(
|
23
|
+
"forest_chart_#{collection_name}_get_#{slug}",
|
24
|
+
'get',
|
25
|
+
"/_charts/:collection_name/#{slug}",
|
26
|
+
proc { |args| handle_smart_chart(args) }
|
27
|
+
)
|
28
|
+
|
29
|
+
add_route(
|
30
|
+
"forest_chart_#{collection_name}_post_#{slug}",
|
31
|
+
'post',
|
32
|
+
"/_charts/:collection_name/#{slug}",
|
33
|
+
proc { |args| handle_api_chart(args) }
|
34
|
+
)
|
35
|
+
|
36
|
+
unless Facades::Container.cache(:is_production)
|
37
|
+
Facades::Container.logger.log(
|
38
|
+
'Info',
|
39
|
+
"Chart #{@chart_name} was mounted at /forest/_charts/#{collection_name}/#{slug}"
|
40
|
+
)
|
41
|
+
end
|
42
|
+
|
43
|
+
self
|
44
|
+
end
|
45
|
+
|
46
|
+
def handle_api_chart(args)
|
47
|
+
{
|
48
|
+
content: Serializer::ForestChartSerializer.serialize(
|
49
|
+
@collection.render_chart(
|
50
|
+
@caller,
|
51
|
+
@chart_name,
|
52
|
+
Id.unpack_id(@collection, args[:params]['record_id'])
|
53
|
+
)
|
54
|
+
)
|
55
|
+
}
|
56
|
+
end
|
57
|
+
|
58
|
+
def handle_smart_chart(args)
|
59
|
+
{
|
60
|
+
content: @collection.render_chart(
|
61
|
+
@caller,
|
62
|
+
@chart_name,
|
63
|
+
Id.unpack_id(@collection, args[:params]['record_id'])
|
64
|
+
)
|
65
|
+
}
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'jsonapi-serializers'
|
2
|
+
require 'active_support/inflector'
|
3
|
+
|
4
|
+
module ForestAdminAgent
|
5
|
+
module Routes
|
6
|
+
module Charts
|
7
|
+
class ApiChartDatasource < AbstractAuthenticatedRoute
|
8
|
+
def initialize(chart_name)
|
9
|
+
@chart_name = chart_name
|
10
|
+
@datasource = ForestAdminAgent::Facades::Container.datasource
|
11
|
+
|
12
|
+
super()
|
13
|
+
end
|
14
|
+
|
15
|
+
def setup_routes
|
16
|
+
# Mount both GET and POST, respectively for smart and api charts.
|
17
|
+
slug = @chart_name.parameterize
|
18
|
+
|
19
|
+
add_route(
|
20
|
+
"forest_chart_get_#{slug}",
|
21
|
+
'get',
|
22
|
+
"/_charts/#{slug}",
|
23
|
+
proc { handle_smart_chart }
|
24
|
+
)
|
25
|
+
|
26
|
+
add_route(
|
27
|
+
"forest_chart_post_#{slug}",
|
28
|
+
'post',
|
29
|
+
"/_charts/#{slug}",
|
30
|
+
proc { handle_api_chart }
|
31
|
+
)
|
32
|
+
|
33
|
+
unless Facades::Container.cache(:is_production)
|
34
|
+
Facades::Container.logger.log('Info', "/forest/_charts/#{slug}")
|
35
|
+
end
|
36
|
+
|
37
|
+
self
|
38
|
+
end
|
39
|
+
|
40
|
+
def handle_api_chart
|
41
|
+
{
|
42
|
+
content: Serializer::ForestChartSerializer.serialize(
|
43
|
+
@datasource.render_chart(
|
44
|
+
@caller,
|
45
|
+
@chart_name
|
46
|
+
)
|
47
|
+
)
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
def handle_smart_chart
|
52
|
+
{
|
53
|
+
content: @datasource.render_chart(
|
54
|
+
@caller,
|
55
|
+
@chart_name
|
56
|
+
)
|
57
|
+
}
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -82,11 +82,11 @@ module ForestAdminAgent
|
|
82
82
|
previous_value = compute_value(FilterFactory.get_previous_period_filter(@filter, @caller.timezone))
|
83
83
|
end
|
84
84
|
|
85
|
-
ValueChart.new(value, previous_value)
|
85
|
+
ValueChart.new(value, previous_value).serialize
|
86
86
|
end
|
87
87
|
|
88
88
|
def make_objective
|
89
|
-
ObjectiveChart.new(compute_value(@filter))
|
89
|
+
ObjectiveChart.new(compute_value(@filter)).serialize
|
90
90
|
end
|
91
91
|
|
92
92
|
def make_pie
|
@@ -99,7 +99,7 @@ module ForestAdminAgent
|
|
99
99
|
|
100
100
|
result = @collection.aggregate(@caller, @filter, aggregation)
|
101
101
|
|
102
|
-
PieChart.new(result.map { |row| { key: row[:group][group_field], value: row[:value] } })
|
102
|
+
PieChart.new(result.map { |row| { key: row[:group][group_field], value: row[:value] } }).serialize
|
103
103
|
end
|
104
104
|
|
105
105
|
def make_line
|
@@ -137,7 +137,7 @@ module ForestAdminAgent
|
|
137
137
|
current += 1.send(time_range.downcase.pluralize.to_sym)
|
138
138
|
end
|
139
139
|
|
140
|
-
LineChart.new(result)
|
140
|
+
LineChart.new(result).serialize
|
141
141
|
end
|
142
142
|
|
143
143
|
def make_leaderboard
|
@@ -194,7 +194,7 @@ module ForestAdminAgent
|
|
194
194
|
}
|
195
195
|
end
|
196
196
|
|
197
|
-
return LeaderboardChart.new(result)
|
197
|
+
return LeaderboardChart.new(result).serialize
|
198
198
|
end
|
199
199
|
|
200
200
|
raise ForestAdminDatasourceToolkit::Exceptions::ForestException,
|
@@ -5,15 +5,31 @@ module ForestAdminAgent
|
|
5
5
|
class LoggerService
|
6
6
|
attr_reader :default_logger
|
7
7
|
|
8
|
+
LEVELS = {
|
9
|
+
'Info' => Logger::INFO,
|
10
|
+
'Debug' => Logger::DEBUG,
|
11
|
+
'Warn' => Logger::WARN,
|
12
|
+
'Error' => Logger::ERROR
|
13
|
+
}.freeze
|
14
|
+
|
8
15
|
def initialize(logger_level = 'Info', logger = nil)
|
9
16
|
@logger_level = logger_level
|
10
17
|
@logger = logger
|
11
|
-
@default_logger = MonoLogger.new(
|
18
|
+
@default_logger = MonoLogger.new($stdout)
|
12
19
|
# TODO: HANDLE FORMATTER
|
13
20
|
end
|
14
21
|
|
15
|
-
def
|
16
|
-
|
22
|
+
def log(level, message)
|
23
|
+
if @logger
|
24
|
+
@logger.call(get_level(level), message)
|
25
|
+
else
|
26
|
+
@default_logger.add(get_level(level), message)
|
27
|
+
end
|
28
|
+
@logger || @default_logger
|
29
|
+
end
|
30
|
+
|
31
|
+
def get_level(level)
|
32
|
+
LEVELS[level]
|
17
33
|
end
|
18
34
|
end
|
19
35
|
end
|
@@ -19,9 +19,8 @@ module ForestAdminAgent
|
|
19
19
|
|
20
20
|
if branch?(filters)
|
21
21
|
aggregator = filters[:aggregator].capitalize
|
22
|
-
conditions = []
|
23
|
-
|
24
|
-
conditions << from_plain_object(collection, sub_tree)
|
22
|
+
conditions = filters[:conditions].map do |sub_tree|
|
23
|
+
from_plain_object(collection, sub_tree)
|
25
24
|
end
|
26
25
|
|
27
26
|
return conditions.size == 1 ? conditions[0] : ConditionTreeBranch.new(aggregator, conditions)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: forest_admin_agent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.pre.beta.
|
4
|
+
version: 1.0.0.pre.beta.41
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthieu
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2024-04-
|
12
|
+
date: 2024-04-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -244,6 +244,8 @@ files:
|
|
244
244
|
- lib/forest_admin_agent/routes/abstract_related_route.rb
|
245
245
|
- lib/forest_admin_agent/routes/abstract_route.rb
|
246
246
|
- lib/forest_admin_agent/routes/action/action.rb
|
247
|
+
- lib/forest_admin_agent/routes/charts/api_chart_collection.rb
|
248
|
+
- lib/forest_admin_agent/routes/charts/api_chart_datasource.rb
|
247
249
|
- lib/forest_admin_agent/routes/charts/charts.rb
|
248
250
|
- lib/forest_admin_agent/routes/resources/count.rb
|
249
251
|
- lib/forest_admin_agent/routes/resources/delete.rb
|