Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
b76a3db
Initial commit
charlesmilam Dec 5, 2014
07e00db
Modify method create_db_connection, remove localhost argument from PG…
charlesmilam Dec 5, 2014
13861e4
Modify save to add new user
charlesmilam Dec 5, 2014
1af08a9
Refactor
charlesmilam Dec 5, 2014
f0dae4e
Modify method find to correctly find users by id.
charlesmilam Dec 6, 2014
5aa5f85
Modify to perform test on find method.
charlesmilam Dec 6, 2014
b331b1c
Modify for further testing of save method.
charlesmilam Dec 6, 2014
ffacf35
Modify save method to handle all tests sucessfully.
charlesmilam Dec 6, 2014
ec32e28
Modify method destroy to delete all records from users table.
charlesmilam Dec 6, 2014
c456038
Modify to perform test of destroy method.
charlesmilam Dec 6, 2014
87a6581
Add /users endpoint.
charlesmilam Dec 6, 2014
3ed5770
Initial commit.
charlesmilam Dec 6, 2014
b73ec60
Initial commit.
charlesmilam Dec 6, 2014
50c6141
Modify to link to users index
charlesmilam Dec 6, 2014
67c0493
Modify /users endpoint to point to users/index
charlesmilam Dec 6, 2014
7e282be
Add h2 element
charlesmilam Dec 6, 2014
dbb6dcb
Modify /users endpoint to make db connection and retrieve user info.
charlesmilam Dec 7, 2014
59765f6
Modify, cleanup html code layout.
charlesmilam Dec 7, 2014
67ca14d
Modify to display a list of all users.
charlesmilam Dec 7, 2014
021b4f0
Add post /users endpoint to create new user in database.
charlesmilam Dec 7, 2014
d762025
Add form for registering new users.
charlesmilam Dec 7, 2014
6c53301
Initial commit.
charlesmilam Dec 7, 2014
de46395
Add methods for CRUD operations.
charlesmilam Dec 7, 2014
ec3abfe
Initial commit.
charlesmilam Dec 7, 2014
dfaa5e5
Modify to test for get of all books, and create book.
charlesmilam Dec 7, 2014
49cf305
Modify for create, clear and drop of books table.
charlesmilam Dec 7, 2014
d24feb4
Final.
charlesmilam Dec 7, 2014
029dfdc
Modify to test find book by id.
charlesmilam Dec 7, 2014
24e23d3
Modify method save to pass tests.
charlesmilam Dec 7, 2014
4a89611
Modify to test update book.
charlesmilam Dec 7, 2014
c398e8a
Refactor methods find and save.
charlesmilam Dec 8, 2014
0db6c82
Add test for method checkouts.
charlesmilam Dec 8, 2014
92b7589
Modify create tables method to create checkouts table. Modifiy method…
charlesmilam Dec 8, 2014
5b0d7d1
Add endpoints get and push for /checkouts.
charlesmilam Dec 8, 2014
73021c3
Initial commit.
charlesmilam Dec 8, 2014
335dda5
Add link to checkout books.
charlesmilam Dec 8, 2014
b085a4a
Add endpoint get /checkouts/books-out
charlesmilam Dec 8, 2014
946daf1
Add link to view checked out books.
charlesmilam Dec 8, 2014
3038134
Add method get_check_outs
charlesmilam Dec 8, 2014
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
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
.bundle
vendor/bundle
.DS_Store
.gems

2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
source 'https://rubygems.org'
ruby '2.0.0'
ruby '2.1.3'

gem 'rspec', '~> 2.14.1'
gem 'pry-byebug'
Expand Down
31 changes: 25 additions & 6 deletions lib/library_plus.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@

module Library
def self.create_db_connection(dbname)
PG.connect(host: 'localhost', dbname: dbname)
PG.connect(dbname: dbname)
end

def self.clear_db(db)
db.exec <<-SQL
DELETE FROM users;
/* TODO: Clear rest of the tables (books, etc.) */
DELETE FROM users cascade;
DELETE FROM books cascade;
DELETE FROM checkouts;
SQL
end

Expand All @@ -18,17 +19,35 @@ def self.create_tables(db)
id SERIAL PRIMARY KEY,
name VARCHAR
);
/* TODO: Create rest of the tables (books, etc.) */

create table books(
id SERIAL PRIMARY KEY,
title VARCHAR,
author VARCHAR
);

create table checkouts(
book_id integer
references books(id) on delete cascade,
user_id integer
references users(id) on delete cascade
);
SQL
end

def self.drop_tables(db)
db.exec <<-SQL
DROP TABLE users;
/* TODO: Drop rest of the tables (books, etc.) */
DROP TABLE if exists users cascade;
DROP TABLE if exists books cascade;
DROP TABLE if exists checkouts
SQL
end

end

require_relative 'library_plus/book_repo'
require_relative 'library_plus/user_repo'

# db = Library.create_db_connection "library_test"
# Library.drop_tables db
# Library.create_tables db
81 changes: 80 additions & 1 deletion lib/library_plus/book_repo.rb
Original file line number Diff line number Diff line change
@@ -1 +1,80 @@
# TODO
module Library
class BookRepo
def self.all(db)
# Other code should not have to deal with the PG:Result.
# Therefore, convert the results into a plain array.
db.exec("SELECT * FROM books").to_a
end

def self.find(db, book_data)
# find book by id
sql = %Q[
select *
from books
where id = $1
]
result = db.exec(sql, [book_data])

result.first
end

def self.save(db, book_data)
# update book data if book exists, otherwise create new book
if book_data.include?(:id)
sql_users = %Q[
UPDATE books
set title =$1, author = $2
where id = $3
returning *
]
result = db.exec(sql_users, [book_data[:title], book_data[:author], book_data[:id]])
else
sql_insert_user = %Q[
insert into books
(title, author)
values ($1, $2)
returning *
]
result = db.exec(sql_insert_user, [book_data[:title], book_data[:author]])
end

result.first
end

def self.check_out(db, check_out_data)
check_out_data.each {|c| puts c}
sql = %Q[
insert into checkouts
(book_id, user_id)
values ($1, $2)
returning *
]
result = db.exec(sql, [check_out_data[:book_id], check_out_data[:user_id]])
end

def self.get_check_outs(db)
sql = %Q[
SELECT
books.title,
books.author,
books.id,
users.name
FROM
books,
checkouts,
users
WHERE
books.id = checkouts.book_id AND
users.id = checkouts.user_id
]
db.exec(sql).to_a
end

def self.destroy(db, book_data)
sql = %Q[
delete from books
]
db.exec(sql)
end
end
end
37 changes: 32 additions & 5 deletions lib/library_plus/user_repo.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,47 @@ def self.all(db)
end

def self.find(db, user_data)
# TODO: Insert SQL statement
# find user by id
sql = %Q[
select *
from users
where id = $1
]
result = db.exec(sql, [user_data])

return result.first
end

def self.save(db, user_data)
if user_data['id']
# TODO: Update SQL statement
# update user data if user exists, otherwise create new user
if user_data.include?(:id)
sql_users = %Q[
UPDATE users
set name =$1
where id = $2
returning *
]
result = db.exec(sql_users, [user_data[:name], user_data[:id]])
else
# TODO: Insert SQL statement
sql_insert_user = %Q[
insert into users
(name)
values ($1)
returning *
]
result = db.exec(sql_insert_user, [user_data[:name]])
end

return result.first
end

def self.destroy(db, user_data)
# TODO: Delete SQL statement
sql = %Q[
delete from users
]
db.exec(sql)
end

end
end

60 changes: 59 additions & 1 deletion server.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,63 @@
# set :bind, '0.0.0.0' # This is needed for Vagrant

get '/' do
erb :index
erb :"index"
end

get "/users" do
db = Library.create_db_connection('library_dev')
@users = Library::UserRepo.all(db)

erb :"users/index"
end

post "/users" do
db = Library.create_db_connection('library_dev')
@name = params[:user_name]

Library::UserRepo.save(db, :name => @name)

redirect back
end

get "/books" do
db = Library.create_db_connection('library_dev')
@books = Library::BookRepo.all(db)

erb :"books/index"
end

post "/books" do
db = Library.create_db_connection('library_dev')
@title = params[:title]
@author = params[:author]

Library::BookRepo.save(db, :title => @title, :author => @author)

redirect back
end

get "/checkouts" do
db = Library.create_db_connection('library_dev')
@books = Library::BookRepo.all(db)
@users = Library::UserRepo.all(db)

erb :"checkouts/index"
end

post "/checkouts" do
db = Library.create_db_connection('library_dev')
@book_id = params[:book_id]
@user_id = params[:user_id]

Library::BookRepo.check_out(db, :book_id => @book_id, :user_id => @user_id)

redirect back
end

get "/checkouts/books-out" do
db = Library.create_db_connection("library_dev")
@checkouts = Library::BookRepo.get_check_outs(db)

erb :"checkouts/books-out"
end
78 changes: 78 additions & 0 deletions spec/repos/book_repo_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
require 'spec_helper'
require "./lib/library_plus/user_repo"

describe Library::BookRepo do

def book_count(db)
db.exec("SELECT COUNT(*) FROM books")[0]["count"].to_i
end

let(:db) { Library.create_db_connection('library_test') }

before(:each) do
Library.clear_db(db)
end

it "gets all books" do
db.exec("INSERT INTO books (title, author) VALUES ($1, $2)", ["To Kill a Mockingbird", "Harper Lee"])
db.exec("INSERT INTO books (title, author) VALUES ($1, $2)", ["Fellowship of the Ring", "J.R.R. Tolkien"])

books = Library::BookRepo.all(db)
expect(books).to be_a Array
expect(books.count).to eq 2

books = books.map {|u| u['title']}
expect(books).to include "To Kill a Mockingbird", "Fellowship of the Ring"
end

it "creates books" do
expect(book_count(db)).to eq 0

book = Library::BookRepo.save(db, :title => "To Kill a Mockingbird", :author => "Harper Lee")
expect(book['id']).to_not be_nil
expect(book['title']).to eq "To Kill a Mockingbird"
expect(book["author"]).to eq "Harper Lee"

# Check for persistence
expect(book_count(db)).to eq 1

book = db.exec("SELECT * FROM books")[0]
expect(book['title']).to eq "To Kill a Mockingbird"
end

it "finds books" do
book = Library::BookRepo.save(db, :title => "To Kill a Mockingbird", :author => "Harper Lee")
retrieved_book = Library::BookRepo.find(db, book['id'])
expect(retrieved_book['title']).to eq "To Kill a Mockingbird"
expect(retrieved_book["author"]).to eq "Harper Lee"
end

it "updates books" do
book1 = Library::BookRepo.save(db, :title => "To Kill a Raven", :author => "Harper Lee")
book2 = Library::BookRepo.save(db, { :id => book1['id'], :title => "To Kill a Mockingbird", :author => book1["author"] })

expect(book2['id']).to eq(book1['id'])
expect(book2['title']).to eq "To Kill a Mockingbird"

# Check for persistence
book3 = Library::BookRepo.find(db, book1['id'])
expect(book3['title']).to eq "To Kill a Mockingbird"
end

it "destroys books" do
book = Library::BookRepo.save(db, :title => "To Kill a Mockingbird", :author => "Harper Lee")
expect(book_count(db)).to eq 1

Library::BookRepo.destroy(db, book['id'])
expect(book_count(db)).to eq 0
end

it "checks out books" do
user = Library::UserRepo.save(db, :name => "Alice")
book = Library::BookRepo.save(db, :title => "Foundation", :author => "Isaac Asimov")

checkout = Library::BookRepo.check_out(db, :book_id => book['id'], :user_id => user["id"])
expect(checkout["user_id"]).to_not be_nil
expect(checkout["book_id"]).to_not be_nil
end
end
11 changes: 6 additions & 5 deletions spec/repos/user_repo_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -38,24 +38,25 @@ def user_count(db)
expect(user['name']).to eq "Alice"
end

xit "finds users" do
it "finds users" do
user = Library::UserRepo.save(db, :name => "Alice")
retrieved_user = Library::UserRepo.find(db, user['id'])
expect(retrieved_user['name']).to eq "Alice"
end

xit "updates users" do
it "updates users" do
user1 = Library::UserRepo.save(db, :name => "Alice")
user2 = Library::UserRepo.save(db, :name => "Alicia")
user2 = Library::UserRepo.save(db, { :id => user1['id'], :name => "Alicia" })

expect(user2['id']).to eq(user1['id'])
expect(user2['name']).to eq "Alicia"

# Check for persistence
user3 = Library::UserRepo.find(user1['id'])
user3 = Library::UserRepo.find(db, user1['id'])
expect(user3['name']).to eq "Alicia"
end

xit "destroys users" do
it "destroys users" do
user = Library::UserRepo.save(db, :name => "Alice")
expect(user_count(db)).to eq 1

Expand Down
Loading