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

Octos- Ari- MediaRanker Revisited #33

Open
wants to merge 12 commits into
base: master
Choose a base branch
from
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@

# Ignore Byebug command history file.
.byebug_history
.env
6 changes: 6 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ gem 'jbuilder', '~> 2.5'
gem 'foundation-rails'
gem 'autoprefixer-rails'

gem "omniauth"
gem "omniauth-github"

gem "binding_of_caller"

group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug', platform: :mri
Expand All @@ -65,6 +70,7 @@ group :development do
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
gem 'dotenv-rails'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
Expand Down
32 changes: 32 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ GEM
erubi (>= 1.0.0)
rack (>= 0.9.0)
bindex (0.5.0)
binding_of_caller (0.8.0)
debug_inspector (>= 0.0.1)
builder (3.2.3)
byebug (10.0.2)
coderay (1.1.2)
Expand All @@ -63,16 +65,24 @@ GEM
coffee-script-source (1.12.2)
concurrent-ruby (1.0.5)
crass (1.0.3)
debug_inspector (0.0.3)
dotenv (2.2.2)
dotenv-rails (2.2.2)
dotenv (= 2.2.2)
railties (>= 3.2, < 6.0)
erubi (1.7.1)
erubis (2.7.0)
execjs (2.7.0)
faraday (0.12.2)
multipart-post (>= 1.2, < 3)
ffi (1.9.23)
foundation-rails (6.4.3.0)
railties (>= 3.1.0)
sass (>= 3.3.0, < 3.5)
sprockets-es6 (>= 0.9.0)
globalid (0.4.1)
activesupport (>= 4.2.0)
hashie (3.5.7)
i18n (1.0.0)
concurrent-ruby (~> 1.0)
jbuilder (2.7.0)
Expand All @@ -82,6 +92,7 @@ GEM
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
jwt (1.5.6)
listen (3.0.8)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
Expand All @@ -108,9 +119,26 @@ GEM
minitest (~> 5.0)
rails (>= 4.1)
multi_json (1.13.1)
multi_xml (0.6.0)
multipart-post (2.0.0)
nio4r (2.3.0)
nokogiri (1.8.2)
mini_portile2 (~> 2.3.0)
oauth2 (1.4.0)
faraday (>= 0.8, < 0.13)
jwt (~> 1.0)
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (>= 1.2, < 3)
omniauth (1.8.1)
hashie (>= 3.4.6, < 3.6.0)
rack (>= 1.6.2, < 3)
omniauth-github (1.3.0)
omniauth (~> 1.5)
omniauth-oauth2 (>= 1.4.0, < 2.0)
omniauth-oauth2 (1.5.0)
oauth2 (~> 1.1)
omniauth (~> 1.2)
pg (0.21.0)
pry (0.11.3)
coderay (~> 1.1.0)
Expand Down Expand Up @@ -197,8 +225,10 @@ PLATFORMS
DEPENDENCIES
autoprefixer-rails
better_errors
binding_of_caller
byebug
coffee-rails (~> 4.2)
dotenv-rails
foundation-rails
jbuilder (~> 2.5)
jquery-rails
Expand All @@ -207,6 +237,8 @@ DEPENDENCIES
minitest-reporters
minitest-skip
minitest-spec-rails
omniauth
omniauth-github
pg (~> 0.18)
pry-rails
puma (~> 3.0)
Expand Down
15 changes: 13 additions & 2 deletions app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ class ApplicationController < ActionController::Base
protect_from_forgery with: :exception

before_action :find_user
before_action :require_login

def render_404
# DPR: this will actually render a 404 page in production
Expand All @@ -10,8 +11,18 @@ def render_404

private
def find_user
if session[:user_id]
@login_user = User.find_by(id: session[:user_id])
@login_user ||= User.find_by(id: session[:user_id]) if session[:user_id]
# if session[:user_id]
# @login_user = User.find_by(id: session[:user_id])
# end
end

def require_login
unless find_user
flash[:status] = :failure
flash[:result_text] = "You must log in to see this content"
redirect_back fallback_location: root_path
end
end

end
38 changes: 20 additions & 18 deletions app/controllers/sessions_controller.rb
Original file line number Diff line number Diff line change
@@ -1,28 +1,29 @@
class SessionsController < ApplicationController
def login_form
end

skip_before_action :require_login

def login
username = params[:username]
if username and user = User.find_by(username: username)
auth_hash = request.env['omniauth.auth']

if auth_hash[:uid]
user = User.find_by(uid: auth_hash[:uid], provider: 'github')
if user.nil?
# User doesn't match anything in the DB
# Attempt to create a new user
user = User.build_login(auth_hash)
end

# If we get here, we have the user instance
session[:user_id] = user.id
flash[:status] = :success
flash[:result_text] = "Successfully logged in as existing user #{user.username}"
flash[:result_text] = "Logged in successfully"
redirect_to root_path
else
user = User.new(username: username)
if user.save
session[:user_id] = user.id
flash[:status] = :success
flash[:result_text] = "Successfully created new user #{user.username} with ID #{user.id}"
else
flash.now[:status] = :failure
flash.now[:result_text] = "Could not log in"
flash.now[:messages] = user.errors.messages
render "login_form", status: :bad_request
return
end
flash[:status] = :failure
flash[:result_text] = "Could not log in"
flash[:messages] = user.errors.messages
redirect_to root_path
end
redirect_to root_path
end

def logout
Expand All @@ -31,4 +32,5 @@ def logout
flash[:result_text] = "Successfully logged out"
redirect_to root_path
end

end
3 changes: 3 additions & 0 deletions app/controllers/users_controller.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
class UsersController < ApplicationController


def index
@users = User.all
end
Expand All @@ -7,4 +9,5 @@ def show
@user = User.find_by(id: params[:id])
render_404 unless @user
end

end
7 changes: 5 additions & 2 deletions app/controllers/works_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ class WorksController < ApplicationController
# We should always be able to tell what category
# of work we're dealing with
before_action :category_from_work, except: [:root, :index, :new, :create]
before_action :require_login, except: [:root]

def root

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You've also added require_login as a filter on the ApplicationController, which means it will happen before every single controller action. Your line 5 here adds it again for everything but root, but doesn't take it away for root. Instead it should be a skip_before_action for only :root.

This is also why all your WorksController tests were breaking.

This was a tricky one - it took me a while to figure out what was going on 🙂

@albums = Work.best_albums
Expand All @@ -24,11 +25,12 @@ def create
if @work.save
flash[:status] = :success
flash[:result_text] = "Successfully created #{@media_category.singularize} #{@work.id}"

redirect_to work_path(@work)
else
flash[:status] = :failure
flash[:result_text] = "Could not create #{@media_category.singularize}"
flash[:messages] = @work.errors.messages
# flash[:messages] = @work.errors.messages
render :new, status: :bad_request
end
end
Expand All @@ -49,7 +51,7 @@ def update
else
flash.now[:status] = :failure
flash.now[:result_text] = "Could not update #{@media_category.singularize}"
flash.now[:messages] = @work.errors.messages
# flash.now[:messages] = @work.errors.messages
render :edit, status: :not_found
end
end
Expand All @@ -68,6 +70,7 @@ def upvote
if vote.save
flash[:status] = :success
flash[:result_text] = "Successfully upvoted!"
redirect_to work_path(@work)
else
flash[:result_text] = "Could not upvote"
flash[:messages] = vote.errors.messages
Expand Down
18 changes: 16 additions & 2 deletions app/models/user.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,20 @@
class User < ApplicationRecord
has_many :votes
has_many :votes, dependent: :destroy
has_many :ranked_works, through: :votes, source: :work

validates :username, uniqueness: true, presence: true
validates :username, presence: true, uniqueness: true

def self.build_login(auth_hash)
user_data = {
uid: auth_hash[:uid],
username: auth_hash["info"]["nickname"],
email: auth_hash["info"]["email"],
provider: auth_hash[:provider]
}
user = self.new(user_data)
if user.save
return user
end
end

end
18 changes: 11 additions & 7 deletions app/views/layouts/application.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,21 @@

<nav>
<div class="site-nav">
<%= link_to "View top media", root_path, class: "button" %>
<%= link_to "View all media", works_path, class: "button" %>
<%= link_to "Add a new work", new_work_path, class: "button" %>
<%= link_to "View all users", users_path, class: "button" %>
<% if session[:user_id] %>
<%= link_to "View top media", root_path, class: "button" %>
<%= link_to "View all media", works_path, class: "button" %>
<%= link_to "Add a new work", new_work_path, class: "button" %>
<%= link_to "View all users", users_path, class: "button" %>
<% else %>
<%= link_to "View top media", root_path, class: "button" %>
<% end %>
</div>
<div class="user-nav">
<% if @login_user %>
<%= link_to "Logged in as #{@login_user.username}", user_path(@login_user), class: "button" %>
<% if session[:user_id] %>
<%= link_to "Logged in as #{@login_user.username}", "/auth/github", class: "button" %>
<%= link_to "Log Out", logout_path, method: :post, class: "button" %>
<% else %>
<%= link_to "Log In", login_path, class: "button" %>
<%= link_to "Log In", "/auth/github", class: "button" %>
<% end %>
</div>
</nav>
Expand Down
3 changes: 3 additions & 0 deletions config/initializers/omniauth.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Rails.application.config.middleware.use OmniAuth::Builder do
provider :github, ENV["GITHUB_CLIENT_ID"], ENV["GITHUB_CLIENT_SECRET"], scope: "user:email"
end
9 changes: 4 additions & 5 deletions config/routes.rb
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
Rails.application.routes.draw do
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
root 'works#root'
get '/login', to: 'sessions#login_form', as: 'login'
post '/login', to: 'sessions#login'
post '/logout', to: 'sessions#logout', as: 'logout'

# get '/login', to: 'sessions#login_form', as: 'login'
# post '/login', to: 'sessions#login'
resources :works
post '/works/:id/upvote', to: 'works#upvote', as: 'upvote'

resources :users, only: [:index, :show]
post '/logout', to: 'sessions#logout', as: 'logout'
get "/auth/:provider/callback", to: "sessions#login", as: 'auth_callback'
end
7 changes: 7 additions & 0 deletions db/migrate/20180417211228_add_columns_to_user.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
class AddColumnsToUser < ActiveRecord::Migration[5.0]
def change
add_column :users, :email, :string
add_column :users, :uid, :integer, null: false
add_column :users, :provider, :string, null: false
end
end
11 changes: 7 additions & 4 deletions db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 20170407164321) do
ActiveRecord::Schema.define(version: 20180417211228) do

# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
Expand All @@ -19,6 +19,9 @@
t.string "username"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "email"
t.integer "uid", null: false
t.string "provider", null: false
end

create_table "votes", force: :cascade do |t|
Expand All @@ -35,9 +38,9 @@
t.string "creator"
t.string "description"
t.string "category"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "vote_count", default: 0
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "vote_count", default: 0
t.integer "publication_year"
end

Expand Down
Loading