wireway 202009261101 → 202012161641
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/README.md +22 -0
- data/app/controllers/wireway/application_controller.rb +1 -0
- data/app/controllers/wireway/restful_controller.rb +13 -0
- data/app/models/wireway/business_logic/restful.rb +41 -12
- data/app/models/wireway/spark.rb +11 -7
- data/app/models/wireway/standard.rb +145 -0
- data/config/routes.rb +5 -0
- 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: 8330c413fc8bd8b3bddd33990d1c124c2974ad0a9a45c4ec7e8b220f933dc417
|
4
|
+
data.tar.gz: db406a9c62ad0fbb1c0d42f4f41f20490e35ca6e7b95957f9424d881bd78728f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4d84f15fe9da85b6348362085c0b0e574061448262b50701f209b2b234bbfbfcf92806e223fabba2b8b3d67eecd6f73094a777cd415acca2fb0f718465e8a72f
|
7
|
+
data.tar.gz: a42d73253abb53f7ac68c6ba95225bee4cb164238e2548d2c1233af639201da95f81b0169f44cb41dbcd77e84bd9e1ce488c544860e2afe3f6e348815eb7fc47
|
data/README.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
|
2
|
+
<!-- TOC -->
|
3
|
+
|
4
|
+
- [说明](#说明)
|
5
|
+
- [执照](#执照)
|
6
|
+
- [插件作用](#插件作用)
|
7
|
+
- [行为准则](#行为准则)
|
8
|
+
- [关于C919](#关于c919)
|
9
|
+
- [使用示例](#使用示例)
|
10
|
+
|
11
|
+
<!-- /TOC -->
|
12
|
+
|
1
13
|
# 说明
|
2
14
|
|
3
15
|
## 执照
|
@@ -27,4 +39,14 @@ C919为系列Gem组件的集合,具体组成部分及相关示例[参考](https:
|
|
27
39
|
```ruby
|
28
40
|
Wireway::Spark.satcom(api_code: :finance_fund_base_info, code: '161725')
|
29
41
|
# => [true, {:基金全称=>"招商中证白酒指数分级证券投资基金", :基金简称=>"招商中证白酒指数分级", :基金代码=>"161725(前端)", :基金类型=>"股票指数", :发行日期=>"2015年05月12日", :"成立日期/规模"=>"2015年05月27日 / 3.965亿份", :资产规模=>"129.25亿元(截止至:2020年06月30日)", :份额规模=>"184.0866亿份(截止至:2020年08月26日)", :基金经理人=>"侯昊", :基金托管人=>"中国银行", :成立来分红=>"每份累计0.00元(0次)", :管理费率=>"1.00%(每年)", :托管费率=>"0.22%(每年)", :销售服务费率=>"---(每年)", :最高认购费率=>"0.80%(前端)", :业绩比较基准=>"中证白酒指数收益率×95%+金融机构人民币活期存款基准利率(税后)×5%", :跟踪标的=>"中证白酒指数", :母子基金=>"161725(母)150269 150270(子)", :是否配对转换=>"是", :是否转LOF=>"否", :封闭期=>"无", :提前结束条款=>"无", :定期折算日=>"每个会计年度的12月15日(遇节假日顺延)", :不定期折算条件=>"当招商中证白酒份额的基金份额净值达到1.500元;当招商中证白酒B份额的基金份额参考净值达到0.250元。", :固定收益份额年化收益率=>"一年期定期存款利率(税后)+3%", :亏损临界点=>"无", :保收益临界点=>"无", :超额收益临界点=>"无"}]
|
42
|
+
```
|
43
|
+
|
44
|
+
或无需引用Gem直接发起Post请求:
|
45
|
+
|
46
|
+
```bash
|
47
|
+
curl --location --request POST '123.57.155.17:3114/wireway/restful/request_api' \
|
48
|
+
--header 'Content-Type: application/x-www-form-urlencoded' \
|
49
|
+
--data-urlencode 'platform=satcom' \
|
50
|
+
--data-urlencode 'api_code=finance_fund_base_info' \
|
51
|
+
--data-urlencode 'code=161725'
|
30
52
|
```
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Wireway
|
2
|
+
class RestfulController < ApplicationController
|
3
|
+
def request_api
|
4
|
+
# TODO 初步了解为rails5的安全机制 去除存在风险 暂时先这样
|
5
|
+
args = params.permit!.to_hash.reject!{|key| ["action", "controller"].include?(key)}.deep_symbolize_keys
|
6
|
+
|
7
|
+
res = Wireway::Spark.send(args[:platform], args)
|
8
|
+
tmp = {success: res[0], result: res[1]}
|
9
|
+
(tmp.merge!(res[2]) rescue nil) if res[2].present?
|
10
|
+
render json: tmp.merge!(tmp)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -11,14 +11,16 @@ module Wireway
|
|
11
11
|
def node_addresses
|
12
12
|
return $wireway_node_addresses unless $wireway_node_addresses == 404
|
13
13
|
|
14
|
-
|
14
|
+
nodes = ['123.57.155.17:3113']
|
15
15
|
route = '/satcom/other/c919/node_addresses.json'
|
16
|
-
res = get(addresses:
|
16
|
+
res = get(addresses: nodes, route: route) do |result|
|
17
17
|
hash = JSON.parse(result[1][:body]).deep_symbolize_keys
|
18
18
|
[true, hash]
|
19
19
|
end
|
20
|
-
|
21
|
-
|
20
|
+
|
21
|
+
return res unless res[0]
|
22
|
+
nodes = res[1].map{|key, value| [key, value[:nodes]]}.to_h
|
23
|
+
$wireway_node_addresses = [true, nodes]
|
22
24
|
end
|
23
25
|
|
24
26
|
def dashboard(**args)
|
@@ -26,8 +28,9 @@ module Wireway
|
|
26
28
|
response_type: 'json',
|
27
29
|
}.merge!(args)
|
28
30
|
route = '/dashboard/restful/request_api'
|
29
|
-
|
30
|
-
|
31
|
+
res = node_addresses
|
32
|
+
return res unless res[0]
|
33
|
+
post(addresses: res[1][:dashboard], route: route, params: params) do |result|
|
31
34
|
return result if (params[:response_type] != 'json')
|
32
35
|
body = JSON.parse(result[1][:body]).deep_symbolize_keys
|
33
36
|
return [false, body[:result]] unless body[:success]
|
@@ -38,14 +41,40 @@ module Wireway
|
|
38
41
|
def satcom(**args)
|
39
42
|
params = {}.merge!(args)
|
40
43
|
route = '/satcom/restful/request_api'
|
44
|
+
res = node_addresses
|
45
|
+
return res unless res[0]
|
46
|
+
post(addresses: res[1][:satcom], route: route, params: params) do |result|
|
47
|
+
body = JSON.parse(result[1][:body]).deep_symbolize_keys
|
48
|
+
return [false, body[:result], body[:errors]].compact unless body[:success]
|
49
|
+
[true, body[:result]]
|
50
|
+
end
|
51
|
+
end
|
41
52
|
|
42
|
-
|
53
|
+
def wireway(**args)
|
54
|
+
params = {
|
55
|
+
local: false
|
56
|
+
}.merge!(args)
|
57
|
+
route = '/wireway/restful/request_api'
|
58
|
+
res = node_addresses
|
59
|
+
return res unless res[0]
|
60
|
+
post(addresses: res[1][:wireway], route: route, params: params) do |result|
|
43
61
|
body = JSON.parse(result[1][:body]).deep_symbolize_keys
|
44
|
-
return [false, body[:result]] unless body[:success]
|
62
|
+
return [false, body[:result], body[:errors]].compact unless body[:success]
|
45
63
|
[true, body[:result]]
|
46
64
|
end
|
47
65
|
end
|
48
66
|
|
67
|
+
def black_box(**args)
|
68
|
+
params = {}.merge!(args)
|
69
|
+
route = '/black_box/restful/request_api'
|
70
|
+
res = node_addresses
|
71
|
+
return res unless res[0]
|
72
|
+
res = post(addresses: res[1][:black_box], route: route, params: params) do |result|
|
73
|
+
body = JSON.parse(result[1][:body]).deep_symbolize_keys
|
74
|
+
return [false, body[:result], body[:errors]].compact unless body[:success]
|
75
|
+
[true, body]
|
76
|
+
end
|
77
|
+
end
|
49
78
|
|
50
79
|
def get(addresses:, route:, params: {})
|
51
80
|
result = round_robin(addresses: addresses) do |address|
|
@@ -58,7 +87,7 @@ module Wireway
|
|
58
87
|
begin
|
59
88
|
yield result
|
60
89
|
rescue
|
61
|
-
return [false, '运行时结果处理异常', {errors: {message: $!.to_s, path: $@}}]
|
90
|
+
return [false, '[Wireway]运行时结果处理异常', {errors: {message: $!.to_s, path: $@}}]
|
62
91
|
end
|
63
92
|
end
|
64
93
|
|
@@ -71,7 +100,7 @@ module Wireway
|
|
71
100
|
begin
|
72
101
|
yield result
|
73
102
|
rescue
|
74
|
-
return [false, '运行时结果处理异常', {errors: {message: $!.to_s, path: $@}}]
|
103
|
+
return [false, '[Wireway]运行时结果处理异常', {errors: {message: $!.to_s, path: $@}}]
|
75
104
|
end
|
76
105
|
end
|
77
106
|
|
@@ -92,7 +121,7 @@ module Wireway
|
|
92
121
|
def get_response
|
93
122
|
begin
|
94
123
|
response = yield
|
95
|
-
return [false, "响应码异常:#{response.code}", {response: response}] unless (response.code == 200)
|
124
|
+
return [false, "[Wireway]响应码异常:#{response.code}", {response: response}] unless (response.code == 200)
|
96
125
|
|
97
126
|
hash = {code: 200}
|
98
127
|
res = handle_body_encode(body: response.body)
|
@@ -100,7 +129,7 @@ module Wireway
|
|
100
129
|
|
101
130
|
hash.merge!({body: res[1]})
|
102
131
|
rescue
|
103
|
-
return [false, '请求异常', {errors: {message: $!.to_s, path: $@}}]
|
132
|
+
return [false, '[Wireway]请求异常', {errors: {message: $!.to_s, path: $@}}]
|
104
133
|
end
|
105
134
|
|
106
135
|
[true, hash]
|
data/app/models/wireway/spark.rb
CHANGED
@@ -1,17 +1,21 @@
|
|
1
1
|
module Wireway
|
2
2
|
module Spark
|
3
|
-
|
4
|
-
# Wireway::Spark.dashboard(api_code: :publish_other_request_assets, rely_assets: ["bootstrap_4", "jQuery_3_5_1", "chart_js"])
|
5
|
-
# Wireway::Spark.satcom(api_code: :finance_fund_base_info, code: '161725')
|
6
|
-
def self.method_missing(method_name, **args)
|
3
|
+
def self.method_missing(method_name, local: true, **args)
|
7
4
|
begin
|
8
5
|
target = Wireway::BusinessLogic::Restful
|
9
|
-
|
6
|
+
unless [true, 'true', 1, '1', 'yes'].include?(local)
|
7
|
+
return [false, "未找到名称为:#{method_name}的方法定义."] unless target.respond_to?(method_name)
|
8
|
+
end
|
10
9
|
res = target.send(method_name, args)
|
11
10
|
rescue
|
12
|
-
|
11
|
+
error_msg = [false, '[Wireway]请求异常', {errors: {message: $!.to_s, path: $@}}]
|
12
|
+
return error_msg unless [true, 'true', 1, '1', 'yes'].include?(local)
|
13
|
+
# 当以Gem形式的组件无法处理请求时,尝试请求线上版组件是否可以正常处理请求
|
14
|
+
# 即当gem出现问题时会请求线上服务 有利于断点排查
|
15
|
+
args.merge!(platform: method_name)
|
16
|
+
res = target.wireway(args)
|
13
17
|
end
|
14
|
-
end
|
18
|
+
end
|
15
19
|
|
16
20
|
end
|
17
21
|
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
module Wireway
|
2
|
+
# 接口请求参数标准
|
3
|
+
module Standard
|
4
|
+
extend self
|
5
|
+
|
6
|
+
# 全自检项检查
|
7
|
+
def inspect_all(ideal:, reality:)
|
8
|
+
ideal_reality = {ideal: ideal, reality: reality}
|
9
|
+
|
10
|
+
res = default_value(ideal_reality)
|
11
|
+
return res unless res[0]
|
12
|
+
|
13
|
+
res = value_type(ideal_reality)
|
14
|
+
return res unless res[0]
|
15
|
+
|
16
|
+
res = attribute_necessary(ideal_reality)
|
17
|
+
return res unless res[0]
|
18
|
+
|
19
|
+
# res = check_data_format(described: described, reality: reality)
|
20
|
+
# return res unless res[0]
|
21
|
+
[true, '']
|
22
|
+
end
|
23
|
+
|
24
|
+
# 参数项检查
|
25
|
+
def attribute_necessary(ideal:, reality:)
|
26
|
+
# 检查必须参数是否缺失
|
27
|
+
necessary_standards = ideal.select{|standard| standard[:necessary] == true}
|
28
|
+
necessary_standards.each do |standard|
|
29
|
+
key = standard[:key]
|
30
|
+
unless (reality[key.to_sym] || reality[key]).present?
|
31
|
+
return [false, "#{standard[:name]}(#{key})为必须项,不能为空"]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# 检查参数值是否符合正则式要求
|
36
|
+
reality.each do |key, value|
|
37
|
+
standard = ideal.select{|standard| [key, key.to_sym, key.to_s].uniq.include?(standard[:key])}[0]
|
38
|
+
# return [false, "未找到关于参数:#{key} 的定义"] unless standard
|
39
|
+
next unless standard
|
40
|
+
|
41
|
+
if standard[:regular] && (value.to_s =~ standard[:regular]).nil?
|
42
|
+
tmp = "参数:#{standard[:name]}(#{key})的参数值(#{value})不满足要求"
|
43
|
+
tmp+= ", 请参考: #{standard[:explain]}" if standard[:explain].present?
|
44
|
+
tmp+= ", 示例值: #{standard[:example]}" if standard[:example].present?
|
45
|
+
tmp+= ", 默认值: #{standard[:default]}" if standard[:default].present?
|
46
|
+
tmp+='.'
|
47
|
+
return [false, tmp]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
[true, '']
|
52
|
+
end
|
53
|
+
|
54
|
+
# 参数默认值检查
|
55
|
+
def default_value(ideal:, reality:)
|
56
|
+
ideal.select{|standard| !standard[:default].nil?}.each do |standard|
|
57
|
+
unless reality[standard[:key].to_sym].present?
|
58
|
+
reality.merge!({standard[:key].to_sym => standard[:default]})
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
[true, '']
|
63
|
+
end
|
64
|
+
|
65
|
+
# 参数值格式检查
|
66
|
+
def value_type(ideal:, reality:)
|
67
|
+
ideal.each do |standard|
|
68
|
+
unless standard[:value_type].present?
|
69
|
+
return [false, "自描述参数标准检查异常: #{standard[:name]}(#{standard[:key]})未设置对应参数值类型(value_type)."]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
ideal.each do |standard|
|
74
|
+
old_value = reality[standard[:key].to_sym]
|
75
|
+
|
76
|
+
case standard[:value_type].to_sym
|
77
|
+
when :string_or_array, :array_or_string
|
78
|
+
new_value = (JSON.parse(old_value) rescue false)
|
79
|
+
new_value = old_value.split(/, |,/) unless new_value
|
80
|
+
when :array
|
81
|
+
error_msg = [false, "参数:#{standard[:key]},参数类型不符合Json数组要求."]
|
82
|
+
next if old_value.is_a?(Array)
|
83
|
+
|
84
|
+
new_value = (JSON.parse(old_value) rescue (return error_msg))
|
85
|
+
return error_msg unless new_value.is_a?(Array)
|
86
|
+
when :key_value
|
87
|
+
error_msg = [false, "参数:#{standard[:key]},参数类型不符合Json键值对要求."]
|
88
|
+
next if old_value.is_a?(Hash)
|
89
|
+
|
90
|
+
new_value = (JSON.parse(old_value) rescue (return error_msg))
|
91
|
+
return error_msg unless new_value.is_a?(Hash)
|
92
|
+
when :boolean
|
93
|
+
new_value = [true, 'true', '1', 1].include?(old_value)
|
94
|
+
when :integer
|
95
|
+
max_value = standard[:max]
|
96
|
+
return [false, "参数:#{standard[:key]},参数值:#{old_value} 大于接口定义最大值:#{max_value}."] if max_value.present? && (old_value.to_i > max_value)
|
97
|
+
next if old_value.is_a?(Integer)
|
98
|
+
if old_value == '0'
|
99
|
+
new_value = 0
|
100
|
+
else
|
101
|
+
return [false, "参数:#{standard[:key]},参数类型不符合数字要求."] if ((old_value.to_i rescue 0) == 0)
|
102
|
+
new_value = old_value.to_i
|
103
|
+
end
|
104
|
+
else
|
105
|
+
next
|
106
|
+
end
|
107
|
+
|
108
|
+
unless (old_value == new_value)
|
109
|
+
reality.merge!({standard[:key].to_sym => new_value})
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
[true, '']
|
114
|
+
end
|
115
|
+
|
116
|
+
def check_data_format(described:, reality:)
|
117
|
+
data_format = {}
|
118
|
+
if (reality[:data_format] == ['original']) && (reality[:key_type] == 'zh')
|
119
|
+
described[:data_structure].map do |key, value|
|
120
|
+
data_format.merge!([[value, key]].to_h)
|
121
|
+
end
|
122
|
+
reality[:data_format] = data_format
|
123
|
+
return [true, '']
|
124
|
+
elsif (reality[:data_format] == ['original'])
|
125
|
+
described[:data_structure].each do |key, value|
|
126
|
+
data_format.merge!([[key, key]].to_h)
|
127
|
+
end
|
128
|
+
reality[:data_format] = data_format
|
129
|
+
return [true, '']
|
130
|
+
end
|
131
|
+
|
132
|
+
data_format = reality[:data_format]
|
133
|
+
data_format = data_format.map(&:to_sym)
|
134
|
+
data_structure = {}
|
135
|
+
described[:data_structure].map{|key, value| data_structure.merge!([[key, key], [value.to_sym, key]].to_h)}
|
136
|
+
hit_items = data_structure.select{|key, value| data_format.include?(key)}
|
137
|
+
missed = (data_format - hit_items.keys).join(',')
|
138
|
+
return [false, "所提供数据格式中:#{missed},未找到对应匹配数据项"] if missed.present?
|
139
|
+
|
140
|
+
reality[:data_format] = hit_items
|
141
|
+
[true, '']
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
145
|
+
end
|
data/config/routes.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wireway
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '
|
4
|
+
version: '202012161641'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ff4c00
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -86,12 +86,14 @@ files:
|
|
86
86
|
- app/assets/javascripts/wireway/application.js
|
87
87
|
- app/assets/stylesheets/wireway/application.css
|
88
88
|
- app/controllers/wireway/application_controller.rb
|
89
|
+
- app/controllers/wireway/restful_controller.rb
|
89
90
|
- app/helpers/wireway/application_helper.rb
|
90
91
|
- app/jobs/wireway/application_job.rb
|
91
92
|
- app/mailers/wireway/application_mailer.rb
|
92
93
|
- app/models/wireway/application_record.rb
|
93
94
|
- app/models/wireway/business_logic/restful.rb
|
94
95
|
- app/models/wireway/spark.rb
|
96
|
+
- app/models/wireway/standard.rb
|
95
97
|
- app/views/layouts/wireway/application.html.erb
|
96
98
|
- config/routes.rb
|
97
99
|
- lib/tasks/wireway_tasks.rake
|