web-connect 0.4.14 → 0.4.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -0
- data/lib/netfira/web_connect/amqp.rb +52 -0
- data/lib/netfira/web_connect/configuration.rb +16 -1
- data/lib/netfira/web_connect/model/record/sendable.rb +30 -1
- data/lib/netfira/web_connect/models/support/shop.rb +12 -0
- data/lib/netfira/web_connect/rack_app/actions/version_1/info.rb +4 -1
- data/lib/netfira/web_connect/rack_app/actions/version_8/records.rb +11 -1
- data/lib/netfira/web_connect/version.rb +1 -1
- data/lib/netfira/web_connect.rb +9 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 453fceed0cd58899614f957a73dc0b6c51241e74
|
4
|
+
data.tar.gz: ba10cbdbf8878af2c85aaeb3041794801fa47c49
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 816141179af1d0e93461e4d585f835c2ebd00ffe38c67bcb5cc41202e59bfe5163876493324dadf6d3c99cadb03cef627c76fb28523668a0a335ba8cf8d2548e
|
7
|
+
data.tar.gz: 2b625cb75d8f2a9580a66cd8beb2ce90b8308b54764c54f93fc80d211d07c866c4e2695fa4fb3cf0c0ab806d4fd9c2d03df9dba487437dc71d54434faa17f977
|
data/README.md
CHANGED
@@ -62,6 +62,12 @@ Netfira::WebConnect.configure do |c|
|
|
62
62
|
|
63
63
|
# Session lifetime (omit to disable sessions)
|
64
64
|
c.session_lifetime = 5.days
|
65
|
+
|
66
|
+
# Send new-data notifications via HTTP. Options are :none, :sync, and :async.
|
67
|
+
c.http_notifications = :async
|
68
|
+
|
69
|
+
# AMQP server to use for downstream communications.
|
70
|
+
c.amqp = 'amqps://admin:Passw0rd@localhost:5672'
|
65
71
|
end
|
66
72
|
```
|
67
73
|
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'bunny'
|
2
|
+
|
3
|
+
module Netfira::WebConnect
|
4
|
+
module AMQP; end
|
5
|
+
class << AMQP
|
6
|
+
|
7
|
+
def connect!
|
8
|
+
disconnect!
|
9
|
+
@connection = Bunny.new(Netfira::WebConnect.amqp_uri)
|
10
|
+
@connection.start
|
11
|
+
@channel = @connection.create_channel
|
12
|
+
@exchanges = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def connected?
|
16
|
+
!!@connection
|
17
|
+
end
|
18
|
+
|
19
|
+
def disconnect!
|
20
|
+
return unless connected?
|
21
|
+
@connection.stop
|
22
|
+
@connection = nil
|
23
|
+
@channel = nil
|
24
|
+
@exchanges = nil
|
25
|
+
end
|
26
|
+
|
27
|
+
def exchange_for_shop(shop)
|
28
|
+
@exchanges && @exchanges[shop.id || 0] ||= make_exchange_for_shop(shop)
|
29
|
+
end
|
30
|
+
|
31
|
+
def queue_name_for_shop(shop)
|
32
|
+
"shops.#{shop.id || 0}"
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def make_exchange_for_shop(shop)
|
38
|
+
|
39
|
+
# Each shop will have its own exchange, and a queue bound to that exchange.
|
40
|
+
# Their names will be the same.
|
41
|
+
name = queue_name_for_shop(shop)
|
42
|
+
|
43
|
+
# Make an exchange
|
44
|
+
@connection.direct(name).tap do |exchange|
|
45
|
+
|
46
|
+
# Make a queue and bind it to the created exchange
|
47
|
+
@channel.queue(name, auto_delete: true).bind exchange, routing_key: name
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -4,7 +4,7 @@ module Netfira::WebConnect
|
|
4
4
|
attr_accessor :db_table_prefix, :file_store, :authenticator, :custom_fields,
|
5
5
|
:time_zone, :materialize_when_db_changed, :session_lifetime, :paranoia
|
6
6
|
|
7
|
-
attr_reader :logger, :db
|
7
|
+
attr_reader :logger, :db, :http_notifications, :amqp
|
8
8
|
|
9
9
|
def initialize(defaults = nil)
|
10
10
|
defaults.each{ |k, v| __send__ :"#{k}=", v } if defaults
|
@@ -29,5 +29,20 @@ module Netfira::WebConnect
|
|
29
29
|
Model.logger = logger if logger
|
30
30
|
end
|
31
31
|
|
32
|
+
def http_notifications=(value)
|
33
|
+
allowed = %i[none sync async]
|
34
|
+
raise "Valid values for `http_notifications` are #{allowed.map { |x| ":#{x}" }.join ', '}" unless allowed.include? value
|
35
|
+
@http_notifications = value
|
36
|
+
end
|
37
|
+
|
38
|
+
def amqp=(value)
|
39
|
+
return if value == @amqp
|
40
|
+
allowed = %w[amqp amqps]
|
41
|
+
uri = URI(value)
|
42
|
+
raise "Scheme must be one of [ #{allowed.join ' | '} ]" unless allowed.include? uri.scheme
|
43
|
+
@amqp = value
|
44
|
+
AMQP.connect!
|
45
|
+
end
|
46
|
+
|
32
47
|
end
|
33
48
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'net/https'
|
2
|
+
|
1
3
|
module Netfira::WebConnect
|
2
4
|
class Model::Record
|
3
5
|
|
@@ -20,12 +22,39 @@ module Netfira::WebConnect
|
|
20
22
|
def send!
|
21
23
|
sent!
|
22
24
|
save!
|
23
|
-
|
25
|
+
send_notifications!
|
24
26
|
self
|
25
27
|
end
|
26
28
|
|
27
29
|
private
|
28
30
|
|
31
|
+
def send_notifications!
|
32
|
+
send_http_notification!
|
33
|
+
send_amqp_notification!
|
34
|
+
end
|
35
|
+
|
36
|
+
def send_http_notification!
|
37
|
+
case Netfira::WebConnect.http_notifications
|
38
|
+
when :sync then send_http_notification_now!
|
39
|
+
when :async then Thread.new { send_http_notification_now! }
|
40
|
+
else return
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def send_http_notification_now!
|
45
|
+
uri_string = shop.settings['notify']
|
46
|
+
if uri_string && !uri_string.empty?
|
47
|
+
uri = URI(uri_string)
|
48
|
+
Net::HTTP.get_response uri if %w[http https].include? uri.scheme
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
AMQP_MESSAGE_TTL = 60 * 1000 # Messages should live for 60 seconds
|
53
|
+
|
54
|
+
def send_amqp_notification!
|
55
|
+
shop.amqp_publish '', type: 'fetch', expiration: AMQP_MESSAGE_TTL
|
56
|
+
end
|
57
|
+
|
29
58
|
end
|
30
59
|
|
31
60
|
end
|
@@ -27,6 +27,18 @@ module Netfira::WebConnect
|
|
27
27
|
relation_class.with_deleted.find_by_origin_ids(args.merge shop: self).first
|
28
28
|
end
|
29
29
|
|
30
|
+
def amqp_exchange
|
31
|
+
AMQP.exchange_for_shop self
|
32
|
+
end
|
33
|
+
|
34
|
+
def amqp_queue
|
35
|
+
AMQP.queue_name_for_shop self
|
36
|
+
end
|
37
|
+
|
38
|
+
def amqp_publish(message, **opts)
|
39
|
+
amqp_exchange && amqp_exchange.publish(message, **opts.merge(routing_key: amqp_queue))
|
40
|
+
end
|
41
|
+
|
30
42
|
end
|
31
43
|
end
|
32
44
|
|
@@ -2,6 +2,8 @@ class Netfira::WebConnect::RackApp
|
|
2
2
|
module Action::Version1
|
3
3
|
class Info < Action
|
4
4
|
def call
|
5
|
+
brokers = []
|
6
|
+
brokers << {uri: Netfira::WebConnect.amqp_uri, queues: [shop.amqp_queue]} if Netfira::WebConnect.amqp_uri
|
5
7
|
{
|
6
8
|
info: {
|
7
9
|
apiVersion: Action.latest_version,
|
@@ -9,7 +11,8 @@ class Netfira::WebConnect::RackApp
|
|
9
11
|
schema: Netfira::WebConnect.schema,
|
10
12
|
customFields: false,
|
11
13
|
acceptableRequestTypes: env['WC_ACCEPTABLE_REQUEST_TYPES'] || ['unpacked'],
|
12
|
-
locale: shop.locale
|
14
|
+
locale: shop.locale,
|
15
|
+
messageBrokers: brokers
|
13
16
|
}
|
14
17
|
}
|
15
18
|
end
|
@@ -16,7 +16,17 @@ module Netfira::WebConnect
|
|
16
16
|
raise NotFound unless Class === klass && klass < Model::Record
|
17
17
|
scope = klass.where shop_id: shop.id
|
18
18
|
method = delete_handler_exists? ? :destroy_all : :delete_all
|
19
|
-
|
19
|
+
event_args = [
|
20
|
+
[:purge, shop, klass],
|
21
|
+
[:"purge_#{path.first.underscore.pluralize}", shop]
|
22
|
+
]
|
23
|
+
event_args.each { |args| dispatch_event [:before, :on], *args }
|
24
|
+
dispatch_event(:around, *event_args.first) do
|
25
|
+
dispatch_event(:around, *event_args.last) do
|
26
|
+
scope.__send__ method
|
27
|
+
end
|
28
|
+
end
|
29
|
+
event_args.each { |args| dispatch_event :after, *args }
|
20
30
|
{}
|
21
31
|
end
|
22
32
|
|
data/lib/netfira/web_connect.rb
CHANGED
@@ -70,6 +70,14 @@ module Netfira
|
|
70
70
|
!!@config.paranoia
|
71
71
|
end
|
72
72
|
|
73
|
+
def self.http_notifications
|
74
|
+
@config.http_notifications || :none
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.amqp_uri
|
78
|
+
@config.amqp
|
79
|
+
end
|
80
|
+
|
73
81
|
private
|
74
82
|
|
75
83
|
def self.null_logger
|
@@ -89,3 +97,4 @@ require_relative 'web_connect/models'
|
|
89
97
|
require_relative 'web_connect/components'
|
90
98
|
require_relative 'web_connect/configuration'
|
91
99
|
require_relative 'web_connect/schema'
|
100
|
+
require_relative 'web_connect/amqp'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: web-connect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Neil E. Pearson
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-11-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -95,6 +95,20 @@ dependencies:
|
|
95
95
|
- - "~>"
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: '2.0'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: bunny
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - "~>"
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '1.4'
|
105
|
+
type: :runtime
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - "~>"
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '1.4'
|
98
112
|
- !ruby/object:Gem::Dependency
|
99
113
|
name: mime-types
|
100
114
|
requirement: !ruby/object:Gem::Requirement
|
@@ -121,6 +135,7 @@ files:
|
|
121
135
|
- README.md
|
122
136
|
- lib/netfira.rb
|
123
137
|
- lib/netfira/web_connect.rb
|
138
|
+
- lib/netfira/web_connect/amqp.rb
|
124
139
|
- lib/netfira/web_connect/components.rb
|
125
140
|
- lib/netfira/web_connect/components/checksum.rb
|
126
141
|
- lib/netfira/web_connect/components/guid.rb
|