Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
6548a49
API golden five
jelaniwoods Aug 8, 2019
e10279f
wip
jelaniwoods Aug 8, 2019
3905fa8
wip
jelaniwoods Aug 8, 2019
4a26835
wip
jelaniwoods Aug 8, 2019
41116bc
Add more form input types
jelaniwoods Aug 8, 2019
dca7f31
wip
jelaniwoods Aug 8, 2019
ee3488a
wip
jelaniwoods Aug 8, 2019
e0b2c97
wip
jelaniwoods Aug 8, 2019
4ca84ba
Remove extra field types
jelaniwoods Aug 8, 2019
4edd0fc
Revert "Remove extra field types"
jelaniwoods Aug 8, 2019
7ced4c5
Remove end at line 61
jelaniwoods Aug 8, 2019
e73c37b
try forcing fieldtype default
jelaniwoods Aug 8, 2019
6b24a91
wip
jelaniwoods Aug 8, 2019
f2abf75
wip
jelaniwoods Aug 8, 2019
deebe22
MM
jelaniwoods Aug 8, 2019
eb67328
Summer will last forever
jelaniwoods Aug 8, 2019
5898bb7
Upper
jelaniwoods Aug 8, 2019
ba326b3
fix some spacing
jelaniwoods Aug 8, 2019
cfc92b2
redirect_to not back
jelaniwoods Aug 8, 2019
8d7703f
wip
jelaniwoods Aug 8, 2019
c4d66c8
wip
jelaniwoods Aug 8, 2019
020f63e
Replace rt_ with route_
raghubetina Aug 13, 2019
9f77c04
Fix controller indentation
raghubetina Aug 13, 2019
ad68007
Fix index form indentation
raghubetina Aug 13, 2019
eac9e1b
Fix show page form
raghubetina Aug 13, 2019
7a618af
Make the new form narrower
raghubetina Aug 13, 2019
eb185c8
Order index by created at descending
raghubetina Aug 13, 2019
b18e9dd
Add margin-bottom to custom-checkboxes
raghubetina Aug 13, 2019
c7868e8
Update format of inputs, labels, and routes
jelaniwoods Nov 19, 2019
e32cae1
Update draft:layout
jelaniwoods Nov 20, 2019
c00f9f2
Add account generator
jelaniwoods Aug 28, 2019
0dd7bdf
Fix add_cookie param fetch
jelaniwoods Nov 21, 2019
4f5ab60
Fix sessions_controller redirect url
jelaniwoods Nov 26, 2019
d7ccfa0
Winter 2020 updates
raghubetina Feb 18, 2020
e8d77c1
Re-organizing draft:account
raghubetina Jun 2, 2020
0e3e763
Comment out javascript pack tag
jelaniwoods Jun 2, 2020
2714b25
Prepopulate checkbox on edit account forms
jelaniwoods Jun 5, 2020
1bea3b3
Update controller.rb
raghubetina Aug 4, 2020
50a4a7b
This commit resolves issue #86. The resource
Aug 7, 2020
fb4cb87
Using the new style for summer 2020, I removed
Aug 11, 2020
671e66b
Changed the query style to match our teaching
Aug 10, 2020
aff224a
Removed bootstrap from winter-2020. Resolves #89
Aug 7, 2020
d4c7453
Fix missing 'the's in generated show page
jelaniwoods Aug 17, 2020
b749884
Added erros.full_messages to account notices
Aug 19, 2020
277f732
removed div's from update and show
Dec 3, 2020
16a7f52
edited force_sign_in comments
Dec 3, 2020
25c38bb
wording
Dec 3, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ group :development do
gem "simplecov", ">= 0"
end

gem 'indefinite_article'
gem 'devise'
1 change: 1 addition & 0 deletions draft_generators.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ Gem::Specification.new do |s|

if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
s.add_runtime_dependency(%q<devise>.freeze, [">= 0"])
s.add_runtime_dependency(%q<indefinite_article>.freeze, [">= 0"])
s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
s.add_development_dependency(%q<bundler>.freeze, ["~> 1.0"])
Expand Down
1 change: 1 addition & 0 deletions lib/draft_generators.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
require "devise_customization_service"
require "rails_tag_service"
require "devise"
require "indefinite_article"

module DraftGenerators
end
189 changes: 189 additions & 0 deletions lib/generators/draft/account/account_generator.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
require "rails/generators/named_base"

module Draft
class AccountGenerator < Rails::Generators::NamedBase
source_root File.expand_path("../templates", __FILE__)

argument :attributes, type: :array, default: [],
banner: "field:type field:type"

include Rails::Generators::ResourceHelpers

def generate_required_attributes
unless attributes_has_password_digest?
password_digest = Rails::Generators::GeneratedAttribute.parse(["password_digest", :string, nil].compact.join(":"))
attributes.unshift(password_digest)
end
unless attributes_has_email?
email = Rails::Generators::GeneratedAttribute.parse(["email", :string, nil].compact.join(":"))
attributes.unshift(email)
end
end

def generate_model
invoke "draft:model", paramaterize_attributes
edit_model
end

def generate_routes
authentication_routes
end

def generate_before_actions
authentication_helpers
end

def generate_controller
template "controllers/authentication_controller.rb", "app/controllers/#{singular_table_name.underscore}_authentication_controller.rb"
end

def create_root_folder
empty_directory File.join("app/views", "#{singular_table_name.underscore}_authentication")
end

def generate_view_files
available_views.each do |view|
filename = view_authentication_filename_with_extensions(view)
template filename, File.join("app/views/#{singular_table_name.underscore}_authentication", File.basename(filename))
end
end

private

def authentication_routes
log :route, "Authentication routes"

route <<-RUBY.gsub(/^ /, "")

# Routes for the #{singular_table_name.humanize} account:

# SIGN UP FORM
get("/#{singular_table_name.underscore}_sign_up", { :controller => "#{singular_table_name.underscore}_authentication", :action => "sign_up_form" })
# CREATE RECORD
post("/insert_#{singular_table_name.underscore}", { :controller => "#{singular_table_name.underscore}_authentication", :action => "create" })

# EDIT PROFILE FORM
get("/edit_#{singular_table_name.underscore}_profile", { :controller => "#{singular_table_name.underscore}_authentication", :action => "edit_profile_form" })
# UPDATE RECORD
post("/modify_#{singular_table_name.underscore}", { :controller => "#{singular_table_name.underscore}_authentication", :action => "update" })

# DELETE RECORD
get("/cancel_#{singular_table_name.underscore}_account", { :controller => "#{singular_table_name.underscore}_authentication", :action => "destroy" })

# ------------------------------

# SIGN IN FORM
get("/#{singular_table_name.underscore}_sign_in", { :controller => "#{singular_table_name.underscore}_authentication", :action => "sign_in_form" })
# AUTHENTICATE AND STORE COOKIE
post("/#{singular_table_name.underscore}_verify_credentials", { :controller => "#{singular_table_name.underscore}_authentication", :action => "create_cookie" })

# SIGN OUT
get("/#{singular_table_name.underscore}_sign_out", { :controller => "#{singular_table_name.underscore}_authentication", :action => "destroy_cookies" })

#------------------------------
RUBY
end

def authentication_helpers
log :controller, "Authentication before_actions"

application_controller <<-RUBY.gsub(/^ /, "")

before_action(:load_current_#{singular_table_name.underscore})

# Uncomment the "before_action" if you want to force #{plural_table_name} to sign in before any other actions
# Remember to also uncomment the "skip_before_action" in the corresponding authentication controller
# before_action(:force_#{singular_table_name.underscore}_sign_in)

def load_current_#{singular_table_name.underscore}
the_id = session[:#{singular_table_name.underscore}_id]
@current_#{singular_table_name.underscore} = #{class_name.singularize}.where({ :id => the_id }).first
end

def force_#{singular_table_name.underscore}_sign_in
if @current_#{singular_table_name.underscore} == nil
redirect_to("/#{singular_table_name.underscore}_sign_in", { :notice => "You have to sign in first." })
end
end
RUBY
end

def edit_model
sentinel = /.*ApplicationRecord\n/
content = " validates :email, :uniqueness => { :case_sensitive => false }\n"\
" validates :email, :presence => true\n"\
" has_secure_password\n"
if model_exists?
inside "app/models" do
insert_into_file "#{singular_table_name.underscore}.rb", content, after: sentinel
end
end
end

def route(routing_code)
sentinel = /\.routes\.draw do(?:\s*\|map\|)?\s*$/

inside "config" do
insert_into_file "routes.rb", routing_code, after: sentinel
end
end

def application_controller(app_code)
sentinel = /::Base$/

inside "app/controllers" do
insert_into_file "application_controller.rb", app_code, after: sentinel
end
end

def available_views
%w(sign_up sign_in edit_profile edit_profile_with_errors)
end

def view_filename_with_extensions(name)
filename = [name, :html, :erb].compact.join(".")
folders = ["views"]
filename = File.join(folders, filename) if folders.any?
filename
end

def view_authentication_filename_with_extensions(name)
filename = [name, :html, :erb].compact.join(".")
folders = ["views", "authentication"]
filename = File.join(folders, filename) if folders.any?
filename
end

def controller_filename_with_extensions(name)
filename = [name,:rb].compact.join(".")
folders = ["controllers"]
filename = File.join(folders, filename) if folders.any?
filename
end

def model_exists?
File.exist?(File.join(destination_root, model_path))
end

def model_path
@model_path ||= File.join("app", "models", "#{file_path}.rb")
end

def attributes_has_email?
attributes.any? { |attribute| attribute.column_name.include?("email") }
end

def attributes_has_password_digest?
attributes.any?{ |attribute| attribute.column_name.include?("password_digest") }
end

def paramaterize_attributes
array = [singular_table_name.underscore]
attributes.each do |attribute|
array.push(attribute.column_name + ":" + attribute.type.to_s)
end
array
end

end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
class <%= class_name.singularize %>AuthenticationController < ApplicationController
# Uncomment this if you want to force <%= plural_table_name %> to sign in before any other actions
# skip_before_action(:force_<%= singular_table_name.underscore %>_sign_in, { :only => [:sign_up_form, :create, :sign_in_form, :create_cookie] })
# Remember to also uncomment the "before_action" in the ApplicationController

def sign_in_form
render({ :template => "<%= singular_table_name.underscore %>_authentication/sign_in.html.erb" })
end

def create_cookie
<%= singular_table_name.underscore %> = <%= class_name.singularize %>.where({ :email => params.fetch("query_email") }).first

the_supplied_password = params.fetch("query_password")

if <%= singular_table_name.underscore %> != nil
are_they_legit = <%= singular_table_name.underscore %>.authenticate(the_supplied_password)

if are_they_legit == false
redirect_to("/<%= singular_table_name.underscore %>_sign_in", { :alert => "Incorrect password." })
else
session[:<%= singular_table_name.underscore %>_id] = <%= singular_table_name.underscore %>.id

redirect_to("/", { :notice => "Signed in successfully." })
end
else
redirect_to("/<%= singular_table_name.underscore %>_sign_in", { :alert => "No <%= singular_table_name.underscore %> with that email address." })
end
end

def destroy_cookies
reset_session

redirect_to("/", { :notice => "Signed out successfully." })
end

def sign_up_form
render({ :template => "<%= singular_table_name.underscore %>_authentication/sign_up.html.erb" })
end

def create
@<%= singular_table_name.underscore %> = <%= class_name.singularize %>.new
<% attributes.each do |attribute| -%>
<% if attribute.field_type == :check_box -%>
@<%= singular_table_name.underscore %>.<%= attribute.column_name %> = params.fetch("query_<%= attribute.column_name %>", false)
<% elsif attribute.column_name != "password_digest" -%>
@<%= singular_table_name.underscore %>.<%= attribute.column_name %> = params.fetch("query_<%= attribute.column_name %>")
<% else -%>
@<%= singular_table_name.underscore %>.password = params.fetch("query_password")
@<%= singular_table_name.underscore %>.password_confirmation = params.fetch("query_password_confirmation")
<% end -%>
<% end -%>

save_status = @<%= singular_table_name.underscore %>.save

if save_status == true
session[:<%= singular_table_name.underscore %>_id] = @<%= singular_table_name.underscore %>.id

redirect_to("/", { :notice => "<%= singular_table_name.humanize %> account created successfully."})
else
redirect_to("/<%= singular_table_name.underscore %>_sign_up", { :alert => @<%= singular_table_name%>.errors.full_messages.to_sentence })
end
end

def edit_profile_form
render({ :template => "<%= singular_table_name.underscore %>_authentication/edit_profile.html.erb" })
end

def update
@<%= singular_table_name.underscore %> = @current_<%= singular_table_name.underscore %>
<% attributes.each do |attribute| -%>
<% if attribute.field_type == :check_box -%>
@<%= singular_table_name.underscore %>.<%= attribute.column_name %> = params.fetch("query_<%= attribute.column_name %>", false)
<% elsif attribute.column_name != "password_digest" -%>
@<%= singular_table_name.underscore %>.<%= attribute.column_name %> = params.fetch("query_<%= attribute.column_name %>")
<% else -%>
@<%= singular_table_name.underscore %>.password = params.fetch("query_password")
@<%= singular_table_name.underscore %>.password_confirmation = params.fetch("query_password_confirmation")
<% end -%>
<% end -%>

if @<%= singular_table_name.underscore %>.valid?
@<%= singular_table_name.underscore %>.save

redirect_to("/", { :notice => "<%= singular_table_name.humanize %> account updated successfully."})
else
render({ :template => "<%= singular_table_name.underscore %>_authentication/edit_profile_with_errors.html.erb" , :alert => @<%= singular_table_name%>.errors.full_messages.to_sentence })
end
end

def destroy
@current_<%= singular_table_name.underscore %>.destroy
reset_session

redirect_to("/", { :notice => "<%= class_name.singularize %> account cancelled" })
end

end
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<div >
<h5>
Edit <%= class_name.titleize %> Account
</h5>

<div>
<form action="/modify_<%= singular_table_name.underscore %>" method="post">
<% attributes.each do |attribute| -%>
<% if attribute.column_name != "password_digest" -%>
<div>
<label for="<%= attribute.column_name %>_box"><%= attribute.column_name.humanize %></label>
<% if attribute.field_type == :text_area -%>
<textarea id="<%= attribute.column_name %>_box" name="query_<%= attribute.column_name %>" rows="3"><%%= @current_<%= singular_table_name %>.<%= attribute.column_name %> %></textarea>
<% elsif attribute.field_type == :check_box -%>
<input id="<%= attribute.column_name %>_box" name="query_<%= attribute.column_name %>" type="checkbox" value="1" <%%= "checked" if @current_<%= singular_table_name %>.<%= attribute.column_name %> %>>
<% else -%>
<input id="<%= attribute.column_name %>_box" name="query_<%= attribute.column_name %>" value="<%%= @current_<%= singular_table_name.underscore %>.<%= attribute.column_name %> %>">
<% end -%>
</div>
<% end -%>
<% end -%>

<div>
<label for="password_box">Password</label>
<input id="password_box" name="query_password" placeholder="Choose a password..." type="password">
</div>

<div>
<label for="password_confirmation_box">Password Confirmation</label>
<input id="password_confirmation_box" name="query_password_confirmation" placeholder="Confirm your password..." type="password">
</div>

<button>
Update account
</button>
</form>
</div>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<div >
<h5>
Edit <%= class_name.titleize %> Account
</h5>

<%% if @<%= singular_table_name %>.errors.any? %>
<%% @<%= singular_table_name %>.errors.full_messages.each do |message| %>
<div class="alert">
<%%= message %>
</div>
<%% end %>
<%% end %>
<div>
<form action="/modify_<%= singular_table_name.underscore %>" method="post">
<% attributes.each do |attribute| -%>
<% if attribute.column_name != "password_digest" %>
<div>
<label for="<%= attribute.column_name %>_box"><%= attribute.column_name.humanize %></label>
<% if attribute.field_type == :text_area %>
<textarea id="<%= attribute.column_name %>_box" name="query_<%= attribute.column_name %>" rows="3"><%%= @current_<%= singular_table_name %>.<%= attribute.column_name %> %></textarea>
<% elsif attribute.field_type == :check_box %>
<input id="<%= attribute.column_name %>_box" name="query_<%= attribute.column_name %>" type="checkbox" value="1" <%%= "checked" if @current_<%= singular_table_name %>.<%= attribute.column_name %> %>>
<% else %>
<input id="<%= attribute.column_name %>_box" name="query_<%= attribute.column_name %>" value="<%%= @current_<%= singular_table_name.underscore %>.<%= attribute.column_name %> %>">
<% end %>
</div>
<% end -%>
<% end %>
<div>
<label for="password_box">Password</label>
<input id="password_box" name="query_password" placeholder="Choose a new password..." type="password">
</div>

<div>
<label for="password_confirmation_box">Password Confirmation</label>
<input id="password_confirmation_box" name="query_password_confirmation" placeholder="Confirm your new password..." type="password">
</div>

<button>
Update account
</button>
</form>
</div>
</div>
Loading