forest_admin_agent 1.0.0.pre.beta.40 → 1.0.0.pre.beta.41
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/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
|