From 3208a46c086c577192f14748164447f779164d2c Mon Sep 17 00:00:00 2001 From: greg Date: Thu, 11 Dec 2014 14:54:16 -0600 Subject: [PATCH 01/34] initial commit --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 20e422c9..4324772d 100644 --- a/Gemfile +++ b/Gemfile @@ -4,6 +4,6 @@ ruby '2.0.0' gem 'rspec', '~> 2.14.1' gem 'sinatra', '~> 1.4.5' gem 'sinatra-contrib', '~> 1.4.2' - +gem 'rest-client' # Testing gem 'pry-byebug' diff --git a/Gemfile.lock b/Gemfile.lock index 92b9a02a..d4e4517b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -52,5 +52,5 @@ PLATFORMS DEPENDENCIES pry-byebug rspec (~> 2.14.1) - sinatra - sinatra-contrib + sinatra (~> 1.4.5) + sinatra-contrib (~> 1.4.2) From 700ea53f2ef7b4eb08045fe2301303154d9a1916 Mon Sep 17 00:00:00 2001 From: greg Date: Thu, 11 Dec 2014 15:01:18 -0600 Subject: [PATCH 02/34] adding repos --- lib/cats_repo/cats_repo.rb | 0 lib/dogs_repo/dogs_repo.rb | 0 lib/pet-shop.rb | 82 ++++++++++++++++++++++++++++++ lib/petshops_repo/petshops_repo.rb | 0 lib/users_repo/users_repo.rb | 38 ++++++++++++++ 5 files changed, 120 insertions(+) create mode 100644 lib/cats_repo/cats_repo.rb create mode 100644 lib/dogs_repo/dogs_repo.rb create mode 100644 lib/pet-shop.rb create mode 100644 lib/petshops_repo/petshops_repo.rb create mode 100644 lib/users_repo/users_repo.rb diff --git a/lib/cats_repo/cats_repo.rb b/lib/cats_repo/cats_repo.rb new file mode 100644 index 00000000..e69de29b diff --git a/lib/dogs_repo/dogs_repo.rb b/lib/dogs_repo/dogs_repo.rb new file mode 100644 index 00000000..e69de29b diff --git a/lib/pet-shop.rb b/lib/pet-shop.rb new file mode 100644 index 00000000..4e24565e --- /dev/null +++ b/lib/pet-shop.rb @@ -0,0 +1,82 @@ +require 'pg' + +require_relative 'petshops_repo/petshops_repo.rb' +require_relative 'cats_repo/cats_repo.rb' +require_relative 'dogs_repo/dogs_repo.rb' +require_relative 'users_repo/users_repo.rb' + +module PetShop + def self.create_db_connection() + PG.connect(host: 'localhost', dbname: "petshop_db", user: "ruby", + password: "rubyRailsJS") + end + + def self.create_tables(db) + db.exec <<-SQL + CREATE TABLE IF NOT EXISTS petshops( + id SERIAL PRIMARY KEY, + name VARCHAR + ); + CREATE TABLE IF NOT EXISTS cats( + id SERIAL PRIMARY KEY, + shopid INTEGER references petshops(id), + imageurl VARCHAR, + name VARCHAR, + adopted BOOLEAN + ); + CREATE TABLE IF NOT EXISTS dogs( + id SERIAL PRIMARY KEY, + shopid INTEGER references petshops(id), + imageurl VARCHAR, + name VARCHAR, + happiness VARCHAR, + adopted BOOLEAN + ); + CREATE TABLE IF NOT EXISTS users( + id SERIAL PRIMARY KEY, + username VARCHAR, + password VARCHAR + ); + CREATE TABLE IF NOT EXISTS pet_adptions( + id SERIAL PRIMARY KEY, + type VARCHAR, + user_id INTEGER references users(id), + pet_id INTEGER + ); + SQL + end + + def self.drop_tables(db) + db.exec <<-SQL + DROP TABLE petshops CASCADE; + DROP TABLE cats CASCADE; + DROP TABLE dogs CASCADE; + DROP TABLE users CASCADE; + DROP TABLE pet_adptions; + SQL + end + + def self.seed_db(db) + r = db.exec <<-SQL + INSERT INTO petshops (name) values ('My Pet Shop') RETURNING id + SQL + + dogurl = "http://www.oldyelladogranch.com/puppies.jpg" + caturl = "http://nextranks.com/data_images/main/cats/cats-04.jpg" + shopid = r[0]['id'] + q = "INSERT INTO cats (shopid, imageurl, name, adopted) values ($1, $2, 'cat1', 'false')" + db.exec(q,[shopid, caturl]) + q = "INSERT INTO dogs (shopid, imageurl, name, happiness, adopted) values ($1, $2, 'dog1', '5', 'false')" + db.exec(q,[shopid, dogurl]) + q = "INSERT INTO users (username, password) values ('ilovepets', 'ilovepets')" + db.exec(q) + q = "INSERT INTO users (username, password) values ('someuser', 'someuser')" + db.exec(q) + q = "INSERT INTO users (username, password) values ('someotherperson', 'someotherperson')" + db.exec(q) + + end + + + +end \ No newline at end of file diff --git a/lib/petshops_repo/petshops_repo.rb b/lib/petshops_repo/petshops_repo.rb new file mode 100644 index 00000000..e69de29b diff --git a/lib/users_repo/users_repo.rb b/lib/users_repo/users_repo.rb new file mode 100644 index 00000000..314f9293 --- /dev/null +++ b/lib/users_repo/users_repo.rb @@ -0,0 +1,38 @@ +module Petshop + class UsersRepo + # find a user by user ID. Intended to be used when + # someone is already authenticated. We keep their + # user id in the cookie. + def self.find db, user_id + sql = %q[SELECT * FROM users WHERE id = $1] + result = db.exec(sql, [user_id]) + result.first + end + + # find user by username. Intended to be used when + # someone tries to sign in. + def self.find_by_name db, username + sql = %q[SELECT * FROM users WHERE username = $1] + result = db.exec(sql, [username]) + result.first + end + + # when someone signs up use this method to save their + # information in the db. we're not encrypting passwords. + def self.save db, user_data + sql = %q[INSERT INTO users (username, password) VALUES ($1, $2) RETURNING *] + result = db.exec(sql, [user_data[:username], user_data[:password]]) + result.first + end + def self.adopt db, user_data + sql = %q[INSERT INTO users (type, user_id, pet_id) VALUES ($1, $2, $3) RETURNING *] + result = db.exec(sql, user_data[:type]], [user_data[:id], user_data[:pet_id]]) + result.first + end + def self.save db, user_data + sql = %q[INSERT INTO pet_adptions (username, password) VALUES ($1, $2) RETURNING *] + result = db.exec(sql, [user_data[:username], user_data[:password]]) + result.first + end + end +end From a038b791bc63dd46fd3ff1f34b1c3f98ccc215cb Mon Sep 17 00:00:00 2001 From: greg Date: Thu, 11 Dec 2014 15:12:19 -0600 Subject: [PATCH 03/34] set up BCrypt for user authentication --- lib/pet-shop.rb | 9 ++++++--- server.rb | 17 ++++++++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/lib/pet-shop.rb b/lib/pet-shop.rb index 4e24565e..8495d6ba 100644 --- a/lib/pet-shop.rb +++ b/lib/pet-shop.rb @@ -68,11 +68,14 @@ def self.seed_db(db) db.exec(q,[shopid, caturl]) q = "INSERT INTO dogs (shopid, imageurl, name, happiness, adopted) values ($1, $2, 'dog1', '5', 'false')" db.exec(q,[shopid, dogurl]) - q = "INSERT INTO users (username, password) values ('ilovepets', 'ilovepets')" + password_hash = BCrypt::Password.create('ilovepets') + q = "INSERT INTO users (username, password) values ('ilovepets', '#{password_hash}')" db.exec(q) - q = "INSERT INTO users (username, password) values ('someuser', 'someuser')" + password_hash = BCrypt::Password.create('someuser') + q = "INSERT INTO users (username, password) values ('someuser', '#{password_hash}')" db.exec(q) - q = "INSERT INTO users (username, password) values ('someotherperson', 'someotherperson')" + password_hash = BCrypt::Password.create('someotherperson') + q = "INSERT INTO users (username, password) values ('someotherperson', '#{password_hash}')" db.exec(q) end diff --git a/server.rb b/server.rb index 9ae90b34..705fea66 100644 --- a/server.rb +++ b/server.rb @@ -21,16 +21,27 @@ RestClient.get("http://pet-shop.api.mks.io/shops") end +get '/signup' do + + erb :"signup" +end +post '/signup' do + db = PetShop.create_db_connection() + password_hash = BCrypt::Password.create(params['password']) + Petshop::UsersRepo.save db, {username: params['username'], password: password_hash} + erb :"signup" +end post '/signin' do params = JSON.parse request.body.read username = params['username'] password = params['password'] - + user = Petshop::UsersRepo.find_by_name(db, username) # TODO: Grab user by username from database and check password - user = { 'username' => 'alice', 'password' => '123' } - if password == user['password'] + pass_from_db = BCrypt::Password.new(user['password']) + + if pass_from_db == password headers['Content-Type'] = 'application/json' # TODO: Return all pets adopted by this user # TODO: Set session[:user_id] so the server will remember this user has logged in From 52c1b2e85f5d530634f277c3bd12f5fa267dc4ca Mon Sep 17 00:00:00 2001 From: greg Date: Thu, 11 Dec 2014 15:14:36 -0600 Subject: [PATCH 04/34] set up BCrypt for user authentication 2 --- lib/users_repo/users_repo.rb | 16 ++++++++++++---- server.rb | 3 +-- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/users_repo/users_repo.rb b/lib/users_repo/users_repo.rb index 314f9293..2aa2e414 100644 --- a/lib/users_repo/users_repo.rb +++ b/lib/users_repo/users_repo.rb @@ -25,13 +25,21 @@ def self.save db, user_data result.first end def self.adopt db, user_data - sql = %q[INSERT INTO users (type, user_id, pet_id) VALUES ($1, $2, $3) RETURNING *] + sql = <<-SQL + INSERT INTO pet_adptions (type, user_id, pet_id) + VALUES ($1, $2, $3) RETURNING * SQL result = db.exec(sql, user_data[:type]], [user_data[:id], user_data[:pet_id]]) result.first end - def self.save db, user_data - sql = %q[INSERT INTO pet_adptions (username, password) VALUES ($1, $2) RETURNING *] - result = db.exec(sql, [user_data[:username], user_data[:password]]) + def self.show_adoptions db, user_data + sql = <<-SQL SELECT u.id, u.name, a.name + FROM pet_adptions p + JOIN users u ON p.user_id = u.id + JOIN cats a ON p.cat_id = a.id + WHERE p.type = 'cat' and u.id = $1 + + SQL + result = db.exec(sql, [user_data[:id]) result.first end end diff --git a/server.rb b/server.rb index 705fea66..6a6e5745 100644 --- a/server.rb +++ b/server.rb @@ -38,14 +38,13 @@ password = params['password'] user = Petshop::UsersRepo.find_by_name(db, username) # TODO: Grab user by username from database and check password - pass_from_db = BCrypt::Password.new(user['password']) if pass_from_db == password headers['Content-Type'] = 'application/json' + session['user_id'] = user['id'] # TODO: Return all pets adopted by this user # TODO: Set session[:user_id] so the server will remember this user has logged in - $sample_user.to_json else status 401 end From 8b4743cdb65be9fbaa4f2edb625bb77b36616c94 Mon Sep 17 00:00:00 2001 From: David Coleman Date: Thu, 11 Dec 2014 15:20:26 -0600 Subject: [PATCH 05/34] set session id upon succesful password and collect pet data --- server.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server.rb b/server.rb index 6a6e5745..33549f58 100644 --- a/server.rb +++ b/server.rb @@ -42,9 +42,11 @@ if pass_from_db == password headers['Content-Type'] = 'application/json' - session['user_id'] = user['id'] + session[:user_id] = user['id'] # TODO: Return all pets adopted by this user + pets = PetShop::UsersRepo.show_adoptions(db, user) # TODO: Set session[:user_id] so the server will remember this user has logged in + else status 401 end From 86a82fbbb507776661942b06d017691e2ddb8b93 Mon Sep 17 00:00:00 2001 From: JMGoldsmith Date: Thu, 11 Dec 2014 15:21:14 -0600 Subject: [PATCH 06/34] petshop query --- lib/petshops_repo/petshops_repo.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/petshops_repo/petshops_repo.rb b/lib/petshops_repo/petshops_repo.rb index e69de29b..df1a6bc2 100644 --- a/lib/petshops_repo/petshops_repo.rb +++ b/lib/petshops_repo/petshops_repo.rb @@ -0,0 +1,8 @@ +module PetShop + class Shops + def get_all_shops + sql = %q[ + SELECT * FROM shops + ] + end + \ No newline at end of file From 4c24c27cbc802251f55620e8e0f55c3dd670b9a4 Mon Sep 17 00:00:00 2001 From: David Coleman Date: Thu, 11 Dec 2014 15:26:25 -0600 Subject: [PATCH 07/34] change login name from default to current user --- server.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server.rb b/server.rb index 33549f58..736292e0 100644 --- a/server.rb +++ b/server.rb @@ -8,7 +8,8 @@ get '/' do if session[:user_id] # TODO: Grab user from database - @current_user = $sample_user + user = Petshop::UsersRepo.find(db, session[:user_id]) + @current_user = user['name'] end erb :index end From 7f35743964d6e0201bb5442de7bf09f4b49588a8 Mon Sep 17 00:00:00 2001 From: JMGoldsmith Date: Thu, 11 Dec 2014 15:26:45 -0600 Subject: [PATCH 08/34] petshop query --- Gemfile.lock | 6 ++++++ lib/users_repo/users_repo.rb | 16 ++++++++++++---- server.rb | 5 +++-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index d4e4517b..39e03203 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -11,7 +11,9 @@ GEM debugger-linecache (1.2.0) diff-lcs (1.2.5) method_source (0.8.2) + mime-types (2.4.3) multi_json (1.10.1) + netrc (0.10.0) pry (0.10.1) coderay (~> 1.1.0) method_source (~> 0.8.1) @@ -24,6 +26,9 @@ GEM rack rack-test (0.6.2) rack (>= 1.0) + rest-client (1.7.2) + mime-types (>= 1.16, < 3.0) + netrc (~> 0.7) rspec (2.14.1) rspec-core (~> 2.14.0) rspec-expectations (~> 2.14.0) @@ -51,6 +56,7 @@ PLATFORMS DEPENDENCIES pry-byebug + rest-client rspec (~> 2.14.1) sinatra (~> 1.4.5) sinatra-contrib (~> 1.4.2) diff --git a/lib/users_repo/users_repo.rb b/lib/users_repo/users_repo.rb index 314f9293..2aa2e414 100644 --- a/lib/users_repo/users_repo.rb +++ b/lib/users_repo/users_repo.rb @@ -25,13 +25,21 @@ def self.save db, user_data result.first end def self.adopt db, user_data - sql = %q[INSERT INTO users (type, user_id, pet_id) VALUES ($1, $2, $3) RETURNING *] + sql = <<-SQL + INSERT INTO pet_adptions (type, user_id, pet_id) + VALUES ($1, $2, $3) RETURNING * SQL result = db.exec(sql, user_data[:type]], [user_data[:id], user_data[:pet_id]]) result.first end - def self.save db, user_data - sql = %q[INSERT INTO pet_adptions (username, password) VALUES ($1, $2) RETURNING *] - result = db.exec(sql, [user_data[:username], user_data[:password]]) + def self.show_adoptions db, user_data + sql = <<-SQL SELECT u.id, u.name, a.name + FROM pet_adptions p + JOIN users u ON p.user_id = u.id + JOIN cats a ON p.cat_id = a.id + WHERE p.type = 'cat' and u.id = $1 + + SQL + result = db.exec(sql, [user_data[:id]) result.first end end diff --git a/server.rb b/server.rb index 705fea66..33549f58 100644 --- a/server.rb +++ b/server.rb @@ -38,14 +38,15 @@ password = params['password'] user = Petshop::UsersRepo.find_by_name(db, username) # TODO: Grab user by username from database and check password - pass_from_db = BCrypt::Password.new(user['password']) if pass_from_db == password headers['Content-Type'] = 'application/json' + session[:user_id] = user['id'] # TODO: Return all pets adopted by this user + pets = PetShop::UsersRepo.show_adoptions(db, user) # TODO: Set session[:user_id] so the server will remember this user has logged in - $sample_user.to_json + else status 401 end From 68a53912112ad8570238321c446ccd3f33602858 Mon Sep 17 00:00:00 2001 From: JMGoldsmith Date: Thu, 11 Dec 2014 15:32:03 -0600 Subject: [PATCH 09/34] no clue --- server.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server.rb b/server.rb index 33549f58..736292e0 100644 --- a/server.rb +++ b/server.rb @@ -8,7 +8,8 @@ get '/' do if session[:user_id] # TODO: Grab user from database - @current_user = $sample_user + user = Petshop::UsersRepo.find(db, session[:user_id]) + @current_user = user['name'] end erb :index end From 454bae95cdec3242f97bd8a39201f033923918e4 Mon Sep 17 00:00:00 2001 From: JMGoldsmith Date: Thu, 11 Dec 2014 16:02:27 -0600 Subject: [PATCH 10/34] cats repo --- lib/cats_repo/cats_repo.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/cats_repo/cats_repo.rb b/lib/cats_repo/cats_repo.rb index e69de29b..9e4289ee 100644 --- a/lib/cats_repo/cats_repo.rb +++ b/lib/cats_repo/cats_repo.rb @@ -0,0 +1,10 @@ +module PetShop + class CatsRepo + def show_all_cats + db.exec('SELECT * FROM cats') + end + def adopt(id) + db.exec("UPDATE cats WHERE id = $1 SET adopted = 'true'",[id]) + end + end +end \ No newline at end of file From 1d92bbb79ab383fac70663a5194d5e4c62914f5e Mon Sep 17 00:00:00 2001 From: JMGoldsmith Date: Thu, 11 Dec 2014 16:08:03 -0600 Subject: [PATCH 11/34] petshop repo extended --- lib/petshops_repo/petshops_repo.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/petshops_repo/petshops_repo.rb b/lib/petshops_repo/petshops_repo.rb index df1a6bc2..ca395998 100644 --- a/lib/petshops_repo/petshops_repo.rb +++ b/lib/petshops_repo/petshops_repo.rb @@ -1,8 +1,8 @@ module PetShop class Shops def get_all_shops - sql = %q[ - SELECT * FROM shops - ] + db.exec('SELECT * FROM shops') end - \ No newline at end of file + def + end +end From dcc983e3d9a12c6145253eaed4f841802c72d31d Mon Sep 17 00:00:00 2001 From: David Coleman Date: Thu, 11 Dec 2014 16:11:20 -0600 Subject: [PATCH 12/34] add dogs repo function --- lib/dogs_repo/dogs_repo.rb | 25 +++++++++++++++++++++++++ lib/petshops_repo/petshops_repo.rb | 8 ++++---- server.rb | 4 +++- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/lib/dogs_repo/dogs_repo.rb b/lib/dogs_repo/dogs_repo.rb index e69de29b..a04b3ae2 100644 --- a/lib/dogs_repo/dogs_repo.rb +++ b/lib/dogs_repo/dogs_repo.rb @@ -0,0 +1,25 @@ +class Petshop + class DogsRepo + + def self.all_from_shop(db, id) + sql = %q[SELECT * FROM dogs WHERE shopid = $1] + result = db.exec(sql, [id]) + result.first + end + + def self.find_by_user(db, user_id) + sql = %q[SELECT * FROM pet_adoptions WHERE user_id = $1] + result = db.exec(sql, [user_id]) + result.first + end + + def self.adopt_dog(db, dog_id) + sql = %q[UPDATE dogs SET adopted = 'true' WHERE id = $1] + result = db.exec(sql, [dog_id]) + result.first + end + + + + end +end \ No newline at end of file diff --git a/lib/petshops_repo/petshops_repo.rb b/lib/petshops_repo/petshops_repo.rb index df1a6bc2..378f0c70 100644 --- a/lib/petshops_repo/petshops_repo.rb +++ b/lib/petshops_repo/petshops_repo.rb @@ -1,8 +1,8 @@ module PetShop class Shops def get_all_shops - sql = %q[ - SELECT * FROM shops - ] + db.exec('SELECT * FROM shops') end - \ No newline at end of file + def + end +end \ No newline at end of file diff --git a/server.rb b/server.rb index 736292e0..08b891ab 100644 --- a/server.rb +++ b/server.rb @@ -1,7 +1,9 @@ require 'sinatra' -require 'sinatra/reloader' +# require 'sinatra/reloader' require 'rest-client' + +set :bind, '0.0.0.0' # # # This is our only html view... # From 0022d1f4b9c35396b711d4893df7fb0a00e42ac4 Mon Sep 17 00:00:00 2001 From: David Coleman Date: Thu, 11 Dec 2014 16:19:12 -0600 Subject: [PATCH 13/34] adjust dog endpoints --- server.rb | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/server.rb b/server.rb index 08b891ab..390a7377 100644 --- a/server.rb +++ b/server.rb @@ -10,8 +10,9 @@ get '/' do if session[:user_id] # TODO: Grab user from database - user = Petshop::UsersRepo.find(db, session[:user_id]) + @user = Petshop::UsersRepo.find(db, session[:user_id]) @current_user = user['name'] + end erb :index end @@ -22,6 +23,7 @@ get '/shops' do headers['Content-Type'] = 'application/json' RestClient.get("http://pet-shop.api.mks.io/shops") + end get '/signup' do @@ -82,6 +84,8 @@ get '/shops/:id/dogs' do headers['Content-Type'] = 'application/json' id = params[:id] + + dogs = PetShop::DogsRepo.all_from_shop(db, id) # TODO: Update database instead RestClient.get("http://pet-shop.api.mks.io/shops/#{id}/dogs") end @@ -91,6 +95,13 @@ shop_id = params[:shop_id] id = params[:id] # TODO: Update database instead + Petshop::DogsRepo.adopt_dog(db, id) + adopt_data = { + type: 'dog', + user_id: @user['id'], + pet_id: id + } + Petshop::UsersRepo.adopt(db, adopt_data) RestClient.put("http://pet-shop.api.mks.io/shops/#{shop_id}/dogs/#{id}", { adopted: true }, :content_type => 'application/json') # TODO (after you create users table): Attach new dog to logged in user From 8b1a40da1d97c73be6817b24eaca4624daa682de Mon Sep 17 00:00:00 2001 From: David Coleman Date: Thu, 11 Dec 2014 16:22:23 -0600 Subject: [PATCH 14/34] change class to module for petshop-dogsrepo --- lib/dogs_repo/dogs_repo.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/dogs_repo/dogs_repo.rb b/lib/dogs_repo/dogs_repo.rb index a04b3ae2..6907e7ef 100644 --- a/lib/dogs_repo/dogs_repo.rb +++ b/lib/dogs_repo/dogs_repo.rb @@ -1,4 +1,4 @@ -class Petshop +module Petshop class DogsRepo def self.all_from_shop(db, id) From fe3142f4d523f67016160afe2841f8e6c68b1d17 Mon Sep 17 00:00:00 2001 From: greg Date: Thu, 11 Dec 2014 16:24:26 -0600 Subject: [PATCH 15/34] fixing bugs with the user repo spec --- Gemfile | 2 ++ Gemfile.lock | 3 ++ lib/petshops_repo/petshops_repo.rb | 1 - lib/users_repo/users_repo.rb | 8 ++++- spec/repos/users_repo_spec.rb | 52 ++++++++++++++++++++++++++++++ spec/spec_helper.rb | 14 ++++++++ spec/spec_helper.rb~ | 0 7 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 spec/repos/users_repo_spec.rb create mode 100644 spec/spec_helper.rb create mode 100644 spec/spec_helper.rb~ diff --git a/Gemfile b/Gemfile index 4324772d..92843dcf 100644 --- a/Gemfile +++ b/Gemfile @@ -5,5 +5,7 @@ gem 'rspec', '~> 2.14.1' gem 'sinatra', '~> 1.4.5' gem 'sinatra-contrib', '~> 1.4.2' gem 'rest-client' +gem 'netrc' # Testing gem 'pry-byebug' +gem 'pg' diff --git a/Gemfile.lock b/Gemfile.lock index 39e03203..91d92332 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -14,6 +14,7 @@ GEM mime-types (2.4.3) multi_json (1.10.1) netrc (0.10.0) + pg (0.17.1) pry (0.10.1) coderay (~> 1.1.0) method_source (~> 0.8.1) @@ -55,6 +56,8 @@ PLATFORMS ruby DEPENDENCIES + netrc + pg pry-byebug rest-client rspec (~> 2.14.1) diff --git a/lib/petshops_repo/petshops_repo.rb b/lib/petshops_repo/petshops_repo.rb index ca395998..c2feaca3 100644 --- a/lib/petshops_repo/petshops_repo.rb +++ b/lib/petshops_repo/petshops_repo.rb @@ -3,6 +3,5 @@ class Shops def get_all_shops db.exec('SELECT * FROM shops') end - def end end diff --git a/lib/users_repo/users_repo.rb b/lib/users_repo/users_repo.rb index 2aa2e414..9be6ab9e 100644 --- a/lib/users_repo/users_repo.rb +++ b/lib/users_repo/users_repo.rb @@ -29,6 +29,12 @@ def self.adopt db, user_data INSERT INTO pet_adptions (type, user_id, pet_id) VALUES ($1, $2, $3) RETURNING * SQL result = db.exec(sql, user_data[:type]], [user_data[:id], user_data[:pet_id]]) + if(user_data[:type] == "cat") + PetShop::CatsRepo.adopt(user_data[:pet_id]) + end + if(user_data[:type] == "dog") + PetShop::DogsRepo.adopt(user_data[:pet_id]) + end result.first end def self.show_adoptions db, user_data @@ -39,7 +45,7 @@ def self.show_adoptions db, user_data WHERE p.type = 'cat' and u.id = $1 SQL - result = db.exec(sql, [user_data[:id]) + result = db.exec(sql, [user_data[:id]]) result.first end end diff --git a/spec/repos/users_repo_spec.rb b/spec/repos/users_repo_spec.rb new file mode 100644 index 00000000..f90e1319 --- /dev/null +++ b/spec/repos/users_repo_spec.rb @@ -0,0 +1,52 @@ +require 'spec_helper' +require_relative "lib/users_repo/users_repo.rb" + +describe PetShop::UsersRepo do + + def user_count(db) + db.exec("SELECT COUNT(*) FROM users")[0]["count"].to_i + end + + let(:db) { PetShop.create_db_connection('library_test') } + + before(:each) do + PetShop.drop_tables(db) + PetShop.create_tables(db) + end + + it "creates users" do + expect(user_count(db)).to eq 0 + user = PetShop::UserRepo.save(db, {'username' => "alice", 'password' => '123' }) + expect(user['id']).to_not be_nil + expect(user['username']).to eq "alice" + + + # Check for persistence + expect(user_count(db)).to eq 1 + + user = db.exec("SELECT * FROM users")[0] + expect(user['username']).to eq "alice" + end + + it "finds users" do + user = PetShop::UserRepo.save(db, {'username' => "alice", 'password' => '123' }) + retrieved_user = PetShop::UserRepo.find(db, user['id']) + expect(retrieved_user['username']).to eq "Alice" + end + + it "adopts pets" do + user1 = PetShop::UserRepo.save(db, {'username' => "alice", 'password' => '123' }) + r = db.exec <<-SQL + INSERT INTO petshops (name) values ('My Pet Shop') RETURNING id + SQL + caturl = "http://nextranks.com/data_images/main/cats/cats-04.jpg" + shopid = r[0]['id'] + q = "INSERT INTO cats (shopid, imageurl, name, adopted) values ($1, $2, 'cat1', 'false')" + cat = db.exec(q,[shopid, caturl]) + user1["type"]="cat" + user1["pet_id"] = cat['id'] + PetShop::UserRepo.adopt(db, user1) + cat = db.exec("SELECT * FROM cats").to_a[0] + expect(cat['adopted']).to be_true + end +end \ No newline at end of file diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 00000000..a8119394 --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,14 @@ +require 'pet-shop' + +RSpec.configure do |config| + config.treat_symbols_as_metadata_keys_with_true_values = true + config.run_all_when_everything_filtered = true + config.filter_run :focus + + # Run specs in random order to surface order dependencies. If you find an + # order dependency and want to debug it, you can fix the order by providing + # the seed, which is printed after each run. + # --seed 1234 + config.order = 'random' +end + diff --git a/spec/spec_helper.rb~ b/spec/spec_helper.rb~ new file mode 100644 index 00000000..e69de29b From 7eb4b894749f7ed14b75267e18ae0d9d8da3b8d2 Mon Sep 17 00:00:00 2001 From: greg Date: Thu, 11 Dec 2014 16:26:54 -0600 Subject: [PATCH 16/34] removing HEAD thngy --- lib/petshops_repo/petshops_repo.rb | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/petshops_repo/petshops_repo.rb b/lib/petshops_repo/petshops_repo.rb index b91fb876..c2feaca3 100644 --- a/lib/petshops_repo/petshops_repo.rb +++ b/lib/petshops_repo/petshops_repo.rb @@ -3,9 +3,5 @@ class Shops def get_all_shops db.exec('SELECT * FROM shops') end -<<<<<<< HEAD -======= - ->>>>>>> 8b1a40da1d97c73be6817b24eaca4624daa682de end end From e09dc970a2356fb163322bb1f0f842f7e72f16c8 Mon Sep 17 00:00:00 2001 From: David Coleman Date: Thu, 11 Dec 2014 16:27:36 -0600 Subject: [PATCH 17/34] Merge correction --- lib/petshops_repo/petshops_repo.rb | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/petshops_repo/petshops_repo.rb b/lib/petshops_repo/petshops_repo.rb index b91fb876..9a1b9594 100644 --- a/lib/petshops_repo/petshops_repo.rb +++ b/lib/petshops_repo/petshops_repo.rb @@ -3,9 +3,6 @@ class Shops def get_all_shops db.exec('SELECT * FROM shops') end -<<<<<<< HEAD -======= ->>>>>>> 8b1a40da1d97c73be6817b24eaca4624daa682de end end From 3d9755b79303b8d3d62edbca500c618d8df53883 Mon Sep 17 00:00:00 2001 From: greg Date: Thu, 11 Dec 2014 16:31:37 -0600 Subject: [PATCH 18/34] got rid of spec closes #7 --- spec/.gitkeep | 0 spec/repos/users_repo_spec.rb | 52 ----------------------------------- spec/spec_helper.rb | 14 ---------- spec/spec_helper.rb~ | 0 4 files changed, 66 deletions(-) delete mode 100644 spec/.gitkeep delete mode 100644 spec/repos/users_repo_spec.rb delete mode 100644 spec/spec_helper.rb delete mode 100644 spec/spec_helper.rb~ diff --git a/spec/.gitkeep b/spec/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/spec/repos/users_repo_spec.rb b/spec/repos/users_repo_spec.rb deleted file mode 100644 index f90e1319..00000000 --- a/spec/repos/users_repo_spec.rb +++ /dev/null @@ -1,52 +0,0 @@ -require 'spec_helper' -require_relative "lib/users_repo/users_repo.rb" - -describe PetShop::UsersRepo do - - def user_count(db) - db.exec("SELECT COUNT(*) FROM users")[0]["count"].to_i - end - - let(:db) { PetShop.create_db_connection('library_test') } - - before(:each) do - PetShop.drop_tables(db) - PetShop.create_tables(db) - end - - it "creates users" do - expect(user_count(db)).to eq 0 - user = PetShop::UserRepo.save(db, {'username' => "alice", 'password' => '123' }) - expect(user['id']).to_not be_nil - expect(user['username']).to eq "alice" - - - # Check for persistence - expect(user_count(db)).to eq 1 - - user = db.exec("SELECT * FROM users")[0] - expect(user['username']).to eq "alice" - end - - it "finds users" do - user = PetShop::UserRepo.save(db, {'username' => "alice", 'password' => '123' }) - retrieved_user = PetShop::UserRepo.find(db, user['id']) - expect(retrieved_user['username']).to eq "Alice" - end - - it "adopts pets" do - user1 = PetShop::UserRepo.save(db, {'username' => "alice", 'password' => '123' }) - r = db.exec <<-SQL - INSERT INTO petshops (name) values ('My Pet Shop') RETURNING id - SQL - caturl = "http://nextranks.com/data_images/main/cats/cats-04.jpg" - shopid = r[0]['id'] - q = "INSERT INTO cats (shopid, imageurl, name, adopted) values ($1, $2, 'cat1', 'false')" - cat = db.exec(q,[shopid, caturl]) - user1["type"]="cat" - user1["pet_id"] = cat['id'] - PetShop::UserRepo.adopt(db, user1) - cat = db.exec("SELECT * FROM cats").to_a[0] - expect(cat['adopted']).to be_true - end -end \ No newline at end of file diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb deleted file mode 100644 index a8119394..00000000 --- a/spec/spec_helper.rb +++ /dev/null @@ -1,14 +0,0 @@ -require 'pet-shop' - -RSpec.configure do |config| - config.treat_symbols_as_metadata_keys_with_true_values = true - config.run_all_when_everything_filtered = true - config.filter_run :focus - - # Run specs in random order to surface order dependencies. If you find an - # order dependency and want to debug it, you can fix the order by providing - # the seed, which is printed after each run. - # --seed 1234 - config.order = 'random' -end - diff --git a/spec/spec_helper.rb~ b/spec/spec_helper.rb~ deleted file mode 100644 index e69de29b..00000000 From b0922227738fa7a5b89117bc9e0ae94b87b6cdb8 Mon Sep 17 00:00:00 2001 From: greg Date: Thu, 11 Dec 2014 16:32:54 -0600 Subject: [PATCH 19/34] removed .rspec file. OUT DAMNED SPEC!!!! --- .rspec | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .rspec diff --git a/.rspec b/.rspec deleted file mode 100644 index 660778bd..00000000 --- a/.rspec +++ /dev/null @@ -1 +0,0 @@ ---colour --format documentation From 1aacd358921c357d47910e2404a87d0748da8f61 Mon Sep 17 00:00:00 2001 From: David Coleman Date: Thu, 11 Dec 2014 16:40:55 -0600 Subject: [PATCH 20/34] remove rest-client, require json and render reterned hashes into json --- server.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/server.rb b/server.rb index 390a7377..9c91924f 100644 --- a/server.rb +++ b/server.rb @@ -1,6 +1,7 @@ require 'sinatra' # require 'sinatra/reloader' require 'rest-client' +require 'json' set :bind, '0.0.0.0' @@ -86,8 +87,9 @@ id = params[:id] dogs = PetShop::DogsRepo.all_from_shop(db, id) + JSON.generate(dogs) # TODO: Update database instead - RestClient.get("http://pet-shop.api.mks.io/shops/#{id}/dogs") + # RestClient.get("http://pet-shop.api.mks.io/shops/#{id}/dogs") end put '/shops/:shop_id/dogs/:id/adopt' do @@ -102,8 +104,8 @@ pet_id: id } Petshop::UsersRepo.adopt(db, adopt_data) - RestClient.put("http://pet-shop.api.mks.io/shops/#{shop_id}/dogs/#{id}", - { adopted: true }, :content_type => 'application/json') + # RestClient.put("http://pet-shop.api.mks.io/shops/#{shop_id}/dogs/#{id}", + # { adopted: true }, :content_type => 'application/json') # TODO (after you create users table): Attach new dog to logged in user end From 4d8c760f68a7805a45c91c93e3f8dc8bcd86030f Mon Sep 17 00:00:00 2001 From: David Coleman Date: Thu, 11 Dec 2014 16:48:31 -0600 Subject: [PATCH 21/34] create db connection in dog sections --- server.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server.rb b/server.rb index 9c91924f..721e0ae5 100644 --- a/server.rb +++ b/server.rb @@ -84,6 +84,7 @@ # # # # get '/shops/:id/dogs' do headers['Content-Type'] = 'application/json' + db = PetShop.create_db_connection() id = params[:id] dogs = PetShop::DogsRepo.all_from_shop(db, id) @@ -96,6 +97,7 @@ headers['Content-Type'] = 'application/json' shop_id = params[:shop_id] id = params[:id] + db = PetShop.create_db_connection() # TODO: Update database instead Petshop::DogsRepo.adopt_dog(db, id) adopt_data = { From 5e2abbdab9945f1f1f5195364b4f30ee34f5abba Mon Sep 17 00:00:00 2001 From: greg Date: Thu, 11 Dec 2014 17:03:17 -0600 Subject: [PATCH 22/34] set up database call for shops.all --- Gemfile | 1 + Gemfile.lock | 2 ++ lib/petshops_repo/petshops_repo.rb | 4 ++-- lib/users_repo/users_repo.rb | 2 +- server.rb | 8 +++----- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Gemfile b/Gemfile index 92843dcf..083cd475 100644 --- a/Gemfile +++ b/Gemfile @@ -9,3 +9,4 @@ gem 'netrc' # Testing gem 'pry-byebug' gem 'pg' +gem 'json' diff --git a/Gemfile.lock b/Gemfile.lock index 91d92332..22d73004 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -10,6 +10,7 @@ GEM columnize (0.8.9) debugger-linecache (1.2.0) diff-lcs (1.2.5) + json (1.8.1) method_source (0.8.2) mime-types (2.4.3) multi_json (1.10.1) @@ -56,6 +57,7 @@ PLATFORMS ruby DEPENDENCIES + json netrc pg pry-byebug diff --git a/lib/petshops_repo/petshops_repo.rb b/lib/petshops_repo/petshops_repo.rb index 9a1b9594..e3eec479 100644 --- a/lib/petshops_repo/petshops_repo.rb +++ b/lib/petshops_repo/petshops_repo.rb @@ -1,7 +1,7 @@ module PetShop class Shops - def get_all_shops - db.exec('SELECT * FROM shops') + def self.get_all_shops(db) + db.exec('SELECT * FROM petshops').to_a end end diff --git a/lib/users_repo/users_repo.rb b/lib/users_repo/users_repo.rb index 9be6ab9e..2af97ddf 100644 --- a/lib/users_repo/users_repo.rb +++ b/lib/users_repo/users_repo.rb @@ -1,4 +1,4 @@ -module Petshop +module PetShop class UsersRepo # find a user by user ID. Intended to be used when # someone is already authenticated. We keep their diff --git a/server.rb b/server.rb index 9c91924f..8ee9aa1f 100644 --- a/server.rb +++ b/server.rb @@ -2,9 +2,7 @@ # require 'sinatra/reloader' require 'rest-client' require 'json' - - -set :bind, '0.0.0.0' +require_relative 'lib/pet-shop.rb' # # # This is our only html view... # @@ -23,8 +21,8 @@ # get '/shops' do headers['Content-Type'] = 'application/json' - RestClient.get("http://pet-shop.api.mks.io/shops") - + db = PetShop.create_db_connection() + JSON.generate(PetShop::Shops.get_all_shops(db)) end get '/signup' do From 370e8eee03cc7b5d69e6c5236ff6dfa0293dec3a Mon Sep 17 00:00:00 2001 From: greg Date: Fri, 12 Dec 2014 09:54:58 -0600 Subject: [PATCH 23/34] adds requires for bcrypt dependency run bundle install when pulling! --- Gemfile | 1 + Gemfile.lock | 2 ++ lib/pet-shop.rb | 1 + server.rb | 2 +- 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 083cd475..adbf9fd0 100644 --- a/Gemfile +++ b/Gemfile @@ -10,3 +10,4 @@ gem 'netrc' gem 'pry-byebug' gem 'pg' gem 'json' +gem 'bcrypt' diff --git a/Gemfile.lock b/Gemfile.lock index 22d73004..dfd55b74 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,6 +2,7 @@ GEM remote: https://rubygems.org/ specs: backports (3.6.3) + bcrypt (3.1.9) byebug (3.5.1) columnize (~> 0.8) debugger-linecache (~> 1.2) @@ -57,6 +58,7 @@ PLATFORMS ruby DEPENDENCIES + bcrypt json netrc pg diff --git a/lib/pet-shop.rb b/lib/pet-shop.rb index 8495d6ba..ac005ace 100644 --- a/lib/pet-shop.rb +++ b/lib/pet-shop.rb @@ -1,4 +1,5 @@ require 'pg' +require 'bcrypt' require_relative 'petshops_repo/petshops_repo.rb' require_relative 'cats_repo/cats_repo.rb' diff --git a/server.rb b/server.rb index 9a49e562..472b9708 100644 --- a/server.rb +++ b/server.rb @@ -2,7 +2,7 @@ # require 'sinatra/reloader' require 'rest-client' require 'json' -require_relative 'lib/pet-shop.rb' +require_relatived 'lib/pet-shop.rb' # # # This is our only html view... # From 70dc15281aa3b100f4b3115233046d59d2867678 Mon Sep 17 00:00:00 2001 From: greg Date: Fri, 12 Dec 2014 10:30:40 -0600 Subject: [PATCH 24/34] corrected typo in server.rb --- server.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.rb b/server.rb index 472b9708..9a49e562 100644 --- a/server.rb +++ b/server.rb @@ -2,7 +2,7 @@ # require 'sinatra/reloader' require 'rest-client' require 'json' -require_relatived 'lib/pet-shop.rb' +require_relative 'lib/pet-shop.rb' # # # This is our only html view... # From 0bfbeaeff684fb784babc96a08962666c5e8a933 Mon Sep 17 00:00:00 2001 From: greg Date: Fri, 12 Dec 2014 10:40:10 -0600 Subject: [PATCH 25/34] did some cleanup on repos added bind on server.rb for the mac folks --- lib/cats_repo/cats_repo.rb | 11 ++++++++--- server.rb | 8 +++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/lib/cats_repo/cats_repo.rb b/lib/cats_repo/cats_repo.rb index 9e4289ee..afb8c883 100644 --- a/lib/cats_repo/cats_repo.rb +++ b/lib/cats_repo/cats_repo.rb @@ -1,10 +1,15 @@ module PetShop class CatsRepo - def show_all_cats - db.exec('SELECT * FROM cats') + def self.find_by_user(db, user_id) + sql = %q[SELECT * FROM pet_adoptions WHERE user_id = $1 and type = 'cat'] + result = db.exec(sql, [user_id]) + result.first end - def adopt(id) + def self.adopt_cat(db, id) db.exec("UPDATE cats WHERE id = $1 SET adopted = 'true'",[id]) end + def self.all_from_shop(db, id) + db.exec("SELECT * FROM cats WHERE shopid = $1",[id]).to_a + end end end \ No newline at end of file diff --git a/server.rb b/server.rb index 9a49e562..141f0be4 100644 --- a/server.rb +++ b/server.rb @@ -3,6 +3,9 @@ require 'rest-client' require 'json' require_relative 'lib/pet-shop.rb' + +set :bind, '0.0.0.0' + # # # This is our only html view... # @@ -63,7 +66,9 @@ headers['Content-Type'] = 'application/json' id = params[:id] # TODO: Grab from database instead - RestClient.get("http://pet-shop.api.mks.io/shops/#{id}/cats") + db = PetShop.create_db_connection() + cats = PetShop::CatsRepo.all_from_shop(db, id) + JSON.generate(cats) end put '/shops/:shop_id/cats/:id/adopt' do @@ -71,6 +76,7 @@ shop_id = params[:shop_id] id = params[:id] # TODO: Grab from database instead + PetShop::UsersRepo.adopt RestClient.put("http://pet-shop.api.mks.io/shops/#{shop_id}/cats/#{id}", { adopted: true }, :content_type => 'application/json') # TODO (after you create users table): Attach new cat to logged in user From b7b5bbc061f537e51b21d411e83855edfbf4efcc Mon Sep 17 00:00:00 2001 From: greg Date: Fri, 12 Dec 2014 11:31:03 -0600 Subject: [PATCH 26/34] fixed several typos --- lib/dogs_repo/dogs_repo.rb | 2 +- lib/pet-shop.rb | 4 ++-- lib/users_repo/users_repo.rb | 29 ++++++++++++++--------------- server.rb | 5 +++-- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/lib/dogs_repo/dogs_repo.rb b/lib/dogs_repo/dogs_repo.rb index 6907e7ef..2a21030f 100644 --- a/lib/dogs_repo/dogs_repo.rb +++ b/lib/dogs_repo/dogs_repo.rb @@ -1,4 +1,4 @@ -module Petshop +module PetShop class DogsRepo def self.all_from_shop(db, id) diff --git a/lib/pet-shop.rb b/lib/pet-shop.rb index ac005ace..c4bf31f7 100644 --- a/lib/pet-shop.rb +++ b/lib/pet-shop.rb @@ -38,7 +38,7 @@ def self.create_tables(db) username VARCHAR, password VARCHAR ); - CREATE TABLE IF NOT EXISTS pet_adptions( + CREATE TABLE IF NOT EXISTS pet_adoptions( id SERIAL PRIMARY KEY, type VARCHAR, user_id INTEGER references users(id), @@ -53,7 +53,7 @@ def self.drop_tables(db) DROP TABLE cats CASCADE; DROP TABLE dogs CASCADE; DROP TABLE users CASCADE; - DROP TABLE pet_adptions; + DROP TABLE pet_adoptions; SQL end diff --git a/lib/users_repo/users_repo.rb b/lib/users_repo/users_repo.rb index 2af97ddf..60d3c425 100644 --- a/lib/users_repo/users_repo.rb +++ b/lib/users_repo/users_repo.rb @@ -5,7 +5,7 @@ class UsersRepo # user id in the cookie. def self.find db, user_id sql = %q[SELECT * FROM users WHERE id = $1] - result = db.exec(sql, [user_id]) + result = db.exec(sql, [user_id]).to_a result.first end @@ -13,7 +13,7 @@ def self.find db, user_id # someone tries to sign in. def self.find_by_name db, username sql = %q[SELECT * FROM users WHERE username = $1] - result = db.exec(sql, [username]) + result = db.exec(sql, [username]).to_a result.first end @@ -24,29 +24,28 @@ def self.save db, user_data result = db.exec(sql, [user_data[:username], user_data[:password]]) result.first end + def self.adopt db, user_data - sql = <<-SQL - INSERT INTO pet_adptions (type, user_id, pet_id) - VALUES ($1, $2, $3) RETURNING * SQL - result = db.exec(sql, user_data[:type]], [user_data[:id], user_data[:pet_id]]) + sql = %q[INSERT INTO pet_adoptions (type, user_id, pet_id) VALUES ($1, $2, $3) RETURNING *] + result = db.exec(sql, [user_data[:type], user_data[:id], user_data[:pet_id]]) + if(user_data[:type] == "cat") PetShop::CatsRepo.adopt(user_data[:pet_id]) end + if(user_data[:type] == "dog") PetShop::DogsRepo.adopt(user_data[:pet_id]) end result.first end - def self.show_adoptions db, user_data - sql = <<-SQL SELECT u.id, u.name, a.name - FROM pet_adptions p - JOIN users u ON p.user_id = u.id - JOIN cats a ON p.cat_id = a.id - WHERE p.type = 'cat' and u.id = $1 - SQL - result = db.exec(sql, [user_data[:id]]) - result.first + def self.show_adoptions db, user_data + sql = %q[SELECT a.pet_id, c.name, c.imageurl FROM pet_adoptions a JOIN cats c on a.pet_id = c.id WHERE a.type = 'cat' and a.user_id = $1] + user_data['cats'] = db.exec(sql, [user_data[:id]]).to_a + sql = %q[SELECT a.pet_id, d.name, d.imageurl FROM pet_adoptions a JOIN dogs d on a.pet_id = d.id WHERE a.type = 'dog' and a.user_id = $1] + user_data['dogs'] = db.exec(sql, [user_data[:id]]).to_a + + user_data end end end diff --git a/server.rb b/server.rb index 141f0be4..28af616c 100644 --- a/server.rb +++ b/server.rb @@ -43,7 +43,8 @@ username = params['username'] password = params['password'] - user = Petshop::UsersRepo.find_by_name(db, username) + db = PetShop.create_db_connection() + user = PetShop::UsersRepo.find_by_name(db, username) # TODO: Grab user by username from database and check password pass_from_db = BCrypt::Password.new(user['password']) @@ -53,7 +54,7 @@ # TODO: Return all pets adopted by this user pets = PetShop::UsersRepo.show_adoptions(db, user) # TODO: Set session[:user_id] so the server will remember this user has logged in - + JSON.generate(pets) else status 401 end From e075c9b84c7dea24e0e87218dfd14436856a5655 Mon Sep 17 00:00:00 2001 From: greg Date: Fri, 12 Dec 2014 12:07:32 -0600 Subject: [PATCH 27/34] refactored some database queries and the way "adopted" is stored --- lib/cats_repo/cats_repo.rb | 3 ++- lib/dogs_repo/dogs_repo.rb | 5 ++--- lib/pet-shop.rb | 12 ++++++------ lib/petshops_repo/petshops_repo.rb | 4 +++- lib/users_repo/users_repo.rb | 4 ++-- server.rb | 2 +- 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/lib/cats_repo/cats_repo.rb b/lib/cats_repo/cats_repo.rb index afb8c883..33fc48f8 100644 --- a/lib/cats_repo/cats_repo.rb +++ b/lib/cats_repo/cats_repo.rb @@ -9,7 +9,8 @@ def self.adopt_cat(db, id) db.exec("UPDATE cats WHERE id = $1 SET adopted = 'true'",[id]) end def self.all_from_shop(db, id) - db.exec("SELECT * FROM cats WHERE shopid = $1",[id]).to_a + db.exec(%q[SELECT id, shopid, name, imageurl AS "imageUrl", adopted FROM cats WHERE shopid = $1],[id]).to_a + end end end \ No newline at end of file diff --git a/lib/dogs_repo/dogs_repo.rb b/lib/dogs_repo/dogs_repo.rb index 2a21030f..9088740a 100644 --- a/lib/dogs_repo/dogs_repo.rb +++ b/lib/dogs_repo/dogs_repo.rb @@ -2,9 +2,8 @@ module PetShop class DogsRepo def self.all_from_shop(db, id) - sql = %q[SELECT * FROM dogs WHERE shopid = $1] - result = db.exec(sql, [id]) - result.first + sql = %q[SELECT id, shopid, name, imageurl AS "imageUrl", adopted, happiness FROM dogs WHERE shopid = $1] + db.exec(sql, [id]).to_a end def self.find_by_user(db, user_id) diff --git a/lib/pet-shop.rb b/lib/pet-shop.rb index c4bf31f7..1a249b1e 100644 --- a/lib/pet-shop.rb +++ b/lib/pet-shop.rb @@ -21,17 +21,17 @@ def self.create_tables(db) CREATE TABLE IF NOT EXISTS cats( id SERIAL PRIMARY KEY, shopid INTEGER references petshops(id), - imageurl VARCHAR, + imageUrl VARCHAR, name VARCHAR, - adopted BOOLEAN + adopted VARCHAR ); CREATE TABLE IF NOT EXISTS dogs( id SERIAL PRIMARY KEY, shopid INTEGER references petshops(id), - imageurl VARCHAR, + imageUrl VARCHAR, name VARCHAR, happiness VARCHAR, - adopted BOOLEAN + adopted VARCHAR ); CREATE TABLE IF NOT EXISTS users( id SERIAL PRIMARY KEY, @@ -65,9 +65,9 @@ def self.seed_db(db) dogurl = "http://www.oldyelladogranch.com/puppies.jpg" caturl = "http://nextranks.com/data_images/main/cats/cats-04.jpg" shopid = r[0]['id'] - q = "INSERT INTO cats (shopid, imageurl, name, adopted) values ($1, $2, 'cat1', 'false')" + q = "INSERT INTO cats (shopid, imageUrl, name) values ($1, $2, 'cat1')" db.exec(q,[shopid, caturl]) - q = "INSERT INTO dogs (shopid, imageurl, name, happiness, adopted) values ($1, $2, 'dog1', '5', 'false')" + q = "INSERT INTO dogs (shopid, imageUrl, name, happiness) values ($1, $2, 'dog1', '5')" db.exec(q,[shopid, dogurl]) password_hash = BCrypt::Password.create('ilovepets') q = "INSERT INTO users (username, password) values ('ilovepets', '#{password_hash}')" diff --git a/lib/petshops_repo/petshops_repo.rb b/lib/petshops_repo/petshops_repo.rb index e3eec479..112ba65d 100644 --- a/lib/petshops_repo/petshops_repo.rb +++ b/lib/petshops_repo/petshops_repo.rb @@ -1,7 +1,9 @@ module PetShop class Shops def self.get_all_shops(db) - db.exec('SELECT * FROM petshops').to_a + shops = db.exec('SELECT * FROM petshops').to_a + + end end diff --git a/lib/users_repo/users_repo.rb b/lib/users_repo/users_repo.rb index 60d3c425..25d51261 100644 --- a/lib/users_repo/users_repo.rb +++ b/lib/users_repo/users_repo.rb @@ -40,9 +40,9 @@ def self.adopt db, user_data end def self.show_adoptions db, user_data - sql = %q[SELECT a.pet_id, c.name, c.imageurl FROM pet_adoptions a JOIN cats c on a.pet_id = c.id WHERE a.type = 'cat' and a.user_id = $1] + sql = %q[SELECT a.pet_id, c.name, c.imageUrl FROM pet_adoptions a JOIN cats c on a.pet_id = c.id WHERE a.type = 'cat' and a.user_id = $1] user_data['cats'] = db.exec(sql, [user_data[:id]]).to_a - sql = %q[SELECT a.pet_id, d.name, d.imageurl FROM pet_adoptions a JOIN dogs d on a.pet_id = d.id WHERE a.type = 'dog' and a.user_id = $1] + sql = %q[SELECT a.pet_id, d.name, d.imageUrl FROM pet_adoptions a JOIN dogs d on a.pet_id = d.id WHERE a.type = 'dog' and a.user_id = $1] user_data['dogs'] = db.exec(sql, [user_data[:id]]).to_a user_data diff --git a/server.rb b/server.rb index 28af616c..cffb7bfd 100644 --- a/server.rb +++ b/server.rb @@ -66,7 +66,7 @@ get '/shops/:id/cats' do headers['Content-Type'] = 'application/json' id = params[:id] - # TODO: Grab from database instead + # TODO: Grab from database instead db = PetShop.create_db_connection() cats = PetShop::CatsRepo.all_from_shop(db, id) JSON.generate(cats) From ea43e11750bcd49041c89cf23dfe5c97a69976f8 Mon Sep 17 00:00:00 2001 From: greg Date: Fri, 12 Dec 2014 13:40:23 -0600 Subject: [PATCH 28/34] fixed cat & dog adoption methods --- lib/cats_repo/cats_repo.rb | 8 +++---- lib/dogs_repo/dogs_repo.rb | 8 +++---- lib/users_repo/users_repo.rb | 14 +++++------- server.rb | 43 ++++++++++++++++++++++-------------- views/index.erb | 2 +- 5 files changed, 41 insertions(+), 34 deletions(-) diff --git a/lib/cats_repo/cats_repo.rb b/lib/cats_repo/cats_repo.rb index 33fc48f8..51de7ee7 100644 --- a/lib/cats_repo/cats_repo.rb +++ b/lib/cats_repo/cats_repo.rb @@ -1,12 +1,12 @@ module PetShop class CatsRepo def self.find_by_user(db, user_id) - sql = %q[SELECT * FROM pet_adoptions WHERE user_id = $1 and type = 'cat'] - result = db.exec(sql, [user_id]) - result.first + sql = %q[SELECT c.id, c.name, c.imageurl AS "imageUrl" FROM pet_adoptions a JOIN cats c ON c.id = a.pet_id WHERE a.user_id = $1 and type = 'cat'] + result = db.exec(sql, [user_id]).to_a + result end def self.adopt_cat(db, id) - db.exec("UPDATE cats WHERE id = $1 SET adopted = 'true'",[id]) + db.exec("UPDATE cats SET adopted = 'true' WHERE id = $1",[id]) end def self.all_from_shop(db, id) db.exec(%q[SELECT id, shopid, name, imageurl AS "imageUrl", adopted FROM cats WHERE shopid = $1],[id]).to_a diff --git a/lib/dogs_repo/dogs_repo.rb b/lib/dogs_repo/dogs_repo.rb index 9088740a..2df2d712 100644 --- a/lib/dogs_repo/dogs_repo.rb +++ b/lib/dogs_repo/dogs_repo.rb @@ -2,20 +2,20 @@ module PetShop class DogsRepo def self.all_from_shop(db, id) - sql = %q[SELECT id, shopid, name, imageurl AS "imageUrl", adopted, happiness FROM dogs WHERE shopid = $1] + sql = %q[SELECT id, shopid, name, imageurl AS "imageUrl", adopted, happiness FROM dogs WHERE shopid = $1] db.exec(sql, [id]).to_a end def self.find_by_user(db, user_id) - sql = %q[SELECT * FROM pet_adoptions WHERE user_id = $1] - result = db.exec(sql, [user_id]) + sql = %q[SELECT d.id, d.name, d.imageurl AS "imageUrl" FROM pet_adoptions a JOIN dogs d ON d.id = a.pet_id WHERE user_id = $1 and type = 'dog'] + result = db.exec(sql, [user_id]).to_a result.first end def self.adopt_dog(db, dog_id) sql = %q[UPDATE dogs SET adopted = 'true' WHERE id = $1] result = db.exec(sql, [dog_id]) - result.first + result end diff --git a/lib/users_repo/users_repo.rb b/lib/users_repo/users_repo.rb index 25d51261..a0204a2b 100644 --- a/lib/users_repo/users_repo.rb +++ b/lib/users_repo/users_repo.rb @@ -27,24 +27,20 @@ def self.save db, user_data def self.adopt db, user_data sql = %q[INSERT INTO pet_adoptions (type, user_id, pet_id) VALUES ($1, $2, $3) RETURNING *] - result = db.exec(sql, [user_data[:type], user_data[:id], user_data[:pet_id]]) + result = db.exec(sql, [user_data[:type], user_data[:user_id], user_data[:pet_id]]) if(user_data[:type] == "cat") - PetShop::CatsRepo.adopt(user_data[:pet_id]) + PetShop::CatsRepo.adopt_cat(db, user_data[:pet_id]) end if(user_data[:type] == "dog") - PetShop::DogsRepo.adopt(user_data[:pet_id]) + PetShop::DogsRepo.adopt_dog(db, user_data[:pet_id]) end - result.first + return "Adopted: true" end def self.show_adoptions db, user_data - sql = %q[SELECT a.pet_id, c.name, c.imageUrl FROM pet_adoptions a JOIN cats c on a.pet_id = c.id WHERE a.type = 'cat' and a.user_id = $1] - user_data['cats'] = db.exec(sql, [user_data[:id]]).to_a - sql = %q[SELECT a.pet_id, d.name, d.imageUrl FROM pet_adoptions a JOIN dogs d on a.pet_id = d.id WHERE a.type = 'dog' and a.user_id = $1] - user_data['dogs'] = db.exec(sql, [user_data[:id]]).to_a - + user_data end end diff --git a/server.rb b/server.rb index cffb7bfd..bfd94b6d 100644 --- a/server.rb +++ b/server.rb @@ -5,15 +5,18 @@ require_relative 'lib/pet-shop.rb' set :bind, '0.0.0.0' - +configure do + enable :sessions + end # # # This is our only html view... # get '/' do - if session[:user_id] + if session['user_id'] # TODO: Grab user from database - @user = Petshop::UsersRepo.find(db, session[:user_id]) - @current_user = user['name'] + db = PetShop.create_db_connection() + @user = PetShop::UsersRepo.find(db, session[:user_id]) + @current_user = @user['name'] end erb :index @@ -35,7 +38,7 @@ post '/signup' do db = PetShop.create_db_connection() password_hash = BCrypt::Password.create(params['password']) - Petshop::UsersRepo.save db, {username: params['username'], password: password_hash} + PetShop::UsersRepo.save db, {username: params['username'], password: password_hash} erb :"signup" end post '/signin' do @@ -43,21 +46,24 @@ username = params['username'] password = params['password'] - db = PetShop.create_db_connection() + db = PetShop.create_db_connection() user = PetShop::UsersRepo.find_by_name(db, username) # TODO: Grab user by username from database and check password pass_from_db = BCrypt::Password.new(user['password']) if pass_from_db == password headers['Content-Type'] = 'application/json' - session[:user_id] = user['id'] + session['user_id'] = user['id'] # TODO: Return all pets adopted by this user - pets = PetShop::UsersRepo.show_adoptions(db, user) # TODO: Set session[:user_id] so the server will remember this user has logged in - JSON.generate(pets) + user["dogs"] = PetShop::DogsRepo.find_by_user(db, user['id']) + user.delete('password') + user["cats"] = PetShop::CatsRepo.find_by_user(db, user['id']) + else status 401 end + JSON.generate(user) end # # # # @@ -76,10 +82,14 @@ headers['Content-Type'] = 'application/json' shop_id = params[:shop_id] id = params[:id] + adopt_data = { + type: 'cat', + user_id: session['user_id'], + pet_id: id + } # TODO: Grab from database instead - PetShop::UsersRepo.adopt - RestClient.put("http://pet-shop.api.mks.io/shops/#{shop_id}/cats/#{id}", - { adopted: true }, :content_type => 'application/json') + db = PetShop.create_db_connection() + PetShop::UsersRepo.adopt(db, adopt_data) # TODO (after you create users table): Attach new cat to logged in user end @@ -103,17 +113,18 @@ shop_id = params[:shop_id] id = params[:id] db = PetShop.create_db_connection() + @user = PetShop::UsersRepo.find(db, session["user_id"]) # TODO: Update database instead - Petshop::DogsRepo.adopt_dog(db, id) adopt_data = { type: 'dog', - user_id: @user['id'], + user_id: session[:user_id].to_i, pet_id: id - } - Petshop::UsersRepo.adopt(db, adopt_data) + } + PetShop::UsersRepo.adopt(db, adopt_data) # RestClient.put("http://pet-shop.api.mks.io/shops/#{shop_id}/dogs/#{id}", # { adopted: true }, :content_type => 'application/json') # TODO (after you create users table): Attach new dog to logged in user + JSON.generate(adopt_data) end diff --git a/views/index.erb b/views/index.erb index ab7afc43..8660fe18 100644 --- a/views/index.erb +++ b/views/index.erb @@ -4,7 +4,7 @@ - +<%= session['user_id'] %>

Loading...

From b709dd71d9d91b49adb136fe22b82532020b342a Mon Sep 17 00:00:00 2001 From: greg Date: Fri, 12 Dec 2014 13:40:56 -0600 Subject: [PATCH 29/34] fixed a typo --- views/index.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/index.erb b/views/index.erb index 8660fe18..ab7afc43 100644 --- a/views/index.erb +++ b/views/index.erb @@ -4,7 +4,7 @@ -<%= session['user_id'] %> +

Loading...

From aa6485601d144b1f59254ac7f0b8d02a3556f229 Mon Sep 17 00:00:00 2001 From: greg Date: Fri, 12 Dec 2014 13:49:40 -0600 Subject: [PATCH 30/34] finished the adopted animals return func --- lib/dogs_repo/dogs_repo.rb | 1 - server.rb | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/dogs_repo/dogs_repo.rb b/lib/dogs_repo/dogs_repo.rb index 2df2d712..9843a85a 100644 --- a/lib/dogs_repo/dogs_repo.rb +++ b/lib/dogs_repo/dogs_repo.rb @@ -9,7 +9,6 @@ def self.all_from_shop(db, id) def self.find_by_user(db, user_id) sql = %q[SELECT d.id, d.name, d.imageurl AS "imageUrl" FROM pet_adoptions a JOIN dogs d ON d.id = a.pet_id WHERE user_id = $1 and type = 'dog'] result = db.exec(sql, [user_id]).to_a - result.first end def self.adopt_dog(db, dog_id) diff --git a/server.rb b/server.rb index bfd94b6d..38e6f391 100644 --- a/server.rb +++ b/server.rb @@ -59,11 +59,11 @@ user["dogs"] = PetShop::DogsRepo.find_by_user(db, user['id']) user.delete('password') user["cats"] = PetShop::CatsRepo.find_by_user(db, user['id']) - + JSON.generate(user) else status 401 end - JSON.generate(user) + end # # # # From 1d7ac7beb49b34676ddb8fb3e32854f7a06fa0cc Mon Sep 17 00:00:00 2001 From: greg Date: Fri, 12 Dec 2014 14:29:29 -0600 Subject: [PATCH 31/34] refactored all adopt and find by user methods to reduce redundancy added endpoint and db calls for unadopt --- lib/cats_repo/cats_repo.rb | 8 -------- lib/dogs_repo/dogs_repo.rb | 14 -------------- lib/petshops_repo/petshops_repo.rb | 2 -- lib/users_repo/users_repo.rb | 18 ++++++++++++------ server.rb | 3 +-- 5 files changed, 13 insertions(+), 32 deletions(-) diff --git a/lib/cats_repo/cats_repo.rb b/lib/cats_repo/cats_repo.rb index 51de7ee7..0f2680bb 100644 --- a/lib/cats_repo/cats_repo.rb +++ b/lib/cats_repo/cats_repo.rb @@ -1,13 +1,5 @@ module PetShop class CatsRepo - def self.find_by_user(db, user_id) - sql = %q[SELECT c.id, c.name, c.imageurl AS "imageUrl" FROM pet_adoptions a JOIN cats c ON c.id = a.pet_id WHERE a.user_id = $1 and type = 'cat'] - result = db.exec(sql, [user_id]).to_a - result - end - def self.adopt_cat(db, id) - db.exec("UPDATE cats SET adopted = 'true' WHERE id = $1",[id]) - end def self.all_from_shop(db, id) db.exec(%q[SELECT id, shopid, name, imageurl AS "imageUrl", adopted FROM cats WHERE shopid = $1],[id]).to_a diff --git a/lib/dogs_repo/dogs_repo.rb b/lib/dogs_repo/dogs_repo.rb index 9843a85a..029a9f19 100644 --- a/lib/dogs_repo/dogs_repo.rb +++ b/lib/dogs_repo/dogs_repo.rb @@ -5,19 +5,5 @@ def self.all_from_shop(db, id) sql = %q[SELECT id, shopid, name, imageurl AS "imageUrl", adopted, happiness FROM dogs WHERE shopid = $1] db.exec(sql, [id]).to_a end - - def self.find_by_user(db, user_id) - sql = %q[SELECT d.id, d.name, d.imageurl AS "imageUrl" FROM pet_adoptions a JOIN dogs d ON d.id = a.pet_id WHERE user_id = $1 and type = 'dog'] - result = db.exec(sql, [user_id]).to_a - end - - def self.adopt_dog(db, dog_id) - sql = %q[UPDATE dogs SET adopted = 'true' WHERE id = $1] - result = db.exec(sql, [dog_id]) - result - end - - - end end \ No newline at end of file diff --git a/lib/petshops_repo/petshops_repo.rb b/lib/petshops_repo/petshops_repo.rb index 112ba65d..869380bf 100644 --- a/lib/petshops_repo/petshops_repo.rb +++ b/lib/petshops_repo/petshops_repo.rb @@ -2,8 +2,6 @@ module PetShop class Shops def self.get_all_shops(db) shops = db.exec('SELECT * FROM petshops').to_a - - end end diff --git a/lib/users_repo/users_repo.rb b/lib/users_repo/users_repo.rb index a0204a2b..af99eb23 100644 --- a/lib/users_repo/users_repo.rb +++ b/lib/users_repo/users_repo.rb @@ -30,18 +30,24 @@ def self.adopt db, user_data result = db.exec(sql, [user_data[:type], user_data[:user_id], user_data[:pet_id]]) if(user_data[:type] == "cat") - PetShop::CatsRepo.adopt_cat(db, user_data[:pet_id]) + sql = %q[UPDATE cats SET adopted = 'true' WHERE id = $1] + result = db.exec(sql, [user_data[:pet_id]]) end if(user_data[:type] == "dog") - PetShop::DogsRepo.adopt_dog(db, user_data[:pet_id]) - end + sql = %q[UPDATE dogs SET adopted = 'true' WHERE id = $1] + result = db.exec(sql, [user_data[:pet_id]]) + end return "Adopted: true" end - def self.show_adoptions db, user_data - - user_data + def self.get_adoptions db, user_data + user_id = user_data['id'] + sql = %q[SELECT d.id, d.name, d.imageurl AS "imageUrl" FROM pet_adoptions a JOIN dogs d ON d.id = a.pet_id WHERE user_id = $1 and type = 'dog'] + user_data["dogs"] = db.exec(sql, [user_id]).to_a + sql = %q[SELECT c.id, c.name, c.imageurl AS "imageUrl" FROM pet_adoptions a JOIN cats c ON c.id = a.pet_id WHERE a.user_id = $1 and type = 'cat'] + user_data["cats"] = db.exec(sql, [user_id]).to_a + return user_data end end end diff --git a/server.rb b/server.rb index 38e6f391..605ab5d8 100644 --- a/server.rb +++ b/server.rb @@ -56,9 +56,8 @@ session['user_id'] = user['id'] # TODO: Return all pets adopted by this user # TODO: Set session[:user_id] so the server will remember this user has logged in - user["dogs"] = PetShop::DogsRepo.find_by_user(db, user['id']) + user = PetShop::UsersRepo.get_adoptions(db, user) user.delete('password') - user["cats"] = PetShop::CatsRepo.find_by_user(db, user['id']) JSON.generate(user) else status 401 From 92814af3de58506764c825e428febb8175ae042c Mon Sep 17 00:00:00 2001 From: greg Date: Fri, 12 Dec 2014 14:33:57 -0600 Subject: [PATCH 32/34] refactored all adopt and find by user methods to reduce redundancy added endpoint and db calls for unadopt --- lib/users_repo/users_repo.rb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/users_repo/users_repo.rb b/lib/users_repo/users_repo.rb index af99eb23..3d4529e3 100644 --- a/lib/users_repo/users_repo.rb +++ b/lib/users_repo/users_repo.rb @@ -41,6 +41,22 @@ def self.adopt db, user_data return "Adopted: true" end + def self.unadopt db, user_data + sql = %q[DELETE FROM pet_adoptions WHERE type = $1 user_id = $2 and pet_id = $3]] + result = db.exec(sql, [user_data[:type], user_data[:user_id], user_data[:pet_id]]) + + if(user_data[:type] == "cat") + sql = %q[UPDATE cats SET adopted = NULL WHERE id = $1] + result = db.exec(sql, [user_data[:pet_id]]) + end + + if(user_data[:type] == "dog") + sql = %q[UPDATE dogs SET adopted = NULL WHERE id = $1] + result = db.exec(sql, [user_data[:pet_id]]) + end + return "Adopted: true" + end + def self.get_adoptions db, user_data user_id = user_data['id'] sql = %q[SELECT d.id, d.name, d.imageurl AS "imageUrl" FROM pet_adoptions a JOIN dogs d ON d.id = a.pet_id WHERE user_id = $1 and type = 'dog'] From cc64d88353b9e72a7af36adce11e5ffccadbf00d Mon Sep 17 00:00:00 2001 From: greg Date: Fri, 12 Dec 2014 14:35:48 -0600 Subject: [PATCH 33/34] added unadopt link to view --- public/js/pet-shop.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/js/pet-shop.js b/public/js/pet-shop.js index 8aa6893b..aee100d7 100644 --- a/public/js/pet-shop.js +++ b/public/js/pet-shop.js @@ -46,6 +46,10 @@ onclick: ctrl.adopt.coldCurry(type, pet.id), href: '#' }, 'Adopt this pet') + var unAdoptLink = m('a', { + onclick: ctrl.adopt.coldCurry(type, pet.id), + href: '#' + }, 'Ditch this loser pet.') return m('.pet', [ m('.photo', @@ -57,6 +61,7 @@ m('span', pet.adopted ? "Yes!" : "No..."), m('br'), pet.adopted ? null : adoptLink + pet.adopted ? 'true' : unAdoptLink ]) ]) }) From dc77bec35316cbdab9ad4b1ab9d64b8f348f3ee1 Mon Sep 17 00:00:00 2001 From: greg Date: Fri, 12 Dec 2014 15:19:51 -0600 Subject: [PATCH 34/34] completed the unadopt --- lib/users_repo/users_repo.rb | 15 +++++++++++++-- public/js/pet-shop.js | 4 ++-- server.rb | 14 +++++++++++++- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/lib/users_repo/users_repo.rb b/lib/users_repo/users_repo.rb index 3d4529e3..111a3cd8 100644 --- a/lib/users_repo/users_repo.rb +++ b/lib/users_repo/users_repo.rb @@ -42,7 +42,7 @@ def self.adopt db, user_data end def self.unadopt db, user_data - sql = %q[DELETE FROM pet_adoptions WHERE type = $1 user_id = $2 and pet_id = $3]] + sql = %q[DELETE FROM pet_adoptions WHERE type = $1 and user_id = $2 and pet_id = $3] result = db.exec(sql, [user_data[:type], user_data[:user_id], user_data[:pet_id]]) if(user_data[:type] == "cat") @@ -54,9 +54,20 @@ def self.unadopt db, user_data sql = %q[UPDATE dogs SET adopted = NULL WHERE id = $1] result = db.exec(sql, [user_data[:pet_id]]) end - return "Adopted: true" + return "something to prevent server err." + end + + def self.get_dog_by_id db, user_data + sql = %q[SELECT * FROM dogs WHERE id = $1] + db.exec(sql, [user_data]).to_a.first end + def self.get_cat_by_id db, user_data + sql = %q[SELECT * FROM cats WHERE id = $1] + db.exec(sql, [user_data]).to_a.first + end + + def self.get_adoptions db, user_data user_id = user_data['id'] sql = %q[SELECT d.id, d.name, d.imageurl AS "imageUrl" FROM pet_adoptions a JOIN dogs d ON d.id = a.pet_id WHERE user_id = $1 and type = 'dog'] diff --git a/public/js/pet-shop.js b/public/js/pet-shop.js index aee100d7..5adb6540 100644 --- a/public/js/pet-shop.js +++ b/public/js/pet-shop.js @@ -16,6 +16,7 @@ var pets = shop[type] var adoptUrl = "/shops/" + shop.id + "/" + type + "/" + petId + "/adopt" + m.request({ method: 'put', url: adoptUrl }).then(function() { var pet = pets().find(function(p){ return p.id == petId }) pet.adopted = true @@ -60,8 +61,7 @@ m('b', "Adopted: "), m('span', pet.adopted ? "Yes!" : "No..."), m('br'), - pet.adopted ? null : adoptLink - pet.adopted ? 'true' : unAdoptLink + pet.adopted ? unAdoptLink : adoptLink ]) ]) }) diff --git a/server.rb b/server.rb index 605ab5d8..eaa9d30d 100644 --- a/server.rb +++ b/server.rb @@ -88,6 +88,12 @@ } # TODO: Grab from database instead db = PetShop.create_db_connection() + cat = PetShop::UsersRepo.get_cat_by_id(db, id) + if(cat['adopted'].class.name == "string") + PetShop::UsersRepo.adopt(db, adopt_data) + else + PetShop::UsersRepo.unadopt(db, adopt_data) + end PetShop::UsersRepo.adopt(db, adopt_data) # TODO (after you create users table): Attach new cat to logged in user end @@ -113,13 +119,19 @@ id = params[:id] db = PetShop.create_db_connection() @user = PetShop::UsersRepo.find(db, session["user_id"]) + dog = PetShop::UsersRepo.get_dog_by_id(db, id) + # TODO: Update database instead adopt_data = { type: 'dog', user_id: session[:user_id].to_i, pet_id: id } - PetShop::UsersRepo.adopt(db, adopt_data) + if(dog['adopted'].class.name == "string") + PetShop::UsersRepo.adopt(db, adopt_data) + else + PetShop::UsersRepo.unadopt(db, adopt_data) + end # RestClient.put("http://pet-shop.api.mks.io/shops/#{shop_id}/dogs/#{id}", # { adopted: true }, :content_type => 'application/json') # TODO (after you create users table): Attach new dog to logged in user