restful-portfolios 0.13.17

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.
@@ -0,0 +1,207 @@
1
+ # encoding: UTF-8
2
+
3
+ # ######################################################################## #
4
+ #
5
+ # Adaptor for Portfolios microservice's hierarchy GET verb
6
+ #
7
+ # Copyright (c) 2018 Razor Risk Technologies Pty Limited. All rights reserved.
8
+ #
9
+ # ######################################################################## #
10
+
11
+
12
+ # ##########################################################################
13
+ # requires
14
+
15
+ require 'razor_risk/cassini/applications/rest_framework/verb_handler'
16
+ require 'razor_risk/cassini/applications/route_verb_adaptors/utilities/collection_get_helper'
17
+ require 'razor_risk/cassini/applications/route_verb_adaptors/utilities/portfolios'
18
+ require 'razor_risk/cassini/util/conversion_util'
19
+
20
+ require 'razor_risk/razor/connectivity/entity_connectors/exceptions'
21
+ require 'razor_risk/razor/connectivity/razor_3/entity_connectors/portfolios_connector'
22
+
23
+ require 'razor_risk/core/diagnostics/exceptions/rrcs_base_exception'
24
+
25
+ require 'razor_risk/core/diagnostics/logger'
26
+
27
+ require 'pantheios'
28
+ require 'xqsr3/conversion/integer_parser'
29
+
30
+ # ##########################################################################
31
+ # module
32
+
33
+ module RazorRisk
34
+ module Cassini
35
+ module Applications
36
+ module RouteVerbAdaptors
37
+ module Portfolios
38
+
39
+ # ##########################################################################
40
+ # classes
41
+
42
+ class HierarchyGet < RESTFramework::VerbHandler
43
+
44
+ include ::RazorRisk::Cassini::Applications::RouteVerbAdaptors::Utilities::CollectionGetHelper
45
+ include ::RazorRisk::Cassini::Applications::RouteVerbAdaptors::Utilities::Portfolios
46
+ include ::RazorRisk::Cassini::Util::ConversionUtil
47
+
48
+ include ::RazorRisk::Razor::Connectivity::EntityConnectors::Exceptions
49
+ include ::RazorRisk::Razor::Connectivity::Razor3
50
+ include ::RazorRisk::Razor::Connectivity::Razor3::EntityConnectors
51
+
52
+ include ::RazorRisk::Core::Diagnostics::Exceptions
53
+
54
+ include ::Pantheios
55
+
56
+ include ::RazorRisk::Core::Diagnostics::Logger
57
+
58
+ HTTP_VERB = :get
59
+
60
+ HTTP_ACCEPTS = %w{ application/xml application/json text/xml }
61
+
62
+ QUERY_PARAMETERS = %w{
63
+
64
+ filter-name
65
+
66
+ page-base
67
+ page-extent
68
+
69
+ key-search
70
+ }
71
+
72
+ def handle env, params, request, response
73
+
74
+ trace ParamNames[ :env, :params, :request, :response ], env, params, request, response
75
+ # params
76
+
77
+ filter_name = params['filter-name'].to_s.strip
78
+ filter_name = nil if filter_name.empty?
79
+ page_base = ::Xqsr3::Conversion::IntegerParser.to_integer(
80
+ params['page-base'] || 0
81
+ ) do |x, arg|
82
+ halt 422, {'Content-Type' => 'text/plain'}, "invalid page specifier: 'page-base'=#{arg}"
83
+ end
84
+ page_extent = ::Xqsr3::Conversion::IntegerParser.to_integer(
85
+ params['page-extent'] || 1000
86
+ ) do |x, arg|
87
+ halt 422, {'Content-Type' => 'text/plain'}, "invalid page specifier: 'page-extent'=#{arg}"
88
+ end
89
+ key_search = params['key-search']
90
+ key_search = nil if key_search.to_s.strip.empty?
91
+
92
+ if page_base < 0 || page_extent < 1
93
+
94
+ halt 416, {'Content-Type' => 'text/plain'}, "invalid page specifier: 'page-base'=#{page_base}; 'page-extent'=#{page_extent}"
95
+ end
96
+
97
+ if key_search
98
+ begin
99
+ key_search = MultiValueConjunctionParser.new.parse_conjunction_list key_search
100
+ rescue MultiValueConjunctionParser::SyntaxError => x
101
+ halt 422, {'Content-Type' => 'text/plain'}, x.message
102
+ end
103
+ end
104
+
105
+ rq_opts = {
106
+ :filter_name => filter_name,
107
+ :page_base => page_base,
108
+ :page_extent => page_extent,
109
+ :key_search => key_search,
110
+ }
111
+
112
+ # get credentials
113
+
114
+ cr = get_required_credentials
115
+
116
+ # get requester
117
+
118
+ rr = settings.razor_requester
119
+
120
+ # get connector
121
+
122
+ ec = PortfoliosConnector.new(rr, credentials: cr, **rq_opts)
123
+
124
+ # issue request
125
+
126
+ begin
127
+
128
+ qr = ec.get_hierarchy indicate_result_by: :qualified_result
129
+ rescue ::ArgumentError, ::NameError, ::NoMethodError, ::TypeError => x
130
+
131
+ log(:violation) { "(#{x.class}): #{x.message}" }
132
+ raise
133
+ rescue RazorRequester::InvalidCredentialsException => x
134
+
135
+ log(:failure) { "exception (#{x.class}): #{x}" }
136
+ halt 401, { 'Content-Type' => 'text/plain' }, 'Invalid credentials'
137
+ rescue DataNotFoundException => x
138
+
139
+ log(:failure) { "exception (#{x.class}): #{x}" }
140
+ halt 404, { 'Content-Type' => 'text/plain' }, x.message
141
+ rescue RRCSBaseException => x
142
+
143
+ log(:failure) { "exception (#{x.class}): #{x}" }
144
+ halt 500, { 'Content-Type' => 'text/plain' }, x.message
145
+ end
146
+
147
+ log :debug1, "qr(#{qr.class})='#{qr}'"
148
+
149
+ unless qr.succeeded?
150
+
151
+ if :no_such_filter == qr.result
152
+
153
+ log :debug1, "failed to retrieve portfolios: no such filter '#{filter_name}'"
154
+ halt 422, { 'Content-Type' => 'text/plain' }, "no such filter '#{filter_name}'"
155
+ elsif r = qr.failure_qualifier.reasons.lookup?('RZ0011')
156
+
157
+ log :debug1, 'failed to retrieve portfolios'
158
+ halt 404, { 'Content-Type' => 'text/plain' }, "#{r.message}: #{r.details}"
159
+ else
160
+
161
+ log :warning, 'failed to retrieve portfolios'
162
+ halt 500, { 'Content-Type' => 'text/plain' }, qr.failure_qualifier.reasons.join("\n")
163
+ end
164
+ end
165
+
166
+ r = qr.result.to_s
167
+
168
+ # return result
169
+
170
+ status 200
171
+
172
+ if false
173
+ elsif request.accept?('application/xml')
174
+
175
+ log :debug1, 'application/xml'
176
+ content_type 'application/xml'
177
+ r
178
+ elsif request.accept?('application/json')
179
+
180
+ log :debug1, 'application/json'
181
+ content_type 'application/json'
182
+ convert_XML_to_JSON r, { scheme: :gdata }
183
+ elsif request.accept?('text/xml')
184
+
185
+ log :debug1, 'text/xml'
186
+ content_type 'text/xml'
187
+ r
188
+ else
189
+
190
+ log :violation, "unexpected failure to match given 'Accept' header '#{request.accept}'"
191
+ status 500
192
+ end
193
+ end
194
+ end # class CollectionGet
195
+
196
+ # ##########################################################################
197
+ # module
198
+
199
+ end # module Portfolios
200
+ end # module RouteVerbAdaptors
201
+ end # module Applications
202
+ end # module Cassini
203
+ end # module RazorRisk
204
+
205
+ # ############################## end of file ############################# #
206
+
207
+
@@ -0,0 +1,112 @@
1
+ # encoding: UTF-8
2
+
3
+ # ######################################################################## #
4
+ #
5
+ # Adaptor for Portfolios microservice's item DELETE verb
6
+ #
7
+ # Copyright (c) 2018 Razor Risk Technologies Pty Limited. All rights reserved.
8
+ #
9
+ # ######################################################################## #
10
+
11
+
12
+ # ##########################################################################
13
+ # requires
14
+
15
+ require 'razor_risk/cassini/applications/rest_framework/verb_handler'
16
+
17
+ require 'razor_risk/razor/connectivity/razor_3/entity_connectors/portfolios_connector'
18
+
19
+ require 'razor_risk/core/diagnostics/logger'
20
+
21
+ require 'pantheios'
22
+
23
+ require 'xqsr3/conversion/integer_parser'
24
+
25
+ # ##########################################################################
26
+ # module
27
+
28
+ module RazorRisk
29
+ module Cassini
30
+ module Applications
31
+ module RouteVerbAdaptors
32
+ module Portfolios
33
+
34
+ # ##########################################################################
35
+ # classes
36
+
37
+ class ItemDelete < RESTFramework::VerbHandler
38
+
39
+ include ::RazorRisk::Razor::Connectivity::Razor3::EntityConnectors
40
+
41
+ include ::RazorRisk::Core::Diagnostics::Logger
42
+
43
+ include ::Pantheios
44
+
45
+ include ::Xqsr3::Conversion
46
+
47
+ HTTP_VERB = :delete
48
+
49
+ HTTP_ACCEPTS = %w{ application/xml application/json text/xml }
50
+
51
+ ROUTE_VARIABLES = %w{
52
+
53
+ id
54
+ }
55
+
56
+ QUERY_PARAMETERS = []
57
+
58
+ def handle env, params, request, response
59
+
60
+ # trace
61
+
62
+ trace ParamNames[ :env, :params, :request, :response ], env, params, request, response
63
+
64
+ # parameters
65
+
66
+ id = IntegerParser.to_integer(params['id'], allow_nil: true) { halt *[ 404, {}, 'invalid identifier for DELETE verb - must be an integer' ] }
67
+
68
+ # get credentials
69
+
70
+ cr = get_required_credentials
71
+
72
+ # get requester
73
+
74
+ rr = settings.razor_requester
75
+
76
+ # get connector
77
+
78
+ ec = PortfoliosConnector.new(rr, credentials: cr)
79
+
80
+ # issue request
81
+
82
+ qr = ec.delete_portfolio id, indicate_result_by: :qualified_result
83
+
84
+ log :debug1, "qr(#{qr.class})='#{qr}'"
85
+
86
+ unless qr.succeeded?
87
+
88
+ log :warning, "failed to delete portfolio with id '#{id}'"
89
+
90
+ if r = qr.failure_qualifier.reasons.lookup?('RZ0011')
91
+
92
+ halt *[ 404, {}, "#{r.message}: #{r.details}" ]
93
+ else
94
+
95
+ halt *[ 500, {}, qr.failure_qualifier.reasons.join("\n") ]
96
+ end
97
+ end
98
+ end
99
+ end # class ItemDelete
100
+
101
+ # ##########################################################################
102
+ # module
103
+
104
+ end # module Portfolios
105
+ end # module RouteVerbAdaptors
106
+ end # module Applications
107
+ end # module Cassini
108
+ end # module RazorRisk
109
+
110
+ # ############################## end of file ############################# #
111
+
112
+
@@ -0,0 +1,169 @@
1
+ # encoding: UTF-8
2
+
3
+ # ######################################################################## #
4
+ #
5
+ # Adaptor for Portfolios microservice's item GET verb
6
+ #
7
+ # Copyright (c) 2018 Razor Risk Technologies Pty Limited. All rights reserved.
8
+ #
9
+ # ######################################################################## #
10
+
11
+
12
+ # ##########################################################################
13
+ # requires
14
+
15
+ require 'razor_risk/cassini/applications/rest_framework/verb_handler'
16
+
17
+ require 'razor_risk/razor/connectivity/razor_3/entity_connectors/portfolios_connector'
18
+
19
+ require 'razor_risk/core/diagnostics/logger'
20
+
21
+ require 'pantheios'
22
+
23
+ # ##########################################################################
24
+ # module
25
+
26
+ module RazorRisk
27
+ module Cassini
28
+ module Applications
29
+ module RouteVerbAdaptors
30
+ module Portfolios
31
+
32
+ # ##########################################################################
33
+ # classes
34
+
35
+ class ItemGet < RESTFramework::VerbHandler
36
+
37
+ include ::RazorRisk::Razor::Connectivity::Razor3::EntityConnectors
38
+
39
+ include ::Pantheios
40
+
41
+ include ::RazorRisk::Core::Diagnostics::Logger
42
+
43
+ HTTP_VERB = :get
44
+
45
+ HTTP_ACCEPTS = %w{ application/xml application/json text/xml }
46
+
47
+ ROUTE_VARIABLES = %w{
48
+
49
+ id
50
+ }
51
+
52
+ QUERY_PARAMETERS = %w{
53
+
54
+ result-form
55
+ }
56
+
57
+ def handle env, params, request, response
58
+
59
+ trace ParamNames[ :env, :params, :request, :response ], env, params, request, response
60
+
61
+ # params
62
+
63
+ id = Integer(params['id']) { halt *[ 404, {}, 'invalid identifier for GET verb - must be an integer' ] }
64
+ rf = case rf = (params['result-form'] || '').to_s
65
+ when '', 'default'
66
+ :body
67
+ when 'summary'
68
+ :portfolio_summary
69
+ when 'portfolio'
70
+ :portfolio
71
+ else
72
+ log(:warning) { "unrecognised result-form '#{rf}'" }
73
+ :body
74
+ end
75
+
76
+ # get credentials
77
+
78
+ cr = get_required_credentials
79
+
80
+ # get requester
81
+
82
+ rr = settings.razor_requester
83
+
84
+ # get connector
85
+
86
+ ec = PortfoliosConnector.new(rr, credentials: cr)
87
+
88
+ # issue request
89
+
90
+ qr = ec.get_portfolio id, indicate_result_by: :qualified_result, result_form: rf
91
+
92
+ log :debug1, "qr(#{qr.class})='#{qr}'"
93
+
94
+ unless qr.succeeded?
95
+
96
+ if false
97
+
98
+ ;
99
+ elsif qr.result.nil?
100
+
101
+ log :debug1, 'failed to retrieve portfolio'
102
+
103
+ halt *[ 404, {}, "portfolio with id '#{id}' does not exist" ]
104
+ elsif r = qr.failure_qualifier.reasons.lookup?('RZ0011')
105
+
106
+ log :debug1, 'failed to retrieve portfolio'
107
+
108
+ halt *[ 404, {}, "#{r.message}: #{r.details}" ]
109
+ else
110
+
111
+ log :warning, 'failed to retrieve portfolio'
112
+
113
+ halt *[ 500, {}, qr.failure_qualifier.reasons.join("\n") ]
114
+ end
115
+ end
116
+
117
+ r = qr.result.to_s
118
+
119
+ # return result
120
+
121
+ status 200
122
+
123
+ if false
124
+ elsif request.accept?('application/xml')
125
+
126
+ log :debug1, 'application/xml'
127
+
128
+ content_type 'application/xml'
129
+
130
+ r
131
+ elsif request.accept?('application/json')
132
+
133
+ log :debug1, 'application/json'
134
+
135
+ content_type 'application/json'
136
+
137
+ resp_hash = Hash.from_xml r
138
+
139
+ resp_json = resp_hash
140
+
141
+ JSON.generate resp_json
142
+ elsif request.accept?('text/xml')
143
+
144
+ log :debug1, 'text/xml'
145
+
146
+ content_type 'text/xml'
147
+
148
+ r
149
+ else
150
+
151
+ log :violation, "unexpected failure to match given 'Accept' header '#{request.accept}'"
152
+
153
+ status 500
154
+ end
155
+ end
156
+ end # class ItemGet
157
+
158
+ # ##########################################################################
159
+ # module
160
+
161
+ end # module Portfolios
162
+ end # module RouteVerbAdaptors
163
+ end # module Applications
164
+ end # module Cassini
165
+ end # module RazorRisk
166
+
167
+ # ############################## end of file ############################# #
168
+
169
+
@@ -0,0 +1,130 @@
1
+ # encoding: UTF-8
2
+
3
+ # ######################################################################## #
4
+ #
5
+ # Adapter for Portfolios microservice's item POST verb
6
+ #
7
+ # Copyright (c) 2018 Razor Risk Technologies Pty Limited. All rights reserved.
8
+ #
9
+ # ######################################################################## #
10
+
11
+
12
+ # ##########################################################################
13
+ # requires
14
+
15
+ require 'razor_risk/cassini/applications/route_verb_adaptors/utilities/portfolios'
16
+
17
+ require 'razor_risk/cassini/applications/rest_framework/verb_handler'
18
+
19
+ require 'razor_risk/razor/connectivity/razor_3/entity_connectors/portfolios_connector'
20
+
21
+ require 'razor_risk/core/diagnostics/logger'
22
+
23
+ require 'pantheios'
24
+
25
+ # ##########################################################################
26
+ # module
27
+
28
+ module RazorRisk
29
+ module Cassini
30
+ module Applications
31
+ module RouteVerbAdaptors
32
+ module Portfolios
33
+
34
+ # ##########################################################################
35
+ # classes
36
+
37
+ class ItemPost < RESTFramework::VerbHandler
38
+
39
+ include ::RazorRisk::Cassini::Applications::RouteVerbAdaptors::Utilities::Portfolios
40
+
41
+ include ::RazorRisk::Razor::Connectivity::Razor3::EntityConnectors
42
+
43
+ include ::RazorRisk::Core::Diagnostics::Logger
44
+
45
+ include ::Pantheios
46
+
47
+ HTTP_VERB = :post
48
+
49
+ HTTP_CONTENT_TYPES = %w{ application/xml text/xml }
50
+
51
+ HTTP_ACCEPTS = %w{ application/xml application/json text/xml }
52
+
53
+ QUERY_PARAMETERS = []
54
+
55
+ def handle env, params, request, response
56
+
57
+ # trace
58
+
59
+ trace ParamNames[ :env, :params, :request, :response ], env, params, request, response
60
+
61
+ # read request body (XML)
62
+ #
63
+ # NOTE: For this handler, the input is required to be XML, and it
64
+ # is required that the document has a single top-level node
65
+ # 'portfolios'
66
+
67
+ request.body.rewind
68
+
69
+ body_text = request.body.read
70
+ rq_body = nil
71
+
72
+ case request.content_type
73
+ when 'application/xml', 'text/xml'
74
+
75
+ rq_body = ::Nokogiri.XML body_text
76
+ else
77
+
78
+ log :violation, "unexpected content-type '#{request.content_type}'"
79
+ end
80
+
81
+ rq_body = validate_request_body rq_body, require_id: false
82
+
83
+ # get credentials
84
+
85
+ cr = get_required_credentials
86
+
87
+ # get requester
88
+
89
+ rr = settings.razor_requester
90
+
91
+ # get connector
92
+
93
+ ec = PortfoliosConnector.new(rr, credentials: cr)
94
+
95
+ # issue request
96
+
97
+ qr = ec.insert_portfolio rq_body, indicate_result_by: :qualified_result
98
+
99
+ unless qr.succeeded?
100
+
101
+ log :warning, "failed to post portfolio: #{qr.failure_qualifier.reasons.join(':')}"
102
+
103
+ if r = qr.failure_qualifier.reasons.lookup?('RZ0011')
104
+
105
+ halt 404, {}, "#{r.message}: #{r.details}"
106
+ else
107
+
108
+ halt 422, {}, "failed to post portfolio"
109
+ end
110
+ end
111
+
112
+ status 201
113
+ portfolio_id = qr.result and return %Q{<portfolio id="#{portfolio_id}" />}
114
+
115
+ halt 500, {}, "returned response from Razor is not well formed"
116
+ end
117
+ end # class ItemPost
118
+
119
+ # ##########################################################################
120
+ # module
121
+
122
+ end # module Portfolios
123
+ end # module RouteVerbAdaptors
124
+ end # module Applications
125
+ end # module Cassini
126
+ end # module RazorRisk
127
+
128
+ # ############################## end of file ############################# #
129
+
130
+