forest_admin_rpc_agent 1.30.5 → 1.30.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7b87f32904f9a2d19ae17c3fc4a072fdd9b9507295650aad7b37f5f5422158e0
4
- data.tar.gz: 98ebfb88b77d5d27a1012e734d27d05c4626bf96530e0515e6fe25a38c3593a3
3
+ metadata.gz: 943cb5cbbec8a205970615612a16fa5f1700db0ae7ccf284720d35f0c21202bc
4
+ data.tar.gz: 0271eaed846c182822afc4dbf1159fd584989b87c3d0f09f876de284270d676c
5
5
  SHA512:
6
- metadata.gz: 9e80b93723b13efccc4c5e6682b3336024915354ade50cebae5044e166e4187334c4db35627ca184e0e78db05a3fb6ad7270889fadadd5049ba6db0de43d4f8e
7
- data.tar.gz: 6eaefdd80f3b2dfc96764f111773304f0adc5575e3b2e0376d7f1824b06b0426ba8b3d3483cfa517148a7370e44b2968f03fc64019e62478bef08f200b772302
6
+ metadata.gz: e1c51a56c98dcd566d0580ab7895c1421225340bccfb2fc495ccd13dc403f3bccf71d016241e2573334ff090a309829ecfb7467b1e7deba789b879138eb8b196
7
+ data.tar.gz: e9492a5e03758c31b6481977964bccdae3faf7e9a967e6903bab63b5931c2a2510a912e1256c8a817931f91dd59267fbad86a7f80b70f28f97c0adff27e75403
@@ -1,3 +1,5 @@
1
+ require 'cgi'
2
+ require 'json'
1
3
  require 'jsonapi-serializers'
2
4
 
3
5
  module ForestAdminRpcAgent
@@ -12,15 +14,37 @@ module ForestAdminRpcAgent
12
14
  end
13
15
 
14
16
  def handle_request(args)
15
- return {} unless args[:params]['collection_name']
16
-
17
17
  datasource = ForestAdminRpcAgent::Facades::Container.datasource
18
18
  collection = get_collection_safe(datasource, args[:params]['collection_name'])
19
19
  filter = FilterFactory.from_plain_object(args[:params]['filter'])
20
20
  data = args[:params]['data']
21
21
  action = args[:params]['action']
22
22
 
23
- collection.execute(args[:caller], action, data, filter)
23
+ result = collection.execute(args[:caller], action, data, filter)
24
+
25
+ return build_file_response(result) if file_result?(result)
26
+
27
+ result
28
+ end
29
+
30
+ private
31
+
32
+ def file_result?(result)
33
+ result.is_a?(Hash) && result[:type] == 'File'
34
+ end
35
+
36
+ def build_file_response(result)
37
+ encoded_name = CGI.escape(result[:name].to_s)
38
+ headers = {
39
+ 'Content-Type' => result[:mime_type],
40
+ 'Content-Disposition' => %(attachment; filename="#{encoded_name}"),
41
+ 'X-Forest-Action-Type' => 'File',
42
+ 'X-Forest-Action-File-Name' => encoded_name
43
+ }
44
+ headers['X-Forest-Action-Response-Headers'] = result[:response_headers].to_json if result[:response_headers]
45
+
46
+ # raw: true skips JSON encoding — file streams are arbitrary binary bytes.
47
+ { status: 200, headers: headers, content: result[:stream], raw: true }
24
48
  end
25
49
  end
26
50
  end
@@ -12,8 +12,6 @@ module ForestAdminRpcAgent
12
12
  end
13
13
 
14
14
  def handle_request(args)
15
- return {} unless args[:params]['collection_name']
16
-
17
15
  datasource = ForestAdminRpcAgent::Facades::Container.datasource
18
16
  collection = get_collection_safe(datasource, args[:params]['collection_name'])
19
17
  filter = FilterFactory.from_plain_object(args[:params]['filter'])
@@ -12,15 +12,13 @@ module ForestAdminRpcAgent
12
12
  end
13
13
 
14
14
  def handle_request(args)
15
- return {} unless args[:params]['collection_name']
16
-
17
15
  datasource = ForestAdminRpcAgent::Facades::Container.datasource
18
16
  collection = get_collection_safe(datasource, args[:params]['collection_name'])
19
17
 
20
18
  aggregation = Aggregation.new(
21
19
  operation: args[:params]['aggregation']['operation'],
22
20
  field: args[:params]['aggregation']['field'],
23
- groups: args[:params]['aggregation']['groups']
21
+ groups: args[:params]['aggregation']['groups'] || []
24
22
  )
25
23
  filter = FilterFactory.from_plain_object(args[:params]['filter'])
26
24
 
@@ -26,7 +26,13 @@ module ForestAdminRpcAgent
26
26
  status result[:status]
27
27
  # Set custom headers if provided
28
28
  result[:headers]&.each { |key, value| headers[key] = value }
29
- result[:content] ? serialize_response(result[:content]) : ''
29
+ if result[:content].nil?
30
+ ''
31
+ elsif result[:raw]
32
+ result[:content].to_s
33
+ else
34
+ serialize_response(result[:content])
35
+ end
30
36
  else
31
37
  serialize_response(result)
32
38
  end
@@ -39,16 +45,16 @@ module ForestAdminRpcAgent
39
45
 
40
46
  # Skip authentication for health check (root path)
41
47
  if @url == '/'
42
- params = deep_symbolize_keys(request.query_parameters.merge(request.request_parameters))
43
- result = handle_request({ params: params.with_indifferent_access, caller: nil, request: request })
48
+ params = extract_request_params(request)
49
+ result = handle_request({ params: params, caller: nil, request: request })
44
50
  build_rails_response(result)
45
51
  else
46
52
  auth_middleware = ForestAdminRpcAgent::Middleware::Authentication.new(->(_env) { [200, {}, ['OK']] })
47
53
  status, headers, response = auth_middleware.call(request.env)
48
54
 
49
55
  if status == 200
50
- params = deep_symbolize_keys(request.query_parameters.merge(request.request_parameters))
51
- result = handle_request({ params: params.with_indifferent_access, caller: headers[:caller], request: request })
56
+ params = extract_request_params(request)
57
+ result = handle_request({ params: params, caller: headers[:caller], request: request })
52
58
  build_rails_response(result)
53
59
  else
54
60
  [status, headers, response]
@@ -68,7 +74,13 @@ module ForestAdminRpcAgent
68
74
  if result.is_a?(Hash) && result.key?(:status)
69
75
  response_headers = { 'Content-Type' => 'application/json' }
70
76
  response_headers.merge!(result[:headers]) if result[:headers]
71
- body = result[:content] ? serialize_response(result[:content]) : ''
77
+ body = if result[:content].nil?
78
+ ''
79
+ elsif result[:raw]
80
+ result[:content].to_s
81
+ else
82
+ serialize_response(result[:content])
83
+ end
72
84
  [result[:status], response_headers, [body]]
73
85
  else
74
86
  [200, { 'Content-Type' => 'application/json' }, [serialize_response(result)]]
@@ -87,15 +99,15 @@ module ForestAdminRpcAgent
87
99
 
88
100
  private
89
101
 
90
- def deep_symbolize_keys(obj)
91
- case obj
92
- when Hash
93
- obj.transform_keys(&:to_sym).transform_values { |v| deep_symbolize_keys(v) }
94
- when Array
95
- obj.map { |v| deep_symbolize_keys(v) }
96
- else
97
- obj
98
- end
102
+ # Merge path params (e.g. :collection_name from the URL) with query and body params so
103
+ # consumers that don't duplicate `collection_name` in the body (the Node datasource-rpc)
104
+ # still resolve the route correctly.
105
+ def extract_request_params(request)
106
+ request.path_parameters
107
+ .except(:controller, :action, :format)
108
+ .merge(request.query_parameters)
109
+ .merge(request.request_parameters)
110
+ .with_indifferent_access
99
111
  end
100
112
 
101
113
  def serialize_response(result)
@@ -10,8 +10,6 @@ module ForestAdminRpcAgent
10
10
  end
11
11
 
12
12
  def handle_request(args)
13
- return {} unless args[:params]['collection_name']
14
-
15
13
  chart_name = args[:params]['chart']
16
14
  parameters = args[:params]['parameters']
17
15
  datasource = ForestAdminRpcAgent::Facades::Container.datasource
@@ -8,8 +8,6 @@ module ForestAdminRpcAgent
8
8
  end
9
9
 
10
10
  def handle_request(args)
11
- return {} unless args[:params]['collection_name']
12
-
13
11
  datasource = ForestAdminRpcAgent::Facades::Container.datasource
14
12
  collection = get_collection_safe(datasource, args[:params]['collection_name'])
15
13
 
@@ -12,8 +12,6 @@ module ForestAdminRpcAgent
12
12
  end
13
13
 
14
14
  def handle_request(args)
15
- return {} unless args[:params]['collection_name']
16
-
17
15
  datasource = ForestAdminRpcAgent::Facades::Container.datasource
18
16
  collection = get_collection_safe(datasource, args[:params]['collection_name'])
19
17
  filter = FilterFactory.from_plain_object(args[:params]['filter'])
@@ -12,8 +12,6 @@ module ForestAdminRpcAgent
12
12
  end
13
13
 
14
14
  def handle_request(args)
15
- return {} unless args[:params]['collection_name']
16
-
17
15
  datasource = ForestAdminRpcAgent::Facades::Container.datasource
18
16
  collection = get_collection_safe(datasource, args[:params]['collection_name'])
19
17
  projection = Projection.new(args[:params]['projection'])
@@ -10,8 +10,6 @@ module ForestAdminRpcAgent
10
10
  end
11
11
 
12
12
  def handle_request(args)
13
- return {} unless args[:params]['collection_name']
14
-
15
13
  datasource = ForestAdminRpcAgent::Facades::Container.datasource
16
14
  collection = get_collection_safe(datasource, args[:params]['collection_name'])
17
15
  filter = FilterFactory.from_plain_object(args[:params]['filter'])
@@ -1,3 +1,3 @@
1
1
  module ForestAdminRpcAgent
2
- VERSION = "1.30.5"
2
+ VERSION = "1.30.7"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: forest_admin_rpc_agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.30.5
4
+ version: 1.30.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthieu
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2026-05-22 00:00:00.000000000 Z
12
+ date: 2026-05-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: base64