straight-server 0.2.0 → 0.2.1
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/Gemfile +1 -1
- data/Gemfile.lock +2 -2
- data/VERSION +1 -1
- data/lib/straight-server/config.rb +12 -1
- data/lib/straight-server/gateway.rb +2 -2
- data/lib/straight-server/order.rb +6 -5
- data/lib/straight-server/orders_controller.rb +13 -4
- data/spec/.straight/config.yml +1 -0
- data/spec/lib/initializer_spec.rb +0 -6
- data/spec/lib/orders_controller_spec.rb +1 -1
- data/spec/spec_helper.rb +3 -0
- data/straight-server.gemspec +6 -6
- data/templates/config.yml +7 -0
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 833d00355a560e1e82ce97ef09a53b0f96bdd0b0
|
4
|
+
data.tar.gz: 96c715dbdd8718aaaded9810738df8ce64e8b13c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b3a8d3401e5d2116f35692996dc188bbc8adcbaad4b79d5b22ba2fcd862b3610f8a62ac5dbc022add0f1880bd5babd31a804f088060731a8ccdbcadee7a94ba
|
7
|
+
data.tar.gz: 1d611882cc686cb3d5e6905630ef3ec2fd708712bcaaa1dcbbacb83eca37965ff39f29570ad4000ab0a5aa14e2f1f5a66626238b074b5a215e53bf4deab2b4f9
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -115,7 +115,7 @@ GEM
|
|
115
115
|
satoshi-unit (0.1.7)
|
116
116
|
sequel (4.22.0)
|
117
117
|
sqlite3 (1.3.10)
|
118
|
-
straight (0.
|
118
|
+
straight (0.2.2)
|
119
119
|
httparty
|
120
120
|
money-tree
|
121
121
|
satoshi-unit
|
@@ -145,4 +145,4 @@ DEPENDENCIES
|
|
145
145
|
satoshi-unit
|
146
146
|
sequel
|
147
147
|
sqlite3
|
148
|
-
straight
|
148
|
+
straight (= 0.2.2)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.1
|
@@ -3,7 +3,18 @@ module StraightServer
|
|
3
3
|
class Config
|
4
4
|
|
5
5
|
class << self
|
6
|
-
attr_accessor :db,
|
6
|
+
attr_accessor :db,
|
7
|
+
:gateways_source,
|
8
|
+
:gateways,
|
9
|
+
:logmaster,
|
10
|
+
:server_secret,
|
11
|
+
:count_orders,
|
12
|
+
:environment,
|
13
|
+
:redis,
|
14
|
+
:check_order_status_in_db_first,
|
15
|
+
:port,
|
16
|
+
:blockchain_adapters,
|
17
|
+
:expiration_overtime
|
7
18
|
end
|
8
19
|
|
9
20
|
end
|
@@ -9,7 +9,7 @@ module StraightServer
|
|
9
9
|
@@websockets = {}
|
10
10
|
|
11
11
|
def fetch_transactions_for(address)
|
12
|
-
try_adapters(@blockchain_adapters) { |b| b.fetch_transactions_for(address) }
|
12
|
+
try_adapters(@blockchain_adapters, type: 'blockchain') { |b| b.fetch_transactions_for(address) }
|
13
13
|
end
|
14
14
|
|
15
15
|
class InvalidSignature < Exception; end
|
@@ -52,7 +52,7 @@ module StraightServer
|
|
52
52
|
#
|
53
53
|
def initialize_exchange_rate_adapters
|
54
54
|
@exchange_rate_adapters ||= []
|
55
|
-
if self.exchange_rate_adapter_names
|
55
|
+
if self.exchange_rate_adapter_names.kind_of?(Array) && self.exchange_rate_adapter_names
|
56
56
|
self.exchange_rate_adapter_names.each do |adapter|
|
57
57
|
begin
|
58
58
|
@exchange_rate_adapters << Straight::ExchangeRate.const_get("#{adapter}Adapter").instance
|
@@ -68,7 +68,8 @@ module StraightServer
|
|
68
68
|
|
69
69
|
def validate
|
70
70
|
super # calling Sequel::Model validator
|
71
|
-
errors.add(:amount, "is
|
71
|
+
errors.add(:amount, "is not numeric") if !amount.kind_of?(Numeric)
|
72
|
+
errors.add(:amount, "should be more than 0") if amount && amount <= 0
|
72
73
|
errors.add(:gateway_id, "is invalid") if !gateway_id.kind_of?(Numeric) || gateway_id <= 0
|
73
74
|
errors.add(:description, "should be shorter than 255 charachters") if description.kind_of?(String) && description.length > 255
|
74
75
|
errors.add(:gateway, "is inactive, cannot create order for inactive gateway") unless gateway.active
|
@@ -104,8 +105,8 @@ module StraightServer
|
|
104
105
|
# Order#created_at into account now, so that we don't start checking on
|
105
106
|
# an order that is already expired. Or, if it's not expired yet,
|
106
107
|
# we make sure to stop all checks as soon as it expires, but not later.
|
107
|
-
def start_periodic_status_check(duration:
|
108
|
-
StraightServer.logger.info "Starting periodic status checks of order #{self.id}"
|
108
|
+
def start_periodic_status_check(duration: nil)
|
109
|
+
StraightServer.logger.info "Starting periodic status checks of order #{self.id} (expires in #{duration} seconds)"
|
109
110
|
if (t = time_left_before_expiration) > 0
|
110
111
|
check_status_on_schedule(duration: t)
|
111
112
|
end
|
@@ -117,9 +118,9 @@ module StraightServer
|
|
117
118
|
super
|
118
119
|
end
|
119
120
|
|
120
|
-
def time_left_before_expiration
|
121
|
+
def time_left_before_expiration
|
121
122
|
time_passed_after_creation = (Time.now - created_at).to_i
|
122
|
-
gateway.orders_expiration_period-time_passed_after_creation
|
123
|
+
gateway.orders_expiration_period+(StraightServer::Config.expiration_overtime || 0) - time_passed_after_creation
|
123
124
|
end
|
124
125
|
|
125
126
|
end
|
@@ -20,20 +20,29 @@ module StraightServer
|
|
20
20
|
end
|
21
21
|
|
22
22
|
begin
|
23
|
-
|
23
|
+
order_data = {
|
24
24
|
amount: @params['amount'], # this is satoshi
|
25
25
|
currency: @params['currency'],
|
26
26
|
btc_denomination: @params['btc_denomination'],
|
27
27
|
id: @params['order_id'],
|
28
28
|
signature: @params['signature'],
|
29
29
|
data: @params['data']
|
30
|
-
|
30
|
+
}
|
31
|
+
order = @gateway.create_order(order_data)
|
31
32
|
StraightServer::Thread.new do
|
32
|
-
|
33
|
+
# Because this is a new thread, we have to wrap the code inside in #watch_exceptions
|
34
|
+
# once again. Otherwise, not watching is done. Oh, threads!
|
35
|
+
StraightServer.logger.watch_exceptions do
|
36
|
+
order.start_periodic_status_check
|
37
|
+
end
|
33
38
|
end
|
34
39
|
[200, {}, order.to_json ]
|
35
40
|
rescue Sequel::ValidationFailed => e
|
36
|
-
StraightServer.logger.warn
|
41
|
+
StraightServer.logger.warn(
|
42
|
+
"VALIDATION ERRORS in order, cannot create it:\n" +
|
43
|
+
"#{e.message.split(",").each_with_index.map { |e,i| "#{i+1}. #{e.lstrip}"}.join("\n") }\n" +
|
44
|
+
"Order data: #{order_data.inspect}\n"
|
45
|
+
)
|
37
46
|
[409, {}, "Invalid order: #{e.message}" ]
|
38
47
|
rescue StraightServer::GatewayModule::InvalidSignature
|
39
48
|
[409, {}, "Invalid signature for id: #{@params['order_id']}" ]
|
data/spec/.straight/config.yml
CHANGED
@@ -54,12 +54,6 @@ RSpec.describe StraightServer::Initializer do
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
it "reads config" do
|
58
|
-
create_config_files
|
59
|
-
@initializer.read_config_file
|
60
|
-
expect(StraightServer::Config.blockchain_adapters).to eq(["BlockchainInfo", "Mycelium"])
|
61
|
-
end
|
62
|
-
|
63
57
|
it "connects to the database" do
|
64
58
|
StraightServer::Config.db = {
|
65
59
|
adapter: 'sqlite',
|
@@ -21,7 +21,7 @@ RSpec.describe StraightServer::OrdersController do
|
|
21
21
|
it "renders 409 error when an order cannot be created due to some validation errors" do
|
22
22
|
send_request "POST", '/gateways/2/orders', amount: 0
|
23
23
|
expect(response[0]).to eq(409)
|
24
|
-
expect(response[2]).to eq("Invalid order: amount
|
24
|
+
expect(response[2]).to eq("Invalid order: amount should be more than 0")
|
25
25
|
end
|
26
26
|
|
27
27
|
it "starts tracking the order status in a separate thread" do
|
data/spec/spec_helper.rb
CHANGED
@@ -63,6 +63,9 @@ RSpec.configure do |config|
|
|
63
63
|
[:debug, :info, :warn, :fatal, :unknown, :blank_lines].each do |e|
|
64
64
|
allow(logger_mock).to receive(e)
|
65
65
|
end
|
66
|
+
|
67
|
+
allow(logger_mock).to receive(:watch_exceptions).and_yield
|
68
|
+
|
66
69
|
StraightServer.logger = logger_mock
|
67
70
|
StraightServer::GatewayOnConfig.class_variable_get(:@@gateways).each do |g|
|
68
71
|
g.last_keychain_id = 0
|
data/straight-server.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: straight-server 0.2.
|
5
|
+
# stub: straight-server 0.2.1 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "straight-server"
|
9
|
-
s.version = "0.2.
|
9
|
+
s.version = "0.2.1"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Roman Snitko"]
|
14
|
-
s.date = "2015-05-
|
14
|
+
s.date = "2015-05-07"
|
15
15
|
s.description = "Accepts orders via http, returns payment info via http or streams updates via websockets, stores orders in a DB"
|
16
16
|
s.email = "roman.snitko@gmail.com"
|
17
17
|
s.executables = ["goliath.log", "goliath.log_stdout.log", "straight-console", "straight-server", "straight-server-benchmark"]
|
@@ -87,7 +87,7 @@ Gem::Specification.new do |s|
|
|
87
87
|
s.specification_version = 4
|
88
88
|
|
89
89
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
90
|
-
s.add_runtime_dependency(%q<straight>, ["
|
90
|
+
s.add_runtime_dependency(%q<straight>, ["= 0.2.2"])
|
91
91
|
s.add_runtime_dependency(%q<satoshi-unit>, [">= 0"])
|
92
92
|
s.add_runtime_dependency(%q<goliath>, [">= 0"])
|
93
93
|
s.add_runtime_dependency(%q<faye-websocket>, [">= 0"])
|
@@ -99,7 +99,7 @@ Gem::Specification.new do |s|
|
|
99
99
|
s.add_development_dependency(%q<jeweler>, ["~> 2.0.1"])
|
100
100
|
s.add_development_dependency(%q<github_api>, ["= 0.11.3"])
|
101
101
|
else
|
102
|
-
s.add_dependency(%q<straight>, ["
|
102
|
+
s.add_dependency(%q<straight>, ["= 0.2.2"])
|
103
103
|
s.add_dependency(%q<satoshi-unit>, [">= 0"])
|
104
104
|
s.add_dependency(%q<goliath>, [">= 0"])
|
105
105
|
s.add_dependency(%q<faye-websocket>, [">= 0"])
|
@@ -112,7 +112,7 @@ Gem::Specification.new do |s|
|
|
112
112
|
s.add_dependency(%q<github_api>, ["= 0.11.3"])
|
113
113
|
end
|
114
114
|
else
|
115
|
-
s.add_dependency(%q<straight>, ["
|
115
|
+
s.add_dependency(%q<straight>, ["= 0.2.2"])
|
116
116
|
s.add_dependency(%q<satoshi-unit>, [">= 0"])
|
117
117
|
s.add_dependency(%q<goliath>, [">= 0"])
|
118
118
|
s.add_dependency(%q<faye-websocket>, [">= 0"])
|
data/templates/config.yml
CHANGED
@@ -9,6 +9,13 @@ environment: development
|
|
9
9
|
# redis-server connection details below.
|
10
10
|
count_orders: false
|
11
11
|
|
12
|
+
# When you display a payment window to a user, he has some time to pay. But what if a
|
13
|
+
# transaction has been made in the last seconds and Straight didn't have time to detect it?
|
14
|
+
# This just adds a little bit more time to each expiration period.
|
15
|
+
# So technically, you can tell your customer he's got 900 seconds to pay, yet wait additional
|
16
|
+
# 30 seconds (default value) to be able to detect a late transaction
|
17
|
+
expiration_overtime: 30
|
18
|
+
|
12
19
|
# Uncomment this if you want to use Gateway's order counters feature
|
13
20
|
# It requires redis.
|
14
21
|
#redis:
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: straight-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roman Snitko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: straight
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 0.2.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 0.2.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: satoshi-unit
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|