hello-rails 0.0.0 → 0.5.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.
Files changed (235) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +97 -0
  4. data/Rakefile +23 -0
  5. data/app/controllers/hello/application_controller.rb +27 -0
  6. data/app/controllers/hello/authentication/sessions_controller.rb +81 -0
  7. data/app/controllers/hello/authentication/sign_in_controller.rb +39 -0
  8. data/app/controllers/hello/authentication/sudo_mode_controller.rb +40 -0
  9. data/app/controllers/hello/concerns/authentication/sign_in.rb +44 -0
  10. data/app/controllers/hello/concerns/management/forgot_password.rb +45 -0
  11. data/app/controllers/hello/concerns/management/reset_password.rb +33 -0
  12. data/app/controllers/hello/concerns/registration/sign_up.rb +64 -0
  13. data/app/controllers/hello/internationalization/locale_controller.rb +28 -0
  14. data/app/controllers/hello/management/accesses_controller.rb +29 -0
  15. data/app/controllers/hello/management/confirm_emails_controller.rb +41 -0
  16. data/app/controllers/hello/management/emails_controller.rb +67 -0
  17. data/app/controllers/hello/management/forgot_password_controller.rb +41 -0
  18. data/app/controllers/hello/management/passwords_controller.rb +57 -0
  19. data/app/controllers/hello/management/profiles_controller.rb +71 -0
  20. data/app/controllers/hello/management/reset_password_controller.rb +53 -0
  21. data/app/controllers/hello/registration/sign_up_controller.rb +63 -0
  22. data/app/helpers/hello/application_helper.rb +5 -0
  23. data/app/mailers/hello/mailer.rb +26 -0
  24. data/app/models/access.rb +2 -0
  25. data/app/models/credential.rb +2 -0
  26. data/app/models/email_credential.rb +2 -0
  27. data/app/models/password_credential.rb +2 -0
  28. data/app/models/user.rb +2 -0
  29. data/app/views/hello/authentication/_sign_in.html.erb +64 -0
  30. data/app/views/hello/authentication/new_session.html.erb +4 -0
  31. data/app/views/hello/authentication/sessions.html.erb +36 -0
  32. data/app/views/hello/authentication/sign_in.html.erb +3 -0
  33. data/app/views/hello/authentication/sudo_mode.html.erb +37 -0
  34. data/app/views/hello/internationalization/locales.html.erb +7 -0
  35. data/app/views/hello/mailer/confirm_email.html.erb +12 -0
  36. data/app/views/hello/mailer/forgot_password.html.erb +12 -0
  37. data/app/views/hello/mailer/welcome.html.erb +11 -0
  38. data/app/views/hello/management/accesses.html.erb +47 -0
  39. data/app/views/hello/management/cancel.html.erb +14 -0
  40. data/app/views/hello/management/email_credentials/expired_confirmation_token.html.erb +1 -0
  41. data/app/views/hello/management/email_credentials/index.html.erb +84 -0
  42. data/app/views/hello/management/password_credentials/_forgot_form.html.erb +17 -0
  43. data/app/views/hello/management/password_credentials/_reset_form.html.erb +39 -0
  44. data/app/views/hello/management/password_credentials/forgot.html.erb +10 -0
  45. data/app/views/hello/management/password_credentials/forgot_success.html.erb +26 -0
  46. data/app/views/hello/management/password_credentials/reset.html.erb +3 -0
  47. data/app/views/hello/management/password_credentials/show.html.erb +25 -0
  48. data/app/views/hello/management/user.html.erb +73 -0
  49. data/app/views/hello/registration/_sign_up.html.erb +86 -0
  50. data/app/views/hello/registration/sign_up.html.erb +3 -0
  51. data/app/views/hello/registration/sign_up_widget.html.erb +3 -0
  52. data/app/views/hello/shared/_errors.html.erb +11 -0
  53. data/app/views/hello/shared/_flash.html.erb +8 -0
  54. data/app/views/hello/shared/_nav_pills.html.erb +15 -0
  55. data/app/views/hello/shared/_session_expiration.html.erb +15 -0
  56. data/app/views/hello/shared/_settings.html.erb +41 -0
  57. data/config/locales/hello.en.yml +69 -0
  58. data/config/locales/hello.es.yml +71 -0
  59. data/config/locales/hello.fr.yml +71 -0
  60. data/config/locales/hello.pl.yml +71 -0
  61. data/config/locales/hello.pt-BR.yml +71 -0
  62. data/config/locales/hello.zh-CN.yml +71 -0
  63. data/config/locales/hello.zh-TW.yml +71 -0
  64. data/config/routes.rb +74 -0
  65. data/db/migrate/1_create_credentials.rb +17 -0
  66. data/db/migrate/2_create_accesses.rb +15 -0
  67. data/db/migrate/3_create_users.rb +23 -0
  68. data/lib/generators/hello/concerns/USAGE +8 -0
  69. data/lib/generators/hello/concerns/concerns_generator.rb +10 -0
  70. data/lib/generators/hello/from_devise/USAGE +8 -0
  71. data/lib/generators/hello/from_devise/from_devise_generator.rb +13 -0
  72. data/lib/generators/hello/from_devise/templates/from_devise.migration.rb +39 -0
  73. data/lib/generators/hello/install/USAGE +8 -0
  74. data/lib/generators/hello/install/install_generator.rb +94 -0
  75. data/lib/generators/hello/install/templates/application.html.erb +35 -0
  76. data/lib/generators/hello/install/templates/hello_helper.rb +16 -0
  77. data/lib/generators/hello/install/templates/initializer.rb +24 -0
  78. data/lib/generators/hello/install/templates/models/concerns/user/authorization.rb +21 -0
  79. data/lib/generators/hello/install/templates/models/user.rb +9 -0
  80. data/lib/generators/hello/install/templates/onboarding/index.html.erb +5 -0
  81. data/lib/generators/hello/install/templates/onboarding/onboarding_controller.rb +33 -0
  82. data/lib/generators/hello/install/templates/root/index.html.erb +7 -0
  83. data/lib/generators/hello/install/templates/root/root_controller.rb +6 -0
  84. data/lib/generators/hello/install/templates/users/controllers/users_controller.rb +71 -0
  85. data/lib/generators/hello/install/templates/users/views/users/index.html.erb +29 -0
  86. data/lib/generators/hello/install/templates/users/views/users/list.html.erb +35 -0
  87. data/lib/generators/hello/install/templates/users/views/users/new.html.erb +60 -0
  88. data/lib/generators/hello/install/templates/users/views/users/show.html.erb +74 -0
  89. data/lib/generators/hello/locales/USAGE +12 -0
  90. data/lib/generators/hello/locales/locales_generator.rb +64 -0
  91. data/lib/generators/hello/views/USAGE +8 -0
  92. data/lib/generators/hello/views/views_generator.rb +9 -0
  93. data/lib/hello-rails.rb +1 -0
  94. data/lib/hello.rb +36 -0
  95. data/lib/hello/CHANGES.md +26 -0
  96. data/lib/hello/business.rb +47 -0
  97. data/lib/hello/business/authentication/sign_in.rb +92 -0
  98. data/lib/hello/business/authentication/sign_out.rb +8 -0
  99. data/lib/hello/business/authentication/sudo_mode_authentication.rb +25 -0
  100. data/lib/hello/business/authentication/sudo_mode_expiration.rb +17 -0
  101. data/lib/hello/business/base.rb +33 -0
  102. data/lib/hello/business/internationalization/update_locale.rb +33 -0
  103. data/lib/hello/business/management/add_email.rb +19 -0
  104. data/lib/hello/business/management/cancel_account.rb +22 -0
  105. data/lib/hello/business/management/confirm_email.rb +36 -0
  106. data/lib/hello/business/management/forgot_password.rb +47 -0
  107. data/lib/hello/business/management/remove_email.rb +19 -0
  108. data/lib/hello/business/management/reset_password.rb +34 -0
  109. data/lib/hello/business/management/send_confirmation_email.rb +40 -0
  110. data/lib/hello/business/management/unlink_access.rb +8 -0
  111. data/lib/hello/business/management/update_profile.rb +44 -0
  112. data/lib/hello/business/registration/sign_up.rb +159 -0
  113. data/lib/hello/configuration.rb +12 -0
  114. data/lib/hello/encryptors.rb +6 -0
  115. data/lib/hello/encryptors/complex.rb +25 -0
  116. data/lib/hello/encryptors/simple.rb +27 -0
  117. data/lib/hello/engine.rb +23 -0
  118. data/lib/hello/errors.rb +12 -0
  119. data/lib/hello/locales.rb +238 -0
  120. data/lib/hello/middleware.rb +13 -0
  121. data/lib/hello/rails_active_record.rb +10 -0
  122. data/lib/hello/rails_active_record/access.rb +65 -0
  123. data/lib/hello/rails_active_record/credential.rb +51 -0
  124. data/lib/hello/rails_active_record/email_credential.rb +60 -0
  125. data/lib/hello/rails_active_record/password_credential.rb +70 -0
  126. data/lib/hello/rails_active_record/user.rb +99 -0
  127. data/lib/hello/rails_controller.rb +124 -0
  128. data/lib/hello/rails_controller/restrict_by_role.rb +79 -0
  129. data/lib/hello/rails_helper.rb +35 -0
  130. data/lib/hello/request_manager.rb +14 -0
  131. data/lib/hello/request_manager/abstract.rb +77 -0
  132. data/lib/hello/request_manager/factory.rb +32 -0
  133. data/lib/hello/request_manager/stateful.rb +53 -0
  134. data/lib/hello/request_manager/stateful/finder.rb +58 -0
  135. data/lib/hello/request_manager/stateful/session_wrapper.rb +37 -0
  136. data/lib/hello/request_manager/stateless.rb +35 -0
  137. data/lib/hello/time_zones.rb +7 -0
  138. data/lib/hello/utils.rb +11 -0
  139. data/lib/hello/utils/device_name.rb +34 -0
  140. data/lib/hello/version.rb +4 -0
  141. data/lib/tasks/hello_tasks.rake +4 -0
  142. data/spec/bdd/hello/authentication/authorization/authorization_role_restriction_spec.rb +291 -0
  143. data/spec/bdd/hello/authentication/authorization/authorization_router_constraints_spec.rb +41 -0
  144. data/spec/bdd/hello/authentication/authorization/authorization_sensitive_restriction_spec.rb +84 -0
  145. data/spec/bdd/hello/authentication/authorization/bdd.yml +1 -0
  146. data/spec/bdd/hello/authentication/bdd.yml +1 -0
  147. data/spec/bdd/hello/authentication/classic_sign_in_spec.rb +264 -0
  148. data/spec/bdd/hello/authentication/manage_sessions_spec.rb +292 -0
  149. data/spec/bdd/hello/authentication/sign_out_spec.rb +159 -0
  150. data/spec/bdd/hello/bdd.yml +1 -0
  151. data/spec/bdd/hello/internalionalization/anyone_can_change_their_locale/bdd.yml +1 -0
  152. data/spec/bdd/hello/internalionalization/anyone_can_change_their_locale/change_locale_on_the_locale_page_spec.rb +90 -0
  153. data/spec/bdd/hello/internalionalization/anyone_can_change_their_locale/change_locale_on_the_profile_page_spec.rb +64 -0
  154. data/spec/bdd/hello/internalionalization/anyone_can_change_their_locale/change_locale_on_the_sign_in_form_spec.rb +31 -0
  155. data/spec/bdd/hello/internalionalization/anyone_can_change_their_locale/change_locale_on_the_sign_up_form_spec.rb +34 -0
  156. data/spec/bdd/hello/internalionalization/anyone_can_change_their_timezone/bdd.yml +1 -0
  157. data/spec/bdd/hello/internalionalization/anyone_can_change_their_timezone/change_timezone_on_the_profile_page_spec.rb +14 -0
  158. data/spec/bdd/hello/internalionalization/anyone_can_change_their_timezone/change_timezone_on_the_sign_in_form_spec.rb +14 -0
  159. data/spec/bdd/hello/internalionalization/anyone_can_change_their_timezone/change_timezone_on_the_sign_up_form_spec.rb +14 -0
  160. data/spec/bdd/hello/internalionalization/bdd.yml +1 -0
  161. data/spec/bdd/hello/management/bdd.yml +1 -0
  162. data/spec/bdd/hello/management/cancel_account_spec.rb +128 -0
  163. data/spec/bdd/hello/management/manage_email_credentials/bdd.yml +1 -0
  164. data/spec/bdd/hello/management/manage_email_credentials/manage_email_credentials_emails_api_spec.rb +7 -0
  165. data/spec/bdd/hello/management/manage_email_credentials/manage_email_credentials_emails_page_spec.rb +252 -0
  166. data/spec/bdd/hello/management/manage_password_credentials/bdd.yml +1 -0
  167. data/spec/bdd/hello/management/manage_password_credentials/manage_password_forgot_password_spec.rb +68 -0
  168. data/spec/bdd/hello/management/manage_password_credentials/manage_password_page_spec.rb +60 -0
  169. data/spec/bdd/hello/management/manage_password_credentials/manage_password_reset_password_spec.rb +145 -0
  170. data/spec/bdd/hello/management/manage_profile/bdd.yml +1 -0
  171. data/spec/bdd/hello/management/manage_profile/manage_profile_api_spec.rb +7 -0
  172. data/spec/bdd/hello/management/manage_profile/manage_profile_page_spec.rb +65 -0
  173. data/spec/bdd/hello/management/manage_social_credentials/bdd.yml +1 -0
  174. data/spec/bdd/hello/management/manage_social_credentials/manage_social_credentials_pending_spec.rb +7 -0
  175. data/spec/bdd/hello/management/unlink_sessions_spec.rb +59 -0
  176. data/spec/bdd/hello/other/bdd.yml +1 -0
  177. data/spec/bdd/hello/other/create_user_spec.rb +70 -0
  178. data/spec/bdd/hello/other/impersonate_user_spec.rb +58 -0
  179. data/spec/bdd/hello/other/list_users_spec.rb +86 -0
  180. data/spec/bdd/hello/registration/bdd.yml +1 -0
  181. data/spec/bdd/hello/registration/classic_sign_up_spec.rb +228 -0
  182. data/spec/bdd/hello/registration/onboarding_process_spec.rb +101 -0
  183. data/spec/bdd/hello/support.rb +62 -0
  184. data/spec/business/hello/authentication/sign_in_spec.rb +72 -0
  185. data/spec/business/hello/registration/sign_up_spec.rb +258 -0
  186. data/spec/controllers/authentication_spec.rb +97 -0
  187. data/spec/controllers/localization_spec.rb +65 -0
  188. data/spec/controllers/request_can_carry_an_access_token_spec.rb +223 -0
  189. data/spec/fixtures/hello/password_mailer/confirmation +3 -0
  190. data/spec/fixtures/hello/password_mailer/forgot +3 -0
  191. data/spec/fixtures/hello/password_mailer/sign_up +3 -0
  192. data/spec/mailers/hello/mailer_spec.rb +53 -0
  193. data/spec/models/access_spec.rb +19 -0
  194. data/spec/models/credential_spec.rb +9 -0
  195. data/spec/models/email_credential_spec.rb +163 -0
  196. data/spec/models/hello/sign_up_model_spec.rb +64 -0
  197. data/spec/models/password_credential_spec.rb +75 -0
  198. data/spec/models/user_spec.rb +93 -0
  199. data/spec/others/configuration_spec.rb +25 -0
  200. data/spec/others/encryptors/complex_spec.rb +26 -0
  201. data/spec/others/encryptors/simple_spec.rb +21 -0
  202. data/spec/others/helper_spec.rb +10 -0
  203. data/spec/others/localization_consistency_spec.rb +73 -0
  204. data/spec/requests/forgot_password_spec.rb +36 -0
  205. data/spec/requests/reset_password_spec.rb +7 -0
  206. data/spec/requests/security/user_spec.rb +19 -0
  207. data/spec/routing/hello/accesses_routing_spec.rb +17 -0
  208. data/spec/routing/hello/emails_routing_spec.rb +37 -0
  209. data/spec/routing/hello/locale_routing_spec.rb +17 -0
  210. data/spec/routing/hello/profile_routing_spec.rb +29 -0
  211. data/spec/routing/hello/registration_routing_spec.rb +23 -0
  212. data/spec/routing/hello/sign_out_routing_spec.rb +11 -0
  213. data/spec/routing/hello/sudo_mode_routing_spec.rb +23 -0
  214. data/spec/routing/hello/users_routing_spec.rb +15 -0
  215. data/spec/spec_helper.rb +9 -0
  216. data/spec/spec_helper/codeclimate.rb +2 -0
  217. data/spec/spec_helper/configure_rspec.rb +23 -0
  218. data/spec/spec_helper/create_database.rb +5 -0
  219. data/spec/spec_helper/dummy_and_test_dependencies.rb +17 -0
  220. data/spec/spec_helper/support.rb +1 -0
  221. data/spec/support/factories.rb +60 -0
  222. data/spec/support/feature_injection.rb +118 -0
  223. data/spec/support/features/feature_support_given.rb +46 -0
  224. data/spec/support/features/feature_support_then.rb +43 -0
  225. data/spec/support/helpers/aliases.rb +76 -0
  226. data/spec/support/helpers/configuration.rb +6 -0
  227. data/spec/support/helpers/current.rb +16 -0
  228. data/spec/support/helpers/expect.rb +61 -0
  229. data/spec/support/helpers/given.rb +49 -0
  230. data/spec/support/helpers/shortcuts.rb +24 -0
  231. data/spec/support/helpers/then.rb +29 -0
  232. data/spec/support/helpers/when.rb +108 -0
  233. data/spec/support/requests/request_support.rb +8 -0
  234. data/spec/utils/device_name_spec.rb +228 -0
  235. metadata +562 -11
@@ -0,0 +1,8 @@
1
+ module Hello
2
+ module Business
3
+ module Authentication
4
+ class SignOut < Base
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,25 @@
1
+ module Hello
2
+ module Business
3
+ module Authentication
4
+ class SudoModeAuthentication < Base
5
+ attr_reader :access
6
+
7
+ def initialize(access)
8
+ @access = access
9
+ end
10
+
11
+ def authenticate!(password)
12
+ if access.user.password_is?(password)
13
+ access.update!(sudo_expires_at: sudo_expires_at)
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def sudo_expires_at
20
+ Hello.configuration.sudo_expires_in.from_now
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ module Hello
2
+ module Business
3
+ module Authentication
4
+ class SudoModeExpiration < Base
5
+ attr_reader :access
6
+
7
+ def initialize(access)
8
+ @access = access
9
+ end
10
+
11
+ def expire!
12
+ access.sudo_expire!
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,33 @@
1
+ module Hello
2
+ module Business
3
+ class Base
4
+ include ActiveModel::Model
5
+
6
+ def errors
7
+ @errors ||= ActiveModel::Errors.new(self)
8
+ end
9
+
10
+ def error_message(extra = {})
11
+ t('error', { count: errors.count }.merge(extra))
12
+ end
13
+
14
+ def alert_message(extra = {})
15
+ t('alert', extra)
16
+ end
17
+
18
+ def success_message(extra = {})
19
+ t('success', extra)
20
+ end
21
+
22
+ def t(key, extra = {})
23
+ I18n.t("#{i18n_scope}.#{key}", extra)
24
+ end
25
+
26
+ protected
27
+
28
+ def i18n_scope
29
+ self.class.name.underscore.tr('/', '.')
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,33 @@
1
+ module Hello
2
+ module Business
3
+ module Internationalization
4
+ class UpdateLocale < Base
5
+ def initialize(locale)
6
+ @locale = locale
7
+ end
8
+
9
+ def locale
10
+ locale_if_available || I18n.default_locale
11
+ end
12
+
13
+ def success_message(_extra = {})
14
+ super(locale_name: current_locale_name)
15
+ end
16
+
17
+ private
18
+
19
+ def locale_if_available
20
+ ([@locale] & locales).first
21
+ end
22
+
23
+ def locales
24
+ Hello.configuration.locales
25
+ end
26
+
27
+ def current_locale_name
28
+ I18n.t('hello.locale_name')
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,19 @@
1
+ module Hello
2
+ module Business
3
+ module Management
4
+ class AddEmail < Base
5
+ def initialize(email_credential)
6
+ @email_credential = email_credential
7
+ end
8
+
9
+ def success_message
10
+ super(email: @email_credential.email)
11
+ end
12
+
13
+ def error_message
14
+ @email_credential.errors.full_messages.first
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,22 @@
1
+ module Hello
2
+ module Business
3
+ module Management
4
+ class CancelAccount < Base
5
+
6
+ def initialize(user)
7
+ @user = user
8
+ end
9
+
10
+ def cancel_account
11
+ @user.destroy!
12
+ rescue ActiveRecord::RecordNotDestroyed => invalid
13
+ false
14
+ end
15
+
16
+ def info_message
17
+ t('info')
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,36 @@
1
+ module Hello
2
+ module Business
3
+ module Management
4
+ class ConfirmEmail < Base
5
+ attr_reader :credential
6
+
7
+ def initialize(credential)
8
+ @credential = credential
9
+ end
10
+
11
+ def validate_token(unencrypted_token)
12
+ # puts "validate_token('#{unencrypted_token}')".blue
13
+ return false unless found_credential?
14
+ return true if credential.verifying_token_is?(unencrypted_token)
15
+ @credential = nil
16
+ end
17
+
18
+ def confirm_with_token(token)
19
+ validate_token(token) && confirm_email!
20
+ end
21
+
22
+ def confirm_email!
23
+ credential.confirm_email!
24
+ end
25
+
26
+ def found_credential?
27
+ !!credential
28
+ end
29
+
30
+ def success_message
31
+ super(email: credential.email)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,47 @@
1
+ module Hello
2
+ module Business
3
+ module Management
4
+ class ForgotPassword < Base
5
+ attr_accessor :login
6
+ attr_reader :user
7
+
8
+ def initialize(attrs = nil)
9
+ if attrs
10
+ @login = attrs[:login]
11
+ @user = find_user
12
+ end
13
+ end
14
+
15
+ def reset
16
+ if user.present?
17
+ true
18
+ else
19
+ errors.add(:login, 'was not found')
20
+ false
21
+ end
22
+ end
23
+
24
+ def email?
25
+ login.to_s.include? '@'
26
+ end
27
+
28
+ def success_message(_extra = {})
29
+ super(login: @login)
30
+ end
31
+
32
+ private
33
+
34
+ # initialize helpers
35
+
36
+ def find_user
37
+ if email?
38
+ credential = ::EmailCredential.find_by_email(login)
39
+ credential.user
40
+ else
41
+ ::User.where(username: login).first
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,19 @@
1
+ module Hello
2
+ module Business
3
+ module Management
4
+ class RemoveEmail < Base
5
+ def initialize(email_credential)
6
+ @email_credential = email_credential
7
+ end
8
+
9
+ def success_message
10
+ super(email: @email_credential.email)
11
+ end
12
+
13
+ def error_message
14
+ @email_credential.errors.full_messages.first
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,34 @@
1
+ module Hello
2
+ module Business
3
+ module Management
4
+ class ResetPassword < Base
5
+ attr_reader :password_credential
6
+
7
+ def initialize(password_credential)
8
+ @password_credential = password_credential
9
+ end
10
+
11
+ def update_password(plain_text_password)
12
+ if @password_credential.update(password: plain_text_password)
13
+ @password_credential.reset_verifying_token!
14
+ return true
15
+ else
16
+ merge_errors_to_self
17
+ return false
18
+ end
19
+ end
20
+
21
+ def user
22
+ password_credential.user
23
+ end
24
+
25
+ private
26
+
27
+ def merge_errors_to_self
28
+ hash = @password_credential.errors.to_hash
29
+ hash.each { |k, v| v.each { |v1| errors.add(k, v1) } }
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,40 @@
1
+ module Hello
2
+ module Business
3
+ module Management
4
+ class SendConfirmationEmail < Base
5
+ attr_reader :controller, :email_credential
6
+
7
+ def initialize(controller, email_credential)
8
+ @controller = controller
9
+ @email_credential = email_credential
10
+ end
11
+
12
+ def deliver
13
+ token = email_credential.reset_verifying_token!
14
+ check_token!(token)
15
+ url = controller.confirm_email_url(email_credential, token)
16
+ mail = Hello::Mailer.confirm_email(email, user, url)
17
+ mail.deliver
18
+ end
19
+
20
+ def success_message(_extra = {})
21
+ super(email: email_credential.email)
22
+ end
23
+
24
+ private
25
+
26
+ def email
27
+ email_credential.email
28
+ end
29
+
30
+ def user
31
+ email_credential.user
32
+ end
33
+
34
+ def check_token!(unencrypted_token)
35
+ fail 'no match' unless email_credential.verifying_token_is?(unencrypted_token)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,8 @@
1
+ module Hello
2
+ module Business
3
+ module Management
4
+ class UnlinkAccess < Base
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,44 @@
1
+ module Hello
2
+ module Business
3
+ module Management
4
+ class UpdateProfile < Base
5
+ def initialize(user)
6
+ @user = user
7
+ self.class.send :attr_accessor, *permitted_column_names
8
+ end
9
+
10
+ def update(attrs)
11
+ # puts "update(#{attrs})".blue
12
+ clear_attrs(attrs).each do |k, v|
13
+ # puts "@user.send('#{k}=', '#{v}')".blue
14
+ @user.send("#{k}=", v)
15
+ end
16
+ @user.save
17
+ end
18
+
19
+ # def update(attrs)
20
+ # @user.update(clear_attrs(attrs))
21
+ # end
22
+
23
+ def errors
24
+ @user.errors
25
+ end
26
+
27
+ private
28
+
29
+ def clear_attrs(attrs)
30
+ attrs.slice(*permitted_column_names)
31
+ end
32
+
33
+ def permitted_column_names
34
+ ignore_columns = %w(id created_at updated_at role)
35
+ the_columns = ::User.column_names
36
+ the_columns -= ignore_columns
37
+ the_columns.reject! { |column| column.ends_with? '_count' }
38
+ the_columns.reject! { |column| column.starts_with? 'password_' }
39
+ the_columns
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,159 @@
1
+ module Hello
2
+ module Business
3
+ module Registration
4
+ class SignUp < Base
5
+ attr_reader :email_credential, :password_credential, :user
6
+
7
+ def initialize
8
+ generate_accessors
9
+ write_defaults
10
+ end
11
+
12
+ def register(attrs)
13
+ write_attrs(attrs.with_indifferent_access)
14
+ create_models
15
+ end
16
+
17
+ # errors.added? DOES NOT WORK when the validation was given a custom message :)
18
+ def email_taken?
19
+ @email_credential && @email_credential.errors.added?(:email, :taken)
20
+ end
21
+
22
+ # errors.added? DOES NOT WORK when the validation was given a custom message :)
23
+ def username_taken?
24
+ @user && user.errors.added?(:username, :taken)
25
+ end
26
+
27
+ private
28
+
29
+ # initialize helpers
30
+
31
+ def generate_accessors
32
+ self.class.send :attr_accessor, *all_fields
33
+ end
34
+
35
+ def all_fields
36
+ user_fields + %w(email password)
37
+ end
38
+
39
+ def write_defaults
40
+ # defaults.each { |k, v| instance_variable_set(:"@#{k}", v) }
41
+ defaults.each { |k, v| send("#{k}=", v) }
42
+ end
43
+
44
+ # save helpers
45
+
46
+ def write_attrs(attrs)
47
+ # attrs.slice(*all_fields).each { |k, v| instance_variable_set(:"@#{k}", v) if v }
48
+ attrs.slice(*all_fields).each { |k, v| send("#{k}=", v) if v }
49
+ end
50
+
51
+ # NOTE:
52
+ # All validations are delegated to the models
53
+ def create_models
54
+ validate_presences
55
+ return false if errors.any?
56
+
57
+ build_and_validate_models
58
+ return false if errors.any?
59
+
60
+ save_models!
61
+ true
62
+ end
63
+
64
+ def validate_presences
65
+ validates_presence_of :email if validates_presence_of_email?
66
+
67
+ validates_presence_of :username if validates_presence_of_username?
68
+
69
+ validates_presence_of :password if validates_presence_of_password?
70
+
71
+ ::User.validators.each do |validator|
72
+ next unless validator.is_a?(ActiveRecord::Validations::PresenceValidator)
73
+ next unless validator.attributes.first.to_sym != :username
74
+ options = validator.options.dup
75
+ options[:attributes] = validator.attributes
76
+ validates_with(validator.class, options)
77
+ end
78
+ end
79
+
80
+ def build_and_validate_models
81
+ # user & username
82
+ @user = ::User.new(user_attributes)
83
+ if username.blank? && !validates_presence_of_username?
84
+ user.set_generated_username
85
+ end
86
+ merge_errors_for(user)
87
+
88
+ # email_credential & email
89
+ if email.present? || validates_presence_of_email?
90
+ @email_credential = ::EmailCredential.new user: @user, email: email
91
+ merge_errors_for(email_credential)
92
+ end
93
+
94
+ # password_credential & password
95
+ @password_credential = ::PasswordCredential.new user: @user, password: password
96
+ if password.blank? && !validates_presence_of_password?
97
+ password_credential.set_generated_password
98
+ end
99
+ merge_errors_for(password_credential)
100
+ end
101
+
102
+ def merge_errors_for(model)
103
+ model.valid?
104
+ model.errors.each do |k, v|
105
+ errors.add(k, v)
106
+ end
107
+ end
108
+
109
+ def save_models!
110
+ user.save!
111
+ email_credential && email_credential.save!
112
+ password_credential.save!
113
+ end
114
+
115
+ # returns {name: "...", city: "..."}
116
+ def user_attributes
117
+ r = {}
118
+ user_fields.each { |k| r[k.to_s] = instance_variable_get(:"@#{k}") }
119
+ r['role'] = starting_role
120
+ r
121
+ end
122
+
123
+ def starting_role
124
+ 'onboarding'
125
+ end
126
+
127
+ def user_fields
128
+ Hello.configuration.sign_up_fields.map(&:to_s)
129
+ end
130
+
131
+ def defaults
132
+ {
133
+ locale: I18n.locale.to_s,
134
+ time_zone: Time.zone.name
135
+ }
136
+ end
137
+
138
+ # config helpers
139
+
140
+ def validates_presence_of_email?
141
+ Hello.configuration.email_presence
142
+ end
143
+
144
+ def validates_presence_of_username?
145
+ Hello.configuration.username_presence
146
+ end
147
+
148
+ def validates_presence_of_password?
149
+ Hello.configuration.password_presence
150
+ end
151
+
152
+ # just because!
153
+
154
+ def self._reflect_on_association(*_args)
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end