diff --git a/lib/songify.rb b/lib/songify.rb index 90548c82..b746c5dd 100644 --- a/lib/songify.rb +++ b/lib/songify.rb @@ -7,8 +7,9 @@ def self.create_db_connection(dbname) def self.clear_db(db) db.exec <<-SQL - DELETE FROM albums; DELETE FROM songs; + DELETE FROM albums_genres; + DELETE FROM albums; DELETE FROM genres; /* TODO: Clear rest of the tables (books, etc.) */ SQL @@ -16,19 +17,24 @@ def self.clear_db(db) def self.create_tables(db) db.exec <<-SQL - CREATE TABLE albums( + CREATE TABLE if not exists albums( id SERIAL PRIMARY KEY, title VARCHAR ); - CREATE TABLE songs( + CREATE TABLE if not exists songs( id SERIAL PRIMARY KEY, - album_id integer REFERENCES genres (id), + album_id integer REFERENCES albums (id), title VARCHAR ); - CREATE TABLE genres( + CREATE TABLE if not exists genres( id SERIAL PRIMARY KEY, name VARCHAR ); + CREATE TABLE if not exists albums_genres( + id SERIAL PRIMARY KEY, + album_id integer REFERENCES albums (id), + genre_id integer REFERENCES genres (id) + ); /* TODO: Create song_genres table */ SQL end diff --git a/lib/songify/album_repo.rb b/lib/songify/album_repo.rb index 54b55451..977a06e4 100644 --- a/lib/songify/album_repo.rb +++ b/lib/songify/album_repo.rb @@ -8,7 +8,23 @@ def self.all(db) end def self.find(db, album_id) - db.exec("SELECT * FROM albums WHERE id=$1", [album_id]).first + response = db.exec("SELECT * FROM albums WHERE id=$1", [album_id]).first + # result = db.exec("SELECT * FROM albums_genres WHERE album_id = $1", [album_id]) + # final = {} + result = db.exec("SELECT g.name FROM albums_genres x JOIN genres g ON x.genre_id = g.id JOIN albums a ON x.album_id = a.id WHERE x.album_id = $1", [album_id]).to_a + if result[0] + final_genre = [] + result.each do |x| + final_genre << x + end + response['genres'] = final_genre + return response + end + response + end + + def self.find_id(db, album_title) + db.exec("SELECT * FROM albums WHERE title=$1", [album_title]).first end def self.save(db, album_data) @@ -20,7 +36,13 @@ def self.save(db, album_data) result = db.exec("INSERT INTO albums (title) VALUES ($1) RETURNING id", [album_data['title']]) album_data['id'] = result.entries.first['id'] album_data + if album_data['genre_ids'] + album_data['genre_ids'].each do |genre| + db.exec("INSERT INTO albums_genres (album_id, genre_id) VALUES ($1, $2)", [album_data['id'], genre]) + end + end end + album_data end def self.destroy(db, album_id) diff --git a/lib/songify/song_repo.rb b/lib/songify/song_repo.rb index a9fc10c0..bc356d34 100644 --- a/lib/songify/song_repo.rb +++ b/lib/songify/song_repo.rb @@ -11,6 +11,10 @@ def self.find(db, song_id) db.exec("SELECT * FROM songs WHERE id=$1", [song_id]).first end + def self.find_id(db, song_title) + db.exec("SELECT * FROM songs WHERE title=$1", [song_title]).first + end + def self.save(db, song_data) if song_data['id'] result = db.exec("UPDATE songs SET title = $2 WHERE id = $1", [song_data['id'], song_data['title']]) @@ -22,11 +26,19 @@ def self.save(db, song_data) album = AlbumRepo.find(db, song_data['album_id']) raise "A valid album_id is required." if album.nil? - result = db.exec("INSERT INTO songs (title) VALUES ($1) RETURNING id", [song_data['title']]) + result = db.exec("INSERT INTO songs (title, album_id) VALUES ($1, $2) RETURNING id", [song_data['title'], album['id']]) song_data['id'] = result.entries.first['id'] song_data end end + def self.songs_per_album(db, album_id) + db.exec("SELECT * FROM songs WHERE album_id=$1", [album_id]) + end + + + + + end end diff --git a/server.rb b/server.rb index 361bacc7..4fb7efb8 100644 --- a/server.rb +++ b/server.rb @@ -1,7 +1,7 @@ require 'sinatra' require './lib/songify.rb' -# set :bind, '0.0.0.0' # This is needed for Vagrant +set :bind, '0.0.0.0' # This is needed for Vagrant get '/' do erb :index @@ -10,22 +10,49 @@ get '/albums' do db = Songify.create_db_connection('songify_dev') @albums = Songify::AlbumRepo.all(db) + @albums.each do |x| + x['count'] = Songify::SongRepo.songs_per_album(db, x['id']).count + end + @genres = Songify::GenreRepo.all(db) erb :"albums/index" end post '/albums' do db = Songify.create_db_connection('songify_dev') album = Songify::AlbumRepo.save(db, { - 'title' => params[:title] + 'title' => params[:title], + 'genres' => params[:genre_ids] }) redirect to '/albums' end +get '/albums/:id' do + db = Songify.create_db_connection('songify_dev') + @album = Songify::AlbumRepo.find(db, params[:id]) + @songs = Songify::SongRepo.songs_per_album(db, params[:id]).to_a + erb :"albums/show" +end + get '/songs' do + db = Songify.create_db_connection('songify_dev') + @albums = Songify::AlbumRepo.all(db) + @songs = Songify::SongRepo.all(db) erb :"songs/index" end +post '/songs' do + db = Songify.create_db_connection('songify_dev') + + album_title = params[:album_title] + album_id = Songify::AlbumRepo.find_id(db, album_title) + song = Songify::SongRepo.save(db, { + 'title' => params[:title], + 'album_id' => album_id['id'] + }) + redirect to '/songs' +end + get '/genres' do db = Songify.create_db_connection('songify_dev') diff --git a/spec/repos/album_repo_spec.rb b/spec/repos/album_repo_spec.rb index 3f080f05..931ebde1 100644 --- a/spec/repos/album_repo_spec.rb +++ b/spec/repos/album_repo_spec.rb @@ -45,7 +45,7 @@ def album_count } end - xit "can be assigned genres" do + it "can be assigned genres" do gid_1 = Songify::GenreRepo.save(db, { 'name' => 'rock' }) gid_2 = Songify::GenreRepo.save(db, { 'name' => 'avant-garde' }) gid_3 = Songify::GenreRepo.save(db, { 'name' => 'jazz' }) diff --git a/views/albums/index.erb b/views/albums/index.erb index fa67cd23..3cff9280 100644 --- a/views/albums/index.erb +++ b/views/albums/index.erb @@ -2,14 +2,75 @@