diff --git a/.gitignore b/.gitignore index e941da68..8f2ea268 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ .bundle vendor/bundle .DS_Store +.gems +Gemfile +Gemfile.lock \ No newline at end of file diff --git a/lib/pet-shop-server/petshop.rb b/lib/pet-shop-server/petshop.rb new file mode 100644 index 00000000..aaf71f1a --- /dev/null +++ b/lib/pet-shop-server/petshop.rb @@ -0,0 +1,12 @@ +require 'pg' + +require_relative 'repos/pets_repo.rb' +require_relative 'repos/shops_repo.rb' +require_relative 'repos/users_repo.rb' +#pet-shop-server + +module PetShopServer + def self.create_db_connection(dbname) + PG::Connection.new(dbname: dbname) + end +end \ No newline at end of file diff --git a/lib/pet-shop-server/repos/pets_repo.rb b/lib/pet-shop-server/repos/pets_repo.rb new file mode 100644 index 00000000..4240da87 --- /dev/null +++ b/lib/pet-shop-server/repos/pets_repo.rb @@ -0,0 +1,97 @@ +module PetShopServer + class PetsRepo + def self.all db + sql = %q[select * from pets] + result = db.exec(sql) + result.entries + end + + def self.find db, id + sql = %[select * from pets where id = $1] + result = db.exec(sql, [id]) + result.first + end + + def self.build_user db, id + # sql = %[select * from pets where id = $1] + # result = db.exec(sql, [id]) + catSql = %Q[SELECT + users.username, + users.password, + pets.id, + pets.name, + pets.image_url, + pets.happiness, + pets.adopted, + pets.shop_id, + pets.userid, + pets.species + FROM + public.pets, + public.users + WHERE + users.id = $1 AND + users.id = pets.userid AND + pets.species = 'cat' ] + dogSql = %Q[SELECT + users.username, + users.password, + pets.id, + pets.name, + pets.image_url, + pets.happiness, + pets.adopted, + pets.shop_id, + pets.userid, + pets.species + FROM + public.pets, + public.users + WHERE + users.id = $1 AND + users.id = pets.userid AND + pets.species = 'dog' ] + catResult = db.exec(catSql, [id]) + dogResult = db.exec(dogSql, [id]) + + $real_user = {} + $real_user['id'] = catResult.first['id'] + $real_user['username'] = catResult.first['username'] + $real_user['cats'] = [] + # push cats + catResult.each do |cat| + push_object = { + 'shopId' => cat['shop_id'], + 'name' => cat['name'], + 'imageUrl' => cat['image_url'], + 'adopted' => cat['adopted'], + 'happiness' => cat['happiness'] + } + + $real_user['cats'] << push_object + end + + # push dogs + $real_user['dogs'] = [] + dogResult.each do |dog| + push_object = { + 'shopId' => dog['shop_id'], + 'name' => dog['name'], + 'imageUrl' => dog['image_url'], + 'adopted' => dog['adopted'], + 'happiness' => dog['happiness'] + } + $real_user['dogs'] << push_object + + + end + + $real_user + + end + + def self.find_by_name db, name + sql = %[select * from pets] + end + end +end \ No newline at end of file diff --git a/lib/pet-shop-server/repos/shops_repo.rb b/lib/pet-shop-server/repos/shops_repo.rb new file mode 100644 index 00000000..bfc34b54 --- /dev/null +++ b/lib/pet-shop-server/repos/shops_repo.rb @@ -0,0 +1,15 @@ +module PetShopServer + class ShopsRepo + def self.all db + sql = %q[SELECT * FROM petshops] + result = db.exec(sql) + result.entries + end + + def self.find db, id + sql = %q[SELECT * FROM petshops WHERE id = $1] + result = db.exec(sql, [id]) + result.first + end + end +end diff --git a/lib/pet-shop-server/repos/users_repo.rb b/lib/pet-shop-server/repos/users_repo.rb new file mode 100644 index 00000000..ba01d948 --- /dev/null +++ b/lib/pet-shop-server/repos/users_repo.rb @@ -0,0 +1,21 @@ +module PetShopServer + class UsersRepo + def self.all db + sql = %q[select * from users] + result = db.exec(sql) + result.entries + end + + def self.find db, id + sql = %[select * from users where id = $1] + result = db.exec(sql, [id]) + result.first + end + + def self.find_by_name db, name + sql = %[select * from users WHERE username = $1] + result = db.exec(sql, [name]) + result.first + end + end +end \ No newline at end of file diff --git a/server.rb b/server.rb index 07df95f4..140abced 100644 --- a/server.rb +++ b/server.rb @@ -1,22 +1,49 @@ require 'sinatra' require 'sinatra/reloader' require 'rest-client' +require 'pg' require 'json' +require_relative 'lib/pet-shop-server/petshop.rb' + +configure do + enable :sessions +end + +before do + + if session[:user_id] + # TODO: Grab user from database + db = PetShopServer.create_db_connection 'petshop' + @current_user = PetShopServer::PetsRepo.build_user(db, session[:user_id]) + # @current_user = PetshopServer::PetsRepo.find + end +end + +# before '/shops/*' do +# status(401) unless @current_user +# end # # # This is our only html view... # get '/' do - if session[:user_id] - # TODO: Grab user from database - @current_user = $sample_user - end + # db = PetShopServer.create_db_connection 'petshop' + # @current_user = PetShopServer::UsersRepo.find(db, session[:user_id]) + + # puts PetShopServer::PetsRepo.build_user(db, 999) + @real_user.to_json erb :index end +get '/logout' do + session.clear + redirect '/' +end + + # # # ...the rest are JSON endpoints -# +#UsersRepo get '/shops' do headers['Content-Type'] = 'application/json' RestClient.get("http://pet-shop.api.mks.io/shops") @@ -28,14 +55,21 @@ username = params['username'] password = params['password'] + db = PetShopServer.create_db_connection 'petshop' + user = PetShopServer::UsersRepo.find_by_name(db, username) + # TODO: Grab user by username from database and check password - user = { 'username' => 'alice', 'password' => '123' } + + # user = { 'username' => 'alice', 'password' => '123' } if password == user['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 - $sample_user.to_json + # @real_user = PetShopServer::PetsRepo.build_user(db, user['id']) + + session["user_id"] = user['id'] + user.to_json else status 401 end @@ -52,13 +86,17 @@ end put '/shops/:shop_id/cats/:id/adopt' do - headers['Content-Type'] = 'application/json' - shop_id = params[:shop_id] - id = params[:id] - # TODO: Grab from database instead - 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 + if @current_user + headers['Content-Type'] = 'application/json' + shop_id = params[:shop_id] + id = params[:id] + # TODO: Grab from database instead + 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 + else + status 401 + end end @@ -83,14 +121,14 @@ end -$sample_user = { - id: 999, - username: 'alice', - cats: [ - { shopId: 1, name: "NaN Cat", imageUrl: "http://i.imgur.com/TOEskNX.jpg", adopted: true, id: 44 }, - { shopId: 8, name: "Meowzer", imageUrl: "http://www.randomkittengenerator.com/images/cats/rotator.php", id: 8, adopted: "true" } - ], - dogs: [ - { shopId: 1, name: "Leaf Pup", imageUrl: "http://i.imgur.com/kuSHji2.jpg", happiness: 2, id: 2, adopted: "true" } - ] -} +# $sample_user = { +# id: 999, +# username: 'alice', +# cats: [ +# { shopId: 1, name: "NaN Cat", imageUrl: "http://i.imgur.com/TOEskNX.jpg", adopted: true, id: 44 }, +# { shopId: 8, name: "Meowzer", imageUrl: "http://www.randomkittengenerator.com/images/cats/rotator.php", id: 8, adopted: "true" } +# ], +# dogs: [ +# { shopId: 1, name: "Leaf Pup", imageUrl: "http://i.imgur.com/kuSHji2.jpg", happiness: 2, id: 2, adopted: "true" } +# ] +# } diff --git a/views/index.erb b/views/index.erb index 4c21800a..62b8b96c 100644 --- a/views/index.erb +++ b/views/index.erb @@ -5,7 +5,9 @@
- +