lesli 5.0.1 → 5.0.2

Sign up to get free protection for your applications and to get access to all the features.
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