restful-trades 0.8.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 62ac6e8e67358970cc32da5c78097870d2b4185d
4
+ data.tar.gz: 5f0a6f5ba2f8e72c586b30fbaaaf185e0a4bbaea
5
+ SHA512:
6
+ metadata.gz: da19ba8eb43a4bb3ef39920460e47d1d9284bb58f78b141c21faf029687e5252b2cc1ff1994e9c73cd5aa9accbc9d2d763e035a377542abd4e520eb3e79f5b27
7
+ data.tar.gz: a11df3126317a46423523fbf067b50a4faeca1e332a962cae863672c57be68b396340e885f48fb24adadbab582a7d7dbbece655b7cdd76606fb6a166f6856cd2
@@ -0,0 +1,392 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ # ######################################################################## #
5
+ # File: tools/servers/restful/trades/ws.rb
6
+ #
7
+ # Purpose: Main module/entry file for the Trades Microservice
8
+ #
9
+ # Author: Matthew Wilson
10
+ #
11
+ # Copyright (c) 2018, Razor Risk Technologies Pty Ltd
12
+ # All rights reserved.
13
+ #
14
+ # ######################################################################## #
15
+
16
+
17
+ # ##########################################################################
18
+
19
+ # Microservices: Trades (trades)
20
+ #
21
+ # Supported:
22
+ #
23
+ # - [GET] / {Unsecured}
24
+ # - [DELETE] /delete/:sysId {Secured}
25
+ # - [GET] /get {Secured}
26
+ # - [GET] /get/:id {Secured}
27
+ # - [POST] /post {Secured}
28
+ # - [PUT] /put/:id {Secured}
29
+
30
+ # ##########################################################################
31
+ # requires
32
+
33
+ require 'razor_risk/cassini/diagnostics/zeroth_include'
34
+
35
+ require 'razor_risk/cassini/applications/microservices/restful/trades'
36
+
37
+ require 'razor_risk/cassini/applications/route_verb_adaptors/trades'
38
+
39
+ require 'razor_risk/cassini/main'
40
+
41
+ require 'razor_risk/cassini/applications/rest_framework/route_verb_dispatcher'
42
+ require 'razor_risk/cassini/applications/secured_microservice'
43
+ require 'razor_risk/cassini/authorisation'
44
+ require 'razor_risk/cassini/common/version'
45
+ require 'razor_risk/cassini/util/version_util'
46
+
47
+ require 'razor_risk/razor/connectivity/razor_3/header_maker'
48
+ require 'razor_risk/razor/connectivity/razor_3/razor_requester'
49
+ require 'razor_risk/razor/connectivity/version'
50
+
51
+ require 'razor_risk/core/diagnostics/extensions/libclimate'
52
+ require 'razor_risk/core/diagnostics/logger'
53
+
54
+ require 'active_support/core_ext/hash'
55
+ require 'pantheios'
56
+ require 'xqsr3/version'
57
+
58
+ require 'csv'
59
+ require 'json'
60
+ require 'nokogiri'
61
+
62
+ # ##########################################################################
63
+ # includes
64
+
65
+ include ::RazorRisk::Cassini::Applications
66
+ include ::RazorRisk::Cassini::Applications::RESTFramework
67
+ include ::RazorRisk::Cassini::Applications::RouteVerbAdaptors
68
+ include ::RazorRisk::Cassini::Authorisation::SecurityModelHelpers
69
+ include ::RazorRisk::Cassini::Constants
70
+ include ::RazorRisk::Cassini::Util::SecretsUtil
71
+ include ::RazorRisk::Cassini::Util::VersionUtil
72
+
73
+ include ::RazorRisk::Razor::Connectivity::Razor3
74
+
75
+ include ::RazorRisk::Cassini::Diagnostics
76
+ include ::RazorRisk::Core::Diagnostics::Logger
77
+
78
+ include ::Pantheios
79
+
80
+ # ##########################################################################
81
+ # constants
82
+
83
+ PROGRAM_VERSION = ::RazorRisk::Cassini::Applications::Microservices::RESTful::Trades::VERSION
84
+
85
+ SUPPORTED_ROUTES = [
86
+
87
+ [ '/delete/:sysId', :delete, 'deletes the specified trade', ],
88
+ [ '/get', :get, 'gets the collection of trades', ],
89
+ [ '/get/:id', :get, 'gets the specified trade', ],
90
+ [ '/post', :post, 'posts a specified trade', ],
91
+ [ '/put/:id', :put, 'puts a specified trade', ],
92
+ [ '/post/getTradeContribution/?', :post, 'puts a specified trade', ],
93
+ ]
94
+
95
+ HTTP_ACCEPTS = %w{ text/html application/json application/xml text/xml text/csv text/plain text/tab-separated-values text/tsv }
96
+
97
+ # ##########################################################################
98
+ # compatibility checks
99
+
100
+ check_version_compatibility ::RazorRisk::Cassini::Common, [ 0, 21 ], 'RazorRisk.Cassini.Common'
101
+ check_version_compatibility ::RazorRisk::Razor::Connectivity, [ 0, 11, 2 ], 'RazorRisk.Razor.Connectivity'
102
+ check_version_compatibility ::LibCLImate, '0.10'
103
+ check_version_compatibility ::Pantheios, '0.20'
104
+ check_version_compatibility ::Xqsr3::VERSION, '0.30'
105
+
106
+ # ##########################################################################
107
+ # functions
108
+
109
+ def make_CSV_routes routes
110
+
111
+ CSV.generate do |csv|
112
+
113
+ routes.each do |ar|
114
+
115
+ csv << ar
116
+ end
117
+ end
118
+ end
119
+
120
+ def make_HTML_routes routes, **options
121
+
122
+ # TODO: use erb
123
+
124
+ routes = routes.map do |ar|
125
+
126
+ <<END_OF_tr
127
+ <tr>
128
+ <td>#{ar[0]}</td>
129
+ <td>#{ar[1]}</td>
130
+ <td>#{ar[2]}</td>
131
+ </tr>
132
+ END_OF_tr
133
+ end
134
+
135
+ <<END_OF_html
136
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.we.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
137
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
138
+ <head>
139
+ <title>Razor Risk Web Service API - Internal Microservice - trade</title>
140
+ <meta name="revisit-after" content="24 hours" />
141
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
142
+ </head>
143
+ <body>
144
+ <h1>Routes</h1>
145
+ <table>
146
+ <tr>
147
+ <th>Route</th>
148
+ <th>Verb</th>
149
+ <th>Description</th>
150
+ </tr>
151
+ #{routes.map { |r| r.chomp("\n") }.join("\n")}
152
+ </table>
153
+ </body>
154
+ </html>
155
+ END_OF_html
156
+ end
157
+
158
+ def make_JSON_routes routes, **options
159
+
160
+ r = {
161
+
162
+ 'routes' => []
163
+ }
164
+
165
+ r['routes'] = SUPPORTED_ROUTES.map { |ar| { route: ar[0], verb: ar[1].to_s.upcase, description: ar[2] } }
166
+
167
+ r.to_json
168
+ end
169
+
170
+ def make_Plain_routes routes
171
+
172
+ make_TSV_routes routes
173
+ end
174
+
175
+ def make_TSV_routes routes
176
+
177
+ routes.map { |ar| "#{ar[0]}\t#{ar[1]}\t#{ar[2]}\n" }
178
+ end
179
+
180
+ def make_XML_routes routes
181
+
182
+ <<END_OF_xml
183
+ <?xml version="1.0">
184
+ <routes>#{routes.map { |ar| %Q{ <route route="#{ar[0]}" verb="#{ar[1].to_s.upcase}" description="#{ar[2]}"/>}}.join(%Q{\n})}
185
+ </routes>
186
+ END_OF_xml
187
+ end
188
+
189
+ # ##########################################################################
190
+ # static set-up
191
+
192
+ # ##########################################################################
193
+ # lambdas
194
+
195
+ Lambdas_XML_to_JSON = lambda do |xml|
196
+
197
+ ConversionUtil.convert_XML_to_JSON xml
198
+ end
199
+
200
+ # ##########################################################################
201
+ # application
202
+
203
+ class TradesApp < SecuredMicroservice
204
+
205
+ include RouteVerbDispatch
206
+
207
+ include ::Pantheios
208
+
209
+
210
+ FULL_DESIGNATION = 'Trades'
211
+ SHORT_DESIGNATION = 'trades'
212
+ SERVICE_TYPE = :microservice
213
+
214
+ PROGRAM_FEATURES = {
215
+
216
+ has_web_server: true,
217
+
218
+ has_host_and_port: true,
219
+
220
+ has_razor_connectivity: true,
221
+
222
+ authentication: :with_credentials_algorithm,
223
+
224
+ copyright_year: 2017,
225
+ }
226
+
227
+
228
+ def self.on_init_service options
229
+
230
+ trace ParamNames[ :options ], options
231
+
232
+ raise ArgumentError, 'missing keyword: razor_requester' unless options.has_key? :razor_requester
233
+
234
+ set :razor_requester, options[:razor_requester]
235
+ end
236
+
237
+
238
+
239
+ private
240
+ def sec
241
+
242
+ return '' if credentials.empty?
243
+ " (for #{credentials.join(':')})"
244
+ end
245
+ public
246
+
247
+
248
+ # functional routes (DELETE, GET, POST, PUT)
249
+
250
+ delete '/delete/:sysId/?' do
251
+
252
+ # trace
253
+
254
+ trace ParamNames[ :request, :params ], request, params
255
+
256
+ dispatch Trades::ItemDelete
257
+ end
258
+
259
+ # params:
260
+ # +result-form+:: Specifies the form of the result: +default+ gets the
261
+ # full Razor body, and is the default if none specified; +summary+ gets
262
+ # the trade-summary form; +trade+ gets the trade form
263
+ get '/get/:id/?' do
264
+
265
+ # trace
266
+
267
+ trace ParamNames[ :request, :params ], request, params
268
+
269
+ dispatch Trades::ItemGet
270
+ end
271
+
272
+ # params:
273
+ # +page-base+:: Specifies the (0-based) index index of the first element
274
+ # to be presented. Defaults to 0 if not specified
275
+ # +page-extent+:: Specifies the number of records to return in the
276
+ # retrieval window. Defaults to 1000 if not specified
277
+ # +quick-search+:: Specifies a quick-search string
278
+ get '/get/?' do
279
+
280
+ trace ParamNames[ :request, :params ], request, params
281
+
282
+ dispatch Trades::CollectionGet
283
+ end
284
+
285
+ # params:
286
+ # +result-form+:: Specifies the form of the result: +id+ gets the
287
+ # ID of the trade, and is the default if none specified; +body+ gets
288
+ # the XML body response
289
+ post '/post/?' do
290
+
291
+ trace ParamNames[ :request, :params ], request, params
292
+
293
+ dispatch Trades::ItemPost
294
+ end
295
+
296
+ post '/post/getTradeContribution/?' do
297
+ trace ParamNames[ :request, :params ], request, params
298
+ dispatch Trades::CollectionPost
299
+ end
300
+
301
+ # params:
302
+ # +result-form+:: Specifies the form of the result: +id+ gets the
303
+ # ID of the trade, and is the default if none specified; +body+ gets
304
+ # the XML body response
305
+ put '/put/:id/?' do
306
+
307
+ trace ParamNames[ :request, :params ], request, params
308
+
309
+ dispatch Trades::ItemPut
310
+ end
311
+
312
+ get '/' do
313
+
314
+ HTTP_ACCEPTS.each do |accept_type|
315
+
316
+ if request.accept? accept_type
317
+
318
+ content_type accept_type
319
+
320
+ case accept_type
321
+ when 'application/json'
322
+
323
+ r = make_JSON_routes SUPPORTED_ROUTES
324
+ when 'application/xml', 'text/xml'
325
+
326
+ r = make_XML_routes SUPPORTED_ROUTES
327
+ when 'text/csv'
328
+
329
+ r = make_CSV_routes SUPPORTED_ROUTES
330
+ when 'text/html'
331
+
332
+ r = make_HTML_routes SUPPORTED_ROUTES
333
+ when 'text/plain'
334
+
335
+ r = make_Plain_routes SUPPORTED_ROUTES
336
+ when 'text/tsv', 'text/tab-separated-values'
337
+
338
+ r = make_TSV_routes SUPPORTED_ROUTES
339
+ else
340
+
341
+ log :violation, 'unrecognised accept type \'', accept_type, '\''
342
+
343
+ halt *[ 500, {}, 'internal server failure' ]
344
+ end
345
+
346
+ return r
347
+ end
348
+ end
349
+
350
+ halt *[ 406, {}, "supports only the Accept types #{HTTP_ACCEPTS.map { |t| %Q<'#{t}'> }.join(', ')}" ]
351
+ end
352
+
353
+ define_catch_all_handlers
354
+ end
355
+
356
+ TheApp = TradesApp
357
+
358
+ # now define the OPTIONS support
359
+
360
+ supported_routes = Hash.new { |h, k| h[k] = [] }
361
+
362
+ SUPPORTED_ROUTES.each do |ar|
363
+
364
+ supported_routes[ar[0]].push ar[1]
365
+ end
366
+
367
+ supported_routes.each do |k, v|
368
+
369
+ if k =~ /:id(?:\/\?)?$/
370
+
371
+ route = "#$`*"
372
+ else
373
+
374
+ route = k
375
+ end
376
+
377
+ TheApp.options route do
378
+
379
+ verbs = v.map { |t| t.upcase }.join(',')
380
+
381
+ halt *[200, { 'Allow' => verbs }, [ verbs ] ]
382
+ end
383
+ end
384
+
385
+ TheApp.options '/' do
386
+
387
+ halt *[200, { 'Allow' => 'GET' }, '' ]
388
+ end
389
+
390
+ # ############################## end of file ############################# #
391
+
392
+
@@ -0,0 +1,59 @@
1
+ # encoding: UTF-8
2
+
3
+ # ######################################################################## #
4
+ # File: razor_risk/cassini/applications/microservices/restful/trades/version.rb
5
+ #
6
+ # Purpose: Version for RazorRisk.Cassini.Microservices.RESTful.Trades library
7
+ #
8
+ # Created: 7th January 2019
9
+ # Updated: 16th January 2019
10
+ #
11
+ # Copyright (c) 2019, Razor Risk Technologies Pty Ltd
12
+ # All rights reserved.
13
+ #
14
+ # ######################################################################## #
15
+
16
+
17
+ =begin
18
+ =end
19
+
20
+ module RazorRisk
21
+ module Cassini
22
+ module Applications
23
+ module Microservices
24
+ module RESTful
25
+
26
+ module Trades
27
+
28
+ # Current version of the RazorRisk.Cassini.Microservices.RESTful.Trades library
29
+ VERSION = '0.8.7'
30
+
31
+ private
32
+ VERSION_PARTS_ = VERSION.split(/[.]/).collect { |n| n.to_i } # :nodoc:
33
+ public
34
+ # Major version of the RazorRisk.Cassini.Microservices.RESTful.Trades library
35
+ VERSION_MAJOR = VERSION_PARTS_[0] # :nodoc:
36
+ # Minor version of the RazorRisk.Cassini.Microservices.RESTful.Trades library
37
+ VERSION_MINOR = VERSION_PARTS_[1] # :nodoc:
38
+ # Patch version of the RazorRisk.Cassini.Microservices.RESTful.Trades library
39
+ VERSION_PATCH = VERSION_PARTS_[2] # :nodoc:
40
+ # Commit version of the RazorRisk.Cassini.Microservices.RESTful.Trades library
41
+ VERSION_COMMIT = VERSION_PARTS_[3] || 0 # :nodoc:
42
+
43
+
44
+ # The description of the framework
45
+ DESCRIPTION = "Razor Risk's Cassini Web-framework's Trades RESTful microservice"
46
+
47
+ # [DEPRECATED] Instead use +DESCRIPTION+
48
+ FRAMEWORK_DESCRIPTION = DESCRIPTION
49
+ end # module Trades
50
+
51
+ end # module RESTful
52
+ end # module Microservices
53
+ end # module Applications
54
+ end # module Cassini
55
+ end # module RazorRisk
56
+
57
+ # ############################## end of file ############################# #
58
+
59
+
@@ -0,0 +1,2 @@
1
+
2
+ require 'razor_risk/cassini/applications/microservices/restful/trades/version'