Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
@@ -1,6 +1,7 @@
source 'https://rubygems.org'
ruby '2.0.0'

gem 'pg'
gem 'rspec', '~> 2.14.1'
gem 'sinatra', '~> 1.4.5'
gem 'sinatra-contrib', '~> 1.4.2'
Expand Down
2 changes: 2 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ GEM
mime-types (1.25.1)
multi_json (1.10.1)
netrc (0.8.0)
pg (0.17.1)
pry (0.10.1)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
Expand Down Expand Up @@ -55,6 +56,7 @@ PLATFORMS
ruby

DEPENDENCIES
pg
pry-byebug
rest-client
rspec (~> 2.14.1)
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Having fun with Pet-Shop-Server
155 changes: 155 additions & 0 deletions lib/petshop.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
require 'pg'
require 'json'
require 'rest-client'

require_relative 'petshop/repos/cats_repo.rb'
require_relative 'petshop/repos/dogs_repo.rb'
require_relative 'petshop/repos/shops_repo.rb'
require_relative 'petshop/repos/users_repo.rb'

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

def self.clear_db(db)
db.exec <<-SQL
DELETE FROM cats;
DELETE FROM dogs;
DELETE FROM users;
DELETE FROM shops;
SQL
end

def self.create_tables(db)
db.exec <<-SQL
CREATE TABLE IF NOT EXISTS shops(
id SERIAL PRIMARY KEY,
name VARCHAR
);
CREATE TABLE IF NOT EXISTS users(
id SERIAL PRIMARY KEY,
username VARCHAR,
password VARCHAR
);
CREATE TABLE IF NOT EXISTS dogs(
id SERIAL PRIMARY KEY,
shopid INT references shops(id),
userid INT references users(id),
name VARCHAR,
imageurl VARCHAR,
adopted BOOLEAN,
happiness INT
);
CREATE TABLE IF NOT EXISTS cats(
id SERIAL PRIMARY KEY,
shopid INT references shops(id),
userid INT references users(id),
name VARCHAR,
imageurl VARCHAR,
adopted BOOLEAN
);
SQL
end

def self.seed_shops(db)
#parse JSON data for shops
shops = JSON.parse RestClient.get("http://pet-shop.api.mks.io/shops")

sql = %q[
INSERT INTO shops(id, name)
VALUES ($1, $2)
]

shops.each do |data|
id = data["id"]
name = data["name"]

db.exec(sql, [id, name])
end

end

def self.seed_users(db)
sql = %q[
INSERT INTO users (username, password)
VALUES ('testuser', 'pass123')
]
db.exec(sql)
end

def self.seed_cats(db)

#parse JSON data for shops
shops = JSON.parse RestClient.get("http://pet-shop.api.mks.io/shops")

#get the cats information
cats = shops.map do |shop|
shop_id = shop['id']
JSON.parse RestClient.get("http://pet-shop.api.mks.io/shops/#{shop_id}/cats")
end

flatcats = cats.flatten

sql = %q[
INSERT INTO cats(id, shopid, name, imageurl, adopted)
VALUES ($1, $2, $3, $4, $5)
]

flatcats.each do |cat|
id = cat["id"]
shopid = cat["shopid"]
name = cat["name"]
imageurl = cat["imageurl"]
adopted = cat["adopted"] ? true : false

db.exec(sql, [id, shopid, name, imageurl, adopted])
end

end

def self.seed_dogs(db)

#parse JSON data for shops
shops = JSON.parse RestClient.get("http://pet-shop.api.mks.io/shops")

#get the dogs information
dogs = shops.map do |shop|
shop_id = shop['id']
JSON.parse RestClient.get("http://pet-shop.api.mks.io/shops/#{shop_id}/dogs")
end

flatdogs = dogs.flatten

sql = %q[
INSERT INTO dogs(id, shopid, name, imageurl, adopted, happiness)
VALUES ($1, $2, $3, $4, $5, $6)
]

flatdogs.each do |dog|
id = dog["id"]
shopid = dog["shopid"]
name = dog["name"]
imageurl = dog["imageurl"]
adopted = dog["adopted"] ? true : false
happiness = dog["happiness"]

db.exec(sql, [id, shopid, name, imageurl, adopted, happiness])
end

end

def self.drop_tables(db)
db.exec <<-SQL
DROP TABLE cats;
DROP TABLE dogs;
DROP TABLE users;
DROP TABLE shops;
SQL
end
end





49 changes: 49 additions & 0 deletions lib/petshop/repos/cats_repo.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
module Petshop
class CatsRepo
def self.all db
sql = %q[SELECT * FROM cats]
result = db.exec(sql)
result.entries
end

def self.find db, id
sql = %q[SELECT * FROM cats WHERE id = $1]
result = db.exec(sql, [id])
result.first
end

def self.find_by_shopid db, shop_id
sql = %q[SELECT shopid, id, userid, name, imageurl as "imageUrl" FROM cats WHERE shopid = $1]
result = db.exec(sql, [shop_id])
result.to_a
end

def self.find_available db, adopted, shop_id
sql = %q[SELECT * FROM cats WHERE adopted != $1 AND shopid = $2]
result = db.exec(sql, [true], [shop_id])
result.to_a
end




def self.save db, cat_name
if cat_name[:id]
sql = %q[UPDATE cats SET content = $1 WHERE id = $2 RETURNING *]
result = db.exec(sql, [cat_name[:name], cat_name[:id]])
else
sql = %q[INSERT INTO cats (cat_name) VALUES ($1) RETURNING *]
result = db.exec(sql, [cat_name[:name], cat_name[:id]])
end

result.first
end

def self.destroy db, id
sql = %q[DELETE FROM cats WHERE id = $1]
db.exec(sql, [id])
post_exists?(db, id)
end

end
end
40 changes: 40 additions & 0 deletions lib/petshop/repos/dogs_repo.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
module Petshop
class DogsRepo
def self.all db
sql = %q[SELECT * FROM dogs]
result = db.exec(sql)
result.entries
end

def self.find db, id
sql = %q[SELECT * FROM dogs WHERE id = $1]
result = db.exec(sql, [id])
result.first
end

def self.find_by_shopid db, shop_id
sql = %q[SELECT shopid, id, userid, name, imageurl as "imageUrl", happiness FROM dogs WHERE shopid = $1]
result = db.exec(sql, [shop_id])
result.to_a
end

def self.save db, dog_name
if dog_name[:id]
sql = %q[UPDATE dogs SET content = $1 WHERE id = $2 RETURNING *]
result = db.exec(sql, [dog_name[:name], dog_name[:id]])
else
sql = %q[INSERT INTO dogs (dog_name) VALUES ($1) RETURNING *]
result = db.exec(sql, [dog_name[:name], dog_name[:id]])
end

result.first
end

def self.destroy db, id
sql = %q[DELETE FROM dogs WHERE id = $1]
db.exec(sql, [id])
post_exists?(db, id)
end

end
end
34 changes: 34 additions & 0 deletions lib/petshop/repos/shops_repo.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
module Petshop
class ShopsRepo
def self.all db
sql = %q[SELECT * FROM shops]
result = db.exec(sql)
result.entries
end

def self.find db, id
sql = %q[SELECT * FROM shops WHERE id = $1]
result = db.exec(sql, [id])
result.first
end

def self.save db, shop_name
if shop_name[:id]
sql = %q[UPDATE shops SET content = $1 WHERE id = $2 RETURNING *]
result = db.exec(sql, [shop_name[:name], shop_name[:id]])
else
sql = %q[INSERT INTO shops (shop_name) VALUES ($1) RETURNING *]
result = db.exec(sql, [shop_name[:name], shop_name[:id]])
end

result.first
end

def self.destroy db, id
sql = %q[DELETE FROM shops WHERE id = $1]
db.exec(sql, [id])
post_exists?(db, id)
end

end
end
28 changes: 28 additions & 0 deletions lib/petshop/repos/users_repo.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
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
end
end
Loading