lesli 5.0.1 → 5.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/config/lesli_manifest.js +7 -4
  3. data/app/assets/fonts/lesli/Domine/Domine-VariableFont_wght.ttf +0 -0
  4. data/app/assets/fonts/lesli/Domine/OFL.txt +2 -0
  5. data/app/assets/javascripts/lesli/users/passwords.js +776 -0
  6. data/app/assets/javascripts/lesli/users/registrations.js +776 -0
  7. data/app/assets/javascripts/lesli/users/sessions.js +776 -1
  8. data/app/assets/stylesheets/lesli/users/passwords.scss +5 -6
  9. data/app/assets/stylesheets/lesli/users/registrations.scss +5 -6
  10. data/app/assets/stylesheets/lesli/users/sessions.scss +5 -10
  11. data/app/controllers/lesli/application_lesli_controller.rb +0 -1
  12. data/app/controllers/lesli/interfaces/application/logger.rb +9 -9
  13. data/app/controllers/lesli/roles_controller.rb +43 -0
  14. data/{lib/sass/lesli/devise/registrations.scss.erb → app/controllers/lesli/users_controller.rb} +18 -23
  15. data/app/controllers/users/registrations_controller.rb +137 -58
  16. data/app/helpers/lesli/assets_helper.rb +2 -2
  17. data/app/helpers/lesli/general_helper.rb +1 -1
  18. data/app/helpers/lesli/navigation_helper.rb +7 -10
  19. data/app/helpers/lesli/system_helper.rb +1 -1
  20. data/app/lib/lesli/system.rb +7 -3
  21. data/app/mailers/lesli/application_lesli_mailer.rb +199 -0
  22. data/app/mailers/lesli/application_mailer.rb +7 -0
  23. data/app/mailers/lesli/devise_mailer.rb +33 -0
  24. data/app/models/concerns/user_guard.rb +3 -4
  25. data/app/models/lesli/account.rb +29 -0
  26. data/{lib/sass/lesli/pages/passes.scss → app/models/lesli/descriptor.rb} +14 -8
  27. data/app/models/lesli/role.rb +90 -0
  28. data/app/models/lesli/system_controller.rb +1 -0
  29. data/app/models/lesli/user/detail.rb +55 -0
  30. data/{lib/sass/lesli/pages/otps.scss → app/models/lesli/user/role.rb} +13 -9
  31. data/app/models/lesli/user.rb +4 -3
  32. data/app/services/lesli/role_service.rb +45 -0
  33. data/app/services/lesli/user_service.rb +69 -0
  34. data/app/views/devise/passwords/new.html.erb +72 -12
  35. data/app/views/devise/registrations/new.html.erb +146 -28
  36. data/app/views/devise/sessions/new.html.erb +11 -78
  37. data/app/views/devise/shared/_links.html.erb +96 -25
  38. data/app/views/lesli/emails/devise_mailer/confirmation_instructions.html.erb +23 -0
  39. data/app/views/lesli/emails/user_mailer/invitation.html.erb +23 -0
  40. data/app/views/lesli/layouts/application-devise.html.erb +1 -1
  41. data/app/views/lesli/layouts/application-public.html.erb +2 -2
  42. data/app/views/lesli/layouts/mailer.html.erb +13 -0
  43. data/app/views/lesli/layouts/mailer.text.erb +1 -0
  44. data/app/views/lesli/partials/_application-lesli-header.html.erb +27 -41
  45. data/app/views/lesli/partials/_application-lesli-javascript.html.erb +10 -6
  46. data/app/views/lesli/partials/_application-public-javascript.html.erb +12 -8
  47. data/{lib/sass/lesli/devise/confirmations.scss.erb → app/views/lesli/wrappers/_application-devise-simple.erb} +30 -46
  48. data/app/views/lesli/wrappers/{_application-auth.html.erb → _application-devise.html.erb} +15 -0
  49. data/config/initializers/{lesli_defaults.rb → lesli.rb} +4 -2
  50. data/config/locales/translations.en.yml +7 -0
  51. data/config/locales/translations.es.yml +7 -0
  52. data/config/routes.rb +22 -17
  53. data/db/migrate/v1.0/0010000210_create_lesli_roles.rb +1 -1
  54. data/db/{tables/0010003010_create_user_details.rb → migrate/v1.0/0010003010_create_lesli_user_details.rb} +6 -6
  55. data/db/{tables/0010003510_create_user_roles.rb → migrate/v1.0/0010003410_create_lesli_user_roles.rb} +4 -4
  56. data/db/{tables/0010005010_create_descriptors.rb → migrate/v1.0/0010005010_create_lesli_descriptors.rb} +5 -6
  57. data/db/{tables/0010005110_create_descriptor_privileges.rb → migrate/v1.0/0010005110_create_lesli_descriptor_privileges.rb} +8 -7
  58. data/db/{tables/0010005210_create_descriptor_activities.rb → migrate/v1.0/0010005210_create_lesli_descriptor_activities.rb} +6 -8
  59. data/db/seeds.rb +0 -2
  60. data/lib/lesli/engine.rb +25 -2
  61. data/lib/lesli/routing.rb +26 -0
  62. data/lib/lesli/version.rb +2 -2
  63. data/lib/lesli.rb +1 -0
  64. data/lib/{sass/lesli/pages/mfas.scss → mailer_previews/devise_mailer_preview.rb} +12 -6
  65. data/lib/sass/lesli/bulma/loader.scss +3 -0
  66. data/lib/sass/lesli/elements/header.scss +1 -1
  67. data/lib/sass/lesli/fonts/families.scss +3 -3
  68. data/lib/sass/lesli/layouts/application-container.scss +4 -0
  69. data/lib/sass/lesli/{devise/passwords.scss.erb → pages/devise-simple.scss} +38 -38
  70. data/lib/sass/lesli/{templates → pages}/devise.scss +4 -26
  71. data/lib/sass/lesli/settings/variables.scss +1 -1
  72. data/lib/sass/lesli/templates/application.scss +8 -4
  73. data/lib/sass/lesli/templates/dashboards.scss +8 -0
  74. data/lib/sass/lesli/templates/public.scss +2 -3
  75. data/lib/tasks/lesli/controllers.rake +33 -0
  76. data/lib/tasks/lesli/db.rake +88 -0
  77. data/lib/tasks/lesli/git.rake +74 -0
  78. data/lib/tasks/lesli_tasks.rake +70 -20
  79. data/lib/vue/devise/registrations.js +10 -15
  80. data/lib/vue/layouts/application-container.vue +10 -2
  81. data/lib/vue/layouts/application-header.vue +10 -3
  82. data/lib/vue/stores/account.js +113 -0
  83. data/lib/vue/stores/role.js +243 -0
  84. data/lib/vue/stores/translations.json +86 -0
  85. data/lib/vue/stores/user.js +102 -0
  86. data/lib/{sass/lesli/devise/sessions.scss → vue/translation.js} +14 -5
  87. data/lib/webpack/base.js +2 -2
  88. data/lib/webpack/core.js +2 -0
  89. data/readme.md +74 -55
  90. metadata +196 -51
  91. data/app/assets/fonts/lesli/Domine/Domine-Bold.ttf +0 -0
  92. data/app/assets/fonts/lesli/Domine/Domine-Regular.ttf +0 -0
  93. data/app/assets/stylesheets/lesli/users/devise.scss +0 -32
  94. data/app/controllers/lesli/profiles_controller.rb +0 -60
  95. data/app/helpers/lesli/profiles_helper.rb +0 -4
  96. data/app/models/lesli/profile.rb +0 -4
  97. data/app/views/lesli/devise/sessions/_form.html.erb +0 -17
  98. data/app/views/lesli/devise/sessions/_session.html.erb +0 -2
  99. data/app/views/lesli/devise/sessions/edit.html.erb +0 -10
  100. data/app/views/lesli/devise/sessions/index.html.erb +0 -14
  101. data/app/views/lesli/devise/sessions/new.html.erb +0 -9
  102. data/app/views/lesli/devise/sessions/show.html.erb +0 -10
  103. data/app/views/lesli/profiles/_form.html.erb +0 -17
  104. data/app/views/lesli/profiles/_profile.html.erb +0 -2
  105. data/app/views/lesli/profiles/edit.html.erb +0 -10
  106. data/app/views/lesli/profiles/index.html.erb +0 -14
  107. data/app/views/lesli/profiles/new.html.erb +0 -9
  108. data/app/views/lesli/profiles/show.html.erb +0 -10
  109. data/lib/sass/lesli/pages/dashboards.scss +0 -57
  110. data/lib/tasks/db.rb +0 -76
  111. data/lib/vue/stores/profile.js +0 -90
  112. data/lib/vue/stores/workflow2.js +0 -345
  113. data/lib/vue/stores/workflows/actions.js +0 -327
  114. data/lib/vue/stores/workflows/associations.js +0 -130
  115. data/lib/vue/stores/workflows/checks.js +0 -210
  116. /data/lib/vue/stores/{announcements.js → entities/announcements.js} +0 -0
  117. /data/lib/vue/stores/{dashboard.js → entities/dashboard.js} +0 -0
  118. /data/lib/vue/stores/{workflow.js → entities/workflow.js} +0 -0
  119. /data/lib/vue/stores/{cloud-bell → panels}/notification.js +0 -0
  120. /data/lib/vue/stores/{firebase.js → services/firebase.js} +0 -0
@@ -0,0 +1,199 @@
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 Framework.
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
+ =end
32
+
33
+ module Lesli
34
+ class ApplicationLesliMailer < ActionMailer::Base
35
+
36
+ # Set a dynamic template according to the engine that is sending the email
37
+ # this is equivalent to: default template_path: -> { "engine_name/emails" }
38
+ =begin
39
+ default(
40
+
41
+ from: -> {
42
+
43
+ instance = Rails.application.config.lesli.dig(:instance)
44
+
45
+ # add custom email name for emails sent from www.lesli.cloud
46
+ if instance[:code] == 'lesli_cloud'
47
+ return email_address_with_name(
48
+ Rails.configuration.lesli.dig(:env, :action_mailer, :default_options_from),
49
+ "Lesli"
50
+ )
51
+ end
52
+
53
+ Rails.configuration.lesli.dig(:env, :action_mailer, :default_options_from)
54
+
55
+ },
56
+
57
+ template_path: -> {
58
+
59
+ instance = Rails.application.config.lesli.dig(:instance)
60
+
61
+ # get class that is executing the mailer
62
+ module_info = self.class.name.split("::")
63
+
64
+ # mailers from engines
65
+ if module_info.length > 1
66
+ return "#{ instance[:code] }/emails/#{(module_info[0].underscore)}/#{ module_info[1].underscore }"
67
+ end
68
+
69
+ # mailers from core
70
+ return "#{ instance[:code] }/emails/#{ module_info[0].underscore }"
71
+
72
+ }
73
+
74
+ )
75
+ =end
76
+ #after_action :log_mail_requests
77
+
78
+ default(template_path: "lesli/emails/devise_mailer")
79
+
80
+ def initialize
81
+
82
+ super
83
+
84
+ # some @email data is defined on: LesliMails/src/partials/data.html
85
+ @custom = {}
86
+ @email = {}
87
+ @data = {}
88
+ @app = {}
89
+
90
+ end
91
+
92
+ protected
93
+
94
+ def email(data={}, to:, subject:, template_name:)
95
+
96
+ @app[:host] = default_url_options[:host]
97
+ @data = @data.merge(data)
98
+
99
+ mail(
100
+ to: to,
101
+ subject: subject,
102
+ template_name: template_name
103
+ )
104
+ end
105
+
106
+
107
+ private
108
+
109
+
110
+ def build_data_from_params(params, data={})
111
+
112
+ # make custom data available in mailer method and mailer template
113
+ @data = @data.merge(data)
114
+
115
+ build_app_from_params(params)
116
+
117
+ build_customization_from_params(params)
118
+
119
+ end
120
+
121
+ def build_app_from_params(params)
122
+
123
+ @app[:host] = default_url_options[:host]
124
+ # @app[:company] = {
125
+ # id: 0,
126
+ # name: "",
127
+ # tag_line: "",
128
+ # }
129
+
130
+ # return if params[:user].blank? || params[:user].class.name != "User"
131
+
132
+ # @app[:company] = {
133
+ # id: params[:user].account.id,
134
+ # name: params[:user].account.company_name,
135
+ # tag_line: params[:user].account.company_tag_line,
136
+ # }
137
+
138
+ end
139
+
140
+ def build_customization_from_params(params)
141
+
142
+ instance = Rails.application.config.lesli.dig(:instance)
143
+
144
+ # lesli is the code used for the core. If there are no builder engines,
145
+ # the instance namespace is "/"
146
+ instance_path = ""
147
+ instance_path = "#{instance[:code]}/" if instance[:code] != "lesli"
148
+
149
+ # using cdn logos by default (testing feature)
150
+ # @custom[:logo] = "#{instance_path}brand/app-logo.svg"
151
+ @custom[:logo] = "https://cdn.lesli.tech/leslicloud/brand/app-logo.png"
152
+
153
+ return if params[:user].blank? || params[:user].class.name != "User"
154
+
155
+ custom_logo = nil # params[:user].account.files.where(file_type: "app_logo").last
156
+
157
+ if custom_logo
158
+ @custom[:logo] = custom_logo.attachment.url if custom_logo.attachment_identifier
159
+ @custom[:logo] = custom_logo.attachment_public.url if custom_logo.attachment_public_identifier
160
+ end
161
+
162
+ end
163
+
164
+ def build_recipients_from_users(users)
165
+ if users.is_a?(Array)
166
+ users.map { |user| email_address_with_name(user.email, user.full_name) }
167
+ end
168
+ end
169
+
170
+ def build_recipients_from_contacts(contacts)
171
+ if contacts.is_a?(Array)
172
+ contacts.map { |contact| email_address_with_name(contact[:email], contact[:name]) }
173
+ end
174
+ end
175
+
176
+ def build_recipients_from_emails()
177
+ end
178
+
179
+ def log_mail_requests title="email_sent", payload=nil
180
+
181
+ if payload.blank?
182
+ payload = {
183
+ subject: self.message.subject,
184
+ to: self.message.to
185
+ }
186
+ end
187
+
188
+ # TODO: Save template path and view used within the email
189
+ Account::Log.log_email(
190
+ "#{self.class.to_s}/#{self.action_name}",
191
+ self.action_name,
192
+ title,
193
+ payload
194
+ )
195
+
196
+ end
197
+
198
+ end
199
+ end
@@ -0,0 +1,7 @@
1
+ module Lesli
2
+ class ApplicationMailer < ActionMailer::Base
3
+ default from: "hello@lesli.tech"
4
+ layout "lesli/layouts/mailer"
5
+ end
6
+ end
7
+
@@ -0,0 +1,33 @@
1
+ module Lesli
2
+ class DeviseMailer < ApplicationLesliMailer
3
+ def confirmation_instructions(record, token, opts = {})
4
+
5
+ # defaults for new accounts/users
6
+ email_template = "confirmation_instructions"
7
+ email_subject = I18n.t("core.users/confirmations.mailer_email_verification")
8
+
9
+ # # custom email and subject if user is changin his email address
10
+ # if !record.unconfirmed_email.blank?
11
+ # email_template = "update_email_confirmation_instructions"
12
+ # email_subject = I18n.t("core.users/confirmations.mailer_confirmation_instructions_subject")
13
+ # end
14
+
15
+ # Depending on wheter there is a new user or they are changing their email,
16
+ # one or another field will be used
17
+ email_recipient = record.unconfirmed_email || record.email
18
+
19
+ # email custom data
20
+ params = {
21
+ url: "/confirmation?confirmation_token=#{token}"
22
+ }
23
+
24
+ # send email
25
+ email(
26
+ params,
27
+ to: email_recipient,
28
+ subject: email_subject,
29
+ template_name: email_template
30
+ )
31
+ end
32
+ end
33
+ end
@@ -17,7 +17,7 @@ GNU General Public License for more details.
17
17
  You should have received a copy of the GNU General Public License
18
18
  along with this program. If not, see http://www.gnu.org/licenses/.
19
19
 
20
- Lesli · Ruby on Rails Development Platform.
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
21
 
22
22
  Made with ♥ by https://www.lesli.tech
23
23
  Building a better future, one line of code at a time.
@@ -28,7 +28,6 @@ Building a better future, one line of code at a time.
28
28
 
29
29
  // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
30
  // ·
31
-
32
31
  =end
33
32
 
34
33
 
@@ -41,12 +40,12 @@ module UserGuard
41
40
  def max_object_level_permission
42
41
 
43
42
  # get the max object level permission from roles assigned to the user
44
- level = self.roles.map(&:object_level_permission).max()
43
+ level = self.roles.maximum(:object_level_permission)
45
44
 
46
45
  # if user has no roles assigned, we return the lowest role available
47
46
  # NOTE: This should not be possible due the user needs a role to login
48
47
  unless level
49
- return (self.account.roles.map(&:object_level_permission).min() + 1)
48
+ return (self.account.roles.minimum(:object_level_permission))
50
49
  end
51
50
 
52
51
  # return the level found
@@ -73,5 +73,34 @@ module Lesli
73
73
 
74
74
  # required a name for the lesli account
75
75
  validates :company_name, :presence => true
76
+
77
+
78
+ # initializers for new accounts
79
+ after_create :initialize_account
80
+
81
+
82
+ def initialize_account
83
+
84
+ # create initial descriptors
85
+ descriptor_owner = self.descriptors.find_or_create_by(name: "owner")
86
+ descriptor_sysadmin = self.descriptors.find_or_create_by(name: "sysadmin")
87
+ descriptor_profile = self.descriptors.find_or_create_by(name: "profile")
88
+
89
+
90
+ # create default roles for the new account
91
+ owner = self.roles.create({ name: "owner", active: true, object_level_permission: 2147483647 })
92
+
93
+ # platform administrator role
94
+ sysadmin = self.roles.create({ name: "sysadmin", active: true, object_level_permission: 100000 })
95
+
96
+ # access only to user profile
97
+ limited = self.roles.create({ name: "limited", active: true, object_level_permission: 10, path_default: "/administration/profile" })
98
+
99
+
100
+ # assign descriptors with appropriate privileges
101
+ #owner.descriptors.create(:descriptor => descriptor_owner)
102
+ #sysadmin.descriptors.create(:descriptor => descriptor_sysadmin)
103
+ #limited.descriptors.create(:descriptor => descriptor_profile)
104
+ end
76
105
  end
77
106
  end
@@ -1,4 +1,4 @@
1
- /*
1
+ =begin
2
2
 
3
3
  Lesli
4
4
 
@@ -17,7 +17,7 @@ GNU General Public License for more details.
17
17
  You should have received a copy of the GNU General Public License
18
18
  along with this program. If not, see http://www.gnu.org/licenses/.
19
19
 
20
- Lesli · Ruby on Rails SaaS development platform.
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
21
 
22
22
  Made with ♥ by https://www.lesli.tech
23
23
  Building a better future, one line of code at a time.
@@ -27,9 +27,15 @@ Building a better future, one line of code at a time.
27
27
  @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
28
 
29
29
  // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
- // ·
31
-
32
- */
33
-
34
- // ·
35
- @import "./base.scss";
30
+ // ·
31
+ =end
32
+
33
+ module Lesli
34
+ class Descriptor < ApplicationLesliRecord
35
+ belongs_to :account
36
+ #has_many :privileges
37
+ #has_many :role_descriptors
38
+
39
+ validates :name, presence: true
40
+ end
41
+ end
@@ -0,0 +1,90 @@
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 Framework.
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
+ =end
32
+
33
+ module Lesli
34
+ class Role < ApplicationLesliRecord
35
+
36
+ belongs_to :account
37
+
38
+
39
+ # Role resources
40
+ has_many :activities
41
+ has_many :descriptors, dependent: :delete_all
42
+ has_many :privileges, class_name: "Role::Privilege", dependent: :delete_all
43
+
44
+
45
+ # initializers for new roles
46
+ after_create :after_create_role
47
+
48
+
49
+ # validations
50
+ validates :name, presence: :true
51
+ validates :object_level_permission, presence: :true
52
+
53
+
54
+ def after_create_role
55
+
56
+ # generate a unique code for the role
57
+ role_code = name
58
+ .downcase # string to lowercase
59
+ .gsub(/[^0-9A-Za-z\s\-\_]/, '') # remove special characters from string
60
+ .gsub(/-/, '_') # replace dashes with underscore
61
+ .gsub(/\s+/, '_') # replace spaces or spaces with single dash
62
+
63
+ # transform UTF-8 characters to ASCI (ex: name in german)
64
+ role_code = I18n.transliterate(role_code) + id.to_s
65
+
66
+ self.update_attribute("code", role_code)
67
+ end
68
+
69
+
70
+ # @return [Boolean]
71
+ # @description Returns if a role is assigned to users.
72
+ def has_users?
73
+ User::Role.where(role: self).count > 0
74
+ end
75
+
76
+ # @return [void]
77
+ # @param current_user [::User] The user that deleted the role
78
+ # @param [Role] The role that was deleted
79
+ # @description Creates an activity for this role indicating that someone deleted it
80
+ # Example
81
+ # role = Role.find(1)
82
+ # Role.log_activity_destroy(User.find(1), role)
83
+ def self.log_activity_destroy(current_user, role)
84
+ role.activities.create(
85
+ user_creator: current_user,
86
+ category: "action_destroy"
87
+ )
88
+ end
89
+ end
90
+ end
@@ -39,6 +39,7 @@ module Lesli
39
39
  # get a matrix of controllers and actions
40
40
  c = SystemController.joins(:actions).select(
41
41
  "lesli_system_controllers.engine as engine",
42
+ "lesli_system_controllers.route as route",
42
43
  "lesli_system_controllers.reference as controller",
43
44
  "lesli_system_controllers.name as controller_name",
44
45
  "lesli_system_controllers.id as controller_id",
@@ -0,0 +1,55 @@
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 Framework.
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
+ =end
32
+
33
+ module Lesli
34
+ class User::Detail < ApplicationLesliRecord
35
+ belongs_to :user
36
+
37
+ #before_save :validate_work_region
38
+
39
+ enum salutation: {
40
+ mr: "mr",
41
+ ms: "ms",
42
+ mrs: "mrs"
43
+ }
44
+
45
+ protected
46
+
47
+ def validate_work_region
48
+ return true unless work_region
49
+ return true if Account::Location.find_by_id(work_region)
50
+
51
+ errors.add(:base, :work_region_invalid)
52
+ throw :abort
53
+ end
54
+ end
55
+ end
@@ -1,4 +1,4 @@
1
- /*
1
+ =begin
2
2
 
3
3
  Lesli
4
4
 
@@ -17,7 +17,7 @@ GNU General Public License for more details.
17
17
  You should have received a copy of the GNU General Public License
18
18
  along with this program. If not, see http://www.gnu.org/licenses/.
19
19
 
20
- Lesli · Ruby on Rails SaaS development platform.
20
+ Lesli · Ruby on Rails SaaS Development Framework.
21
21
 
22
22
  Made with ♥ by https://www.lesli.tech
23
23
  Building a better future, one line of code at a time.
@@ -27,10 +27,14 @@ Building a better future, one line of code at a time.
27
27
  @license GPLv3 http://www.gnu.org/licenses/gpl-3.0.en.html
28
28
 
29
29
  // · ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~ ~·~
30
- // ·
31
-
32
- */
33
-
34
-
35
- // ·
36
- @import "./base.scss";
30
+ // ·
31
+ =end
32
+
33
+ module Lesli
34
+ class User::Role < ApplicationLesliRecord
35
+ belongs_to :user
36
+ belongs_to :role
37
+ has_many :roles
38
+ #has_many :privileges, through: :roles
39
+ end
40
+ end
@@ -57,9 +57,10 @@ module Lesli
57
57
  has_many :activities, class_name: "User::Activity"
58
58
 
59
59
  # users can have many roles and too many privileges through the roles
60
- has_many :user_roles, class_name: "User::Role"
61
- has_many :roles, through: :user_roles, source: :role
62
- has_many :privileges, through: :roles
60
+ has_many :user_roles, class_name: "Lesli::User::Role"
61
+ has_many :roles, class_name: "Lesli::Role", through: :user_roles, source: :role
62
+ #has_many :privileges, through: :roles
63
+
63
64
 
64
65
  # devise implementation
65
66
  devise :database_authenticatable,
@@ -0,0 +1,45 @@
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 Framework.
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
+ =end
32
+
33
+ module Lesli
34
+ class RoleService < ApplicationLesliService
35
+
36
+ # Return a list of roles that the user is able to work with
37
+ # according to object level permission
38
+ def list params
39
+ current_user.account.roles
40
+ .where("object_level_permission <= ?", current_user.max_object_level_permission)
41
+ .order(object_level_permission: :desc, name: :asc)
42
+ .select(:id, :name, :object_level_permission)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,69 @@
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 Framework.
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
+ =end
32
+
33
+ module Lesli
34
+ class UserService < Lesli::ApplicationLesliService
35
+
36
+
37
+ # Return a list of users that belongs to the account of the current_user
38
+ # this list is meant to be used in selectors, autocomplets, etc
39
+ def list params=nil
40
+ #users = current_user.account.users
41
+ users = Lesli::Account.first.users
42
+
43
+ if params[:role].present?
44
+ # add simple quotes to the roles so the sql can manage the query
45
+ roles = params[:role].split(",").map { |role| "'#{role}'" }.join(", ")
46
+ users = users.joins("
47
+ inner join (
48
+ select
49
+ ur.users_id, string_agg(r.\"name\", ', ') role_names
50
+ from user_roles ur
51
+ join roles r
52
+ on r.id = ur.role_id
53
+ and r.name in ( #{ roles } )
54
+ where ur.deleted_at is null
55
+ group by ur.users_id
56
+ ) roles on roles.users_id = users.id
57
+ ")
58
+ end
59
+
60
+ users.order(name: :asc).select(
61
+ :id,
62
+ :email,
63
+ "CONCAT_WS(' ', first_name, last_name) as name",
64
+ :alias
65
+ ).as_json
66
+ end
67
+
68
+ end
69
+ end