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
@@ -0,0 +1,28 @@
1
+ require_dependency "anubis/tenant/application_controller"
2
+ require_dependency "anubis/tenant/data/actions"
3
+ require_dependency "anubis/tenant/data/load"
4
+ require_dependency "anubis/tenant/data/get"
5
+ require_dependency "anubis/tenant/data/set"
6
+ require_dependency "anubis/tenant/data/setup"
7
+ require_dependency "anubis/tenant/data/defaults"
8
+ require_dependency "anubis/tenant/data/convert"
9
+ require_dependency "anubis/tenant/data/callbacks"
10
+
11
+ module Anubis
12
+ ##
13
+ # Module presents all core functions for Anubis Library
14
+ module Tenant
15
+ ##
16
+ # Controller consists all procedures and function for presents and modify models data.
17
+ class DataController < Anubis::Tenant::ApplicationController
18
+ include Anubis::Tenant::Data::Actions
19
+ include Anubis::Tenant::Data::Load
20
+ include Anubis::Tenant::Data::Get
21
+ include Anubis::Tenant::Data::Set
22
+ include Anubis::Tenant::Data::Setup
23
+ include Anubis::Tenant::Data::Defaults
24
+ include Anubis::Tenant::Data::Convert
25
+ include Anubis::Tenant::Data::Callbacks
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,191 @@
1
+ module Anubis
2
+ module Tenant
3
+ module Index
4
+ ##
5
+ # Module contains all basic actions for {IndexController}.
6
+ module Actions
7
+ include Anubis::Core::Index::Actions
8
+
9
+ ##
10
+ # <i>Login</i> action of index controller. Procedure checks user credential. If credentials are correct than user enters
11
+ # into the system and procedure returns session token. If credentials are incorrect then procedure returns error.
12
+ #
13
+ # <b>API request:</b>
14
+ # POST /api/<version>/login
15
+ # <b>Request body:</b>
16
+ # {
17
+ # "login": "login",
18
+ # "password": "password",
19
+ # "locale": "Country code"
20
+ # }
21
+ # <b>Parameters:</b>
22
+ # - <b>login</b> (String) -- the login of the user
23
+ # - <b>password</b> (String) -- the password of the user
24
+ # - <b>locale</b> (String) -- the output language locale <i>(optional value)</i>
25
+ #
26
+ # <b>Request example:</b>
27
+ # curl --header "Content-Type: application/json" --request POST --data '{"login":"<login>","password":"<password>"}' http://<server>:<port>/api/<api-version>/login
28
+ #
29
+ # <b>Results:</b><br>
30
+ #
31
+ # Resulting data is placed in self.output({Anubis::OutputLogin}) class and returns in JSON format.
32
+ #
33
+ # <b>Examples:</b>
34
+ #
35
+ # <b>Success:</b> HTTP response code 200
36
+ # {
37
+ # "result": 0,
38
+ # "message": "Successful",
39
+ # "name": "Name",
40
+ # "surname": "Surname",
41
+ # "token": "Session token",
42
+ # "email": "e-mail"
43
+ # }
44
+ #
45
+ # <b>Error:</b> HTTP response code 422
46
+ # {
47
+ # "result": -1,
48
+ # "message": "Incorrect user login or password"
49
+ # }
50
+ def login
51
+ self.output = Anubis::Output::Login.new
52
+ if params.has_key?(:login) && params.has_key?(:password)
53
+ user = Anubis::Tenant::User.where(login: params[:login].downcase, status: 0).first
54
+
55
+ if !user
56
+ tenant = Anubis::Tenant::Tenant.where(state: Anubis::Tenant::Tenant.states[:default]).first
57
+ user = Anubis::Tenant::User.where(login: (params[:login]+'.'+tenant.ident).downcase, status: 0).first
58
+ end
59
+
60
+ if !user
61
+ tenant = Anubis::Tenant::Tenant.find(1)
62
+ user = Anubis::Tenant::User.where(login: (params[:login]+'.'+tenant.ident).downcase, status: 0).first
63
+ end
64
+
65
+ if user && user.authenticate(params[:password])
66
+ if !user.auth_key
67
+ self.redis_save_user(user)
68
+ self.output.token = new_session_id
69
+ self.output.name = user.name
70
+ self.output.surname = user.surname
71
+ self.output.email = user.email
72
+ self.output.locale = user.locale
73
+ self.redis.set(self.redis_prefix + 'session:' + self.output.token, { uuid: user.uuid, login: Time.now, time: Time.now, ttl: Time.now + user.timeout}.to_json)
74
+ else
75
+ self.output.result = -2
76
+ end
77
+ else
78
+ self.output.result = -2
79
+ end
80
+ else
81
+ self.output.result = -1
82
+ end
83
+ respond_to do |format|
84
+ if self.output.result == 0
85
+ format.json { render json: self.output.to_h }
86
+ else
87
+ format.json { render json: self.output.to_h, status: :unprocessable_entity }
88
+ end
89
+ end
90
+ end
91
+
92
+ ##
93
+ # <i>Menu</i> action of index controller. Procedure outputs menu for current user in JSON format.
94
+ # Authorization bearer is required.
95
+ #
96
+ # <b>API request:</b>
97
+ # GET /api/<version>/menu
98
+ # <b>Request Header:</b>
99
+ # {
100
+ # "Authorization": "Bearer <Session token>"
101
+ # }
102
+ #
103
+ # <b>Parameters:</b>
104
+ # - <b>locale</b> (String) -- the output language locale <i>(optional value)</i>
105
+ #
106
+ # <b>Request example:</b>
107
+ # curl --header "Content-Type: application/json" -header 'Authorization: Bearer <session-token>' http://<server>:<port>/api/<api-version>/menu?locale=en
108
+ #
109
+ # <b>Results:</b><br>
110
+ #
111
+ # Resulting data is placed in self.output({Anubis::Output::Menu}) variable and returns in JSON format.
112
+ #
113
+ # <b>Examples:</b>
114
+ #
115
+ # <b>Success:</b> HTTP response code 200
116
+ # {
117
+ # "result": 0,
118
+ # "message": "Successful",
119
+ # "menu": {
120
+ # [{
121
+ # "mode": "admin/anubis",
122
+ # "title": "Administration",
123
+ # "page_title": "System administration",
124
+ # "short_title": "",
125
+ # "position": 0,
126
+ # "tab": 0,
127
+ # "action": "menu",
128
+ # "access": "read",
129
+ # "state": "visible",
130
+ # "parent": ""
131
+ # }]
132
+ # }
133
+ # }
134
+ #
135
+ # <b>Error:</b> HTTP response code 422
136
+ # {
137
+ # "result": -1,
138
+ # "message": "Session expired"
139
+ # }
140
+ def menu
141
+ self.output = Anubis::Output::Menu.new
142
+ access = Anubis::Tenant::GroupMenu.accesses[:read].to_s+','+Anubis::Tenant::GroupMenu.accesses[:write].to_s
143
+ locale = Anubis::Tenant::MenuLocale.locales[self.locale.to_s.to_sym]
144
+ query = <<-SQL
145
+ SELECT `t`.* FROM
146
+ (
147
+ SELECT `t2`.`id`, `t2`.`mode`, `t2`.`action`, `t2`.`title`, `t2`.`page_title`, `t2`.`short_title`,
148
+ `t2`.`position`, `t2`.`tab`, `t2`.`menu_id`, `t2`.`state`, MAX(`t2`.`access`) AS `access`,
149
+ `t2`.`user_id`, `t2`.`parent_mode`
150
+ FROM (
151
+ SELECT `menus`.`id`, `menus`.`mode`, `menus`.`action`, `menu_locales`.`title`, `menu_locales`.`page_title`,
152
+ `menu_locales`.`short_title`, `menus`.`position`, `menus`.`tab`, `menus`.`menu_id`, `menus`.`state`,
153
+ `group_menus`.`access`, `user_groups`.`user_id`, `parent_menu`.`mode` AS `parent_mode`
154
+ FROM (`menus`, `group_menus`, `groups`, `user_groups`)
155
+ LEFT JOIN `menu_locales` ON `menu_locales`.`menu_id` = `menus`.`id` AND `menu_locales`.`locale` = #{locale}
156
+ LEFT JOIN `menus` AS `parent_menu` ON `menus`.`menu_id` = `parent_menu`.`id`
157
+ WHERE `menus`.`id` = `group_menus`.`menu_id` AND `menus`.`status` = 0 AND `group_menus`.`group_id` = `groups`.`id` AND
158
+ `groups`.`id` = `user_groups`.`group_id` AND `user_groups`.`user_id` = #{self.current_user.id}
159
+ ) AS `t2`
160
+ GROUP BY `t2`.`id`, `t2`.`mode`, `t2`.`action`, `t2`.`title`, `t2`.`page_title`, `t2`.`short_title`,
161
+ `t2`.`position`, `t2`.`tab`, `t2`.`menu_id`, `t2`.`state`, `t2`.`user_id`, `t2`.`parent_mode`) AS `t`
162
+ WHERE `t`.access IN (#{access}
163
+ )
164
+ ORDER BY `t`.`menu_id`, `t`.`position`
165
+ SQL
166
+ Anubis::Tenant::GroupMenu.find_by_sql(query).each do |data|
167
+ self.output.addElement({
168
+ mode: data.mode,
169
+ title: data.title,
170
+ page_title: data.page_title,
171
+ short_title: data.short_title,
172
+ position: data.position,
173
+ tab: data.tab,
174
+ action: data.action,
175
+ access: data.access,
176
+ state: Anubis::Tenant::Menu.states.invert[data.state],
177
+ parent: data.parent_mode
178
+ })
179
+ #self.output[:data].push menu_id[data.id.to_s.to_sym]
180
+ end
181
+
182
+ self.before_menu_output
183
+
184
+ respond_to do |format|
185
+ format.json { render json: around_menu_output(self.output.to_h) }
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end
191
+ end
@@ -0,0 +1,11 @@
1
+ module Anubis
2
+ module Tenant
3
+ module Index
4
+ ##
5
+ # Module contains all callbacks {IndexController}.
6
+ module Callbacks
7
+ include Anubis::Core::Index::Callbacks
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,38 @@
1
+ require_dependency "anubis/tenant/application_controller"
2
+ require_dependency "anubis/tenant/index/actions"
3
+ require_dependency "anubis/tenant/index/callbacks"
4
+
5
+ module Anubis
6
+ ##
7
+ # Module presents all tenant functions for Anubis Library
8
+ module Tenant
9
+ ##
10
+ # Controller processes main system functions. Authenticates user, checks user access, outputs main menu and etc.
11
+ class IndexController < Anubis::Tenant::ApplicationController
12
+ include Anubis::Tenant::Index::Actions
13
+ include Anubis::Tenant::Index::Callbacks
14
+
15
+ ##
16
+ # Check if authentication required
17
+ def authenticate?
18
+ if controller_name == 'index'
19
+ if action_name == 'login'
20
+ return false
21
+ end
22
+ end
23
+ return true
24
+ end
25
+
26
+ ##
27
+ # Check if authentication required
28
+ def check_menu_access?
29
+ if controller_name == 'index'
30
+ if action_name == 'login' || action_name == 'menu' || action_name == 'logout'
31
+ return false
32
+ end
33
+ end
34
+ return true
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,7 @@
1
+ module Anubis
2
+ ##
3
+ # Controller that shows and proccesses {Tenant} data
4
+ class TenantsController < DataController
5
+
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require_dependency "anoubis/application_controller"
2
+
3
+ module Anubis
4
+ class UsersController < DataController
5
+
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ module Anoubis
2
+ ##
3
+ # Default jobs of Anoubis library
4
+ class ApplicationJob < ActiveJob::Base
5
+ end
6
+ end
@@ -0,0 +1,8 @@
1
+ module Anoubis
2
+ ##
3
+ # Default mailer for Anoubis library
4
+ class ApplicationMailer < ActionMailer::Base
5
+ default from: 'from@example.com'
6
+ layout 'mailer'
7
+ end
8
+ end
@@ -0,0 +1,45 @@
1
+ ## Main application model record class inherited from {https://api.rubyonrails.org/classes/ActiveRecord/Base.html ActiveRecord::Base}
2
+ class Anoubis::ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+
5
+ ## Redis database variable
6
+ attr_accessor :redis
7
+
8
+ ##
9
+ # Returns {https://github.com/redis/redis-rb Redis database} class
10
+ # @return [Class] {https://github.com/redis/redis-rb Redis} class reference
11
+ def redis
12
+ @redis ||= Redis.new
13
+ end
14
+
15
+ ##
16
+ # Returns {https://github.com/redis/redis-rb Redis database} class
17
+ # @return [Class] {https://github.com/redis/redis-rb Redis} class reference
18
+ def self.redis
19
+ Redis.new
20
+ end
21
+
22
+ ##
23
+ # Returns {https://github.com/redis/redis-rb Redis} prefix for storing cache data. Prefix can be set in Rails.configuration.anoubis_redis_prefix configuration parameter.
24
+ # @return [String] {https://github.com/redis/redis-rb Redis} prefix
25
+ def redis_prefix
26
+ begin
27
+ value = Rails.configuration.redis_prefix
28
+ rescue
29
+ return ''
30
+ end
31
+ return value + ':'
32
+ end
33
+
34
+ ##
35
+ # Returns {https://github.com/redis/redis-rb Redis} prefix for storing cache data. Prefix can be set in Rails.configuration.anoubis_redis_prefix configuration parameter.
36
+ # @return [String] {https://github.com/redis/redis-rb Redis} prefix
37
+ def self.redis_prefix
38
+ begin
39
+ value = Rails.configuration.redis_prefix
40
+ rescue
41
+ return ''
42
+ end
43
+ return value + ':'
44
+ end
45
+ end
@@ -0,0 +1,250 @@
1
+ ##
2
+ # Default ApplicationRecord for Anubis::Core library.
3
+ class Anubis::Core::ApplicationRecord < ActiveRecord::Base
4
+ self.abstract_class = true
5
+
6
+ # @!attribute created_at
7
+ # @return [DateTime] the date and time when item had been created
8
+
9
+ # @!attribute updated_at
10
+ # @return [DateTime] the date and time when item had been updated
11
+
12
+ # @!attribute redis
13
+ # @return [Object] pointer to Redis database
14
+ class_attribute :redis
15
+
16
+ # @!attribute [rw] current_user
17
+ # @return [String] definition of current user for this record
18
+ attr_accessor :current_user
19
+
20
+ # @!attribute [rw] need_refresh
21
+ # @return [Boolean] defines when table representation data should be updated even after simple update
22
+ class_attribute :need_refresh, default: false
23
+
24
+ # @!attribute [r] sys_title
25
+ attr_reader :sys_title
26
+
27
+ # @!attribute [r] can_new
28
+ attr_reader :can_new
29
+
30
+ # @!attribute [r] can_edit
31
+ attr_reader :can_edit
32
+
33
+ # @!attribute [r] can_delete
34
+ attr_reader :can_delete
35
+
36
+ after_initialize :after_initialize_core_anubis_model
37
+ before_validation :before_validation_core_anubis_model
38
+
39
+ public
40
+
41
+ ##
42
+ # Is called after initialization Anubis::Core ActiveRecord. Sets default parameters.
43
+ def after_initialize_core_anubis_model
44
+ self.need_refresh = false
45
+ self.redis = Redis.new
46
+ self.current_user = nil
47
+ end
48
+
49
+ ##
50
+ # Return defined locale according by I18n
51
+ def current_locale
52
+ I18n.locale.to_s
53
+ end
54
+
55
+ ##
56
+ # Checks if this record may be destroyed.
57
+ def can_destroy?
58
+ result = true
59
+ self.class.reflect_on_all_associations.all? do |assoc|
60
+ result = self.send(assoc.name).nil? if assoc.macro == :has_one
61
+ result = self.send(assoc.name).empty? if (assoc.macro == :has_many) && result
62
+ end
63
+ result
64
+ end
65
+
66
+ ##
67
+ # Returns the default ActiveRecord 'where' for defined model.
68
+ # @param object [ApplicationController] pointer to used Application controller
69
+ # @param pid [Integer] parent model id if present (default: 0). Variable doesn't necessary
70
+ # @return [Hash] ActiveRecord 'where' definition
71
+ def self.get_where(object, pid = 0)
72
+ { }
73
+ end
74
+
75
+ ##
76
+ # Returns model's system title. Default value is the row ID. For another result procedure should be overridden.
77
+ # @return [String] model's system title
78
+ def sys_title
79
+ self.id
80
+ end
81
+
82
+ ##
83
+ # Returns the ability to create new data. By default all items may be deleted. For another result
84
+ # procedure should be overridden.
85
+ # @return [Boolean] true if new data may be created.
86
+ def can_new(args = {})
87
+ true
88
+ end
89
+
90
+ ##
91
+ # Returns the ability to edit the data. By default all items may be edited. For another result
92
+ # procedure should be overridden.
93
+ # @return [Boolean] true if data may be edited
94
+ def can_edit(args = {})
95
+ true
96
+ end
97
+
98
+ ##
99
+ # Returns the ability to delete a data. By default all items may be deleted. For another result
100
+ # procedure should be overridden.
101
+ # @return [Boolean] true if data may be deleted
102
+ def can_delete(args = {})
103
+ true
104
+ end
105
+
106
+ ##
107
+ # Sets current locale and nullifies locale variable that presents model translation data.
108
+ # @param value [String] new locale value ('ru', 'en', etc)
109
+ def current_locale=(value)
110
+ @current_locale = value
111
+ @model_locale = nil
112
+ end
113
+
114
+ private
115
+
116
+ ##
117
+ # Is called before validation model's data. Sets user id of user that modify model's data
118
+ # (if updated_user_id field presents in database)
119
+ def before_validation_core_anubis_model
120
+ begin
121
+ self.updated_user_id = self.current_user.id if self.current_user
122
+ rescue
123
+
124
+ end
125
+ end
126
+
127
+ protected
128
+
129
+ ##
130
+ # Returns text that was converted for russian quotes.
131
+ # @param str [String] - source text
132
+ # @return [String] converted text
133
+ def convert_russian_quotes(str)
134
+ return str.gsub(/^"/, "«").gsub(/ "/, " «").gsub(/«"/, "««").gsub(/" /, "» ").gsub(/"$/, "»").gsub(/"»/, "»»")
135
+ end
136
+
137
+ ##
138
+ # @!group Block of UUID functions
139
+
140
+ ##
141
+ # Decodes binary UUID data into the UUID string
142
+ # @param data [Binary] binary representation of UUID
143
+ # @return [String, nil] string representation of UUID or nil if can't be decoded
144
+ def bin_to_uuid(data)
145
+ begin
146
+ data = data.unpack('H*')[0]
147
+ return data[0..7]+'-'+data[8..11]+'-'+data[12..15]+'-'+data[16..19]+'-'+data[20..31]
148
+ rescue
149
+ return nil
150
+ end
151
+ end
152
+
153
+ ##
154
+ # Encodes string UUID data into the binary UUID
155
+ # @param data [Binary] string representation of UUID
156
+ # @return [Binary, nil] binary representation of UUID or nil if can't be encoded
157
+ def uuid_to_bin(data)
158
+ begin
159
+ return [data.delete('-')].pack('H*')
160
+ rescue
161
+ return nil
162
+ end
163
+ end
164
+
165
+ public
166
+
167
+ ##
168
+ # Generates new UUID data
169
+ # @return [String] string representation of UUID
170
+ def new_uuid
171
+ SecureRandom.uuid
172
+ end
173
+
174
+ # @!endgroup
175
+
176
+ ##
177
+ # @!group Block of Redis functions
178
+
179
+ ##
180
+ # Returns defined application prefix for redis cache for current record. Default value ''
181
+ def redis_prefix
182
+ begin
183
+ value = Rails.configuration.redis_prefix
184
+ rescue
185
+ return ''
186
+ end
187
+ return value + ':'
188
+ end
189
+
190
+ ##
191
+ # Returns defined application prefix for redis cache for model. Default value ''
192
+ def self.redis_prefix
193
+ begin
194
+ value = Rails.configuration.redis_prefix
195
+ rescue
196
+ return ''
197
+ end
198
+ return value + ':'
199
+ end
200
+
201
+ ##
202
+ # Returns reference to Redis database
203
+ def self.redis
204
+ Redis.new
205
+ end
206
+
207
+ # @!endgroup
208
+
209
+ def get_locale
210
+ if self.current_locale && self.current_locale != ''
211
+ return self.current_locale
212
+ end
213
+
214
+ self.default_locale
215
+ end
216
+
217
+ def default_locale
218
+ Rails.configuration.i18n.default_locale.to_s
219
+ end
220
+
221
+ def get_locale_field(field, used_locale = nil)
222
+ field = field.to_s.to_sym
223
+ used_locale = self.current_locale.to_s unless used_locale
224
+
225
+ return '' unless self[field]
226
+ return self[field][used_locale] if self[field].key? used_locale
227
+ return '' unless self[field].key? self.default_locale.to_s
228
+
229
+ self[field][self.default_locale.to_s]
230
+ end
231
+
232
+ def set_locale_field(field, value, used_locale = nil)
233
+ field = field.to_s.to_sym
234
+ used_locale = self.current_locale.to_s unless used_locale
235
+
236
+ self[field] = {} unless self[field]
237
+ self[field][self.default_locale.to_s] = value unless self[field].key? self.default_locale.to_s
238
+ self[field][used_locale] = value
239
+ end
240
+
241
+ def is_field_localized(field, used_locale = nil)
242
+ field = field.to_s.to_sym
243
+ used_locale = self.current_locale.to_s unless used_locale
244
+
245
+ return false unless self[field]
246
+ return true if self[field].key? used_locale
247
+
248
+ false
249
+ end
250
+ end
@@ -0,0 +1,27 @@
1
+ ##
2
+ # Defines all available locales.
3
+ module Anoubis::Core::Locales
4
+ # List of all possible locales.
5
+ LIST = {
6
+ ru: { id: 1, name: 'Russian' },
7
+ en: { id: 2, name: 'English' },
8
+ kz: { id: 3, name: 'Kazakh' }
9
+ }.freeze
10
+
11
+ class << self
12
+ ##
13
+ # Returns the title of chosen locale
14
+ # @param key [String] identificator of locale ('ru', 'en', etc.)
15
+ # @return [String] english title of locale
16
+ def name(key)
17
+ LIST[key.to_sym][:name]
18
+ end
19
+
20
+ ##
21
+ # Converts list of locales into enum attribute
22
+ # @return [Symbol] return symbols array for all locales.
23
+ def enums
24
+ LIST.reduce({}) { |res, v| res.merge("#{v.first}": v.last[:id]) }
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ class Anoubis::Sso::Client::ApplicationRecord < Anoubis::Core::ApplicationRecord
2
+ self.abstract_class = true
3
+ end
@@ -0,0 +1,19 @@
1
+ class Anoubis::Sso::Client::Group < Anoubis::Sso::Client::ApplicationRecord
2
+ self.table_name = 'groups'
3
+
4
+ VALID_IDENT_REGEX = /\A[a-z]*\z/i
5
+
6
+ # @!attribute ident
7
+ # @return [String] the group's identifier. Identifier consists of lowercase alphabetical symbols.
8
+ validates :ident, length: { minimum: 3, maximum: 50 }, uniqueness: { case_sensitive: false }, format: { with: VALID_IDENT_REGEX }
9
+
10
+ validates :title, presence: true, length: { maximum: 100 }
11
+
12
+ def title
13
+ get_locale_field 'title_locale'
14
+ end
15
+
16
+ def title=(value)
17
+ self.set_locale_field 'title_locale', value
18
+ end
19
+ end