lesli_vault 0.1.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.
- checksums.yaml +7 -0
- data/Rakefile +38 -0
- data/app/assets/config/lesli_vault_manifest.js +38 -0
- data/app/assets/images/lesli_vault/vault-logo.svg +160 -0
- data/app/assets/javascripts/lesli_vault/application.js +2848 -0
- data/app/assets/stylesheets/lesli_vault/application.scss +15 -0
- data/app/assets/stylesheets/lesli_vault/dashboards.scss +32 -0
- data/app/assets/stylesheets/lesli_vault/descriptors.scss +32 -0
- data/app/assets/stylesheets/lesli_vault/roles.scss +32 -0
- data/app/assets/stylesheets/lesli_vault/system_controller.scss +32 -0
- data/app/controllers/lesli_vault/application_controller.rb +37 -0
- data/app/controllers/lesli_vault/dashboards_controller.rb +6 -0
- data/app/controllers/lesli_vault/descriptor/activities_controller.rb +122 -0
- data/app/controllers/lesli_vault/descriptor/privileges_controller.rb +104 -0
- data/app/controllers/lesli_vault/descriptors_controller.rb +130 -0
- data/app/controllers/lesli_vault/role/activities_controller.rb +76 -0
- data/app/controllers/lesli_vault/role/descriptors_controller.rb +95 -0
- data/app/controllers/lesli_vault/role/privileges_controller.rb +48 -0
- data/app/controllers/lesli_vault/roles_controller.rb +226 -0
- data/app/controllers/lesli_vault/system_controller/actions_controller.rb +112 -0
- data/app/controllers/lesli_vault/system_controllers_controller.rb +64 -0
- data/app/helpers/lesli_vault/application_helper.rb +4 -0
- data/app/helpers/lesli_vault/dashboards_helper.rb +4 -0
- data/app/helpers/lesli_vault/descriptor/activities_helper.rb +4 -0
- data/app/helpers/lesli_vault/descriptor/privileges_helper.rb +4 -0
- data/app/helpers/lesli_vault/descriptors_helper.rb +4 -0
- data/app/helpers/lesli_vault/role/activities_helper.rb +4 -0
- data/app/helpers/lesli_vault/role/descriptors_helper.rb +4 -0
- data/app/helpers/lesli_vault/role/privileges_helper.rb +4 -0
- data/app/helpers/lesli_vault/roles_helper.rb +4 -0
- data/app/helpers/lesli_vault/system_controller/actions_helper.rb +4 -0
- data/app/helpers/lesli_vault/system_controllers_helper.rb +4 -0
- data/app/jobs/lesli_vault/application_job.rb +37 -0
- data/app/mailers/lesli_vault/application_mailer.rb +39 -0
- data/app/models/lesli_vault/application_record.rb +39 -0
- data/app/models/lesli_vault/descriptor/activity.rb +40 -0
- data/app/models/lesli_vault/descriptor/privilege.rb +40 -0
- data/app/models/lesli_vault/descriptor.rb +41 -0
- data/app/models/lesli_vault/role/activity.rb +40 -0
- data/app/models/lesli_vault/role/descriptor.rb +40 -0
- data/app/models/lesli_vault/role/privilege.rb +40 -0
- data/app/models/lesli_vault/role.rb +39 -0
- data/app/models/lesli_vault/system_controller/action.rb +39 -0
- data/app/models/lesli_vault/system_controller.rb +40 -0
- data/app/services/application_lesli_services.rb +168 -0
- data/app/services/descriptor_services.rb +197 -0
- data/app/services/role_services.rb +218 -0
- data/app/services/system_controller_services.rb +99 -0
- data/app/views/layouts/lesli_vault/application.html.erb +15 -0
- data/app/views/lesli_vault/dashboards/show.html.erb +1 -0
- data/app/views/lesli_vault/descriptor/activities/_form.html.erb +32 -0
- data/app/views/lesli_vault/descriptor/activities/edit.html.erb +34 -0
- data/app/views/lesli_vault/descriptor/activities/index.html.erb +34 -0
- data/app/views/lesli_vault/descriptor/activities/new.html.erb +34 -0
- data/app/views/lesli_vault/descriptor/activities/show.html.erb +34 -0
- data/app/views/lesli_vault/descriptor/privileges/_form.html.erb +32 -0
- data/app/views/lesli_vault/descriptor/privileges/edit.html.erb +34 -0
- data/app/views/lesli_vault/descriptor/privileges/index.html.erb +34 -0
- data/app/views/lesli_vault/descriptor/privileges/new.html.erb +34 -0
- data/app/views/lesli_vault/descriptor/privileges/show.html.erb +34 -0
- data/app/views/lesli_vault/descriptors/_form.html.erb +32 -0
- data/app/views/lesli_vault/descriptors/edit.html.erb +34 -0
- data/app/views/lesli_vault/descriptors/index.html.erb +34 -0
- data/app/views/lesli_vault/descriptors/new.html.erb +34 -0
- data/app/views/lesli_vault/descriptors/show.html.erb +34 -0
- data/app/views/lesli_vault/role/activities/_form.html.erb +32 -0
- data/app/views/lesli_vault/role/activities/edit.html.erb +34 -0
- data/app/views/lesli_vault/role/activities/index.html.erb +34 -0
- data/app/views/lesli_vault/role/activities/new.html.erb +34 -0
- data/app/views/lesli_vault/role/activities/show.html.erb +34 -0
- data/app/views/lesli_vault/role/descriptors/_form.html.erb +32 -0
- data/app/views/lesli_vault/role/descriptors/edit.html.erb +34 -0
- data/app/views/lesli_vault/role/descriptors/index.html.erb +34 -0
- data/app/views/lesli_vault/role/descriptors/new.html.erb +34 -0
- data/app/views/lesli_vault/role/descriptors/show.html.erb +34 -0
- data/app/views/lesli_vault/role/privileges/_form.html.erb +32 -0
- data/app/views/lesli_vault/role/privileges/edit.html.erb +34 -0
- data/app/views/lesli_vault/role/privileges/index.html.erb +34 -0
- data/app/views/lesli_vault/role/privileges/new.html.erb +34 -0
- data/app/views/lesli_vault/role/privileges/show.html.erb +34 -0
- data/app/views/lesli_vault/roles/edit.html.erb +34 -0
- data/app/views/lesli_vault/roles/index.html.erb +34 -0
- data/app/views/lesli_vault/roles/new.html.erb +34 -0
- data/app/views/lesli_vault/roles/show.html.erb +34 -0
- data/app/views/lesli_vault/system_controller/actions/_form.html.erb +32 -0
- data/app/views/lesli_vault/system_controller/actions/edit.html.erb +34 -0
- data/app/views/lesli_vault/system_controller/actions/index.html.erb +34 -0
- data/app/views/lesli_vault/system_controller/actions/new.html.erb +34 -0
- data/app/views/lesli_vault/system_controller/actions/show.html.erb +34 -0
- data/app/views/lesli_vault/system_controllers/_form.html.erb +32 -0
- data/app/views/lesli_vault/system_controllers/edit.html.erb +34 -0
- data/app/views/lesli_vault/system_controllers/index.html.erb +34 -0
- data/app/views/lesli_vault/system_controllers/new.html.erb +34 -0
- data/app/views/lesli_vault/system_controllers/show.html.erb +34 -0
- data/app/vue/lesli_vault/application.js +38 -0
- data/app/vue/lesli_vault/apps/descriptors/components/form.vue +147 -0
- data/app/vue/lesli_vault/apps/descriptors/edit.vue +83 -0
- data/app/vue/lesli_vault/apps/descriptors/index.vue +116 -0
- data/app/vue/lesli_vault/apps/descriptors/new.vue +76 -0
- data/app/vue/lesli_vault/apps/descriptors/privileges.vue +179 -0
- data/app/vue/lesli_vault/apps/descriptors/show.vue +240 -0
- data/app/vue/lesli_vault/apps/roles/componentForm.vue +231 -0
- data/app/vue/lesli_vault/apps/roles/componentPrivilegeCustom.vue +86 -0
- data/app/vue/lesli_vault/apps/roles/componentPrivilegeStandard.vue +173 -0
- data/app/vue/lesli_vault/apps/roles/edit.vue +93 -0
- data/app/vue/lesli_vault/apps/roles/index.vue +169 -0
- data/app/vue/lesli_vault/apps/roles/logs.vue +110 -0
- data/app/vue/lesli_vault/apps/roles/new.vue +89 -0
- data/app/vue/lesli_vault/apps/roles/show.vue +111 -0
- data/app/vue/lesli_vault/apps/security/index.vue +208 -0
- data/app/vue/lesli_vault/stores/descriptor.js +116 -0
- data/app/vue/lesli_vault/stores/descriptors.js +167 -0
- data/app/vue/lesli_vault/stores/role.js +243 -0
- data/app/vue/lesli_vault/stores/roles.js +89 -0
- data/app/vue/lesli_vault/stores/systemController.js +67 -0
- data/config/routes.rb +52 -0
- data/lib/lesli_vault/engine.rb +18 -0
- data/lib/lesli_vault/version.rb +3 -0
- data/lib/lesli_vault.rb +6 -0
- data/lib/tasks/lesli_vault_tasks.rake +4 -0
- data/lib/tasks/system/controllers.rake +112 -0
- data/lib/vue/application.js +7 -0
- data/readme.md +19 -0
- metadata +181 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
|
|
3
|
+
Lesli
|
|
4
|
+
|
|
5
|
+
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
6
|
+
|
|
7
|
+
This program is free software: you can redistribute it and/or modify
|
|
8
|
+
it under the terms of the GNU General Public License as published by
|
|
9
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
10
|
+
(at your option) any later version.
|
|
11
|
+
|
|
12
|
+
This program is distributed in the hope that it will be useful,
|
|
13
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
GNU General Public License for more details.
|
|
16
|
+
|
|
17
|
+
You should have received a copy of the GNU General Public License
|
|
18
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
19
|
+
|
|
20
|
+
Lesli · Ruby on Rails SaaS development platform.
|
|
21
|
+
|
|
22
|
+
Made with ♥ by https://www.lesli.tech
|
|
23
|
+
Building a better future, one line of code at a time.
|
|
24
|
+
|
|
25
|
+
@contact hello@lesli.tech
|
|
26
|
+
@website https://www.lesli.tech
|
|
27
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
28
|
+
|
|
29
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
|
+
// ·
|
|
31
|
+
|
|
32
|
+
=end
|
|
33
|
+
|
|
34
|
+
module LesliVault
|
|
35
|
+
class DescriptorServices < LesliVault::ApplicationLesliServices
|
|
36
|
+
|
|
37
|
+
# @overwrite
|
|
38
|
+
# @return {Object}
|
|
39
|
+
# @description Finds a descriptor according the ID given
|
|
40
|
+
def find id
|
|
41
|
+
self.resource = self.current_user.account.descriptors.find_by_id(id)
|
|
42
|
+
self
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# @overwrite
|
|
46
|
+
# @return [Array] Paginated index of users.
|
|
47
|
+
# @description Return a paginated array of users, used mostly in frontend views
|
|
48
|
+
def index
|
|
49
|
+
descriptors = current_user.account.descriptors.where.not(
|
|
50
|
+
:name => ["owner"]
|
|
51
|
+
).select(
|
|
52
|
+
:id,
|
|
53
|
+
:name,
|
|
54
|
+
:category,
|
|
55
|
+
"coalesce(actions.total, 0) as privileges_count",
|
|
56
|
+
Date2.new.date_time.db_timestamps("descriptors")
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
# Count the amount of privileges assigned to every descriptor
|
|
60
|
+
descriptors = descriptors.joins(%(
|
|
61
|
+
left join (
|
|
62
|
+
select
|
|
63
|
+
count(1) as total,
|
|
64
|
+
descriptor_id
|
|
65
|
+
from descriptor_privileges
|
|
66
|
+
--where apga.status = TRUE
|
|
67
|
+
group by descriptor_id
|
|
68
|
+
) as actions
|
|
69
|
+
on actions.descriptor_id = descriptors.id
|
|
70
|
+
))
|
|
71
|
+
|
|
72
|
+
# skip native descriptors
|
|
73
|
+
#descriptors = descriptors.where.not("descriptors.name in (?)", ["owner", "sysadmin", "profile"])
|
|
74
|
+
|
|
75
|
+
# Filter results by search string
|
|
76
|
+
# unless search_string.blank?
|
|
77
|
+
# descriptors = descriptors.where("(LOWER(descriptors.name) SIMILAR TO ?)", search_string)
|
|
78
|
+
# end
|
|
79
|
+
|
|
80
|
+
descriptors.page(
|
|
81
|
+
query[:pagination][:page]
|
|
82
|
+
).per(query[:pagination][:perPage]
|
|
83
|
+
).order("#{query[:order][:by]} #{query[:order][:dir]} NULLS LAST")
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# @overwrite
|
|
87
|
+
# @return {Hash}
|
|
88
|
+
# @description Retrives the descriptor with specific keys/attributes
|
|
89
|
+
def show
|
|
90
|
+
{
|
|
91
|
+
:id => resource.id,
|
|
92
|
+
:name => resource.name,
|
|
93
|
+
:category => resource.category,
|
|
94
|
+
:privileges => resource.privileges.joins(system_controller_action: :system_controller).select(
|
|
95
|
+
"descriptor_privileges.id",
|
|
96
|
+
"system_controllers.name as controlle_name",
|
|
97
|
+
"system_controller_actions.name as action_name",
|
|
98
|
+
"descriptor_privileges.created_at"
|
|
99
|
+
)
|
|
100
|
+
}
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# @overwrite
|
|
104
|
+
# @return {Object}
|
|
105
|
+
# @param {params} Hash of the permitted attributes for a descriptor
|
|
106
|
+
# @description Creates a new descriptor
|
|
107
|
+
def create params
|
|
108
|
+
descriptor = current_user.account.descriptors.new(params)
|
|
109
|
+
|
|
110
|
+
if descriptor.save
|
|
111
|
+
self.resource = descriptor
|
|
112
|
+
# TODO: keep track of the activities
|
|
113
|
+
else
|
|
114
|
+
self.error(descriptor.errors.full_messages.to_sentence)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
self
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# @overwrite
|
|
121
|
+
# @return {Object}
|
|
122
|
+
# @param {params} Hash of the permitted attributes for a descriptor
|
|
123
|
+
# @description Updates descriptor's attributes and saves logs if it went without problem
|
|
124
|
+
def update params
|
|
125
|
+
|
|
126
|
+
# TODO: keep track of the activities
|
|
127
|
+
|
|
128
|
+
unless self.resource.update(params)
|
|
129
|
+
self.error(self.resource.errors.full_messages.to_sentence)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
self
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# @overwrite
|
|
136
|
+
# @return {Object}
|
|
137
|
+
# @description Deletes the descriptor
|
|
138
|
+
def destroy
|
|
139
|
+
|
|
140
|
+
# TODO: keep track of the activities
|
|
141
|
+
|
|
142
|
+
unless self.resource.destroy
|
|
143
|
+
self.error(self.resource.errors.full_messages.to_sentence)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
self
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# @return [void]
|
|
150
|
+
# @param role_descriptor [RoleDescriptor] The role_descriptor on wich we want to add the system actions
|
|
151
|
+
# @description Return the list of privilege actions defined for
|
|
152
|
+
# profile descriptor
|
|
153
|
+
# Example
|
|
154
|
+
# RoleDescriptor::DefaultPrivilegeActionsService.add_profile_actions(RoleDescriptor.last)
|
|
155
|
+
def self.add_profile_privileges(descriptor)
|
|
156
|
+
|
|
157
|
+
# Adding default system actions for profile descriptor
|
|
158
|
+
[
|
|
159
|
+
{ controller: "Profiles", actions: ["show"] }, # enable profile view
|
|
160
|
+
#{ controller: "profile/subscriptions", actions: ["options", "index"] }, # enable profile subscriptions
|
|
161
|
+
#{ controller: "user/sessions", actions: ["index"] }, # seession management
|
|
162
|
+
{ controller: "Users", actions: ["options", "update"] } # enable user edition
|
|
163
|
+
].each do |controller_action|
|
|
164
|
+
|
|
165
|
+
controller_action[:actions].each do |action_name|
|
|
166
|
+
|
|
167
|
+
system_controller_action = SystemController::Action.joins(:system_controller)
|
|
168
|
+
.where("system_controllers.reference = ?", controller_action[:controller])
|
|
169
|
+
.where("system_controller_actions.name = ?", action_name).first
|
|
170
|
+
|
|
171
|
+
descriptor.privileges.find_or_create_by(
|
|
172
|
+
system_controller_action: system_controller_action
|
|
173
|
+
)
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# @return [void]
|
|
179
|
+
# @param role_descriptor [RoleDescriptor] The role_descriptor on wich we want to add the system actions
|
|
180
|
+
# @description Return the list of privilege actions defined for
|
|
181
|
+
# profile descriptor
|
|
182
|
+
# Example
|
|
183
|
+
# RoleDescriptor::DefaultPrivilegeActionsService.add_profile_actions(RoleDescriptor.last)
|
|
184
|
+
def self.add_owner_privileges(descriptor)
|
|
185
|
+
|
|
186
|
+
# Adding default system actions for profile descriptor
|
|
187
|
+
actions = SystemController::Action.all
|
|
188
|
+
|
|
189
|
+
actions.each do |action|
|
|
190
|
+
descriptor.privileges.find_or_create_by(
|
|
191
|
+
system_controller_action: action
|
|
192
|
+
)
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
end
|
|
197
|
+
end
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
|
|
3
|
+
Lesli
|
|
4
|
+
|
|
5
|
+
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
6
|
+
|
|
7
|
+
This program is free software: you can redistribute it and/or modify
|
|
8
|
+
it under the terms of the GNU General Public License as published by
|
|
9
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
10
|
+
(at your option) any later version.
|
|
11
|
+
|
|
12
|
+
This program is distributed in the hope that it will be useful,
|
|
13
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
GNU General Public License for more details.
|
|
16
|
+
|
|
17
|
+
You should have received a copy of the GNU General Public License
|
|
18
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
19
|
+
|
|
20
|
+
Lesli · Ruby on Rails SaaS development platform.
|
|
21
|
+
|
|
22
|
+
Made with ♥ by https://www.lesli.tech
|
|
23
|
+
Building a better future, one line of code at a time.
|
|
24
|
+
|
|
25
|
+
@contact hello@lesli.tech
|
|
26
|
+
@website https://www.lesli.tech
|
|
27
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
28
|
+
|
|
29
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
|
+
// ·
|
|
31
|
+
|
|
32
|
+
=end
|
|
33
|
+
|
|
34
|
+
module LesliVault
|
|
35
|
+
class RoleServices < ApplicationLesliServices
|
|
36
|
+
|
|
37
|
+
# @overwrite
|
|
38
|
+
# @return {Object}
|
|
39
|
+
# @description Finds a role according the ID given
|
|
40
|
+
def find id
|
|
41
|
+
self.resource = current_user.account.roles.find_by_id(id)
|
|
42
|
+
self
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# @overwrite
|
|
46
|
+
# @return {Object}
|
|
47
|
+
# @description Retrives the role
|
|
48
|
+
def show
|
|
49
|
+
self.resource
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# @overwrite
|
|
53
|
+
# @return [Array] Paginated index of roles.
|
|
54
|
+
# @description Return a paginated array of roles, used mostly in frontend views
|
|
55
|
+
def index
|
|
56
|
+
|
|
57
|
+
current_user.account.roles
|
|
58
|
+
.joins("
|
|
59
|
+
left join (
|
|
60
|
+
select
|
|
61
|
+
count(1) users,
|
|
62
|
+
role_id
|
|
63
|
+
from user_roles
|
|
64
|
+
inner join users as u
|
|
65
|
+
on u.id = user_roles.user_id
|
|
66
|
+
and u.deleted_at is null
|
|
67
|
+
where user_roles.deleted_at is null
|
|
68
|
+
group by (role_id)
|
|
69
|
+
)
|
|
70
|
+
users on users.role_id = roles.id
|
|
71
|
+
")
|
|
72
|
+
.where("roles.object_level_permission < ?", current_user.max_object_level_permission)
|
|
73
|
+
.select(
|
|
74
|
+
:id,
|
|
75
|
+
:name,
|
|
76
|
+
:active,
|
|
77
|
+
:isolated,
|
|
78
|
+
:description,
|
|
79
|
+
:path_default,
|
|
80
|
+
:object_level_permission,
|
|
81
|
+
"users.users"
|
|
82
|
+
)
|
|
83
|
+
.page(query[:pagination][:page])
|
|
84
|
+
.per(query[:pagination][:perPage])
|
|
85
|
+
.order(object_level_permission: :desc, name: :asc)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Return a list of roles that the user is able to work with
|
|
89
|
+
# according to object level permission
|
|
90
|
+
def list
|
|
91
|
+
current_user.account.roles.where(
|
|
92
|
+
"object_level_permission <= ?", current_user.max_object_level_permission
|
|
93
|
+
).order(
|
|
94
|
+
object_level_permission: :desc,
|
|
95
|
+
name: :asc
|
|
96
|
+
).select(:id, :name, :object_level_permission)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# @overwrite
|
|
100
|
+
# @return {Object}
|
|
101
|
+
# @param {params} Hash of the permitted attributes for a role
|
|
102
|
+
# @description Creates a new role
|
|
103
|
+
def create params
|
|
104
|
+
role = current_user.account.roles.new(params)
|
|
105
|
+
|
|
106
|
+
unless current_user.can_work_with_role?(role)
|
|
107
|
+
self.error(I18n.t("core.roles.messages_danger_creating_role_object_level_permission_too_high"))
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# check if user can work with that object level permission
|
|
111
|
+
if role.object_level_permission.to_f >= current_user.roles.map(&:object_level_permission).max()
|
|
112
|
+
self.error(I18n.t("core.roles.messages_danger_creating_role_object_level_permission_too_high"))
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Try to save role and logs if it went OK
|
|
116
|
+
if role.save
|
|
117
|
+
self.resource = role
|
|
118
|
+
Role::Activity.log_create(current_user, self.resource)
|
|
119
|
+
else
|
|
120
|
+
self.error(role.errors.full_messages.to_sentence)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
self
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# @overwrite
|
|
127
|
+
# @return {Object}
|
|
128
|
+
# @param {params} Hash of the permitted attributes for a role
|
|
129
|
+
# @description Updates role's attributes and saves logs if it went without problem
|
|
130
|
+
def update params
|
|
131
|
+
old_attributes = self.resource.attributes
|
|
132
|
+
|
|
133
|
+
unless self.resource.update(params)
|
|
134
|
+
self.error(self.resource.errors.full_messages.to_sentence)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
if self.successful?
|
|
138
|
+
new_attributes = self.resource.attributes
|
|
139
|
+
|
|
140
|
+
LesliVault::Role::Activity.log_update(current_user, role, old_attributes, new_attributes)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
self
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# @overwrite
|
|
147
|
+
# @return {Object}
|
|
148
|
+
# @description Deletes the role
|
|
149
|
+
def destroy
|
|
150
|
+
unless self.resource.destroy
|
|
151
|
+
self.error(self.resource.errors.full_messages.to_sentence)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
if self.successful?
|
|
155
|
+
LesliVault::Role::Activity.log_destroy(current_user, self.resource)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
self
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def options
|
|
162
|
+
levels = {}
|
|
163
|
+
|
|
164
|
+
# get all the different object level permission registered in the roles
|
|
165
|
+
existing_levels = current_user.account.roles
|
|
166
|
+
.select(:object_level_permission)
|
|
167
|
+
.order(object_level_permission: :desc)
|
|
168
|
+
.distinct
|
|
169
|
+
.map { |level| level.object_level_permission }
|
|
170
|
+
|
|
171
|
+
# Build the next available object levels
|
|
172
|
+
# basically we need to add the possibles object level permissions between the
|
|
173
|
+
# existing ones
|
|
174
|
+
existing_levels.each_with_index do |level_current, i|
|
|
175
|
+
|
|
176
|
+
level_next = 0
|
|
177
|
+
|
|
178
|
+
# get the next OLP in the list of the existing roles
|
|
179
|
+
level_next = existing_levels.to_a[i+1] unless existing_levels.to_a[i+1].nil?
|
|
180
|
+
|
|
181
|
+
# calculate the new next level, basically we get the level right in the middle
|
|
182
|
+
# between the existing levels, example:
|
|
183
|
+
# 1000 existing level
|
|
184
|
+
# 750 new projected level
|
|
185
|
+
# 500 existing level
|
|
186
|
+
level_new = (level_current + level_next) / 2
|
|
187
|
+
|
|
188
|
+
# add the levels to the levels object
|
|
189
|
+
levels[level_current] = []
|
|
190
|
+
|
|
191
|
+
next if level_next == 0
|
|
192
|
+
|
|
193
|
+
levels[level_new] = []
|
|
194
|
+
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# Get all the existing roles
|
|
198
|
+
current_user.account.roles
|
|
199
|
+
.select(:id, :name, :object_level_permission)
|
|
200
|
+
.where.not(object_level_permission: nil).each do |role|
|
|
201
|
+
levels[role.object_level_permission] = [] if levels[role.object_level_permission].blank?
|
|
202
|
+
# push the role grouping by the object level permission
|
|
203
|
+
levels[role.object_level_permission].push(role)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
levels_sorted = []
|
|
207
|
+
|
|
208
|
+
levels.keys.each do |key|
|
|
209
|
+
levels_sorted.push({
|
|
210
|
+
level: key,
|
|
211
|
+
roles: levels[key]
|
|
212
|
+
})
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
levels_sorted
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
=begin
|
|
2
|
+
|
|
3
|
+
Lesli
|
|
4
|
+
|
|
5
|
+
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
6
|
+
|
|
7
|
+
This program is free software: you can redistribute it and/or modify
|
|
8
|
+
it under the terms of the GNU General Public License as published by
|
|
9
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
10
|
+
(at your option) any later version.
|
|
11
|
+
|
|
12
|
+
This program is distributed in the hope that it will be useful,
|
|
13
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
GNU General Public License for more details.
|
|
16
|
+
|
|
17
|
+
You should have received a copy of the GNU General Public License
|
|
18
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
19
|
+
|
|
20
|
+
Lesli · Ruby on Rails SaaS development platform.
|
|
21
|
+
|
|
22
|
+
Made with ♥ by https://www.lesli.tech
|
|
23
|
+
Building a better future, one line of code at a time.
|
|
24
|
+
|
|
25
|
+
@contact hello@lesli.tech
|
|
26
|
+
@website https://www.lesli.tech
|
|
27
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
28
|
+
|
|
29
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
|
+
// ·
|
|
31
|
+
|
|
32
|
+
=end
|
|
33
|
+
|
|
34
|
+
module LesliVault
|
|
35
|
+
class SystemControllerServices < ApplicationLesliServices
|
|
36
|
+
|
|
37
|
+
# @overwrite
|
|
38
|
+
# ...
|
|
39
|
+
def index
|
|
40
|
+
# get a matrix of controllers and actions
|
|
41
|
+
c = SystemController.joins(:actions).select(
|
|
42
|
+
"lesli_vault_system_controllers.name as id",
|
|
43
|
+
"lesli_vault_system_controllers.name as controller",
|
|
44
|
+
"lesli_vault_system_controllers.id as controller_id",
|
|
45
|
+
"lesli_vault_system_controller_actions.name as action",
|
|
46
|
+
"lesli_vault_system_controller_actions.id as action_id",
|
|
47
|
+
"case lesli_vault_system_controller_actions.name
|
|
48
|
+
when 'index' then 1
|
|
49
|
+
when 'show' then 2
|
|
50
|
+
when 'new' then 3
|
|
51
|
+
when 'edit' then 4
|
|
52
|
+
when 'create' then 5
|
|
53
|
+
when 'update' then 6
|
|
54
|
+
when 'destroy' then 7
|
|
55
|
+
when 'options' then 8
|
|
56
|
+
else 9
|
|
57
|
+
end as importance
|
|
58
|
+
"
|
|
59
|
+
)
|
|
60
|
+
#.where("lesli_vault_system_controller_actions.name in ('index', 'create', 'update', 'show', 'destroy')")
|
|
61
|
+
#.order("lesli_vault_system_controllers.name, importance, lesli_vault_system_controller_actions.name")
|
|
62
|
+
.order("importance DESC")
|
|
63
|
+
|
|
64
|
+
return c unless matrix
|
|
65
|
+
|
|
66
|
+
cc = {}
|
|
67
|
+
|
|
68
|
+
# convert the matrix to a hash of controllers with the available actions as values
|
|
69
|
+
# example:
|
|
70
|
+
# my_controller: [my list of actions]
|
|
71
|
+
c.each do |c|
|
|
72
|
+
|
|
73
|
+
# create a uniq container for every action that belongs to a specific controller
|
|
74
|
+
if cc[c[:controller]].blank?
|
|
75
|
+
cc[c[:controller]] = {
|
|
76
|
+
id: c[:controller_id],
|
|
77
|
+
name: c[:controller],
|
|
78
|
+
actions: []
|
|
79
|
+
}
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# push every action to his specic controller
|
|
83
|
+
cc[c[:controller]][:actions].push({
|
|
84
|
+
id: c[:action_id],
|
|
85
|
+
action: c[:action]
|
|
86
|
+
})
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
cc
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# ...
|
|
93
|
+
def options
|
|
94
|
+
{
|
|
95
|
+
categories: SystemController.categories.map {|k, _| { label: k, value: k }}
|
|
96
|
+
}
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<router-view></router-view>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
<%#
|
|
2
|
+
|
|
3
|
+
Lesli
|
|
4
|
+
|
|
5
|
+
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
6
|
+
|
|
7
|
+
This program is free software: you can redistribute it and/or modify
|
|
8
|
+
it under the terms of the GNU General Public License as published by
|
|
9
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
10
|
+
(at your option) any later version.
|
|
11
|
+
|
|
12
|
+
This program is distributed in the hope that it will be useful,
|
|
13
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
GNU General Public License for more details.
|
|
16
|
+
|
|
17
|
+
You should have received a copy of the GNU General Public License
|
|
18
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
19
|
+
|
|
20
|
+
Lesli · Ruby on Rails SaaS development platform.
|
|
21
|
+
|
|
22
|
+
Made with ♥ by https://www.lesli.tech
|
|
23
|
+
Building a better future, one line of code at a time.
|
|
24
|
+
|
|
25
|
+
@contact hello@lesli.tech
|
|
26
|
+
@website https://www.lesli.tech
|
|
27
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
28
|
+
|
|
29
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
|
+
// ·
|
|
31
|
+
|
|
32
|
+
%>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<%#
|
|
2
|
+
|
|
3
|
+
Lesli
|
|
4
|
+
|
|
5
|
+
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
6
|
+
|
|
7
|
+
This program is free software: you can redistribute it and/or modify
|
|
8
|
+
it under the terms of the GNU General Public License as published by
|
|
9
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
10
|
+
(at your option) any later version.
|
|
11
|
+
|
|
12
|
+
This program is distributed in the hope that it will be useful,
|
|
13
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
GNU General Public License for more details.
|
|
16
|
+
|
|
17
|
+
You should have received a copy of the GNU General Public License
|
|
18
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
19
|
+
|
|
20
|
+
Lesli · Ruby on Rails SaaS development platform.
|
|
21
|
+
|
|
22
|
+
Made with ♥ by https://www.lesli.tech
|
|
23
|
+
Building a better future, one line of code at a time.
|
|
24
|
+
|
|
25
|
+
@contact hello@lesli.tech
|
|
26
|
+
@website https://www.lesli.tech
|
|
27
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
28
|
+
|
|
29
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
|
+
// ·
|
|
31
|
+
|
|
32
|
+
%>
|
|
33
|
+
|
|
34
|
+
<router-view></router-view>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<%#
|
|
2
|
+
|
|
3
|
+
Lesli
|
|
4
|
+
|
|
5
|
+
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
6
|
+
|
|
7
|
+
This program is free software: you can redistribute it and/or modify
|
|
8
|
+
it under the terms of the GNU General Public License as published by
|
|
9
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
10
|
+
(at your option) any later version.
|
|
11
|
+
|
|
12
|
+
This program is distributed in the hope that it will be useful,
|
|
13
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
GNU General Public License for more details.
|
|
16
|
+
|
|
17
|
+
You should have received a copy of the GNU General Public License
|
|
18
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
19
|
+
|
|
20
|
+
Lesli · Ruby on Rails SaaS development platform.
|
|
21
|
+
|
|
22
|
+
Made with ♥ by https://www.lesli.tech
|
|
23
|
+
Building a better future, one line of code at a time.
|
|
24
|
+
|
|
25
|
+
@contact hello@lesli.tech
|
|
26
|
+
@website https://www.lesli.tech
|
|
27
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
28
|
+
|
|
29
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
|
+
// ·
|
|
31
|
+
|
|
32
|
+
%>
|
|
33
|
+
|
|
34
|
+
<router-view></router-view>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<%#
|
|
2
|
+
|
|
3
|
+
Lesli
|
|
4
|
+
|
|
5
|
+
Copyright (c) 2023, Lesli Technologies, S. A.
|
|
6
|
+
|
|
7
|
+
This program is free software: you can redistribute it and/or modify
|
|
8
|
+
it under the terms of the GNU General Public License as published by
|
|
9
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
10
|
+
(at your option) any later version.
|
|
11
|
+
|
|
12
|
+
This program is distributed in the hope that it will be useful,
|
|
13
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
14
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
15
|
+
GNU General Public License for more details.
|
|
16
|
+
|
|
17
|
+
You should have received a copy of the GNU General Public License
|
|
18
|
+
along with this program. If not, see http://www.gnu.org/licenses/.
|
|
19
|
+
|
|
20
|
+
Lesli · Ruby on Rails SaaS development platform.
|
|
21
|
+
|
|
22
|
+
Made with ♥ by https://www.lesli.tech
|
|
23
|
+
Building a better future, one line of code at a time.
|
|
24
|
+
|
|
25
|
+
@contact hello@lesli.tech
|
|
26
|
+
@website https://www.lesli.tech
|
|
27
|
+
@license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
|
|
28
|
+
|
|
29
|
+
// · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
|
|
30
|
+
// ·
|
|
31
|
+
|
|
32
|
+
%>
|
|
33
|
+
|
|
34
|
+
<router-view></router-view>
|