avocado 0.5.0 → 0.7.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 +4 -4
- data/CHANGELOG.md +59 -14
- data/README.md +8 -43
- data/Rakefile +0 -2
- data/app/controllers/avocado/affirmations_controller.rb +21 -18
- data/app/controllers/avocado/base_controller.rb +26 -5
- data/app/controllers/avocado/credentials_controller.rb +41 -0
- data/app/controllers/avocado/emails_controller.rb +9 -17
- data/app/controllers/avocado/events_controller.rb +3 -3
- data/app/controllers/avocado/passwords_controller.rb +8 -8
- data/app/controllers/avocado/recoveries_controller.rb +8 -41
- data/app/controllers/avocado/registrations_controller.rb +7 -14
- data/app/controllers/avocado/sessions_controller.rb +21 -13
- data/app/controllers/avocado/verifications_controller.rb +14 -15
- data/app/views/avocado/affirmations/_form.html.erb +4 -0
- data/app/views/avocado/affirmations/edit.html.erb +7 -0
- data/app/views/avocado/affirmations/new.html.erb +2 -4
- data/app/views/avocado/{recoveries/edit.html.erb → credentials/_form.html.erb} +4 -13
- data/app/views/avocado/credentials/edit.html.erb +12 -0
- data/app/views/avocado/emails/_form.html.erb +8 -0
- data/app/views/avocado/emails/edit.html.erb +1 -6
- data/app/views/avocado/mailer/email_affirmation.text.erb +1 -1
- data/app/views/avocado/mailer/email_verification.text.erb +1 -1
- data/app/views/avocado/mailer/password_reset.text.erb +1 -1
- data/app/views/avocado/passwords/_form.html.erb +12 -0
- data/app/views/avocado/passwords/edit.html.erb +1 -9
- data/app/views/avocado/recoveries/_form.html.erb +4 -0
- data/app/views/avocado/recoveries/new.html.erb +2 -4
- data/app/views/avocado/registrations/_form.html.erb +12 -0
- data/app/views/avocado/registrations/new.html.erb +1 -12
- data/app/views/avocado/sessions/_form.html.erb +8 -0
- data/app/views/avocado/sessions/new.html.erb +1 -4
- data/app/views/avocado/verifications/edit.html.erb +7 -0
- data/config/locales/en.yml +45 -0
- data/config/routes/avocado.rb +11 -0
- data/config.ru +0 -2
- data/docs/USAGE.md +164 -0
- data/lib/avocado/authentication.rb +2 -4
- data/lib/avocado/current.rb +0 -2
- data/lib/avocado/engine.rb +5 -2
- data/lib/avocado/event.rb +0 -2
- data/lib/avocado/mailer.rb +0 -2
- data/lib/avocado/session.rb +6 -2
- data/lib/avocado/session_callbacks.rb +0 -2
- data/lib/avocado/user.rb +0 -2
- data/lib/avocado/user_callbacks.rb +0 -2
- data/lib/avocado/user_tokens.rb +0 -2
- data/lib/avocado/user_validations.rb +0 -2
- data/lib/avocado/version.rb +1 -3
- data/lib/avocado.rb +1 -2
- data/lib/generators/avocado/migrations/migrations_generator.rb +34 -0
- data/lib/generators/avocado/migrations/templates/create_events.rb.tt +12 -0
- data/lib/generators/avocado/migrations/templates/create_sessions.rb.tt +12 -0
- data/lib/generators/avocado/migrations/templates/create_users.rb.tt +11 -0
- data/lib/generators/avocado/views/views_generator.rb +21 -0
- metadata +27 -38
- data/config/routes.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e9ec8adfbc4563b5bbcddd5d5406963b4a9fe7d5a38765e35a86c9a3d35a09a0
|
4
|
+
data.tar.gz: 6db1dfa3a370661017533e44f2278a09daeece5c145267f05f0bced8943ea910
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9761662e0cf44fab571f6f6003aed2c0be2ae56424afbc1cc4b3ccb2f0d856a3e4d3b7a67c8a9e82b7d408977ebb30b4f1f61d9af0fd24db17c3fcb5c944cd89
|
7
|
+
data.tar.gz: a8021001d0f4864a36c981b2c5d18b71bca432f4f4b6fcde4ff6f07c38e7fc39f766dd39670041582cacb9a80526423eafd8156b5d8fc0580189679a1b67d144
|
data/CHANGELOG.md
CHANGED
@@ -1,33 +1,78 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
1
3
|
## [Unreleased]
|
2
4
|
|
5
|
+
## [0.7.0] - 2023-08-10
|
6
|
+
|
7
|
+
### Added
|
8
|
+
|
9
|
+
- An `avocado:views` generator copies engine views into application
|
10
|
+
|
11
|
+
### Changed
|
12
|
+
|
13
|
+
- Flash messages for controllers moved to i18n yml
|
14
|
+
- View forms updated to use `_form` partials
|
15
|
+
- Move the reset phase of password recovery to a `Credentials` controller
|
16
|
+
|
17
|
+
## [0.6.0] - 2023-07-25
|
18
|
+
|
19
|
+
### Added
|
20
|
+
|
21
|
+
- Migration generator
|
22
|
+
|
23
|
+
### Changed
|
24
|
+
|
25
|
+
- Affirmation and Verification paths require user action
|
26
|
+
- Use session `token` instead of `id` for signed cookie value
|
27
|
+
|
3
28
|
## [0.5.0] - 2023-07-21
|
4
29
|
|
5
|
-
|
6
|
-
|
7
|
-
-
|
8
|
-
-
|
9
|
-
-
|
30
|
+
### Added
|
31
|
+
|
32
|
+
- Controller for "passwordless" email-link sign-in
|
33
|
+
- `Event` class to log user auth events
|
34
|
+
- User-facing email and password edit pages
|
35
|
+
- Misc event logging callbacks
|
36
|
+
|
37
|
+
### Changed
|
38
|
+
|
39
|
+
- Sign out all non-current sessions when password changes
|
10
40
|
|
11
41
|
## [0.4.0] - 2023-07-19
|
12
42
|
|
43
|
+
### Added
|
44
|
+
|
45
|
+
- Controllers for signing up, signing in, password reset and email verification
|
46
|
+
|
47
|
+
### Changed
|
48
|
+
|
13
49
|
- Convert the `Avocado::Mailer` module into a class
|
14
|
-
- Add controllers for signing up, signing in, password reset and email
|
15
|
-
verification
|
16
50
|
|
17
51
|
## [0.3.0] - 2023-07-17
|
18
52
|
|
19
|
-
|
53
|
+
### Added
|
54
|
+
|
55
|
+
- `Avocado::Mailer` which generates each of the signed ids
|
56
|
+
|
57
|
+
### Changed
|
58
|
+
|
20
59
|
- Rename `password_recovery` to `password_reset`
|
21
60
|
|
22
61
|
## [0.2.0] - 2023-07-15
|
23
62
|
|
24
|
-
|
25
|
-
|
26
|
-
-
|
27
|
-
-
|
63
|
+
### Added
|
64
|
+
|
65
|
+
- Validations for presence, uniqueness, and format on `email` attribute
|
66
|
+
- Normalizer for email value during save
|
67
|
+
- Validations on password format and length
|
68
|
+
- Token generator for password recovery
|
69
|
+
|
70
|
+
### Changed
|
71
|
+
|
28
72
|
- Rename `Avocado::UserConcern` to `Avocado::User`
|
29
73
|
|
30
74
|
## [0.1.0] - 2023-07-14
|
31
75
|
|
32
|
-
|
33
|
-
|
76
|
+
### Added
|
77
|
+
|
78
|
+
- `Avocado::UserConcern` which calls `has_secure_password`
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
#
|
1
|
+
# 🥑
|
2
2
|
|
3
|
-
|
3
|
+
Authentication library for [Rails] 7.1+ applications.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -10,49 +10,13 @@ Add to the application's Gemfile by executing:
|
|
10
10
|
|
11
11
|
## Usage
|
12
12
|
|
13
|
-
|
14
|
-
such features via a packaged gem, you can include some Avocado modules into your
|
15
|
-
application to get authentication functionality.
|
16
|
-
|
17
|
-
As a prerequisite, you should have a database schema with columns that match the
|
18
|
-
users and sessions tables from [the demo app schema]. It's ok to have more
|
19
|
-
columns, but you need at least what is shown there.
|
20
|
-
|
21
|
-
With that set, include the modules into your classes:
|
22
|
-
|
23
|
-
```ruby
|
24
|
-
class User < ApplicationRecord
|
25
|
-
include Avocado::User
|
26
|
-
end
|
27
|
-
|
28
|
-
class Session < ApplicationRecord
|
29
|
-
include Avocado::Session
|
30
|
-
end
|
31
|
-
|
32
|
-
class Event < ApplicationRecord
|
33
|
-
include Avocado::Event
|
34
|
-
end
|
35
|
-
|
36
|
-
class ApplicationController < ActionController::Base
|
37
|
-
include Avocado::Authentication
|
38
|
-
end
|
39
|
-
```
|
40
|
-
|
41
|
-
This will enable a few things:
|
42
|
-
|
43
|
-
- Models will get validations, associations, and normalizations
|
44
|
-
- Rails built-in `has_secure_password` is called within `User`
|
45
|
-
- A mailer with signed token generators is created
|
46
|
-
- Controllers and Routes for sign up, sign in, password reset, email
|
47
|
-
verification, etc
|
48
|
-
|
49
|
-
The `spec/internal` app within this repo has some example usage.
|
13
|
+
Read the [documentation] for more details or the [wiki] for background.
|
50
14
|
|
51
15
|
## Development
|
52
16
|
|
53
|
-
After checking out the repo, run `bin/setup` to install dependencies.
|
54
|
-
`
|
55
|
-
|
17
|
+
After checking out the repo, run `bin/setup` to install dependencies. Use
|
18
|
+
`bin/rspec` to run the full spec suite and `bin/standardrb` to run the linter.
|
19
|
+
Running `bin/rake` will run specs & linter.
|
56
20
|
|
57
21
|
## Contributing
|
58
22
|
|
@@ -62,7 +26,8 @@ Bug reports and pull requests are welcome on [GitHub].
|
|
62
26
|
|
63
27
|
The gem is available as open source under the terms of the [MIT License].
|
64
28
|
|
29
|
+
[documentation]: https://github.com/tcuwp/avocado/blob/main/docs/USAGE.md
|
65
30
|
[GitHub]: https://github.com/tcuwp/avocado
|
66
31
|
[MIT License]: https://opensource.org/licenses/MIT
|
67
32
|
[Rails]: https://github.com/rails/rails
|
68
|
-
[
|
33
|
+
[wiki]: https://github.com/tcuwp/avocado/wiki
|
data/Rakefile
CHANGED
@@ -1,23 +1,28 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
module Avocado
|
4
2
|
class AffirmationsController < BaseController
|
5
3
|
skip_before_action :authenticate
|
6
4
|
|
7
|
-
before_action :set_user,
|
8
|
-
|
5
|
+
before_action :set_user,
|
6
|
+
only: %i[edit update]
|
7
|
+
before_action :verify_user,
|
8
|
+
only: :create
|
9
9
|
|
10
10
|
def new
|
11
11
|
end
|
12
12
|
|
13
|
-
def show
|
14
|
-
sign_in(@user)
|
15
|
-
redirect_to(root_path, notice: "Signed in successfully")
|
16
|
-
end
|
17
|
-
|
18
13
|
def create
|
19
14
|
send_affirmation_email
|
20
|
-
redirect_to new_session_path,
|
15
|
+
redirect_to new_session_path,
|
16
|
+
notice: t(".success")
|
17
|
+
end
|
18
|
+
|
19
|
+
def edit
|
20
|
+
end
|
21
|
+
|
22
|
+
def update
|
23
|
+
sign_in(@user)
|
24
|
+
redirect_to root_path,
|
25
|
+
notice: t(".success")
|
21
26
|
end
|
22
27
|
|
23
28
|
private
|
@@ -25,7 +30,8 @@ module Avocado
|
|
25
30
|
def set_user
|
26
31
|
@user = user_from_signed_affirmation_token
|
27
32
|
rescue ActiveSupport::MessageVerifier::InvalidSignature
|
28
|
-
redirect_to new_affirmation_path,
|
33
|
+
redirect_to new_affirmation_path,
|
34
|
+
alert: t(".errors.invalid_token")
|
29
35
|
end
|
30
36
|
|
31
37
|
def user_from_signed_affirmation_token
|
@@ -33,19 +39,16 @@ module Avocado
|
|
33
39
|
end
|
34
40
|
|
35
41
|
def verify_user
|
36
|
-
unless
|
37
|
-
redirect_to new_affirmation_path,
|
42
|
+
unless requested_verified_user
|
43
|
+
redirect_to new_affirmation_path,
|
44
|
+
alert: t(".errors.unverified_email")
|
38
45
|
end
|
39
46
|
end
|
40
47
|
|
41
48
|
def send_affirmation_email
|
42
|
-
mailer_for(
|
49
|
+
mailer_for(requested_verified_user)
|
43
50
|
.email_affirmation
|
44
51
|
.deliver_later
|
45
52
|
end
|
46
|
-
|
47
|
-
def user_from_params_email
|
48
|
-
::User.verified.find_by(email: params[:email])
|
49
|
-
end
|
50
53
|
end
|
51
54
|
end
|
@@ -1,21 +1,42 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
module Avocado
|
4
2
|
class BaseController < ApplicationController
|
3
|
+
FINDER_PARAMETERS = %i[email]
|
4
|
+
|
5
5
|
private
|
6
6
|
|
7
7
|
def verify_password_challenge
|
8
8
|
unless current_user.authenticate(params_password_challenge)
|
9
|
-
redirect_back
|
9
|
+
redirect_back fallback_location: root_path,
|
10
|
+
alert: t("avocado.filters.invalid_password_challenge")
|
10
11
|
end
|
11
12
|
end
|
12
13
|
|
13
14
|
def params_password_challenge
|
14
|
-
params
|
15
|
+
params
|
16
|
+
.dig(:user, :password_challenge)
|
17
|
+
end
|
18
|
+
|
19
|
+
def requested_verified_user
|
20
|
+
::User
|
21
|
+
.verified
|
22
|
+
.find_by(email: finder_parameters[:email])
|
23
|
+
end
|
24
|
+
|
25
|
+
def finder_parameters
|
26
|
+
params
|
27
|
+
.require(:user)
|
28
|
+
.permit(FINDER_PARAMETERS)
|
15
29
|
end
|
16
30
|
|
17
31
|
def mailer_for(user)
|
18
|
-
Avocado::Mailer
|
32
|
+
Avocado::Mailer
|
33
|
+
.with(user: user)
|
34
|
+
end
|
35
|
+
|
36
|
+
def send_email_verification(user)
|
37
|
+
mailer_for(user)
|
38
|
+
.email_verification
|
39
|
+
.deliver_later
|
19
40
|
end
|
20
41
|
end
|
21
42
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Avocado
|
2
|
+
class CredentialsController < BaseController
|
3
|
+
UPDATE_PARAMETERS = %i[password password_confirmation]
|
4
|
+
|
5
|
+
skip_before_action :authenticate
|
6
|
+
|
7
|
+
before_action :set_user
|
8
|
+
|
9
|
+
def edit
|
10
|
+
end
|
11
|
+
|
12
|
+
def update
|
13
|
+
if @user.update(update_parameters)
|
14
|
+
redirect_to new_session_path,
|
15
|
+
notice: t(".success")
|
16
|
+
else
|
17
|
+
render :edit, status: :unprocessable_entity
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def set_user
|
24
|
+
@user = user_from_signed_password_reset_token
|
25
|
+
rescue ActiveSupport::MessageVerifier::InvalidSignature
|
26
|
+
redirect_to new_recovery_path,
|
27
|
+
alert: t(".errors.invalid_token")
|
28
|
+
end
|
29
|
+
|
30
|
+
def user_from_signed_password_reset_token
|
31
|
+
::User
|
32
|
+
.find_by_token_for!(:password_reset, params[:id])
|
33
|
+
end
|
34
|
+
|
35
|
+
def update_parameters
|
36
|
+
params
|
37
|
+
.require(:user)
|
38
|
+
.permit(UPDATE_PARAMETERS)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -1,18 +1,19 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
module Avocado
|
4
2
|
class EmailsController < BaseController
|
5
|
-
|
3
|
+
UPDATE_PARAMETERS = %i[email]
|
6
4
|
|
7
5
|
before_action :set_user
|
8
|
-
before_action :verify_password_challenge,
|
6
|
+
before_action :verify_password_challenge,
|
7
|
+
only: :update
|
9
8
|
|
10
9
|
def edit
|
11
10
|
end
|
12
11
|
|
13
12
|
def update
|
14
|
-
if @user.update(
|
13
|
+
if @user.update(update_parameters)
|
15
14
|
process_email_update
|
15
|
+
redirect_to root_path,
|
16
|
+
notice: t(".success")
|
16
17
|
else
|
17
18
|
render :edit, status: :unprocessable_entity
|
18
19
|
end
|
@@ -24,25 +25,16 @@ module Avocado
|
|
24
25
|
@user = current_user
|
25
26
|
end
|
26
27
|
|
27
|
-
def
|
28
|
+
def update_parameters
|
28
29
|
params
|
29
30
|
.require(:user)
|
30
|
-
.permit(
|
31
|
+
.permit(UPDATE_PARAMETERS)
|
31
32
|
end
|
32
33
|
|
33
34
|
def process_email_update
|
34
35
|
if @user.email_previously_changed?
|
35
|
-
|
36
|
-
redirect_to root_path, notice: "Your email has been changed"
|
37
|
-
else
|
38
|
-
redirect_to root_path
|
36
|
+
send_email_verification(@user)
|
39
37
|
end
|
40
38
|
end
|
41
|
-
|
42
|
-
def resend_email_verification
|
43
|
-
mailer_for(@user)
|
44
|
-
.email_verification
|
45
|
-
.deliver_later
|
46
|
-
end
|
47
39
|
end
|
48
40
|
end
|
@@ -1,18 +1,18 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
module Avocado
|
4
2
|
class PasswordsController < BaseController
|
5
|
-
|
3
|
+
UPDATE_PARAMETERS = %i[password password_confirmation password_challenge]
|
6
4
|
|
7
5
|
before_action :set_user
|
8
|
-
before_action :verify_password_challenge,
|
6
|
+
before_action :verify_password_challenge,
|
7
|
+
only: :update
|
9
8
|
|
10
9
|
def edit
|
11
10
|
end
|
12
11
|
|
13
12
|
def update
|
14
|
-
if @user.update(
|
15
|
-
redirect_to root_path,
|
13
|
+
if @user.update(update_parameters)
|
14
|
+
redirect_to root_path,
|
15
|
+
notice: t(".success")
|
16
16
|
else
|
17
17
|
render :edit, status: :unprocessable_entity
|
18
18
|
end
|
@@ -24,10 +24,10 @@ module Avocado
|
|
24
24
|
@user = current_user
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
27
|
+
def update_parameters
|
28
28
|
params
|
29
29
|
.require(:user)
|
30
|
-
.permit(
|
30
|
+
.permit(UPDATE_PARAMETERS)
|
31
31
|
.with_defaults(password_challenge: "")
|
32
32
|
end
|
33
33
|
end
|
@@ -1,63 +1,30 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
module Avocado
|
4
2
|
class RecoveriesController < BaseController
|
5
|
-
PERMITTED_PARAMS = %i[password password_confirmation]
|
6
|
-
|
7
3
|
skip_before_action :authenticate
|
8
4
|
|
9
|
-
before_action :
|
10
|
-
|
5
|
+
before_action :verify_user,
|
6
|
+
only: :create
|
11
7
|
|
12
8
|
def new
|
13
9
|
end
|
14
10
|
|
15
|
-
def edit
|
16
|
-
end
|
17
|
-
|
18
11
|
def create
|
19
12
|
send_password_reset_email
|
20
|
-
redirect_to new_session_path,
|
21
|
-
|
22
|
-
|
23
|
-
def update
|
24
|
-
if @user.update(user_params)
|
25
|
-
redirect_to new_session_path, notice: "Password reset successfully. Please sign in."
|
26
|
-
else
|
27
|
-
render :edit, status: :unprocessable_entity
|
28
|
-
end
|
13
|
+
redirect_to new_session_path,
|
14
|
+
notice: t(".success")
|
29
15
|
end
|
30
16
|
|
31
17
|
private
|
32
18
|
|
33
|
-
def set_user
|
34
|
-
@user = user_from_signed_password_reset_token
|
35
|
-
rescue ActiveSupport::MessageVerifier::InvalidSignature
|
36
|
-
redirect_to new_recovery_path, alert: "Password reset link is invalid."
|
37
|
-
end
|
38
|
-
|
39
|
-
def user_from_signed_password_reset_token
|
40
|
-
::User.find_by_token_for!(:password_reset, params[:id])
|
41
|
-
end
|
42
|
-
|
43
19
|
def verify_user
|
44
|
-
unless
|
45
|
-
redirect_to new_recovery_path,
|
20
|
+
unless requested_verified_user
|
21
|
+
redirect_to new_recovery_path,
|
22
|
+
alert: t(".errors.unverified_email")
|
46
23
|
end
|
47
24
|
end
|
48
25
|
|
49
|
-
def user_params
|
50
|
-
params
|
51
|
-
.require(:user)
|
52
|
-
.permit(PERMITTED_PARAMS)
|
53
|
-
end
|
54
|
-
|
55
|
-
def user_from_params_email
|
56
|
-
::User.find_by(email: params[:email], verified: true)
|
57
|
-
end
|
58
|
-
|
59
26
|
def send_password_reset_email
|
60
|
-
mailer_for(
|
27
|
+
mailer_for(requested_verified_user)
|
61
28
|
.password_reset
|
62
29
|
.deliver_later
|
63
30
|
end
|
@@ -1,8 +1,6 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
module Avocado
|
4
2
|
class RegistrationsController < BaseController
|
5
|
-
|
3
|
+
INITIALIZATION_PARAMETERS = %i[email password password_confirmation]
|
6
4
|
|
7
5
|
skip_before_action :authenticate
|
8
6
|
|
@@ -11,13 +9,14 @@ module Avocado
|
|
11
9
|
end
|
12
10
|
|
13
11
|
def create
|
14
|
-
@user = ::User.new(
|
12
|
+
@user = ::User.new(initialization_parameters)
|
15
13
|
|
16
14
|
if @user.save
|
17
15
|
sign_in(@user)
|
18
16
|
|
19
|
-
send_email_verification
|
20
|
-
redirect_to root_path,
|
17
|
+
send_email_verification(@user)
|
18
|
+
redirect_to root_path,
|
19
|
+
notice: t(".success")
|
21
20
|
else
|
22
21
|
render :new, status: :unprocessable_entity
|
23
22
|
end
|
@@ -25,16 +24,10 @@ module Avocado
|
|
25
24
|
|
26
25
|
private
|
27
26
|
|
28
|
-
def
|
27
|
+
def initialization_parameters
|
29
28
|
params
|
30
29
|
.require(:user)
|
31
|
-
.permit(
|
32
|
-
end
|
33
|
-
|
34
|
-
def send_email_verification
|
35
|
-
mailer_for(@user)
|
36
|
-
.email_verification
|
37
|
-
.deliver_later
|
30
|
+
.permit(INITIALIZATION_PARAMETERS)
|
38
31
|
end
|
39
32
|
end
|
40
33
|
end
|
@@ -1,19 +1,21 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
module Avocado
|
4
2
|
class SessionsController < BaseController
|
5
|
-
|
3
|
+
AUTHENTICATION_PARAMETERS = %i[email password]
|
6
4
|
|
7
|
-
skip_before_action :authenticate,
|
5
|
+
skip_before_action :authenticate,
|
6
|
+
only: %i[new create]
|
8
7
|
|
9
8
|
with_options only: :create do
|
10
9
|
before_action :verify_authentication_attempt
|
11
10
|
end
|
12
11
|
|
13
|
-
before_action :set_session,
|
12
|
+
before_action :set_session,
|
13
|
+
only: :destroy
|
14
14
|
|
15
15
|
def index
|
16
|
-
@sessions = current_user
|
16
|
+
@sessions = current_user
|
17
|
+
.sessions
|
18
|
+
.newest_first
|
17
19
|
end
|
18
20
|
|
19
21
|
def new
|
@@ -23,35 +25,41 @@ module Avocado
|
|
23
25
|
def create
|
24
26
|
sign_in(authenticated_user)
|
25
27
|
|
26
|
-
redirect_to root_path,
|
28
|
+
redirect_to root_path,
|
29
|
+
notice: t(".success")
|
27
30
|
end
|
28
31
|
|
29
32
|
def destroy
|
30
33
|
@session.destroy
|
31
|
-
redirect_to sessions_path,
|
34
|
+
redirect_to sessions_path,
|
35
|
+
notice: t(".success")
|
32
36
|
end
|
33
37
|
|
34
38
|
private
|
35
39
|
|
36
|
-
def
|
40
|
+
def authentication_parameters
|
37
41
|
params
|
38
42
|
.require(:session)
|
39
|
-
.permit(
|
43
|
+
.permit(AUTHENTICATION_PARAMETERS)
|
40
44
|
.with_defaults(email: "", password: "")
|
41
45
|
end
|
42
46
|
|
43
47
|
def authenticated_user
|
44
|
-
@_authenticated_user ||= ::User
|
48
|
+
@_authenticated_user ||= ::User
|
49
|
+
.authenticate_by(authentication_parameters)
|
45
50
|
end
|
46
51
|
|
47
52
|
def verify_authentication_attempt
|
48
53
|
if authenticated_user.blank?
|
49
|
-
redirect_to new_session_path,
|
54
|
+
redirect_to new_session_path,
|
55
|
+
alert: t(".errors.authentication")
|
50
56
|
end
|
51
57
|
end
|
52
58
|
|
53
59
|
def set_session
|
54
|
-
@session = current_user
|
60
|
+
@session = current_user
|
61
|
+
.sessions
|
62
|
+
.find(params[:id])
|
55
63
|
end
|
56
64
|
end
|
57
65
|
end
|