anoubis 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (188) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +38 -0
  5. data/app/controllers/anoubis/application_controller.rb +78 -0
  6. data/app/controllers/anoubis/core/application_controller.rb +343 -0
  7. data/app/controllers/anoubis/core/data/actions.rb +962 -0
  8. data/app/controllers/anoubis/core/data/callbacks.rb +68 -0
  9. data/app/controllers/anoubis/core/data/convert.rb +407 -0
  10. data/app/controllers/anoubis/core/data/defaults.rb +217 -0
  11. data/app/controllers/anoubis/core/data/get.rb +531 -0
  12. data/app/controllers/anoubis/core/data/load.rb +89 -0
  13. data/app/controllers/anoubis/core/data/set.rb +49 -0
  14. data/app/controllers/anoubis/core/data/setup.rb +104 -0
  15. data/app/controllers/anoubis/core/data_controller.rb +28 -0
  16. data/app/controllers/anoubis/core/index/actions.rb +53 -0
  17. data/app/controllers/anoubis/core/index/callbacks.rb +23 -0
  18. data/app/controllers/anoubis/core/index_controller.rb +36 -0
  19. data/app/controllers/anoubis/etc/base.rb +52 -0
  20. data/app/controllers/anoubis/etc/data.rb +89 -0
  21. data/app/controllers/anoubis/etc/field.rb +468 -0
  22. data/app/controllers/anoubis/etc/field_options.rb +83 -0
  23. data/app/controllers/anoubis/etc/field_order.rb +51 -0
  24. data/app/controllers/anoubis/etc/filter.rb +251 -0
  25. data/app/controllers/anoubis/etc/menu.rb +101 -0
  26. data/app/controllers/anoubis/etc/model.rb +67 -0
  27. data/app/controllers/anoubis/etc/tab_item.rb +91 -0
  28. data/app/controllers/anoubis/etc.rb +8 -0
  29. data/app/controllers/anoubis/export.rb +47 -0
  30. data/app/controllers/anoubis/output/autocomplete.rb +30 -0
  31. data/app/controllers/anoubis/output/basic.rb +86 -0
  32. data/app/controllers/anoubis/output/data.rb +101 -0
  33. data/app/controllers/anoubis/output/delete.rb +41 -0
  34. data/app/controllers/anoubis/output/edit.rb +55 -0
  35. data/app/controllers/anoubis/output/frame.rb +227 -0
  36. data/app/controllers/anoubis/output/login.rb +71 -0
  37. data/app/controllers/anoubis/output/menu.rb +220 -0
  38. data/app/controllers/anoubis/output/update.rb +43 -0
  39. data/app/controllers/anoubis/sso/client/application_controller.rb +139 -0
  40. data/app/controllers/anoubis/sso/client/data/actions.rb +5 -0
  41. data/app/controllers/anoubis/sso/client/data/callbacks.rb +5 -0
  42. data/app/controllers/anoubis/sso/client/data/convert.rb +5 -0
  43. data/app/controllers/anoubis/sso/client/data/defaults.rb +5 -0
  44. data/app/controllers/anoubis/sso/client/data/get.rb +5 -0
  45. data/app/controllers/anoubis/sso/client/data/load.rb +26 -0
  46. data/app/controllers/anoubis/sso/client/data/set.rb +5 -0
  47. data/app/controllers/anoubis/sso/client/data/setup.rb +5 -0
  48. data/app/controllers/anoubis/sso/client/data_controller.rb +21 -0
  49. data/app/controllers/anoubis/sso/client/index/actions.rb +79 -0
  50. data/app/controllers/anoubis/sso/client/index/callbacks.rb +13 -0
  51. data/app/controllers/anoubis/sso/client/index_controller.rb +18 -0
  52. data/app/controllers/anoubis/sso/server/application_controller.rb +49 -0
  53. data/app/controllers/anoubis/sso/server/login_controller.rb +342 -0
  54. data/app/controllers/anoubis/sso/server/user_controller.rb +142 -0
  55. data/app/controllers/anoubis/tenant/application_controller.rb +54 -0
  56. data/app/controllers/anoubis/tenant/data/actions.rb +11 -0
  57. data/app/controllers/anoubis/tenant/data/callbacks.rb +11 -0
  58. data/app/controllers/anoubis/tenant/data/convert.rb +11 -0
  59. data/app/controllers/anoubis/tenant/data/defaults.rb +11 -0
  60. data/app/controllers/anoubis/tenant/data/get.rb +11 -0
  61. data/app/controllers/anoubis/tenant/data/load.rb +52 -0
  62. data/app/controllers/anoubis/tenant/data/set.rb +11 -0
  63. data/app/controllers/anoubis/tenant/data/setup.rb +11 -0
  64. data/app/controllers/anoubis/tenant/data_controller.rb +28 -0
  65. data/app/controllers/anoubis/tenant/index/actions.rb +191 -0
  66. data/app/controllers/anoubis/tenant/index/callbacks.rb +11 -0
  67. data/app/controllers/anoubis/tenant/index_controller.rb +38 -0
  68. data/app/controllers/anoubis/tenants_controller.rb +7 -0
  69. data/app/controllers/anoubis/users_controller.rb +7 -0
  70. data/app/jobs/anoubis/application_job.rb +6 -0
  71. data/app/mailers/anoubis/application_mailer.rb +8 -0
  72. data/app/models/anoubis/application_record.rb +45 -0
  73. data/app/models/anoubis/core/application_record.rb +250 -0
  74. data/app/models/anoubis/core/locales.rb +27 -0
  75. data/app/models/anoubis/sso/client/application_record.rb +3 -0
  76. data/app/models/anoubis/sso/client/group.rb +19 -0
  77. data/app/models/anoubis/sso/client/group_menu.rb +109 -0
  78. data/app/models/anoubis/sso/client/menu.rb +145 -0
  79. data/app/models/anoubis/sso/client/user.rb +81 -0
  80. data/app/models/anoubis/sso/client/user_group.rb +32 -0
  81. data/app/models/anoubis/sso/server/system.rb +36 -0
  82. data/app/models/anoubis/sso/server/user.rb +79 -0
  83. data/app/models/anoubis/tenant/application_record.rb +41 -0
  84. data/app/models/anoubis/tenant/group.rb +95 -0
  85. data/app/models/anoubis/tenant/group_locale.rb +19 -0
  86. data/app/models/anoubis/tenant/group_menu.rb +84 -0
  87. data/app/models/anoubis/tenant/menu.rb +156 -0
  88. data/app/models/anoubis/tenant/menu_locale.rb +27 -0
  89. data/app/models/anoubis/tenant/system.rb +127 -0
  90. data/app/models/anoubis/tenant/system_locale.rb +19 -0
  91. data/app/models/anoubis/tenant/system_menu.rb +51 -0
  92. data/app/models/anoubis/tenant/tenant.rb +107 -0
  93. data/app/models/anoubis/tenant/tenant_system.rb +19 -0
  94. data/app/models/anoubis/tenant/user.rb +225 -0
  95. data/app/models/anoubis/tenant/user_group.rb +32 -0
  96. data/app/services/anoubis/core_service.rb +16 -0
  97. data/app/services/anoubis/session_service.rb +17 -0
  98. data/app/validators/presence_in_tenant_validator.rb +20 -0
  99. data/config/initializers/mime_type.rb +1 -0
  100. data/config/locales/en.yml +120 -0
  101. data/config/locales/ru.yml +245 -0
  102. data/config/routes.rb +74 -0
  103. data/db/migrate/20181018085843_create_tenants.rb +13 -0
  104. data/db/migrate/20181018111217_create_systems.rb +10 -0
  105. data/db/migrate/20181018111713_create_tenant_systems.rb +11 -0
  106. data/db/migrate/20181018111925_create_groups.rb +13 -0
  107. data/db/migrate/20181018112151_create_users.rb +25 -0
  108. data/db/migrate/20181018115737_add_title_to_users.rb +10 -0
  109. data/db/migrate/20181022060211_create_menus.rb +18 -0
  110. data/db/migrate/20181115055245_create_group_menus.rb +12 -0
  111. data/db/migrate/20181115060830_create_system_menus.rb +11 -0
  112. data/db/migrate/20181122062131_create_user_groups.rb +11 -0
  113. data/db/migrate/20181221060727_create_menu_locales.rb +14 -0
  114. data/db/migrate/20181225062303_create_system_locales.rb +11 -0
  115. data/db/migrate/20181225062339_create_group_locales.rb +11 -0
  116. data/db/seeds.rb +268 -0
  117. data/lib/anoubis/engine.rb +13 -0
  118. data/lib/anoubis/version.rb +5 -0
  119. data/lib/anoubis.rb +213 -0
  120. data/lib/tasks/anubis_tasks.rake +10 -0
  121. data/lib/tasks/sessions/clear_sessions.rake +10 -0
  122. data/spec/anubis_spec.rb +5 -0
  123. data/spec/controllers/anoubis/index_controller_spec.rb +77 -0
  124. data/spec/dummy/Rakefile +3 -0
  125. data/spec/dummy/app/assets/config/manifest.js +2 -0
  126. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  127. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  128. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  129. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  130. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  131. data/spec/dummy/app/jobs/application_job.rb +2 -0
  132. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  133. data/spec/dummy/app/models/application_record.rb +3 -0
  134. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  135. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  136. data/spec/dummy/bin/bundle +3 -0
  137. data/spec/dummy/bin/rails +4 -0
  138. data/spec/dummy/bin/rake +4 -0
  139. data/spec/dummy/bin/setup +33 -0
  140. data/spec/dummy/bin/update +28 -0
  141. data/spec/dummy/config/application.rb +14 -0
  142. data/spec/dummy/config/boot.rb +5 -0
  143. data/spec/dummy/config/cable.yml +10 -0
  144. data/spec/dummy/config/database.yml +54 -0
  145. data/spec/dummy/config/environment.rb +5 -0
  146. data/spec/dummy/config/environments/development.rb +54 -0
  147. data/spec/dummy/config/environments/production.rb +85 -0
  148. data/spec/dummy/config/environments/test.rb +46 -0
  149. data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
  150. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  151. data/spec/dummy/config/initializers/cors.rb +16 -0
  152. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  153. data/spec/dummy/config/initializers/inflections.rb +16 -0
  154. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  155. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  156. data/spec/dummy/config/locales/en.yml +33 -0
  157. data/spec/dummy/config/puma.rb +34 -0
  158. data/spec/dummy/config/routes.rb +3 -0
  159. data/spec/dummy/config/spring.rb +6 -0
  160. data/spec/dummy/config/storage.yml +34 -0
  161. data/spec/dummy/config.ru +5 -0
  162. data/spec/dummy/db/schema.rb +167 -0
  163. data/spec/dummy/db/seeds.rb +1 -0
  164. data/spec/factories/anubis_group_locales.rb +7 -0
  165. data/spec/factories/anubis_group_menus.rb +7 -0
  166. data/spec/factories/anubis_groups.rb +6 -0
  167. data/spec/factories/anubis_menu_locales.rb +9 -0
  168. data/spec/factories/anubis_menus.rb +6 -0
  169. data/spec/factories/anubis_system_locales.rb +7 -0
  170. data/spec/factories/anubis_system_menus.rb +6 -0
  171. data/spec/factories/anubis_systems.rb +5 -0
  172. data/spec/factories/anubis_tenants.rb +7 -0
  173. data/spec/factories/anubis_users.rb +10 -0
  174. data/spec/integration/navigation_test.rb +7 -0
  175. data/spec/models/anoubis/group_locale_spec.rb +25 -0
  176. data/spec/models/anoubis/group_menu_spec.rb +50 -0
  177. data/spec/models/anoubis/group_spec.rb +52 -0
  178. data/spec/models/anoubis/menu_locale_spec.rb +31 -0
  179. data/spec/models/anoubis/menu_spec.rb +48 -0
  180. data/spec/models/anoubis/system_locale_spec.rb +20 -0
  181. data/spec/models/anoubis/system_menu_spec.rb +49 -0
  182. data/spec/models/anoubis/system_spec.rb +53 -0
  183. data/spec/models/anoubis/tenant_spec.rb +67 -0
  184. data/spec/models/anoubis/user_spec.rb +57 -0
  185. data/spec/rails_helper.rb +32 -0
  186. data/spec/requests/anoubis/users_request_spec.rb +5 -0
  187. data/spec/spec_helper.rb +13 -0
  188. metadata +408 -0
data/lib/anoubis.rb ADDED
@@ -0,0 +1,213 @@
1
+ require "anoubis/engine"
2
+
3
+ ##
4
+ # Anoubis library
5
+ module Anoubis
6
+ module HasManualOrder
7
+ extend ActiveSupport::Concern
8
+
9
+ included do
10
+
11
+ end
12
+
13
+ module ClassMethods
14
+ def has_manual_order(params = {})
15
+ send :cattr_accessor, :manual_order_options
16
+ send :before_create, :manual_order_before_create_element
17
+ send :before_update, :manual_order_before_update_element
18
+ send :after_save, :manual_order_after_save_element
19
+ send :after_destroy, :manual_order_after_destroy
20
+
21
+ self.manual_order_options = params if params.is_a?(Hash)
22
+ include Anubis::HasManualOrder::LocalInstanceMethods
23
+ end
24
+ end
25
+
26
+ module LocalInstanceMethods
27
+ # Check presence of position
28
+ def manual_order_before_create_element
29
+ # puts 'manual_order_before_create_element'
30
+ position = self.manual_order_options[:field].to_sym # set order field for simplicity
31
+ if !self[position]
32
+ data = self.class.where(manual_order_get_where).maximum(position)
33
+ data = if data then data + 1 else 0 end
34
+ self[position] = data
35
+ else
36
+ self[position] = 0 if self[position].to_i < 0 # position must be 0 or greater
37
+ manual_order_check_order_position 0
38
+ end
39
+ end
40
+
41
+ def manual_order_before_update_element
42
+ # puts self.id.to_s+'> manual_order_before_update_element'
43
+ if manual_order_changed_orders
44
+ position = self.manual_order_options[:field].to_sym # set order field for simplicity
45
+ if !manual_order_changed_group
46
+ # puts self.id.to_s+'> Group was not changed'
47
+ was_position = eval('self.'+position.to_s+'_was')
48
+ # puts self.id.to_s+'> Position changed: '+was_position.to_s+' -> '+self[position].to_s
49
+ if self[position] > was_position
50
+ order_where = manual_order_get_where
51
+ order_where[position] = was_position.to_i
52
+ data = self.class.where(order_where).where.not(:id => self.id).first
53
+ if !data
54
+ # puts self.id.to_s+'> Update attributes'
55
+ self.update_columns position => self[position]
56
+ order_where[position] = [was_position.to_i..self[position].to_i]
57
+ self.class.where(order_where).where.not(:id => self.id).order(position).all.each do |element|
58
+ # puts self.id.to_s+'> Element id: '+element.id.to_s+' -> '+element[position].to_s
59
+ element[position] -= 1
60
+ begin
61
+ element.current_user = self.current_user
62
+ rescue
63
+ puts 'Cant set current_user'
64
+ end
65
+ element.save
66
+ end
67
+ end
68
+ end
69
+
70
+ end
71
+ if self[self.manual_order_options[:field].to_sym] != 0
72
+ manual_order_check_order_position self.id
73
+ end
74
+ end
75
+ end
76
+
77
+ # Check manual order position
78
+ def manual_order_check_order_position (id)
79
+ # puts self.id.to_s+'> manual_order_check_order_position'
80
+ position = self.manual_order_options[:field].to_sym # set order field for simplicity
81
+ if self[position].to_i > 0
82
+ order_where = manual_order_get_where
83
+ # Check if elements present for order conditions (before current element position)
84
+ order_where[position] = [0..self[position].to_i-1]
85
+ data = self.class.where(order_where).where.not(:id => id).maximum(position)
86
+ if !data
87
+ self[position] = 0 # if elements not found then position equal 0
88
+ else
89
+ self[position] = data+1 if self[position] != data+1 # if previous elements ends before position-1 then correct current position
90
+ end
91
+ end
92
+ end
93
+
94
+ # Recalculate position of elements after set current position
95
+ def manual_order_after_save_element
96
+ if manual_order_changed_orders
97
+ # puts self.id.to_s+'> manual_order_after_save_element'
98
+ position = self.manual_order_options[:field].to_sym # set order field for simplicity
99
+ order_where = manual_order_get_where
100
+ order_where[position] = self[position]
101
+ count = 0
102
+ self.class.where(order_where).where.not(:id => self.id).find_each do |element|
103
+ # puts self.id.to_s+'> Increment element position: '+element.id.to_s
104
+ element[position] = self[position]+1
105
+ begin
106
+ element.current_user = self.current_user
107
+ rescue
108
+ puts 'Cant set current_user'
109
+ end
110
+ element.save
111
+ count += 1
112
+ end
113
+ if manual_order_changed_group
114
+ order_where = manual_order_get_where_was
115
+ pos = eval('self.'+position.to_s+'_was').to_i
116
+ order_where[position] = [pos..Float::INFINITY]
117
+ self.class.where(order_where).order(position).all.each do |element|
118
+ element[position] = pos
119
+ begin
120
+ element.current_user = self.current_user
121
+ rescue
122
+ puts 'Cant set current_user'
123
+ end
124
+ element.save
125
+ pos += 1
126
+ end
127
+ end
128
+ #if count == 0
129
+ # order_where[position] = [self[position]+2..Float::INFINITY]
130
+ # data = self.class.where(order_where).where.not(:id => self.id).order(position).first
131
+ # if data
132
+ # data[position] = self[position]+1
133
+ # data.save
134
+ # end
135
+ # end
136
+ end
137
+ end
138
+
139
+ # Recalculate positions after destroy element
140
+ def manual_order_after_destroy
141
+ position = self.manual_order_options[:field].to_sym # set order field for simplicity
142
+ order_where = manual_order_get_where
143
+ pos = self[position]
144
+ order_where[position] = [pos..Float::INFINITY]
145
+ self.class.where(order_where).order(position).all.each do |element|
146
+ element[position] = pos
147
+ begin
148
+ element.current_user = self.current_user
149
+ rescue
150
+ puts 'Cant set current_user'
151
+ end
152
+ element.save
153
+ pos += 1
154
+ end
155
+ end
156
+
157
+ # Check if element's position was changed (or changed order group)
158
+ def manual_order_changed_orders
159
+ changed = eval('self.'+self.manual_order_options[:field].to_s+'_changed?')
160
+ if self.manual_order_options.key? :groups
161
+ self.manual_order_options[:groups].each do |key|
162
+ # puts 'self.'+key.to_s+'_changed?'
163
+ changed = eval('self.'+key.to_s+'_changed?') if !changed
164
+ end
165
+ end
166
+ # puts 'manual_order_changed_orders: '+changed.to_s
167
+ return changed
168
+ end
169
+
170
+ # Check if element's position changed in current order group
171
+ def manual_order_changed_group
172
+ changed = false
173
+ if self.manual_order_options.key? :groups
174
+ self.manual_order_options[:groups].each do |key|
175
+ # puts 'self.'+key.to_s+'_changed?'
176
+ changed = eval('self.'+key.to_s+'_changed?') if !changed
177
+ end
178
+ end
179
+ # puts 'manual_order_changed_group: '+changed.to_s
180
+ return changed
181
+ end
182
+
183
+ def manual_order_get_where
184
+ where = {}
185
+ if self.manual_order_options.key? :groups
186
+ self.manual_order_options[:groups].each do |key|
187
+ where[key.to_sym] = self[key.to_sym]
188
+ end
189
+ end
190
+ return where
191
+ end
192
+
193
+ def manual_order_get_where_was
194
+ where = {}
195
+ if self.manual_order_options.key? :groups
196
+ self.manual_order_options[:groups].each do |key|
197
+ str = 'self.class.'+key.to_s.pluralize
198
+ begin
199
+ # puts str+'[(self.'+key.to_s+'_was).to_sym]'
200
+ where[key.to_sym] = eval(str+'[(self.'+key.to_s+'_was).to_sym]')
201
+ rescue
202
+ # puts 'self.'+key.to_s+'_was'
203
+ where[key.to_sym] = eval('self.'+key.to_s+'_was')
204
+ end
205
+ end
206
+ end
207
+ return where
208
+ end
209
+ end
210
+ end
211
+ end
212
+
213
+ ActiveRecord::Base.send :include, Anoubis::HasManualOrder
@@ -0,0 +1,10 @@
1
+ namespace :anoubis do
2
+ desc "Prepare Anoubis test database"
3
+ task :prepare do
4
+ Rake::Task['app:db:migrate'].invoke
5
+ Rake::Task['app:db:test:prepare'].invoke
6
+ Rake::Task['app:db:seed'].invoke
7
+ end
8
+ end
9
+
10
+
@@ -0,0 +1,10 @@
1
+ namespace :anoubis do
2
+ namespace :sessions do
3
+ desc "Clear timeout sessions."
4
+
5
+ task clear: [:environment] do
6
+ service = Anoubis::SessionService.new
7
+ service.clear
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe Anoubis do
4
+
5
+ end
@@ -0,0 +1,77 @@
1
+ require 'rails_helper'
2
+
3
+ module Anubis
4
+ RSpec.describe IndexController, type: :controller do
5
+ render_views
6
+
7
+ context "when request sets accept => application/json" do
8
+ it "should login" do
9
+ request.accept = "application/json"
10
+ post :login, params: { use_route: 'api/1', login: 'admin@local.local.sys', password: 'admin', version: 1 }
11
+ user = JSON.parse(response.body, { symbolize_names: true })
12
+ expect(response.status).to eq 200
13
+ expect(user[:result]).to eq 0
14
+ expect(user.has_key? :message).to eq true
15
+ expect(user.has_key? :token).to eq true
16
+ expect(user.has_key? :name).to eq true
17
+ expect(user.has_key? :surname).to eq true
18
+ expect(user.has_key? :email).to eq true
19
+ end
20
+
21
+ it "has incorrect login" do
22
+ request.accept = "application/json"
23
+ post :login, params: { use_route: 'api/1', login: 'admin@local.local.sys', password: 'admin1', version: 1 }
24
+ user = JSON.parse(response.body, { symbolize_names: true })
25
+ expect(response.status).to eq 422
26
+ expect(user[:result]).to eq -2
27
+ expect(user.has_key? :token).to eq false
28
+ expect(user.has_key? :message).to eq true
29
+ end
30
+
31
+ it "has invalid login parameters" do
32
+ request.accept = "application/json"
33
+ post :login, params: { use_route: 'api/1', login: 'admin@local.local.sys', version: 1 }
34
+ user = JSON.parse(response.body, { symbolize_names: true })
35
+ expect(response.status).to eq 422
36
+ expect(user[:result]).to eq -1
37
+ expect(user.has_key? :token).to eq false
38
+ end
39
+
40
+ it "can get menu for logged in user" do
41
+ request.accept = "application/json"
42
+ post :login, params: { use_route: 'api/1', login: 'admin@local.local.sys', password: 'admin', version: 1 }
43
+ user = JSON.parse(response.body, { symbolize_names: true })
44
+ request.headers['Authorization'] = 'Bearer '+user[:token]
45
+ get :menu, params: { use_route: 'api/1', version: 1 }
46
+ menu = JSON.parse(response.body, { symbolize_names: true })
47
+ expect(response.status).to eq 200
48
+ expect(menu[:result]).to eq 0
49
+ expect(menu.has_key? :menu).to eq true
50
+ end
51
+
52
+ it "can't get menu for unauthorized user" do
53
+ request.accept = "application/json"
54
+ get :menu, params: { use_route: 'api/1', version: 1 }
55
+ JSON.parse(response.body, { symbolize_names: true })
56
+ expect(response.status).to eq 422
57
+ end
58
+
59
+ it "can logout" do
60
+ request.accept = "application/json"
61
+ post :login, params: { use_route: 'api/1', login: 'admin@local.local.sys', password: 'admin', version: 1 }
62
+ data = JSON.parse(response.body, { symbolize_names: true })
63
+ expect(response.status).to eq 200
64
+ expect(data[:result]).to eq 0
65
+ user = JSON.parse(response.body, { symbolize_names: true })
66
+ request.headers['Authorization'] = 'Bearer '+user[:token]
67
+ get :logout, params: { use_route: 'api/1', version: 1 }
68
+ data = JSON.parse(response.body, { symbolize_names: true })
69
+ expect(response.status).to eq 200
70
+ expect(data[:result]).to eq 0
71
+ get :menu, params: { use_route: 'api/1', version: 1 }
72
+ JSON.parse(response.body, { symbolize_names: true })
73
+ expect(response.status).to eq 422
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,3 @@
1
+ require_relative 'config/application'
2
+
3
+ Rails.application.load_tasks
@@ -0,0 +1,2 @@
1
+ //= link_directory ../javascripts .js
2
+ //= link_directory ../stylesheets .css
@@ -0,0 +1,15 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file. JavaScript code in this file should be added after the last require_* statement.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require rails-ujs
14
+ //= require activestorage
15
+ //= require_tree .
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,4 @@
1
+ module ApplicationCable
2
+ class Channel < ActionCable::Channel::Base
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module ApplicationCable
2
+ class Connection < ActionCable::Connection::Base
3
+ end
4
+ end
@@ -0,0 +1,2 @@
1
+ class ApplicationController < ActionController::API
2
+ end
@@ -0,0 +1,2 @@
1
+ class ApplicationJob < ActiveJob::Base
2
+ end
@@ -0,0 +1,4 @@
1
+ class ApplicationMailer < ActionMailer::Base
2
+ default from: 'from@example.com'
3
+ layout 'mailer'
4
+ end
@@ -0,0 +1,3 @@
1
+ class ApplicationRecord < ActiveRecord::Base
2
+ self.abstract_class = true
3
+ end
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <style>
6
+ /* Email styles need to be inline */
7
+ </style>
8
+ </head>
9
+
10
+ <body>
11
+ <%= yield %>
12
+ </body>
13
+ </html>
@@ -0,0 +1 @@
1
+ <%= yield %>
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
3
+ load Gem.bin_path('bundler', 'bundle')
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ APP_PATH = File.expand_path('../config/application', __dir__)
3
+ require_relative '../config/boot'
4
+ require 'rails/commands'
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../config/boot'
3
+ require 'rake'
4
+ Rake.application.run
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+ require 'fileutils'
3
+ include FileUtils
4
+
5
+ # path to your application root.
6
+ APP_ROOT = File.expand_path('..', __dir__)
7
+
8
+ def system!(*args)
9
+ system(*args) || abort("\n== Command #{args} failed ==")
10
+ end
11
+
12
+ chdir APP_ROOT do
13
+ # This script is a starting point to setup your application.
14
+ # Add necessary setup steps to this file.
15
+
16
+ puts '== Installing dependencies =='
17
+ system! 'gem install bundler --conservative'
18
+ system('bundle check') || system!('bundle install')
19
+
20
+ # puts "\n== Copying sample files =="
21
+ # unless File.exist?('config/database.yml')
22
+ # cp 'config/database.yml.sample', 'config/database.yml'
23
+ # end
24
+
25
+ puts "\n== Preparing database =="
26
+ system! 'bin/rails db:setup'
27
+
28
+ puts "\n== Removing old logs and tempfiles =="
29
+ system! 'bin/rails log:clear tmp:clear'
30
+
31
+ puts "\n== Restarting application server =="
32
+ system! 'bin/rails restart'
33
+ end
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+ require 'fileutils'
3
+ include FileUtils
4
+
5
+ # path to your application root.
6
+ APP_ROOT = File.expand_path('..', __dir__)
7
+
8
+ def system!(*args)
9
+ system(*args) || abort("\n== Command #{args} failed ==")
10
+ end
11
+
12
+ chdir APP_ROOT do
13
+ # This script is a way to update your development environment automatically.
14
+ # Add necessary update steps to this file.
15
+
16
+ puts '== Installing dependencies =='
17
+ system! 'gem install bundler --conservative'
18
+ system('bundle check') || system!('bundle install')
19
+
20
+ puts "\n== Updating database =="
21
+ system! 'bin/rails db:migrate'
22
+
23
+ puts "\n== Removing old logs and tempfiles =="
24
+ system! 'bin/rails log:clear tmp:clear'
25
+
26
+ puts "\n== Restarting application server =="
27
+ system! 'bin/rails restart'
28
+ end
@@ -0,0 +1,14 @@
1
+ require_relative 'boot'
2
+
3
+ require 'rails/all'
4
+
5
+ Bundler.require(*Rails.groups)
6
+ require "anoubis"
7
+
8
+ module Dummy
9
+ class Application < Rails::Application
10
+ config.load_defaults 5.2
11
+ config.api_only = true
12
+ end
13
+ end
14
+
@@ -0,0 +1,5 @@
1
+ # Set up gems listed in the Gemfile.
2
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../Gemfile', __dir__)
3
+
4
+ require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
5
+ $LOAD_PATH.unshift File.expand_path('../../../lib', __dir__)
@@ -0,0 +1,10 @@
1
+ development:
2
+ adapter: async
3
+
4
+ test:
5
+ adapter: async
6
+
7
+ production:
8
+ adapter: redis
9
+ url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
10
+ channel_prefix: dummy_production
@@ -0,0 +1,54 @@
1
+ # MySQL. Versions 5.1.10 and up are supported.
2
+ #
3
+ # Install the MySQL driver
4
+ # gem install mysql2
5
+ #
6
+ # Ensure the MySQL gem is defined in your Gemfile
7
+ # gem 'mysql2'
8
+ #
9
+ # And be sure to use new-style password hashing:
10
+ # https://dev.mysql.com/doc/refman/5.7/en/password-hashing.html
11
+ #
12
+ default: &default
13
+ adapter: mysql2
14
+ encoding: utf8
15
+ pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
16
+ username: ruby
17
+ password: ruby
18
+ socket: /var/run/mysqld/mysqld.sock
19
+
20
+ development:
21
+ <<: *default
22
+ database: anoubis_dummy_development
23
+
24
+ # Warning: The database defined as "test" will be erased and
25
+ # re-generated from your development database when you run "rake".
26
+ # Do not set this db to the same as development or production.
27
+ test:
28
+ <<: *default
29
+ database: anoubis_dummy_test
30
+
31
+ # As with config/secrets.yml, you never want to store sensitive information,
32
+ # like your database password, in your source code. If your source code is
33
+ # ever seen by anyone, they now have access to your database.
34
+ #
35
+ # Instead, provide the password as a unix environment variable when you boot
36
+ # the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database
37
+ # for a full rundown on how to provide these environment variables in a
38
+ # production deployment.
39
+ #
40
+ # On Heroku and other platform providers, you may have a full connection URL
41
+ # available as an environment variable. For example:
42
+ #
43
+ # DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase"
44
+ #
45
+ # You can use this database configuration with:
46
+ #
47
+ # production:
48
+ # url: <%= ENV['DATABASE_URL'] %>
49
+ #
50
+ production:
51
+ <<: *default
52
+ database: dummy_production
53
+ username: dummy
54
+ password: <%= ENV['DUMMY_DATABASE_PASSWORD'] %>
@@ -0,0 +1,5 @@
1
+ # Load the Rails application.
2
+ require_relative 'application'
3
+
4
+ # Initialize the Rails application.
5
+ Rails.application.initialize!
@@ -0,0 +1,54 @@
1
+ Rails.application.configure do
2
+ # Settings specified here will take precedence over those in config/application.rb.
3
+
4
+ # In the development environment your application's code is reloaded on
5
+ # every request. This slows down response time but is perfect for development
6
+ # since you don't have to restart the web server when you make code changes.
7
+ config.cache_classes = false
8
+
9
+ # Do not eager load code on boot.
10
+ config.eager_load = false
11
+
12
+ # Show full error reports.
13
+ config.consider_all_requests_local = true
14
+
15
+ # Enable/disable caching. By default caching is disabled.
16
+ # Run rails dev:cache to toggle caching.
17
+ if Rails.root.join('tmp', 'caching-dev.txt').exist?
18
+ config.action_controller.perform_caching = true
19
+
20
+ config.cache_store = :memory_store
21
+ config.public_file_server.headers = {
22
+ 'Cache-Control' => "public, max-age=#{2.days.to_i}"
23
+ }
24
+ else
25
+ config.action_controller.perform_caching = false
26
+
27
+ config.cache_store = :null_store
28
+ end
29
+
30
+ # Store uploaded files on the local file system (see config/storage.yml for options)
31
+ config.active_storage.service = :local
32
+
33
+ # Don't care if the mailer can't send.
34
+ config.action_mailer.raise_delivery_errors = false
35
+
36
+ config.action_mailer.perform_caching = false
37
+
38
+ # Print deprecation notices to the Rails logger.
39
+ config.active_support.deprecation = :log
40
+
41
+ # Raise an error on page load if there are pending migrations.
42
+ config.active_record.migration_error = :page_load
43
+
44
+ # Highlight code that triggered database queries in logs.
45
+ config.active_record.verbose_query_logs = true
46
+
47
+
48
+ # Raises error for missing translations
49
+ # config.action_view.raise_on_missing_translations = true
50
+
51
+ # Use an evented file watcher to asynchronously detect changes in source code,
52
+ # routes, locales, etc. This feature depends on the listen gem.
53
+ # config.file_watcher = ActiveSupport::EventedFileUpdateChecker
54
+ end