smartkiosk-server 0.9.3 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- data/app/controllers/terminal_pings_controller.rb +35 -24
- data/app/models/agent.rb +1 -1
- data/app/models/provider.rb +4 -6
- data/app/models/provider_group.rb +2 -4
- data/app/models/provider_profile.rb +2 -0
- data/app/models/terminal.rb +0 -55
- data/app/models/terminal_profile.rb +84 -1
- data/app/models/terminal_profile_promotion.rb +2 -4
- data/app/models/terminal_profile_provider.rb +8 -0
- data/app/models/terminal_profile_provider_group.rb +8 -0
- data/config/routes.rb +9 -3
- data/lib/smartkiosk/server/version.rb +1 -1
- metadata +24 -36
@@ -3,43 +3,54 @@ class TerminalPingsController < ApplicationController
|
|
3
3
|
|
4
4
|
def create
|
5
5
|
begin
|
6
|
-
|
7
|
-
providers = ping_data[:providers]
|
6
|
+
profile = @terminal.terminal_profile
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
TerminalProfilePromotion.timestamp.value || DateTime.civil(0, 1, 1)
|
14
|
-
].max
|
8
|
+
ping_data = params[:terminal_ping]
|
9
|
+
remote_timestamp = ping_data[:providers_updated_at].blank? ? nil : DateTime.parse(ping_data[:providers_updated_at])
|
10
|
+
local_timestamp = nil
|
11
|
+
profile.cached_providers_lock.lock { local_timestamp = profile.actual_timestamp }
|
15
12
|
|
16
13
|
@terminal.ping!(TerminalPing.new ping_data)
|
17
14
|
|
18
15
|
response = {
|
19
16
|
:time => DateTime.now,
|
20
17
|
:profile => {
|
21
|
-
:support_phone =>
|
22
|
-
:logo =>
|
23
|
-
:modified_at =>
|
18
|
+
:support_phone => profile.support_phone,
|
19
|
+
:logo => profile.logo.url,
|
20
|
+
:modified_at => profile.updated_at
|
24
21
|
},
|
25
22
|
:orders => @terminal.terminal_orders.unsent.as_json(:only => [:id, :keyword, :args, :created_at]),
|
26
|
-
:
|
23
|
+
:update_providers => remote_timestamp.blank? || local_timestamp.to_i > remote_timestamp.to_i # to drop microseconds
|
27
24
|
}
|
28
25
|
|
29
|
-
unless providers[:ids].blank?
|
30
|
-
response[:providers][:remove] = providers[:ids].map{|x| x.to_i} - Provider.select(:id).map(&:id)
|
31
|
-
end
|
32
|
-
|
33
|
-
if remote_timestamp.blank? || local_timestamp > remote_timestamp
|
34
|
-
response[:providers][:update] = @terminal.providers_dump remote_timestamp
|
35
|
-
response[:providers][:groups] = @terminal.provider_groups_dump
|
36
|
-
response[:providers][:promotions] = @terminal.promotions_dump
|
37
|
-
response[:providers][:updated_at] = local_timestamp.strftime('%Y-%m-%dT%H:%M:%S.%9N%z')
|
38
|
-
end
|
39
|
-
|
40
26
|
render :json => response
|
41
27
|
rescue ActiveRecord::RecordInvalid
|
42
28
|
render :text => nil, :status => 400
|
43
29
|
end
|
44
30
|
end
|
45
|
-
|
31
|
+
|
32
|
+
def providers
|
33
|
+
profile = @terminal.terminal_profile
|
34
|
+
|
35
|
+
providers = nil
|
36
|
+
profile.cached_providers_lock.lock do
|
37
|
+
providers = profile.cached_providers.value
|
38
|
+
|
39
|
+
if providers.nil?
|
40
|
+
ActiveRecord::Base.transaction do
|
41
|
+
providers = {
|
42
|
+
:providers => profile.providers_dump,
|
43
|
+
:groups => profile.provider_groups_dump,
|
44
|
+
:promotions => profile.promotions_dump,
|
45
|
+
:updated_at => profile.actual_timestamp
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
providers = ActiveSupport::Gzip.compress(ActiveSupport::JSON.encode(providers))
|
50
|
+
profile.cached_providers.value = providers
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
send_data providers, :type => 'application/gzip', :disposition => 'inline'
|
55
|
+
end
|
56
|
+
end
|
data/app/models/agent.rb
CHANGED
data/app/models/provider.rb
CHANGED
@@ -1,19 +1,17 @@
|
|
1
1
|
class Provider < ActiveRecord::Base
|
2
2
|
include Redis::Objects::RMap
|
3
3
|
|
4
|
-
value :timestamp, :global => true, :marshal => true
|
5
|
-
|
6
4
|
has_rmap({:id => lambda{|x| x.to_s}}, :title)
|
7
5
|
has_paper_trail
|
8
6
|
|
9
7
|
mount_uploader :icon, IconUploader
|
10
8
|
|
11
9
|
after_save do
|
12
|
-
|
10
|
+
TerminalProfile.invalidate_all_cached_providers!
|
13
11
|
end
|
14
12
|
|
15
13
|
after_destroy do
|
16
|
-
|
14
|
+
TerminalProfile.invalidate_all_cached_providers!
|
17
15
|
end
|
18
16
|
|
19
17
|
#
|
@@ -37,8 +35,8 @@ class Provider < ActiveRecord::Base
|
|
37
35
|
scope :gateway_ids_eq, lambda{|x| includes(:gateways).where(:gateways => {:id => x})}
|
38
36
|
search_method :gateway_ids_eq
|
39
37
|
|
40
|
-
scope :after, lambda{|x|
|
41
|
-
x.blank? ? scoped
|
38
|
+
scope :after, lambda{|x|
|
39
|
+
x.blank? ? scoped
|
42
40
|
: where(arel_table[:updated_at].gt x)
|
43
41
|
}
|
44
42
|
|
@@ -3,14 +3,12 @@ class ProviderGroup < ActiveRecord::Base
|
|
3
3
|
|
4
4
|
mount_uploader :icon, IconUploader
|
5
5
|
|
6
|
-
value :timestamp, :global => true, :marshal => true
|
7
|
-
|
8
6
|
after_save do
|
9
|
-
|
7
|
+
TerminalProfile.invalidate_all_cached_providers!
|
10
8
|
end
|
11
9
|
|
12
10
|
after_destroy do
|
13
|
-
|
11
|
+
TerminalProfile.invalidate_all_cached_providers!
|
14
12
|
end
|
15
13
|
|
16
14
|
belongs_to :provider_group
|
data/app/models/terminal.rb
CHANGED
@@ -35,61 +35,6 @@ class Terminal < ActiveRecord::Base
|
|
35
35
|
#
|
36
36
|
# METHODS
|
37
37
|
#
|
38
|
-
def providers_dump(after=nil)
|
39
|
-
providers = Provider.includes(:provider_fields).after(after)
|
40
|
-
|
41
|
-
return [] if providers.blank?
|
42
|
-
|
43
|
-
overload = Hash[*terminal_profile.terminal_profile_providers.map{|x| [x.provider_id, x]}.flatten]
|
44
|
-
|
45
|
-
providers.map do |x|
|
46
|
-
icon = overload[x.id].icon rescue nil
|
47
|
-
|
48
|
-
if icon.blank?
|
49
|
-
icon = x.icon.try(:url)
|
50
|
-
else
|
51
|
-
icon = icon.url
|
52
|
-
end
|
53
|
-
|
54
|
-
{
|
55
|
-
:id => x.id,
|
56
|
-
:title => x.title,
|
57
|
-
:keyword => x.keyword,
|
58
|
-
:icon => icon,
|
59
|
-
:priority => overload[x.id].try(:priority),
|
60
|
-
:fields => x.fields_dump,
|
61
|
-
:group_id => x.provider_group_id,
|
62
|
-
:requires_print => x.requires_print
|
63
|
-
}
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def promotions_dump
|
68
|
-
terminal_profile.terminal_profile_promotions.map{|x| x.provider_id}
|
69
|
-
end
|
70
|
-
|
71
|
-
def provider_groups_dump
|
72
|
-
overload = Hash[*terminal_profile.terminal_profile_provider_groups.map{|x| [x.provider_group_id, x]}.flatten]
|
73
|
-
|
74
|
-
ProviderGroup.all.map do |x|
|
75
|
-
icon = overload[x.id].icon rescue nil
|
76
|
-
|
77
|
-
if icon.blank?
|
78
|
-
icon = x.icon.try(:url)
|
79
|
-
else
|
80
|
-
icon = icon.url
|
81
|
-
end
|
82
|
-
|
83
|
-
{
|
84
|
-
:id => x.id,
|
85
|
-
:title => x.title,
|
86
|
-
:icon => icon,
|
87
|
-
:priority => overload[x.id].try(:priority),
|
88
|
-
:parent_id => x.provider_group_id
|
89
|
-
}
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
38
|
def title
|
94
39
|
keyword
|
95
40
|
end
|
@@ -1,9 +1,13 @@
|
|
1
1
|
class TerminalProfile < ActiveRecord::Base
|
2
2
|
include Redis::Objects::RMap
|
3
3
|
|
4
|
-
has_rmap({:id => lambda{|x| x.to_s}}, :
|
4
|
+
has_rmap({:id => lambda{|x| x.to_s}}, :title)
|
5
5
|
has_paper_trail
|
6
6
|
|
7
|
+
value :cached_providers
|
8
|
+
value :cached_providers_timestamp, :marshal => true
|
9
|
+
lock :cached_providers, :expiration => 15
|
10
|
+
|
7
11
|
has_many :terminals, :conditions => "terminal_profile_id IS NOT NULL"
|
8
12
|
has_many :terminal_profile_promotions, :dependent => :destroy, :order => :priority
|
9
13
|
has_many :terminal_profile_providers, :dependent => :destroy, :order => :priority
|
@@ -15,6 +19,8 @@ class TerminalProfile < ActiveRecord::Base
|
|
15
19
|
accepts_nested_attributes_for :terminal_profile_providers
|
16
20
|
accepts_nested_attributes_for :terminal_profile_provider_groups
|
17
21
|
|
22
|
+
validates :title, :presence => true, :uniqueness => true
|
23
|
+
|
18
24
|
def actualize_links!
|
19
25
|
ProviderGroup.where(ProviderGroup.arel_table[:id].not_in TerminalProfileProviderGroup.arel_table.project(:provider_group_id)).each do |pg|
|
20
26
|
terminal_profile_provider_groups << TerminalProfileProviderGroup.new(:provider_group_id => pg.id, :terminal_profile_id => id)
|
@@ -24,4 +30,81 @@ class TerminalProfile < ActiveRecord::Base
|
|
24
30
|
terminal_profile_providers << TerminalProfileProvider.new(:provider_id => p.id, :terminal_profile_id => id)
|
25
31
|
end
|
26
32
|
end
|
33
|
+
|
34
|
+
def self.invalidate_all_cached_providers!
|
35
|
+
TerminalProfile.all.each(&:invalidate_cached_providers!)
|
36
|
+
end
|
37
|
+
|
38
|
+
def invalidate_cached_providers!
|
39
|
+
self.cached_providers_lock.lock do
|
40
|
+
self.cached_providers.value = nil
|
41
|
+
self.cached_providers_timestamp.value = DateTime.now
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def actual_timestamp
|
46
|
+
local_timestamp = self.cached_providers_timestamp.value
|
47
|
+
|
48
|
+
if local_timestamp.nil? # Redis is not populated yet
|
49
|
+
self.cached_providers_timestamp.value = local_timestamp = DateTime.now
|
50
|
+
end
|
51
|
+
|
52
|
+
local_timestamp
|
53
|
+
end
|
54
|
+
|
55
|
+
def providers_dump
|
56
|
+
providers = Provider.includes(:provider_fields)
|
57
|
+
|
58
|
+
return [] if providers.blank?
|
59
|
+
|
60
|
+
overload = Hash[self.terminal_profile_providers.map{|x| [x.provider_id, x]}]
|
61
|
+
|
62
|
+
providers.map do |x|
|
63
|
+
icon = overload[x.id].icon rescue nil
|
64
|
+
|
65
|
+
if icon.blank?
|
66
|
+
icon = x.icon.try(:url)
|
67
|
+
else
|
68
|
+
icon = icon.url
|
69
|
+
end
|
70
|
+
|
71
|
+
{
|
72
|
+
:id => x.id,
|
73
|
+
:title => x.title,
|
74
|
+
:keyword => x.keyword,
|
75
|
+
:icon => icon,
|
76
|
+
:priority => overload[x.id].try(:priority),
|
77
|
+
:fields => x.fields_dump,
|
78
|
+
:group_id => x.provider_group_id,
|
79
|
+
:requires_print => x.requires_print
|
80
|
+
}
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def promotions_dump
|
85
|
+
self.terminal_profile_promotions.map &:provider_id
|
86
|
+
end
|
87
|
+
|
88
|
+
def provider_groups_dump
|
89
|
+
overload = Hash[self.terminal_profile_provider_groups.map{|x| [x.provider_group_id, x]}]
|
90
|
+
|
91
|
+
ProviderGroup.all.map do |x|
|
92
|
+
icon = overload[x.id].icon rescue nil
|
93
|
+
|
94
|
+
if icon.blank?
|
95
|
+
icon = x.icon.try(:url)
|
96
|
+
else
|
97
|
+
icon = icon.url
|
98
|
+
end
|
99
|
+
|
100
|
+
{
|
101
|
+
:id => x.id,
|
102
|
+
:title => x.title,
|
103
|
+
:icon => icon,
|
104
|
+
:priority => overload[x.id].try(:priority),
|
105
|
+
:parent_id => x.provider_group_id
|
106
|
+
}
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
27
110
|
end
|
@@ -1,18 +1,16 @@
|
|
1
1
|
class TerminalProfilePromotion < ActiveRecord::Base
|
2
2
|
include Redis::Objects::RMap
|
3
3
|
|
4
|
-
value :timestamp, :global => true, :marshal => true
|
5
|
-
|
6
4
|
belongs_to :terminal_profile
|
7
5
|
belongs_to :provider
|
8
6
|
|
9
7
|
validates :provider, :presence => true
|
10
8
|
|
11
9
|
after_save do
|
12
|
-
self.
|
10
|
+
self.terminal_profile.invalidate_cached_providers!
|
13
11
|
end
|
14
12
|
|
15
13
|
after_destroy do
|
16
|
-
self.
|
14
|
+
self.terminal_profile.invalidate_cached_providers!
|
17
15
|
end
|
18
16
|
end
|
@@ -8,4 +8,12 @@ class TerminalProfileProvider < ActiveRecord::Base
|
|
8
8
|
validates :provider_id, :uniqueness => {:scope => :terminal_profile_id}
|
9
9
|
validates :provider, :presence => true
|
10
10
|
validates :terminal_profile, :presence => true
|
11
|
+
|
12
|
+
after_save do
|
13
|
+
self.terminal_profile.invalidate_cached_providers!
|
14
|
+
end
|
15
|
+
|
16
|
+
after_destroy do
|
17
|
+
self.terminal_profile.invalidate_cached_providers!
|
18
|
+
end
|
11
19
|
end
|
@@ -12,4 +12,12 @@ class TerminalProfileProviderGroup < ActiveRecord::Base
|
|
12
12
|
validates :terminal_profile, :presence => true
|
13
13
|
|
14
14
|
delegate :title, :to => :terminal_profile
|
15
|
+
|
16
|
+
after_save do
|
17
|
+
self.terminal_profile.invalidate_cached_providers!
|
18
|
+
end
|
19
|
+
|
20
|
+
after_destroy do
|
21
|
+
self.terminal_profile.invalidate_cached_providers!
|
22
|
+
end
|
15
23
|
end
|
data/config/routes.rb
CHANGED
@@ -7,8 +7,8 @@ Rails.application.class.routes.draw do
|
|
7
7
|
|
8
8
|
devise_for :users, ActiveAdmin::Devise.config
|
9
9
|
|
10
|
-
constraints lambda { |request|
|
11
|
-
request.env["warden"].authenticate? and request.env['warden'].user.root?
|
10
|
+
constraints lambda { |request|
|
11
|
+
request.env["warden"].authenticate? and request.env['warden'].user.root?
|
12
12
|
} do
|
13
13
|
mount Sidekiq::Web => '/sidekiq'
|
14
14
|
end
|
@@ -20,7 +20,13 @@ Rails.application.class.routes.draw do
|
|
20
20
|
:log_to => Rails.root.join('log/webdav.log').to_s
|
21
21
|
) => '/builds/'
|
22
22
|
|
23
|
-
resources :terminal_pings
|
23
|
+
resources :terminal_pings do
|
24
|
+
collection do
|
25
|
+
get :providers
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
|
24
30
|
resources :collections
|
25
31
|
resources :system_receipt_templates
|
26
32
|
|
metadata
CHANGED
@@ -1,48 +1,38 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smartkiosk-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
4
|
+
version: 0.10.0
|
5
|
+
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Boris Staal
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-02-
|
12
|
+
date: 2013-02-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
|
17
|
-
requirements:
|
18
|
-
- - '='
|
19
|
-
- !ruby/object:Gem::Version
|
20
|
-
version: 3.2.11
|
16
|
+
requirement: &70123420824880 !ruby/object:Gem::Requirement
|
21
17
|
none: false
|
22
|
-
requirement: !ruby/object:Gem::Requirement
|
23
18
|
requirements:
|
24
|
-
- -
|
19
|
+
- - =
|
25
20
|
- !ruby/object:Gem::Version
|
26
21
|
version: 3.2.11
|
27
|
-
none: false
|
28
|
-
prerelease: false
|
29
22
|
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70123420824880
|
30
25
|
- !ruby/object:Gem::Dependency
|
31
26
|
name: matrioshka
|
32
|
-
|
33
|
-
requirements:
|
34
|
-
- - ">="
|
35
|
-
- !ruby/object:Gem::Version
|
36
|
-
version: 0.1.1
|
27
|
+
requirement: &70123420824340 !ruby/object:Gem::Requirement
|
37
28
|
none: false
|
38
|
-
requirement: !ruby/object:Gem::Requirement
|
39
29
|
requirements:
|
40
|
-
- -
|
30
|
+
- - ! '>='
|
41
31
|
- !ruby/object:Gem::Version
|
42
32
|
version: 0.1.1
|
43
|
-
none: false
|
44
|
-
prerelease: false
|
45
33
|
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70123420824340
|
46
36
|
description: Smartkiosk server application
|
47
37
|
email:
|
48
38
|
- boris@roundlake.ru
|
@@ -50,8 +40,8 @@ executables: []
|
|
50
40
|
extensions: []
|
51
41
|
extra_rdoc_files: []
|
52
42
|
files:
|
53
|
-
-
|
54
|
-
-
|
43
|
+
- .gitignore
|
44
|
+
- .rspec
|
55
45
|
- Capfile
|
56
46
|
- Gemfile
|
57
47
|
- Gemfile.lock
|
@@ -310,26 +300,24 @@ rdoc_options: []
|
|
310
300
|
require_paths:
|
311
301
|
- lib
|
312
302
|
required_ruby_version: !ruby/object:Gem::Requirement
|
303
|
+
none: false
|
313
304
|
requirements:
|
314
|
-
- -
|
305
|
+
- - ! '>='
|
315
306
|
- !ruby/object:Gem::Version
|
307
|
+
version: '0'
|
316
308
|
segments:
|
317
309
|
- 0
|
318
|
-
hash:
|
319
|
-
version: !binary |-
|
320
|
-
MA==
|
321
|
-
none: false
|
310
|
+
hash: 4534525538031660803
|
322
311
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
312
|
+
none: false
|
323
313
|
requirements:
|
324
|
-
- -
|
314
|
+
- - ! '>='
|
325
315
|
- !ruby/object:Gem::Version
|
326
|
-
version:
|
327
|
-
MA==
|
328
|
-
none: false
|
316
|
+
version: '0'
|
329
317
|
requirements: []
|
330
|
-
rubyforge_project:
|
331
|
-
rubygems_version: 1.8.
|
332
|
-
signing_key:
|
318
|
+
rubyforge_project:
|
319
|
+
rubygems_version: 1.8.15
|
320
|
+
signing_key:
|
333
321
|
specification_version: 3
|
334
322
|
summary: Smartkiosk server application
|
335
323
|
test_files:
|