Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Milestone: #Add-devise #10

Merged
merged 14 commits into from
Oct 4, 2023
2 changes: 2 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ gem 'rspec-rails'

gem 'rails-controller-testing'

gem 'devise'

# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
gem 'rails', '~> 7.0.8'

Expand Down
14 changes: 14 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ GEM
public_suffix (>= 2.0.2, < 6.0)
ast (2.4.2)
base64 (0.1.1)
bcrypt (3.1.19)
bindex (0.8.1)
bootsnap (1.16.0)
msgpack (~> 1.2)
Expand All @@ -89,6 +90,12 @@ GEM
debug (1.8.0)
irb (>= 1.5.0)
reline (>= 0.3.1)
devise (4.9.2)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 4.1.0)
responders
warden (~> 1.2.3)
diff-lcs (1.5.0)
erubi (1.12.0)
globalid (1.2.1)
Expand Down Expand Up @@ -133,6 +140,7 @@ GEM
nio4r (2.5.9)
nokogiri (1.15.4-x64-mingw-ucrt)
racc (~> 1.4)
orm_adapter (0.5.0)
parallel (1.23.0)
parser (3.2.2.3)
ast (~> 2.4.1)
Expand Down Expand Up @@ -186,6 +194,9 @@ GEM
regexp_parser (2.8.1)
reline (0.3.8)
io-console (~> 0.5)
responders (3.1.0)
actionpack (>= 5.2)
railties (>= 5.2)
rexml (3.2.6)
rspec-core (3.12.2)
rspec-support (~> 3.12.0)
Expand Down Expand Up @@ -245,6 +256,8 @@ GEM
tzinfo-data (1.2023.3)
tzinfo (>= 1.0.0)
unicode-display_width (2.4.2)
warden (1.2.9)
rack (>= 2.0.9)
web-console (4.2.1)
actionview (>= 6.0.0)
activemodel (>= 6.0.0)
Expand All @@ -265,6 +278,7 @@ DEPENDENCIES
bootsnap
capybara
debug
devise
importmap-rails
jbuilder
pg (~> 1.1)
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ Blog-app is a fully functioning website that show the list of posts and empower
- **Users and posts views**
- **Creating Forms**
- **Intergration specs and fix N+1**
- **Add-devise**

<p align="right">(<a href="#readme-top">back to top</a>)</p>

Expand Down Expand Up @@ -118,7 +119,6 @@ it will install the required gemfile for running the project
<!-- FUTURE FEATURES -->

## 🔭 Future Features <a name="future-features"></a>
- Add Devise.
- Add authorization rules.
- Add API endpoints.
- API documentation.
Expand Down Expand Up @@ -147,7 +147,7 @@ If you like this project you can share this project to your friend

## 🙏 Acknowledgments <a name="acknowledgements"></a>

I would like to thank Microverse for this project
We would like to thank Microverse for this project

<p align="right">(<a href="#readme-top">back to top</a>)</p>

Expand Down
42 changes: 42 additions & 0 deletions app/assets/stylesheets/application.css
Original file line number Diff line number Diff line change
Expand Up @@ -217,3 +217,45 @@ a {
width: 150px;
text-align: center;
}

.form_container {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
width: 100%;
}

.devise-head {
text-align: center;
}

.field-dev {
margin-block: 10px;
width: 80%;
font-size: 25px;
}

.dev-links {
display: flex;
flex-direction: column;
font-size: 25px;
justify-content: center;
align-items: center;
margin-top: 20px;
}

.actions-dev input[type="submit"] {
font-size: 25px;
background-color: brown;
color: white;
width: 20rem;
}

.field-dev input[type="text"],
.field-dev input[type="email"],
.field-dev input[type="password"],
.field-dev textarea {
height: 40px;
width: 20rem;
}
21 changes: 19 additions & 2 deletions app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,22 @@
class ApplicationController < ActionController::Base
def current_user
@current_user = User.first
# Set up user authentication
before_action :authenticate_user!
# Add addtional parameters
before_action :configure_permitted_parameters, if: :devise_controller?
# Customize redirect hooks
def after_sign_in_path_for(_resource)
users_url
end
# Permit addtional parameters (@lazy)

protected

def configure_permitted_parameters
devise_parameter_sanitizer.permit(
:sign_up, keys: %i[name bio email photo password confirm_password]
)
devise_parameter_sanitizer.permit(
:sign_in, keys: %i[email password]
)
end
end
1 change: 1 addition & 0 deletions app/controllers/posts_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ def create
@post = @user.posts.build(post_params)

if @post.save
@user.increment!(:posts_counter)
redirect_to user_post_url(@user, @post)

else
Expand Down
10 changes: 10 additions & 0 deletions app/models/user.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,21 @@
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :confirmable, :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_many :posts, foreign_key: 'author_id'
has_many :comments, foreign_key: 'user_id'
has_many :likes, foreign_key: 'user_id'

validates :name, presence: true
validates :posts_counter, numericality: { only_integer: true, greater_than_or_equal_to: 0 }

after_initialize :set_defaults

def set_defaults
self.posts_counter ||= 0
end

def recent_posts(limit = 3)
posts.order(created_at: :desc).limit(limit)
end
Expand Down
20 changes: 20 additions & 0 deletions app/views/devise/confirmations/new.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<h2 class="devise-head">Resend confirmation instructions</h2>

<div class="form_container">
<%= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| %>

<%= render "devise/shared/error_messages", resource: resource %>

<div class="field-dev">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true, autocomplete: "email", value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email) %>
</div>

<div class="actions-dev">
<%= f.submit "Resend confirmation instructions" %>
</div>
<% end %>
<div class="dev-links"
<%= render "devise/shared/links" %>
</div>
</div>
5 changes: 5 additions & 0 deletions app/views/devise/mailer/confirmation_instructions.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<p>Welcome <%= @email %>!</p>

<p>You can confirm your account email through the link below:</p>

<p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p>
7 changes: 7 additions & 0 deletions app/views/devise/mailer/email_changed.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<p>Hello <%= @email %>!</p>

<% if @resource.try(:unconfirmed_email?) %>
<p>We're contacting you to notify you that your email is being changed to <%= @resource.unconfirmed_email %>.</p>
<% else %>
<p>We're contacting you to notify you that your email has been changed to <%= @resource.email %>.</p>
<% end %>
3 changes: 3 additions & 0 deletions app/views/devise/mailer/password_change.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<p>Hello <%= @resource.email %>!</p>

<p>We're contacting you to notify you that your password has been changed.</p>
8 changes: 8 additions & 0 deletions app/views/devise/mailer/reset_password_instructions.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<p>Hello <%= @resource.email %>!</p>

<p>Someone has requested a link to change your password. You can do this through the link below.</p>

<p><%= link_to 'Change my password', edit_password_url(@resource, reset_password_token: @token) %></p>

<p>If you didn't request this, please ignore this email.</p>
<p>Your password won't change until you access the link above and create a new one.</p>
7 changes: 7 additions & 0 deletions app/views/devise/mailer/unlock_instructions.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<p>Hello <%= @resource.email %>!</p>

<p>Your account has been locked due to an excessive number of unsuccessful sign in attempts.</p>

<p>Click the link below to unlock your account:</p>

<p><%= link_to 'Unlock my account', unlock_url(@resource, unlock_token: @token) %></p>
25 changes: 25 additions & 0 deletions app/views/devise/passwords/edit.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<h2>Change your password</h2>

<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %>
<%= render "devise/shared/error_messages", resource: resource %>
<%= f.hidden_field :reset_password_token %>

<div class="field">
<%= f.label :password, "New password" %><br />
<% if @minimum_password_length %>
<em>(<%= @minimum_password_length %> characters minimum)</em><br />
<% end %>
<%= f.password_field :password, autofocus: true, autocomplete: "new-password" %>
</div>

<div class="field">
<%= f.label :password_confirmation, "Confirm new password" %><br />
<%= f.password_field :password_confirmation, autocomplete: "new-password" %>
</div>

<div class="actions">
<%= f.submit "Change my password" %>
</div>
<% end %>

<%= render "devise/shared/links" %>
20 changes: 20 additions & 0 deletions app/views/devise/passwords/new.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<h2 class="devise-head">Forgot your password?</h2>

<div class="form_container">
<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %>
<%= render "devise/shared/error_messages", resource: resource %>

<div class="field-dev">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>

<div class="actions-dev">
<%= f.submit "Send me reset password instructions" %>
</div>
<% end %>

<div class="dev-links">
<%= render "devise/shared/links" %>
</div>
</div>
44 changes: 44 additions & 0 deletions app/views/devise/registrations/edit.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<h2 class="devise-head">Edit <%= resource_name.to_s.humanize %></h2>
<div class="form_container">
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
<%= render "devise/shared/error_messages", resource: resource %>

<div class="field-dev">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>

<% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
<div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
<% end %>

<div class="field-dev">
<%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
<%= f.password_field :password, autocomplete: "new-password" %>
<% if @minimum_password_length %>
<br />
<em><%= @minimum_password_length %> characters minimum</em>
<% end %>
</div>

<div class="field-dev">
<%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, autocomplete: "new-password" %>
</div>

<div class="field-dev">
<%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
<%= f.password_field :current_password, autocomplete: "current-password" %>
</div>

<div class="actions-dev">
<%= f.submit "Update" %>
</div>
<% end %>

<h3>Cancel my account</h3>

<div>Unhappy? <%= button_to "Cancel my account", registration_path(resource_name), data: { confirm: "Are you sure?", turbo_confirm: "Are you sure?" }, method: :delete %></div>

<%= link_to "Back", :back %>
</div>
42 changes: 42 additions & 0 deletions app/views/devise/registrations/new.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<h2 class="devise-head">Sign up</h2>
<div class="form_container">
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>

<%= render "devise/shared/error_messages", resource: resource %>

<div class="field-dev">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>

<div class="field-dev">
<%= f.label :bio %><br />
<%= f.text_area :bio %>
</div>

<div class="field-dev">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true, autocomplete: "email" %>
</div>

<div class="field-dev">
<%= f.label :password %>
<% if @minimum_password_length %>
<em><%= @minimum_password_length %> characters minimum)</em>
<% end %><br />
<%= f.password_field :password, autocomplete: "new-password" %>
</div>

<div class="field-dev">
<%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, autocomplete: "new-password" %>
</div>

<div class="actions-dev">
<%= f.submit "Sign up" %>
</div>
<% end %>
<div class="dev-links">
<%= render "devise/shared/links" %>
</div>
</div>
Loading
Loading