istox 0.1.79.pre.test4 → 0.1.79

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6110bc3c6514d97d3bf2dd7bbfed24a95e416ca03725af187ed252bc14527685
4
- data.tar.gz: a7b6b2bc84a4929b832077c1918236abd63a30e46a618d37041d99bef634c1be
3
+ metadata.gz: 58d997502994f1db5538c06204840b3342b4f5698fb1230889949df0da38d6a8
4
+ data.tar.gz: 7948ebc1e984766a30b9b10c9b23ec1c616b89c96d03921d6a703bcef77178a4
5
5
  SHA512:
6
- metadata.gz: d0ca00179abde28c76d72e3cad8fcec0156aee2e2cc0be9c3832e58fab0c195392253d6f22308635e725c3b3f48bd1c74558799b2350535597bdcd4cad0d874b
7
- data.tar.gz: c587365c56c44cd85f67e3f857b629d69f9eeb39cd35b0d5acef81fa6a1e6385d5a245717b35494700a0344cc509b9b373109fd761c60c9cf4001405b1cc791c
6
+ metadata.gz: 188fcf120fec87d968a93a141787ed7191df228d6625e839bb3ffedd4333b7fc2bbede0245f54eaa27520c1283e5bafc0190b818db45425c5082b309f6d99741
7
+ data.tar.gz: e4e46c2bc88fc9670d92ff0fd62be71eaab96aaf0d1fafe01b51462df6fab42c41426ecc8ca412d4e0dd5ab116e47c4ba82d24fcf1eb1675303f4d785557ad54
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- istox (0.1.79.pre.test3)
4
+ istox (0.1.77)
5
5
  binding_of_caller
6
6
  bunny (>= 2.12.0)
7
7
  graphlient
@@ -68,6 +68,7 @@ GEM
68
68
  uniform_notifier (~> 1.11.0)
69
69
  bunny (2.14.2)
70
70
  amq-protocol (~> 2.3, >= 2.3.0)
71
+ byebug (8.2.5)
71
72
  concurrent-ruby (1.1.4)
72
73
  crass (1.0.4)
73
74
  database_cleaner (1.6.2)
@@ -88,21 +89,21 @@ GEM
88
89
  ffi (1.11.1)
89
90
  globalid (0.4.2)
90
91
  activesupport (>= 4.2.0)
91
- google-protobuf (3.9.1-universal-darwin)
92
+ google-protobuf (3.9.1)
92
93
  googleapis-common-protos-types (1.0.4)
93
94
  google-protobuf (~> 3.0)
94
95
  graphlient (0.3.6)
95
96
  faraday
96
97
  faraday_middleware
97
98
  graphql-client
98
- graphql (1.9.11)
99
+ graphql (1.9.9)
99
100
  graphql-client (0.15.0)
100
101
  activesupport (>= 3.0)
101
102
  graphql (~> 1.8)
102
- grpc (1.23.0-universal-darwin)
103
+ grpc (1.22.0)
103
104
  google-protobuf (~> 3.8)
104
105
  googleapis-common-protos-types (~> 1.0)
105
- grpc-tools (1.23.0)
106
+ grpc-tools (1.22.0)
106
107
  gruf (2.7.0)
107
108
  activesupport (> 4)
108
109
  concurrent-ruby (> 1)
@@ -216,6 +217,7 @@ PLATFORMS
216
217
  DEPENDENCIES
217
218
  bullet (~> 5.7.5)
218
219
  bundler (~> 1.16)
220
+ byebug
219
221
  database_cleaner (~> 1.6.0)
220
222
  factory_bot_rails (~> 4.8.2)
221
223
  faker (~> 1.7.3)
@@ -227,4 +229,4 @@ DEPENDENCIES
227
229
  sqlite3 (~> 1.3.6)
228
230
 
229
231
  BUNDLED WITH
230
- 1.17.3
232
+ 1.17.1
@@ -0,0 +1,19 @@
1
+ module Istox
2
+ class BlockchainHashHandler
3
+ class << self
4
+ def hash_generated(data, payload_target)
5
+ receipt = ::Istox::BlockchainReceipt.where(txid: data.uuid).first
6
+ if receipt.nil?
7
+ puts 'Transaction doesnt belong here, skipping...'
8
+ return
9
+ end
10
+
11
+ # sid cannot be nil
12
+ update_receipt = ::Istox::BlockchainReceipt.where(txid: data.uuid, txhash: nil).where.not(sid: nil).first
13
+ raise "Unable to find receipt to update" if update_receipt.blank?
14
+
15
+ update_receipt.update!(txhash: data.txnHash)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,49 +1,105 @@
1
1
  module Istox
2
2
  class BlockchainStatusHandler
3
3
  class << self
4
- # format of transaction
5
- # {
6
- # uuid: "XXXXXX"
7
- # status: "confirmed/failed"
8
- # }
9
-
10
- def txn_status_changed(transaction)
11
- receipt = ::Istox::BlockchainReceipt.where(txid: transaction.uuid).first
12
- if receipt.blank?
13
- puts 'Transaction doesn\'t belong to this backend, skipping...'
14
- return
15
- end
16
4
 
17
- return unless %w[failed confirmed].include?(transaction.status)
5
+ def txn_data_confirmed(transactions)
6
+ found_txns = transactions.map do |transaction|
7
+ receipt = ::Istox::BlockchainReceipt.where(txid: transaction.uuid).first
8
+ if !receipt.blank?
9
+ handling_receipt = ::Istox::BlockchainReceipt.where(txhash: transaction.id, txid: transaction.uuid).first
10
+ raise 'Unable to find receipt' if handling_receipt.blank?
11
+ transaction
12
+ else
13
+ puts 'Transaction doesnt belong here, skipping...'
14
+ nil
15
+ end
16
+ end.compact
17
+
18
+ found_txns.each do |transaction|
19
+ receipt = ::Istox::BlockchainReceipt.where(txhash: transaction.id, txid: transaction.uuid).first
20
+
21
+ receipt.update!(status: "confirmed")
22
+
23
+ resource = begin
24
+ class_eval("::#{receipt.resource_name}").find(receipt.resource_id)
25
+ rescue => e
26
+ puts "Class not found, skipping..."
27
+ next
28
+ end
29
+
30
+ receipt_list = get_receipt_list(resource)
31
+
32
+ next if resource_handled?(receipt_list)
18
33
 
19
- receipt.update!(status: transaction.status)
34
+ next if resource.outcome == 'pending'
35
+
36
+ if resource.outcome == 'confirmed'
37
+ resource.handle_confirm(receipt.resource_action)
38
+
39
+ mark_resource_handled(receipt_list)
40
+ publish_to_frontend(resource, true, receipt, receipt.sid, receipt_list)
41
+ end
20
42
 
21
- resource = begin
22
- class_eval("::#{receipt.resource_name}", __FILE__, __LINE__).find(receipt.resource_id)
23
- rescue StandardError
24
- puts 'Class not found, skipping...'
25
- return
26
43
  end
44
+ end
45
+
46
+ def txn_status_changed(transactions, payload_target)
47
+ # pre check all transaction does exists
48
+ found_txns = transactions.map do |transaction|
49
+ receipt = ::Istox::BlockchainReceipt.where(txid: transaction.uuid).first
50
+ if !receipt.blank?
51
+ handling_receipt = ::Istox::BlockchainReceipt.where(txhash: transaction.id, txid: transaction.uuid).first
52
+ raise 'Unable to find receipt' if handling_receipt.blank?
53
+ transaction
54
+ else
55
+ puts 'Transaction doesnt belong here, skipping...'
56
+ nil
57
+ end
58
+ end.compact
59
+
60
+ found_txns.each do |transaction|
61
+ receipt = ::Istox::BlockchainReceipt.where(txhash: transaction.id, txid: transaction.uuid).first
62
+
63
+ next if !(%w[failed pending].include?(transaction.status))
64
+ receipt.update!(status: transaction.status)
65
+
66
+ resource = begin
67
+ class_eval("::#{receipt.resource_name}").find(receipt.resource_id)
68
+ rescue => e
69
+ puts "Class not found, skipping..."
70
+ next
71
+ end
27
72
 
28
- return if resource_handled?(receipt)
73
+ receipt_list = get_receipt_list(resource)
29
74
 
30
- if transaction.status == 'confirmed'
31
- resource.handle_confirm(receipt.resource_action)
75
+ next if resource_handled?(receipt_list)
32
76
 
33
- mark_resource_handled(receipt)
34
- publish_to_frontend(resource, true, receipt, receipt.sid)
77
+ # if transaction.status == 'confirmed'
78
+ # next if resource.outcome == 'pending'
35
79
 
36
- elsif transaction.status == 'failed'
37
- resource.handle_fail(receipt.resource_action)
80
+ # if resource.outcome == 'confirmed'
81
+ # resource.handle_confirm(receipt.resource_action)
82
+
83
+ # mark_resource_handled(receipt_list)
84
+ # publish_to_frontend(resource, true, receipt, receipt.sid, receipt_list)
85
+ # end
86
+ # end
87
+
88
+ if transaction.status == 'failed'
89
+ resource.handle_fail(receipt.resource_action)
90
+
91
+ mark_resource_handled(receipt_list)
92
+ publish_to_frontend(resource, false, receipt, receipt.sid, receipt_list)
93
+ end
38
94
 
39
- mark_resource_handled(receipt)
40
- publish_to_frontend(resource, false, receipt, receipt.sid)
41
95
  end
42
96
  end
43
97
 
44
98
  private
45
99
 
46
- def publish_to_frontend(model, success, receipt, sid)
100
+ def publish_to_frontend(model, success, receipt, sid, receipt_list)
101
+ yield if block_given?
102
+
47
103
  ::Istox::Publisher.publish(
48
104
  'amq.topic',
49
105
  model.class.name.gsub('::', '').underscore.to_s,
@@ -58,26 +114,35 @@ module Istox
58
114
  sid,
59
115
  data: {
60
116
  success: success,
61
- purpose: receipt.activity
117
+ purpose: receipt.activity,
118
+ txids: get_receipts_tx_hashes(receipt_list)
62
119
  }
63
120
  )
64
- rescue StandardError => e
65
- Rails.logger.error "Unable to publish to frontend for receipt #{receipt.inspect},
66
- but will silently ignore the error"
67
- Rails.logger.error e
68
121
  end
69
122
 
70
- def mark_resource_handled(receipt)
71
- receipt.update(resource_handled: true)
72
- rescue StandardError => e
73
- Rails.logger.error "Unable to update resource_handled for receipt #{receipt.inspect},
74
- but will silently ignore the error"
75
- Rails.logger.error e
123
+ def get_receipts_tx_hashes(receipt_list)
124
+ tx_hashes = receipt_list.map(&:txhash).compact
125
+
126
+ tx_hashes.join(', ')
76
127
  end
77
128
 
78
- def resource_handled?(receipt)
79
- receipt.resource_handled == true
129
+ def mark_resource_handled(receipt_list)
130
+ receipt_list.each do |receipt|
131
+ receipt.update(resource_handled: true)
132
+ end
80
133
  end
134
+
135
+ def resource_handled?(receipt_list)
136
+ receipt_list.map(&:resource_handled).none? { |item| item.nil? || item == false }
137
+ end
138
+
139
+ def get_receipt_list(resource)
140
+ ::Istox::BlockchainReceipt.where(
141
+ resource_name: resource.class.name,
142
+ resource_id: resource.id
143
+ )
144
+ end
145
+
81
146
  end
82
147
  end
83
148
  end
@@ -0,0 +1,71 @@
1
+ module Istox
2
+ class BlockchainReceiptService
3
+
4
+ def self.init(blockchain_receipt_klass)
5
+ @@blockchain_receipt_klass = blockchain_receipt_klass
6
+ end
7
+
8
+ def self.get_blockchain_receipt_klass
9
+ @@blockchain_receipt_klass
10
+ end
11
+
12
+ def self.generate_uuid
13
+ klass = ::Istox::BlockchainReceiptService.blockchain_receipt_class
14
+ uuid = SecureRandom.uuid
15
+
16
+ klass.create!({
17
+ txid: uuid
18
+ })
19
+
20
+ uuid
21
+ end
22
+
23
+ def create!(tx_message, model, sid, action, is_request: false)
24
+ klass = ::Istox::BlockchainReceiptService.blockchain_receipt_class
25
+
26
+ # delete the previous existing blockchain receipts
27
+ klass.where(resource_name: model.class.name,
28
+ resource_id: model.id).destroy_all
29
+
30
+ (0...tx_message.txnCount).each do |i|
31
+ if i == 0
32
+ blockchain_receipt = klass.find_by_txid(tx_message.uuid)
33
+
34
+ raise "Unable to find blockchain receipt with uuid #{tx_message.uuid}, have you forgetten to generate uuid?" if blockchain_receipt.blank?
35
+
36
+ blockchain_receipt.update!({
37
+ sid: sid,
38
+ txid: tx_message.uuid,
39
+ resource_name: model.class.name,
40
+ resource_id: model.id,
41
+ resource_action: action,
42
+ is_request: is_request
43
+ })
44
+ else
45
+ blockchain_receipt = klass.new(
46
+ sid: sid,
47
+ txid: tx_message.uuid,
48
+ resource_name: model.class.name,
49
+ resource_id: model.id,
50
+ resource_action: action,
51
+ is_request: is_request
52
+ )
53
+ blockchain_receipt.save!
54
+ end
55
+ end
56
+ end
57
+
58
+ def self.blockchain_receipt_class
59
+ raise "Have you forgetten to init blockchain receipt service?" if ::Istox::BlockchainReceiptService.get_blockchain_receipt_klass == nil
60
+
61
+ blockchain_receipt_klass = ::Istox::BlockchainReceiptService.get_blockchain_receipt_klass
62
+ klass = class_eval("::#{blockchain_receipt_klass.name}")
63
+ unless klass <= ::Istox::BlockchainReceipt
64
+ raise RuntimeError, "#{blockchain_receipt_klass.name} does not inherit istox blockchain receipt"
65
+ end
66
+
67
+ return klass
68
+ end
69
+
70
+ end
71
+ end
@@ -1,35 +1,35 @@
1
- require 'graphlient'
1
+ require "graphlient"
2
2
 
3
3
  module Istox
4
4
  class GraphqlClient
5
- class << self
6
- def add_host(host_type, url)
7
- @@hosts = {} unless defined?(@@hosts)
8
- init_host(host_type, url)
9
- end
10
-
11
- def query(host_type, query, variables = {})
12
- client = @@hosts[host_type]
13
-
14
- raise "Please make sure you have initialised graphql cient for host #{host_type}" unless client
15
-
16
- Rails.logger.info "Querying Graphql host: #{host_type}, query: #{query}, variables: #{variables.inspect}"
17
- result = client.query(query, variables)
18
-
19
- return_values = ::Istox::CommonHelper.to_open_struct(result&.data)
20
-
21
- Rails.logger.info "Graphql result: #{return_values.inspect}"
22
-
23
- return_values
24
- end
25
-
26
- private
27
-
28
- def init_host(host_type, url)
29
- client = Graphlient::Client.new(url, http: Graphlient::Adapters::HTTP::HTTPAdapter)
5
+ class << self
6
+ def add_host(host_type, url)
7
+ unless defined?(@@hosts)
8
+ @@hosts = {}
9
+ end
10
+ init_host(host_type, url)
11
+ end
12
+
13
+ def query(host_type, query, variables = {})
14
+ client = @@hosts[host_type]
15
+
16
+ raise "Please make sure you have initialised graphql cient for host #{host_type}" if !client
17
+
18
+ Rails.logger.info "Querying Graphql host: #{host_type}, query: #{query}, variables: #{variables.inspect}"
19
+ result = client.query(query, variables)
20
+ Rails.logger.info "Graphql result: #{result.inspect}"
21
+
22
+ return result
23
+ end
24
+
25
+ private
26
+
27
+ def init_host(host_type, url)
28
+ client = Graphlient::Client.new(url, http: Graphlient::Adapters::HTTP::HTTPAdapter)
29
+
30
+ @@hosts[host_type] = client
31
+ end
30
32
 
31
- @@hosts[host_type] = client
32
33
  end
33
- end
34
34
  end
35
- end
35
+ end
@@ -1,63 +1,66 @@
1
1
  module Istox
2
- class GrpcClient
3
- class << self
4
- def add_host(host_type, url)
5
- @@hosts = {} unless defined?(@@hosts)
2
+ class GrpcClient
3
+ class << self
4
+ def add_host(host_type, url)
5
+ unless defined?(@@hosts)
6
+ @@hosts = {}
7
+ end
6
8
 
7
- @@hosts[host_type] = url
8
- end
9
+ @@hosts[host_type] = url
10
+ end
9
11
 
10
- def call(host_type, service, method, **keyword_args)
11
- execute(host_type, service, method, **keyword_args)
12
- # rescue => e
13
- # reinitiate service and try again, second chance
14
- # reinitiate_service(host_type, service)
15
- # execute(host_type, service, method, **keyword_args)
16
- end
12
+ def call(host_type, service, method, **keyword_args)
13
+ execute(host_type, service, method, **keyword_args)
14
+ # rescue => e
15
+ # reinitiate service and try again, second chance
16
+ # reinitiate_service(host_type, service)
17
+ # execute(host_type, service, method, **keyword_args)
18
+ end
19
+
20
+ private
17
21
 
18
- private
22
+ def execute(host_type, service, method, **keyword_args)
23
+ Rails.logger.info "Calling method in grpc method: #{method.inspect}, params: #{keyword_args.inspect}"
24
+ t1 = Time.now
25
+
26
+ result = get_host(host_type, service).call(method, keyword_args)
27
+ Rails.logger.info "Time taken for grpc execution: #{Time.now - t1} seconds"
28
+ Rails.logger.info "Result: #{result.message.inspect}"
29
+ result
30
+ end
19
31
 
20
- def execute(host_type, service, method, **keyword_args)
21
- Rails.logger.info "Calling method in grpc method: #{method.inspect}, params: #{keyword_args.inspect}"
22
- t1 = Time.now
32
+ def get_host(host_type, service)
33
+ unless defined?(@@services)
34
+ @@services = {}
35
+ end
23
36
 
24
- result = get_host(host_type, service).call(method, keyword_args)
25
- Rails.logger.info "Time taken for grpc execution: #{Time.now - t1} seconds"
37
+ grpc_client = @@services[get_key(host_type, service)]
26
38
 
27
- return_values = ::Istox::CommonHelper.to_open_struct(result.message)
28
- Rails.logger.info "Result: #{return_values}"
39
+ if grpc_client
40
+ return grpc_client
41
+ else
42
+ reinitiate_service(host_type, service)
43
+ return @@services[get_key(host_type, service)]
44
+ end
45
+ end
29
46
 
30
- return_values
31
- end
47
+ def reinitiate_service(host_type, service)
48
+ unless defined?(@@services)
49
+ @@services = {}
50
+ end
32
51
 
33
- def get_host(host_type, service)
34
- @@services = {} unless defined?(@@services)
52
+ host_url = @@hosts[host_type]
53
+ raise StandardError, 'Unable to find host, have you forgotten to add host to grpc client?' if !host_url
54
+
55
+ Rails.logger.info 'Reinitiating to grpc host at ' + host_url
56
+ t1 = Time.now
57
+ @@services[get_key(host_type, service)] = ::Gruf::Client.new(service: service, options: { hostname: host_url })
58
+ Rails.logger.info "Time taken for reinitiating grpc host: #{Time.now - t1} seconds"
59
+ end
35
60
 
36
- grpc_client = @@services[get_key(host_type, service)]
37
-
38
- if grpc_client
39
- return grpc_client
40
- else
41
- reinitiate_service(host_type, service)
42
- return @@services[get_key(host_type, service)]
61
+ def get_key(host_type, service)
62
+ host_type.to_s + service.to_s
63
+ end
43
64
  end
44
- end
45
-
46
- def reinitiate_service(host_type, service)
47
- @@services = {} unless defined?(@@services)
48
-
49
- host_url = @@hosts[host_type]
50
- raise StandardError, 'Unable to find host, have you forgotten to add host to grpc client?' unless host_url
51
-
52
- Rails.logger.info 'Reinitiating to grpc host at ' + host_url
53
- t1 = Time.now
54
- @@services[get_key(host_type, service)] = ::Gruf::Client.new(service: service, options: { hostname: host_url })
55
- Rails.logger.info "Time taken for reinitiating grpc host: #{Time.now - t1} seconds"
56
- end
57
-
58
- def get_key(host_type, service)
59
- host_type.to_s + service.to_s
60
- end
61
65
  end
62
- end
63
- end
66
+ end
@@ -1,31 +1,45 @@
1
1
  module Istox
2
2
  module BlockchainReceiptQuery
3
3
  extend ActiveSupport::Concern
4
-
5
- # overrideable, when blockchain transaction has confirmed
6
- def handle_confirm(_resource_action)
4
+
5
+ #overrideable, when blockchain transaction has confirmed
6
+ def handle_confirm(resource_action)
7
7
  self
8
8
  end
9
9
 
10
- # overrideable, when blockchain transaction has failed
11
- def handle_fail(_resource_action)
10
+ #overrideable, when blockchain transaction has failed
11
+ def handle_fail(resource_action)
12
12
  self
13
13
  end
14
14
 
15
- # overrideable, extra data that will be published back to frontend
15
+ #overrideable, extra data that will be published back to frontend
16
16
  def handle_extra
17
17
  nil
18
18
  end
19
19
 
20
20
  # outcome of the blockchain transaction, can be "pending" / "confirmed" / "failed"
21
21
  def outcome
22
- blockchain_receipt = ::Istox::BlockchainReceipt.where(resource_id: id, resource_name: self.class.name).first
22
+ blockchain_receipts = get_blockchain_receipts
23
+
24
+ return "confirmed" if blockchain_receipts.empty?
25
+
26
+ # return failed state if there is any failed hashes
27
+ return "failed" if blockchain_receipts.any?{ |r| r.status == 'failed' }
23
28
 
24
- return 'confirmed' unless blockchain_receipt.present?
29
+ # return pending state if there is any pending hashes
30
+ return "pending" if blockchain_receipts.any?{ |r| r.status == 'pending' }
25
31
 
26
- return 'confirmed' if blockchain_receipt.status.blank?
32
+ # return confirmed otherwise
33
+ return "confirmed"
34
+ end
35
+
36
+ def get_blockchain_receipts
37
+ ::Istox::BlockchainReceipt.where(resource_id: self.id, resource_name: self.class.name).all
38
+ end
27
39
 
28
- blockchain_receipt.status
40
+ def last_receipt
41
+ ::Istox::BlockchainReceipt.where(resource_id: self.id, resource_name: self.class.name).last
29
42
  end
43
+
30
44
  end
31
45
  end
data/lib/istox/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Istox
2
- VERSION = '0.1.79-test4'.freeze
2
+ VERSION = "0.1.79"
3
3
  end
data/lib/istox.rb CHANGED
@@ -1,34 +1,33 @@
1
1
  require 'active_record'
2
2
  require 'paranoia'
3
- require 'gruf'
4
- require 'listen'
5
- require 'istox/version'
3
+ require "gruf"
4
+ require "listen"
5
+ require "istox/version"
6
6
 
7
7
  module Istox
8
8
  # Your code goes here...
9
9
  class Test
10
10
  def self.method1
11
- 'abc'
11
+ "abc"
12
12
  end
13
13
  end
14
14
 
15
- require 'istox/interfaces/chainhub/transaction'
16
- require 'istox/helpers/publisher'
17
- require 'istox/helpers/bunny_boot'
18
- require 'istox/helpers/vault'
19
- require 'istox/helpers/order_book'
20
- require 'istox/helpers/grpc_client'
21
- require 'istox/helpers/graphql_client'
22
- require 'istox/helpers/gruf_listener_hook'
23
- require 'istox/helpers/message_service'
24
- require 'istox/helpers/blockchain_service'
25
- require 'istox/helpers/f_math'
26
- require 'istox/helpers/my_open_struct'
27
- require 'istox/helpers/common_helper'
28
- require 'istox/models/blockchain_receipt'
29
- require 'istox/models/concerns/blockchain_receipt_query'
30
- require 'istox/consumers/blockchain_status_handler'
31
- require 'istox/migrations/create_blockchain_receipts'
32
- require 'istox/logging/hash_logging'
33
- require 'istox/logging/log_formatter'
15
+ require "istox/interfaces/chainhub/transaction"
16
+ require "istox/helpers/publisher"
17
+ require "istox/helpers/bunny_boot"
18
+ require "istox/helpers/vault"
19
+ require "istox/helpers/order_book"
20
+ require "istox/helpers/grpc_client"
21
+ require "istox/helpers/graphql_client"
22
+ require "istox/helpers/gruf_listener_hook"
23
+ require "istox/helpers/message_service"
24
+ require "istox/helpers/blockchain_receipt_service"
25
+ require "istox/helpers/f_math"
26
+ require "istox/models/blockchain_receipt"
27
+ require "istox/models/concerns/blockchain_receipt_query"
28
+ require "istox/consumers/blockchain_status_handler"
29
+ require "istox/consumers/blockchain_hash_handler"
30
+ require "istox/migrations/create_blockchain_receipts"
31
+ require "istox/logging/hash_logging"
32
+ require "istox/logging/log_formatter"
34
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: istox
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.79.pre.test4
4
+ version: 0.1.79
5
5
  platform: ruby
6
6
  authors:
7
7
  - Siong Leng
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-03 00:00:00.000000000 Z
11
+ date: 2019-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bunny
@@ -278,8 +278,6 @@ files:
278
278
  - ".idea/modules.xml"
279
279
  - ".idea/vcs.xml"
280
280
  - ".idea/workspace.xml"
281
- - ".rubocop.yml"
282
- - ".solargraph.yml"
283
281
  - CODE_OF_CONDUCT.md
284
282
  - Gemfile
285
283
  - Gemfile.lock
@@ -289,16 +287,15 @@ files:
289
287
  - bin/setup
290
288
  - istox.gemspec
291
289
  - lib/istox.rb
290
+ - lib/istox/consumers/blockchain_hash_handler.rb
292
291
  - lib/istox/consumers/blockchain_status_handler.rb
293
- - lib/istox/helpers/blockchain_service.rb
292
+ - lib/istox/helpers/blockchain_receipt_service.rb
294
293
  - lib/istox/helpers/bunny_boot.rb
295
- - lib/istox/helpers/common_helper.rb
296
294
  - lib/istox/helpers/f_math.rb
297
295
  - lib/istox/helpers/graphql_client.rb
298
296
  - lib/istox/helpers/grpc_client.rb
299
297
  - lib/istox/helpers/gruf_listener_hook.rb
300
298
  - lib/istox/helpers/message_service.rb
301
- - lib/istox/helpers/my_open_struct.rb
302
299
  - lib/istox/helpers/order_book.rb
303
300
  - lib/istox/helpers/publisher.rb
304
301
  - lib/istox/helpers/vault.rb
@@ -323,11 +320,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
323
320
  version: '0'
324
321
  required_rubygems_version: !ruby/object:Gem::Requirement
325
322
  requirements:
326
- - - ">"
323
+ - - ">="
327
324
  - !ruby/object:Gem::Version
328
- version: 1.3.1
325
+ version: '0'
329
326
  requirements: []
330
- rubygems_version: 3.0.6
327
+ rubyforge_project:
328
+ rubygems_version: 2.7.8
331
329
  signing_key:
332
330
  specification_version: 4
333
331
  summary: istox backend shared gem
data/.rubocop.yml DELETED
@@ -1,105 +0,0 @@
1
- require: rubocop-rspec
2
-
3
- AllCops:
4
- TargetRubyVersion: 2.5
5
- Exclude:
6
- - .gems/**/*
7
- - bin/**/*
8
- - config/**/*
9
- - db/**/*
10
- - log/**/*
11
- - public/**/*
12
- - tmp/**/*
13
- - vendor/**/*
14
- - spec/rails_helper.rb
15
- - spec/spec_helper.rb
16
- - config.ru
17
- - Guardfile
18
- - Rakefile
19
-
20
- Documentation:
21
- Enabled: false
22
-
23
- Layout/SpaceBeforeFirstArg:
24
- Exclude:
25
- - app/views/api/**/**/*
26
-
27
- Lint/AmbiguousBlockAssociation:
28
- Exclude:
29
- - spec/**/*
30
-
31
- Metrics/AbcSize:
32
- # The ABC size is a calculated magnitude, so this number can be an Integer or
33
- # a Float.
34
- Max: 100
35
-
36
- Metrics/BlockLength:
37
- CountComments: false # count full line comments?
38
- Max: 25
39
- Exclude:
40
- - config/**/*
41
- - spec/**/*
42
- - app/admin/**/*
43
-
44
- Metrics/BlockNesting:
45
- Max: 4
46
-
47
- Metrics/ClassLength:
48
- CountComments: false # count full line comments?
49
- Max: 200
50
-
51
- # Avoid complex methods.
52
- Metrics/CyclomaticComplexity:
53
- Max: 20
54
-
55
- Metrics/MethodLength:
56
- CountComments: false # count full line comments?
57
- Max: 100
58
-
59
- Metrics/ModuleLength:
60
- CountComments: false # count full line comments?
61
- Max: 200
62
-
63
- Metrics/LineLength:
64
- Max: 130
65
- # To make it possible to copy or click on URIs in the code, we allow lines
66
- # containing a URI to be longer than Max.
67
- AllowURI: true
68
- URISchemes:
69
- - http
70
- - https
71
-
72
- Metrics/ParameterLists:
73
- Max: 5
74
- CountKeywordArgs: true
75
-
76
- Metrics/PerceivedComplexity:
77
- Max: 12
78
-
79
- Style/FrozenStringLiteralComment:
80
- Enabled: false
81
-
82
- Style/ModuleFunction:
83
- Enabled: false
84
-
85
- RequireNotFound:
86
- Enabled: false
87
-
88
- RSpec/MultipleExpectations:
89
- Max: 99
90
-
91
- RSpec/ExampleLength:
92
- Max: 100
93
-
94
- Lint/BigDecimalNew:
95
- Enabled: false
96
-
97
-
98
- RSpec/MessageSpies:
99
- Enabled: false
100
-
101
- RSpec/AnyInstance:
102
- Enabled: false
103
-
104
- RSpec/VerifiedDoubles:
105
- Enabled: false
data/.solargraph.yml DELETED
@@ -1,14 +0,0 @@
1
- ---
2
- include:
3
- - "**/*.rb"
4
- exclude:
5
- - spec/**/*
6
- - test/**/*
7
- - vendor/**/*
8
- - ".bundle/**/*"
9
- require: []
10
- domains: []
11
- reporters:
12
- - rubocop
13
- require_paths: []
14
- max_files: 5000
@@ -1,65 +0,0 @@
1
- module Istox
2
- class BlockchainService
3
- def self.init(blockchain_receipt_klass)
4
- @@blockchain_receipt_klass = blockchain_receipt_klass
5
- end
6
-
7
- def self.get_blockchain_receipt_klass
8
- @@blockchain_receipt_klass
9
- end
10
-
11
- def self.request(sid:, action:, before:, execute:)
12
- start(sid: sid, action: action, before: before, execute: execute, is_request: true)
13
- end
14
-
15
- def self.run(sid:, action:, before:, execute:)
16
- start(sid: sid, action: action, before: before, execute: execute)
17
- end
18
-
19
- private
20
-
21
- # before is the proc that will be executed before, must return the main model blockchain receipt will bind to
22
- def self.start(sid:, action:, before:, execute:, is_request: false)
23
- # create blockchain receipt first
24
- klass = blockchain_receipt_class
25
- uuid = :: SecureRandom.uuid
26
- @receipt = klass.create!(
27
- txid: uuid,
28
- sid: sid,
29
- is_request: is_request,
30
- resource_action: action
31
- )
32
-
33
- ::ActiveRecord::Base.transaction do
34
- # execute before proc, and get the model that blockchain receipt should bind to
35
- model = before.call(uuid)
36
-
37
- puts model
38
-
39
- # delete the previous existing blockchain receipts
40
- klass.where(resource_name: model.class.name, resource_id: model.id).destroy_all
41
-
42
- # then update receipt
43
- @receipt.update!(resource_id: model.id, resource_name: model.class.name)
44
-
45
- # execute the actual call to chainhub
46
- execute.call(uuid)
47
- end
48
- rescue StandardError => e
49
- @receipt&.destroy
50
- raise e
51
- end
52
-
53
- def self.blockchain_receipt_class
54
- raise 'Have you forgetten to init blockchain receipt service?' if get_blockchain_receipt_klass.nil?
55
-
56
- blockchain_receipt_klass = get_blockchain_receipt_klass
57
- klass = class_eval("::#{blockchain_receipt_klass.name}")
58
- unless klass <= ::Istox::BlockchainReceipt
59
- raise "#{blockchain_receipt_klass.name} does not inherit istox blockchain receipt"
60
- end
61
-
62
- klass
63
- end
64
- end
65
- end
@@ -1,69 +0,0 @@
1
- module Istox
2
- module CommonHelper
3
- def self.to_open_struct(model)
4
- return nil if model.blank?
5
-
6
- if model.is_a?(Array)
7
- model.map do |item|
8
- hash = deep_to_h(item).deep_transform_keys { |key| key.to_s.underscore.to_sym }
9
- process_hash(nil, hash)
10
- to_recursive_ostruct(hash)
11
- end
12
- else
13
- hash = deep_to_h(model).deep_transform_keys { |key| key.to_s.underscore.to_sym }
14
- process_hash(nil, hash)
15
- to_recursive_ostruct(hash)
16
- end
17
- end
18
-
19
- def self.process_hash(_parent, my_hash)
20
- my_hash.each do |key, value|
21
- if value.is_a?(Hash)
22
- process_hash(key, value)
23
- elsif value.is_a?(Array)
24
- my_hash[key] = value.map do |item|
25
- process_hash(nil, item.to_h)
26
- end
27
- else
28
- my_hash[key] = value
29
- end
30
- end
31
- end
32
-
33
- # def self.add_methods(ostruct)
34
- # hashmap = ostruct.to_h
35
-
36
- # hashmap&.each do |k, _v|
37
- # # add_method k.to_s do
38
- # ostruct.send(k.to_s)
39
- # # end
40
- # end
41
- # end
42
-
43
- def self.to_recursive_ostruct(hash)
44
- ::Istox::MyOpenStruct.new(hash.each_with_object({}) do |(key, val), memo|
45
- memo[key] = if val.is_a?(Hash)
46
- to_open_struct(val)
47
- elsif val.is_a?(Array)
48
- val.map do |item|
49
- to_open_struct(item)
50
- end
51
- else
52
- val
53
- end
54
- end)
55
- end
56
-
57
- def add_method(name, &block)
58
- (class << self; self; end).class_eval do
59
- define_method name, &block
60
- end
61
- end
62
-
63
- def self.deep_to_h(obj)
64
- obj.to_h.transform_values do |v|
65
- v.is_a?(OpenStruct) ? deep_to_h(v) : v
66
- end
67
- end
68
- end
69
- end
@@ -1,7 +0,0 @@
1
- module Istox
2
- class MyOpenStruct < OpenStruct
3
- def to_json(*_args)
4
- to_h.to_json
5
- end
6
- end
7
- end