thron 0.7.0

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.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.env.example +4 -0
  3. data/.gitignore +13 -0
  4. data/.travis.yml +6 -0
  5. data/Gemfile +4 -0
  6. data/README.md +182 -0
  7. data/Rakefile +10 -0
  8. data/Vagrantfile +80 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +7 -0
  11. data/config/thron.yml +10 -0
  12. data/lib/thron.rb +3 -0
  13. data/lib/thron/circuit_breaker.rb +46 -0
  14. data/lib/thron/config.rb +35 -0
  15. data/lib/thron/entity/base.rb +78 -0
  16. data/lib/thron/entity/image.rb +30 -0
  17. data/lib/thron/gateway/access_manager.rb +69 -0
  18. data/lib/thron/gateway/apps.rb +91 -0
  19. data/lib/thron/gateway/apps_admin.rb +153 -0
  20. data/lib/thron/gateway/base.rb +41 -0
  21. data/lib/thron/gateway/category.rb +210 -0
  22. data/lib/thron/gateway/client.rb +59 -0
  23. data/lib/thron/gateway/comment.rb +76 -0
  24. data/lib/thron/gateway/contact.rb +120 -0
  25. data/lib/thron/gateway/content.rb +267 -0
  26. data/lib/thron/gateway/content_category.rb +32 -0
  27. data/lib/thron/gateway/content_list.rb +40 -0
  28. data/lib/thron/gateway/dashboard.rb +120 -0
  29. data/lib/thron/gateway/delivery.rb +122 -0
  30. data/lib/thron/gateway/device.rb +58 -0
  31. data/lib/thron/gateway/metadata.rb +68 -0
  32. data/lib/thron/gateway/publish_in_weebo_express.rb +39 -0
  33. data/lib/thron/gateway/publishing_process.rb +141 -0
  34. data/lib/thron/gateway/repository.rb +111 -0
  35. data/lib/thron/gateway/session.rb +15 -0
  36. data/lib/thron/gateway/users_group_manager.rb +117 -0
  37. data/lib/thron/gateway/v_user_manager.rb +195 -0
  38. data/lib/thron/logger.rb +25 -0
  39. data/lib/thron/pageable.rb +26 -0
  40. data/lib/thron/paginator.rb +82 -0
  41. data/lib/thron/response.rb +48 -0
  42. data/lib/thron/root.rb +9 -0
  43. data/lib/thron/routable.rb +80 -0
  44. data/lib/thron/route.rb +102 -0
  45. data/lib/thron/string_extensions.rb +23 -0
  46. data/lib/thron/user.rb +77 -0
  47. data/lib/thron/version.rb +3 -0
  48. data/log/.gitignore +4 -0
  49. data/thron.gemspec +26 -0
  50. metadata +176 -0
@@ -0,0 +1,30 @@
1
+ module Thron
2
+ module Entity
3
+ class Image < Base
4
+ def initialize(hash = {})
5
+ super
6
+ @path = hash.delete(:path)
7
+ if valid_path?
8
+ fetch_mime_type
9
+ fetch_buffer
10
+ end
11
+ end
12
+
13
+ private
14
+
15
+ def valid_path?
16
+ File.readable?(@path.to_s)
17
+ end
18
+
19
+ def fetch_mime_type
20
+ @table[:mime_type] ||= `file -b --mime-type #{@path}`.to_s.chomp
21
+ new_ostruct_member(:mime_type)
22
+ end
23
+
24
+ def fetch_buffer
25
+ @table[:buffer] ||= File.binread(@path).unpack('c*')
26
+ new_ostruct_member(:buffer)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,69 @@
1
+ require 'thron/gateway/base'
2
+
3
+ module Thron
4
+ module Gateway
5
+ class AccessManager < Base
6
+
7
+ PACKAGE = Package.new(:xsso, :resources, self.service_name)
8
+
9
+ def self.routes
10
+ @routes ||= {
11
+ login: Route::factory(name: 'login', package: PACKAGE, params: [client_id]),
12
+ logout: Route::factory(name: 'logout', package: PACKAGE, params: [client_id], type: Route::Types::PLAIN, accept: Route::Types::PLAIN),
13
+ validate_capabilities: Route::factory(name: 'validateCapability', package: PACKAGE, params: [client_id], type: Route::Types::PLAIN, accept: Route::Types::PLAIN),
14
+ validate_roles: Route::factory(name: 'validateRole', package: PACKAGE, params: [client_id], type: Route::Types::PLAIN, accept: Route::Types::PLAIN),
15
+ validate_token: Route::factory(name: 'validateToken', package: PACKAGE, params: [client_id])
16
+ }
17
+ end
18
+
19
+ def login(options = {})
20
+ query = {
21
+ username: options[:username],
22
+ password: options[:password]
23
+ }
24
+ route(to: __callee__, query: query, dash: false) do |response|
25
+ response.body = Entity::Base::factory(response.body)
26
+ @token_id = response.body.token_id
27
+ end
28
+ end
29
+
30
+ def logout
31
+ check_session
32
+ route(to: __callee__, token_id: token_id, dash: false) do |response|
33
+ @token_id = nil
34
+ end
35
+ end
36
+
37
+ def validate_capabilities(options = {})
38
+ capabilities = options.fetch(:capabilities) { [] }
39
+ check_session
40
+ query = {
41
+ capabilities: capabilities.join(',')
42
+ }
43
+ route(to: __callee__, query: query, token_id: @token_id, dash: false)
44
+ end
45
+
46
+ def validate_roles(options = {})
47
+ roles = options.fetch(:roles) { [] }
48
+ xor = options.fetch(:xor) { false }
49
+ check_session
50
+ separator = xor ? '|' : ','
51
+ query = {
52
+ role: roles.join(separator)
53
+ }
54
+ route(to: __callee__, query: query, token_id: @token_id, dash: false)
55
+ end
56
+
57
+ def validate_token(options = {})
58
+ username = options[:username]
59
+ check_session
60
+ query = {
61
+ username: username
62
+ }
63
+ route(to: __callee__, query: query, token_id: @token_id, dash: false) do |response|
64
+ response.body = Entity::Base::factory(response.body)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,91 @@
1
+ require 'thron/gateway/session'
2
+
3
+ module Thron
4
+ module Gateway
5
+ class Apps < Session
6
+
7
+ PACKAGE = Package.new(:xadmin, :resources, self.service_name)
8
+
9
+ def self.routes
10
+ @routes ||= {
11
+ app_detail: Route::factory(name: 'appDetail', package: PACKAGE),
12
+ list_apps: Route::factory(name: 'appsList', package: PACKAGE),
13
+ find_apps: Route::factory(name: 'findByProperties', package: PACKAGE),
14
+ login_app: Route::factory(name: 'loginApp', package: PACKAGE, verb: Route::Verbs::GET),
15
+ login_snippet: Route::factory(name: 'loginSnippet', package: PACKAGE, verb: Route::Verbs::GET),
16
+ su: Route::factory(name: 'su', package: PACKAGE, accept: Route::Types::PLAIN)
17
+ }
18
+ end
19
+
20
+ def app_detail(options = {})
21
+ app_id = options[:app_id]
22
+ body = {
23
+ clientId: client_id,
24
+ appId: app_id
25
+ }
26
+ route(to: __callee__, body: body, token_id: token_id) do |response|
27
+ response.body = Entity::Base::factory(response.body.fetch('app') { {} })
28
+ end
29
+ end
30
+
31
+ def list_apps(options = {})
32
+ criteria = options.fetch(:criteria) { {} }
33
+ body = {
34
+ clientId: client_id,
35
+ criteria: criteria
36
+ }
37
+ route(to: __callee__, body: body, token_id: token_id) do |response|
38
+ response.body = Entity::Base::factory(response.body.fetch('apps') { [] })
39
+ end
40
+ end
41
+
42
+ def find_apps(options = {})
43
+ criteria = options.fetch(:criteria) { {} }
44
+ body = {
45
+ clientId: client_id,
46
+ criteria: criteria
47
+ }
48
+ route(to: __callee__, body: body, token_id: token_id) do |response|
49
+ response.body = Entity::Base::factory(response.body.fetch('apps') { [] })
50
+ end
51
+ end
52
+
53
+ def login_app(options = {})
54
+ app_id = options[:app_id]
55
+ query = {
56
+ clientId: client_id,
57
+ appId: app_id
58
+ }
59
+ route(to: __callee__, query: query, token_id: token_id, dash: false) do |response|
60
+ response.body = Entity::Base::factory(response.body.fetch('app') { {} })
61
+ end
62
+ end
63
+
64
+ def login_snippet(options = {})
65
+ app_id = options[:app_id]
66
+ snippet_id = options[:snippet_id]
67
+ query = {
68
+ clientId: client_id,
69
+ appId: app_id,
70
+ snippetId: snippet_id,
71
+ }
72
+ route(to: __callee__, query: query, token_id: token_id, dash: false) do |response|
73
+ response.body = Entity::Base::factory(response.body.fetch('snippet') { {} })
74
+ end
75
+ end
76
+
77
+ def su(options = {})
78
+ app_id = options[:app_id]
79
+ username = options[:username]
80
+ body = {
81
+ clientId: client_id,
82
+ appId: app_id,
83
+ username: username
84
+ }
85
+ route(to: __callee__, body: body, token_id: token_id) do |response|
86
+ response.body = Entity::Base::factory(response.body)
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,153 @@
1
+ require 'thron/gateway/session'
2
+
3
+ module Thron
4
+ module Gateway
5
+ class AppsAdmin < Session
6
+
7
+ PACKAGE = Package.new(:xadmin, :resources, self.service_name)
8
+
9
+ def self.routes
10
+ @routes ||= {
11
+ add_group_app: Route::factory(name: 'addGroupApp', package: PACKAGE),
12
+ add_snippet: Route::factory(name: 'addSnippet', package: PACKAGE),
13
+ add_user_app: Route::factory(name: 'addUserApp', package: PACKAGE),
14
+ create_app: Route::factory(name: 'create', package: PACKAGE),
15
+ remove_app: Route::factory(name: 'remove', package: PACKAGE),
16
+ remove_group_app: Route::factory(name: 'removeGroupApp', package: PACKAGE),
17
+ remove_snippet: Route::factory(name: 'removeSnippet', package: PACKAGE),
18
+ remove_user_app: Route::factory(name: 'removeUserApp', package: PACKAGE),
19
+ update_app: Route::factory(name: 'updateApp', package: PACKAGE),
20
+ update_snippet: Route::factory(name: 'updateSnippet', package: PACKAGE)
21
+ }
22
+ end
23
+
24
+ def add_group_app(options = {})
25
+ app_id = options[:app_id]
26
+ group_id = options[:group_id]
27
+ capabilities = options[:capabilities]
28
+ body = {
29
+ clientId: client_id,
30
+ appId: app_id,
31
+ groupId: group_id,
32
+ userCaps: capabilities
33
+ }
34
+ route(to: __callee__, body: body, token_id: token_id)
35
+ end
36
+
37
+ def add_snippet(options = {})
38
+ app_id = options[:app_id]
39
+ data = options[:data]
40
+ capabilities = options[:capabilities]
41
+ body = {
42
+ clientId: client_id,
43
+ appId: app_id,
44
+ snippet: data,
45
+ caps: capabilities
46
+ }
47
+ route(to: __callee__, body: body, token_id: token_id) do |response|
48
+ response.body = Entity::Base::factory(response.body.fetch('snippet') { {} })
49
+ end
50
+ end
51
+
52
+ def add_user_app(options = {})
53
+ app_id = options[:app_id]
54
+ username = options[:username]
55
+ capabilities = options[:capabilities]
56
+ body = {
57
+ clientId: client_id,
58
+ appId: app_id,
59
+ username: username,
60
+ userCaps: capabilities
61
+ }
62
+ route(to: __callee__, body: body, token_id: token_id)
63
+ end
64
+
65
+ def create_app(options = {})
66
+ data = options[:data]
67
+ options = options.fetch(:options) { {} }
68
+ body = {
69
+ clientId: client_id,
70
+ app: data,
71
+ options: options
72
+ }
73
+ route(to: __callee__, body: body, token_id: token_id) do |response|
74
+ response.body = Entity::Base::factory(response.body.fetch('app') { {} })
75
+ end
76
+ end
77
+
78
+ def remove_app(options = {})
79
+ app_id = options[:app_id]
80
+ body = {
81
+ clientId: client_id,
82
+ appId: app_id
83
+ }
84
+ route(to: __callee__, body: body, token_id: token_id)
85
+ end
86
+
87
+ def remove_group_app(options = {})
88
+ app_id = options[:app_id]
89
+ group_id = options[:group_id]
90
+ body = {
91
+ clientId: client_id,
92
+ appId: app_id,
93
+ groupId: group_id
94
+ }
95
+ route(to: __callee__, body: body, token_id: token_id)
96
+ end
97
+
98
+ def remove_snippet(options = {})
99
+ app_id = options[:app_id]
100
+ snippet_id = options[:snippet_id]
101
+ body = {
102
+ clientId: client_id,
103
+ appId: app_id,
104
+ snippetId: snippet_id
105
+ }
106
+ route(to: __callee__, body: body, token_id: token_id)
107
+ end
108
+
109
+ def remove_user_app(options = {})
110
+ app_id = options[:app_id]
111
+ username = options[:username]
112
+ body = {
113
+ clientId: client_id,
114
+ appId: app_id,
115
+ username: username
116
+ }
117
+ route(to: __callee__, body: body, token_id: token_id)
118
+ end
119
+
120
+ def update_app(options = {})
121
+ app_id = options[:app_id]
122
+ data = options[:data]
123
+ capabilities = options[:capabilities]
124
+ body = {
125
+ clientId: client_id,
126
+ appId: app_id,
127
+ update: data,
128
+ caps: capabilities
129
+ }
130
+ route(to: __callee__, body: body, token_id: token_id) do |response|
131
+ response.body = Entity::Base::factory(response.body.fetch('app') { {} })
132
+ end
133
+ end
134
+
135
+ def update_snippet(options = {})
136
+ app_id = options[:app_id]
137
+ snippet_id = options[:snippet_id]
138
+ data = options[:data]
139
+ capabilities = options[:capabilities]
140
+ body = {
141
+ clientId: client_id,
142
+ appId: app_id,
143
+ snippetId: snippet_id,
144
+ snippet: data,
145
+ caps: capabilities
146
+ }
147
+ route(to: __callee__, body: body, token_id: token_id) do |response|
148
+ response.body = Entity::Base::factory(response.body.fetch('snippet') { {} })
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,41 @@
1
+ require 'httparty'
2
+ require 'thron/entity/base'
3
+ require 'thron/routable'
4
+
5
+ module Thron
6
+ module Gateway
7
+ Package = Struct::new(:name, :domain, :service) do
8
+ def to_s
9
+ "#{name}/#{domain}/#{service}"
10
+ end
11
+ end
12
+
13
+ class NoActiveSessionError < StandardError; end
14
+
15
+ class Base
16
+ include Routable
17
+
18
+ base_uri "#{Config::thron::protocol}://#{Config::thron.client_id}-view.4me.it/api"
19
+
20
+ NO_ACTIVE_SESSION = "Please provide a valid token ID"
21
+
22
+ def self.service_name
23
+ self.name.split('::').last.downcase
24
+ end
25
+
26
+ def self.client_id
27
+ @client_id ||= Config.thron.client_id
28
+ end
29
+
30
+ attr_accessor :token_id
31
+
32
+ def client_id
33
+ self.class.client_id
34
+ end
35
+
36
+ def check_session
37
+ fail NoActiveSessionError, NO_ACTIVE_SESSION unless token_id
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,210 @@
1
+ require 'thron/gateway/session'
2
+
3
+ module Thron
4
+ module Gateway
5
+ class Category < Session
6
+
7
+ PACKAGE = Package.new(:xcontents, :resources, self.service_name)
8
+
9
+ paginate :find_categories
10
+
11
+ def self.routes
12
+ @routes ||= {
13
+ create_category: Route::factory(name: 'createCategory', package: PACKAGE),
14
+ create_system_category: Route::factory(name: 'createSystemCategory', package: PACKAGE),
15
+ add_category_for_locale: Route::factory(name: 'addCategory4Locale', package: PACKAGE),
16
+ add_category_pretty_id: Route::factory(name: 'addCategoryPrettyId', package: PACKAGE),
17
+ find_categories: Route::factory(name: 'findByProperties2', package: PACKAGE),
18
+ category_detail: Route::factory(name: 'getCategory', package: PACKAGE, verb: Route::Verbs::GET),
19
+ remove_category: Route::factory(name: 'removeCategory', package: PACKAGE),
20
+ remove_category_for_locale: Route::factory(name: 'removeCategory4Locale', package: PACKAGE),
21
+ remove_category_pretty_id: Route::factory(name: 'removeCategoryPrettyId', package: PACKAGE),
22
+ set_parent_category: Route::factory(name: 'setParentId', package: PACKAGE),
23
+ update_category: Route::factory(name: 'updateCategory', package: PACKAGE),
24
+ update_category_for_locale: Route::factory(name: 'updateCategory4Locale', package: PACKAGE),
25
+ update_category_pretty_id: Route::factory(name: 'updateCategoryPrettyId', package: PACKAGE)
26
+ }
27
+ end
28
+
29
+ def create_category(options = {})
30
+ parent_id = options[:parent_id]
31
+ locale = options[:locale]
32
+ is_private = options.fetch(:is_private) { false }
33
+ solution = options[:solution]
34
+ data = options[:data]
35
+ body = {
36
+ client: {
37
+ clientId: client_id
38
+ },
39
+ upCatId: parent_id,
40
+ catLocales: locale,
41
+ isPrivate: is_private,
42
+ private: is_private,
43
+ solution: solution,
44
+ options: data
45
+ }
46
+ route(to: __callee__, body: body, token_id: token_id)
47
+ end
48
+
49
+ def create_system_category(options = {})
50
+ category_id = options[:category_id]
51
+ parent_id = options[:parent_id]
52
+ locale = options[:locale]
53
+ data = options[:data]
54
+ body = {
55
+ client: {
56
+ clientId: client_id
57
+ },
58
+ newCategoryId: category_id,
59
+ upCatId: parent_id,
60
+ catLocales: locale,
61
+ options: data
62
+ }
63
+ route(to: __callee__, body: body, token_id: token_id)
64
+ end
65
+
66
+ def add_category_for_locale(options = {})
67
+ category_id = options[:category_id]
68
+ locale = options[:locale]
69
+ body = {
70
+ client: {
71
+ clientId: client_id
72
+ },
73
+ catId: category_id,
74
+ catLocale: locale
75
+ }
76
+ route(to: __callee__, body: body, token_id: token_id)
77
+ end
78
+
79
+ def add_category_pretty_id(options = {})
80
+ category_id = options[:category_id]
81
+ pretty_id = options[:pretty_id]
82
+ body = {
83
+ clientId: client_id,
84
+ categoryId: category_id,
85
+ prettyId: pretty_id
86
+ }
87
+ route(to: __callee__, body: body, token_id: token_id)
88
+ end
89
+
90
+ def find_categories(options = {})
91
+ criteria = options.fetch(:criteria) { {} }
92
+ locale = options[:locale]
93
+ order_by = options[:order_by]
94
+ offset = options[:offset].to_i
95
+ limit = options[:limit].to_i
96
+ body = {
97
+ client: {
98
+ clientId: client_id
99
+ },
100
+ properties: criteria,
101
+ locale: locale,
102
+ orderBy: order_by,
103
+ offset: offset.to_i,
104
+ numberOfResult: limit.to_i
105
+ }
106
+ route(to: __callee__, body: body, token_id: token_id) do |response|
107
+ response.body = Entity::Base::factory(response.body.fetch('categories') { [] })
108
+ end
109
+ end
110
+
111
+ def category_detail(options = {})
112
+ category_id = options[:category_id]
113
+ recursive = options.fetch(:recursive) { false }
114
+ locale = options[:locale]
115
+ query = {
116
+ clientId: client_id,
117
+ categoryId: category_id,
118
+ cascade: recursive,
119
+ locale: locale
120
+ }
121
+ route(to: __callee__, query: query, token_id: token_id) do |response|
122
+ response.body = Entity::Base::factory(response.body.fetch('category') { {} })
123
+ end
124
+ end
125
+
126
+ def remove_category(options = {})
127
+ category_id = options[:category_id]
128
+ recursive = options.fetch(:recursive) { false }
129
+ query = {
130
+ clientId: client_id,
131
+ catId: category_id,
132
+ cascade: recursive
133
+ }
134
+ route(to: __callee__, query: query, token_id: token_id, dash: false)
135
+ end
136
+
137
+ def remove_category_for_locale(options = {})
138
+ category_id = options[:category_id]
139
+ locale = options[:locale]
140
+ body = {
141
+ client: {
142
+ clientId: client_id
143
+ },
144
+ catId: category_id,
145
+ locale: locale
146
+ }
147
+ route(to: __callee__, body: body, token_id: token_id)
148
+ end
149
+
150
+ def remove_category_pretty_id(options = {})
151
+ category_id = options[:category_id]
152
+ locale = options[:locale]
153
+ body = {
154
+ clientId: client_id,
155
+ categoryId: category_id,
156
+ locale: locale
157
+ }
158
+ route(to: __callee__, body: body, token_id: token_id)
159
+ end
160
+
161
+ def set_parent_category(options = {})
162
+ category_id = options[:category_id]
163
+ parent_id = options[:parent_id]
164
+ query = {
165
+ clientId: client_id,
166
+ categoryId: category_id,
167
+ categoryParentId: parent_id
168
+ }
169
+ route(to: __callee__, query: query, token_id: token_id, dash: false)
170
+ end
171
+
172
+ def update_category(options = {})
173
+ category_id = options[:category_id]
174
+ data = options[:data]
175
+ body = {
176
+ client: {
177
+ clientId: client_id
178
+ },
179
+ categoryId: category_id,
180
+ update: data
181
+ }
182
+ route(to: __callee__, body: body, token_id: token_id)
183
+ end
184
+
185
+ def update_category_for_locale(options = {})
186
+ category_id = options[:category_id]
187
+ locale = options[:locale]
188
+ body = {
189
+ client: {
190
+ clientId: client_id
191
+ },
192
+ catId: category_id,
193
+ property: locale
194
+ }
195
+ route(to: __callee__, body: body, token_id: token_id)
196
+ end
197
+
198
+ def update_category_pretty_id(options = {})
199
+ category_id = options[:category_id]
200
+ pretty_id = options[:pretty_id]
201
+ body = {
202
+ clientId: client_id,
203
+ categoryId: category_id,
204
+ prettyId: pretty_id
205
+ }
206
+ route(to: __callee__, body: body, token_id: token_id)
207
+ end
208
+ end
209
+ end
210
+ end