From 49f7ab514e2ca5d9c0f8ce55362b313d9f38b751 Mon Sep 17 00:00:00 2001 From: Gilbert Date: Mon, 8 Dec 2014 08:49:01 -0600 Subject: [PATCH 1/7] Starter code for songify exercise --- Gemfile | 3 ++ Gemfile.lock | 13 ++++++ Rakefile | 50 +++++++++++++++++++++ lib/songify.rb | 48 ++++++++++++++++++++ lib/songify/album_repo.rb | 33 ++++++++++++++ lib/songify/genre_repo.rb | 33 ++++++++++++++ lib/songify/song_repo.rb | 32 +++++++++++++ server.rb | 42 ++++++++++++++++++ spec/.gitkeep | 0 spec/repos/album_repo_spec.rb | 79 ++++++++++++++++++++++++++++++++ spec/repos/genre_repo_spec.rb | 66 +++++++++++++++++++++++++++ spec/repos/song_repo_spec.rb | 84 +++++++++++++++++++++++++++++++++++ spec/spec_helper.rb | 13 ++++++ views/albums/index.erb | 15 +++++++ views/genres/index.erb | 15 +++++++ views/index.erb | 8 ++++ 16 files changed, 534 insertions(+) create mode 100644 Rakefile create mode 100644 lib/songify.rb create mode 100644 lib/songify/album_repo.rb create mode 100644 lib/songify/genre_repo.rb create mode 100644 lib/songify/song_repo.rb create mode 100644 server.rb delete mode 100644 spec/.gitkeep create mode 100644 spec/repos/album_repo_spec.rb create mode 100644 spec/repos/genre_repo_spec.rb create mode 100644 spec/repos/song_repo_spec.rb create mode 100644 spec/spec_helper.rb create mode 100644 views/albums/index.erb create mode 100644 views/genres/index.erb create mode 100644 views/index.erb diff --git a/Gemfile b/Gemfile index 1f478929..cc9b3f83 100644 --- a/Gemfile +++ b/Gemfile @@ -3,3 +3,6 @@ ruby '2.0.0' gem 'rspec', '~> 2.14.1' gem 'pry-byebug' +gem 'pg' +gem 'sinatra' +gem 'rake' diff --git a/Gemfile.lock b/Gemfile.lock index a885a8c7..8da63939 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -10,6 +10,7 @@ GEM debugger-linecache (1.2.0) diff-lcs (1.2.5) method_source (0.8.2) + pg (0.17.1) pry (0.10.1) coderay (~> 1.1.0) method_source (~> 0.8.1) @@ -17,6 +18,10 @@ GEM pry-byebug (2.0.0) byebug (~> 3.4) pry (~> 0.10) + rack (1.5.2) + rack-protection (1.5.3) + rack + rake (10.3.2) rspec (2.14.1) rspec-core (~> 2.14.0) rspec-expectations (~> 2.14.0) @@ -25,11 +30,19 @@ GEM rspec-expectations (2.14.5) diff-lcs (>= 1.1.3, < 2.0) rspec-mocks (2.14.5) + sinatra (1.4.5) + rack (~> 1.4) + rack-protection (~> 1.4) + tilt (~> 1.3, >= 1.3.4) slop (3.6.0) + tilt (1.4.1) PLATFORMS ruby DEPENDENCIES + pg pry-byebug + rake rspec (~> 2.14.1) + sinatra diff --git a/Rakefile b/Rakefile new file mode 100644 index 00000000..5f19a6ca --- /dev/null +++ b/Rakefile @@ -0,0 +1,50 @@ + +task :environment do + require './lib/songify.rb' +end + +task :console => :environment do + require 'irb' + ARGV.clear + IRB.start +end + + +namespace :db do + + task :create do + `createdb songify_test` + `createdb songify_dev` + puts "Created." + end + + task :drop do + `dropdb songify_test` + `dropdb songify_dev` + puts "Dropped." + end + + task :create_tables => :environment do + db1 = Songify.create_db_connection('songify_test') + db2 = Songify.create_db_connection('songify_dev') + Songify.create_tables(db1) + Songify.create_tables(db2) + puts "Created tables." + end + + task :drop_tables => :environment do + db1 = Songify.create_db_connection('songify_test') + db2 = Songify.create_db_connection('songify_dev') + Songify.drop_tables(db1) + Songify.drop_tables(db2) + puts "Dropped tables." + end + + task :clear => :environment do + # The test db clears all the time, so there's no point in doing it here. + db = Songify.create_db_connection('songify_dev') + Songify.drop_tables(db) + puts "Cleared tables." + end + +end diff --git a/lib/songify.rb b/lib/songify.rb new file mode 100644 index 00000000..90548c82 --- /dev/null +++ b/lib/songify.rb @@ -0,0 +1,48 @@ +require 'pg' + +module Songify + def self.create_db_connection(dbname) + PG.connect(host: 'localhost', dbname: dbname) + end + + def self.clear_db(db) + db.exec <<-SQL + DELETE FROM albums; + DELETE FROM songs; + DELETE FROM genres; + /* TODO: Clear rest of the tables (books, etc.) */ + SQL + end + + def self.create_tables(db) + db.exec <<-SQL + CREATE TABLE albums( + id SERIAL PRIMARY KEY, + title VARCHAR + ); + CREATE TABLE songs( + id SERIAL PRIMARY KEY, + album_id integer REFERENCES genres (id), + title VARCHAR + ); + CREATE TABLE genres( + id SERIAL PRIMARY KEY, + name VARCHAR + ); + /* TODO: Create song_genres table */ + SQL + end + + def self.drop_tables(db) + db.exec <<-SQL + DROP TABLE albums; + DROP TABLE songs; + DROP TABLE genres; + /* TODO: Drop song_genres table */ + SQL + end +end + +require_relative 'songify/album_repo' +require_relative 'songify/genre_repo' +require_relative 'songify/song_repo' diff --git a/lib/songify/album_repo.rb b/lib/songify/album_repo.rb new file mode 100644 index 00000000..54b55451 --- /dev/null +++ b/lib/songify/album_repo.rb @@ -0,0 +1,33 @@ +module Songify + class AlbumRepo + + 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 albums").to_a + end + + def self.find(db, album_id) + db.exec("SELECT * FROM albums WHERE id=$1", [album_id]).first + end + + def self.save(db, album_data) + if album_data['id'] + result = db.exec("UPDATE albums SET title = $2 WHERE id = $1", [album_data['id'], album_data['title']]) + self.find(db, album_data['id']) + else + raise "title is required." if album_data['title'].nil? || album_data['title'] == '' + result = db.exec("INSERT INTO albums (title) VALUES ($1) RETURNING id", [album_data['title']]) + album_data['id'] = result.entries.first['id'] + album_data + end + end + + def self.destroy(db, album_id) + # TODO: Delete SQL statement + # ALSO DELETE SONGS + # ALSO DELETE JOIN TABLE ENTRIES BETWEEN THIS ALBUM AND ITS GENRES + end + + end +end diff --git a/lib/songify/genre_repo.rb b/lib/songify/genre_repo.rb new file mode 100644 index 00000000..558261b5 --- /dev/null +++ b/lib/songify/genre_repo.rb @@ -0,0 +1,33 @@ +module Songify + class GenreRepo + + 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 genres").to_a + end + + def self.find(db, genre_id) + db.exec("SELECT * FROM genres WHERE id=$1", [genre_id]).first + end + + def self.save(db, genre_data) + if genre_data['id'] + result = db.exec("UPDATE genres SET name = $2 WHERE id = $1", [genre_data['id'], genre_data['name']]) + self.find(db, genre_data['id']) + else + raise "name is required." if genre_data['name'].nil? || genre_data['name'] == '' + + result = db.exec("INSERT INTO genres (name) VALUES ($1) RETURNING id", [genre_data['name']]) + genre_data['id'] = result.entries.first['id'] + genre_data + end + end + + def self.destroy(db, genre_id) + # TODO: Delete SQL statement + # ALSO DELETE JOIN TABLE ENTRIES BETWEEN THIS GENRE AND ITS ALBUMS + end + + end +end diff --git a/lib/songify/song_repo.rb b/lib/songify/song_repo.rb new file mode 100644 index 00000000..a9fc10c0 --- /dev/null +++ b/lib/songify/song_repo.rb @@ -0,0 +1,32 @@ +module Songify + class SongRepo + + 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 songs").to_a + end + + def self.find(db, song_id) + db.exec("SELECT * FROM songs WHERE id=$1", [song_id]).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']]) + self.find(db, song_data['id']) + else + raise "title is required." if song_data['title'].nil? || song_data['title'] == '' + + # Ensure album exists + 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']]) + song_data['id'] = result.entries.first['id'] + song_data + end + end + + end +end diff --git a/server.rb b/server.rb new file mode 100644 index 00000000..361bacc7 --- /dev/null +++ b/server.rb @@ -0,0 +1,42 @@ +require 'sinatra' +require './lib/songify.rb' + +# set :bind, '0.0.0.0' # This is needed for Vagrant + +get '/' do + erb :index +end + +get '/albums' do + db = Songify.create_db_connection('songify_dev') + @albums = Songify::AlbumRepo.all(db) + erb :"albums/index" +end + +post '/albums' do + db = Songify.create_db_connection('songify_dev') + album = Songify::AlbumRepo.save(db, { + 'title' => params[:title] + }) + redirect to '/albums' +end + + +get '/songs' do + erb :"songs/index" +end + + +get '/genres' do + db = Songify.create_db_connection('songify_dev') + @genres = Songify::GenreRepo.all(db) + erb :"genres/index" +end + +post '/genres' do + db = Songify.create_db_connection('songify_dev') + album = Songify::GenreRepo.save(db, { + 'name' => params[:name] + }) + redirect to '/genres' +end diff --git a/spec/.gitkeep b/spec/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/spec/repos/album_repo_spec.rb b/spec/repos/album_repo_spec.rb new file mode 100644 index 00000000..3f080f05 --- /dev/null +++ b/spec/repos/album_repo_spec.rb @@ -0,0 +1,79 @@ +require 'spec_helper' + +describe Songify::AlbumRepo do + + def album_count + repo.all(db).count + end + + let(:repo) { Songify::AlbumRepo } + let(:db) { Songify.create_db_connection('songify_test') } + + before(:each) do + Songify.clear_db(db) + end + + it "gets all albums" do + album = repo.save(db, { 'title' => "Allybum" }) + album = repo.save(db, { 'title' => "Bluesbum" }) + + albums = repo.all(db) + expect(albums).to be_a Array + expect(albums.count).to eq 2 + + titles = albums.map {|u| u['title'] } + expect(titles).to include "Allybum", "Bluesbum" + end + + it "creates albums" do + expect(album_count).to eq 0 + + album = repo.save(db, { 'title' => "Allybum" }) + expect(album['id']).to_not be_nil + expect(album['title']).to eq "Allybum" + + # Check for persistence + expect(album_count).to eq 1 + + album = repo.all(db).first + expect(album['title']).to eq "Allybum" + end + + it "requires a title" do + expect { repo.save(db, {}) }.to raise_error {|e| + expect(e.message).to match /title/ + } + end + + xit "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' }) + + album = repo.save(db, { 'title' => 'Suspicious Activity?', + 'genre_ids' => [gid_1['id'], gid_2['id'], gid_3['id']] }) + album = repo.find(db, album['id']) + expect(album['genres'].count).to eq 3 + + names = album['genres'].map {|g| g['name'] } + expect(names).to include 'rock', 'avant-garde', 'jazz' + end + + it "finds albums" do + album = repo.save(db, { 'title' => "Allybum" }) + retrieved_song = repo.find(db, album['id']) + expect(retrieved_song['title']).to eq "Allybum" + end + + it "updates albums" do + song1 = repo.save(db, { 'title' => "Allybum" }) + song2 = repo.save(db, { 'id' => song1['id'], 'title' => "Alicia" }) + expect(song2['id']).to eq(song1['id']) + expect(song2['title']).to eq "Alicia" + + # Check for persistence + song3 = repo.find(db, song1['id']) + expect(song3['title']).to eq "Alicia" + end + +end diff --git a/spec/repos/genre_repo_spec.rb b/spec/repos/genre_repo_spec.rb new file mode 100644 index 00000000..3e7664bf --- /dev/null +++ b/spec/repos/genre_repo_spec.rb @@ -0,0 +1,66 @@ +require 'spec_helper' + +describe Songify::GenreRepo do + + def genre_count + repo.all(db).count + end + + let(:repo) { Songify::GenreRepo } + let(:db) { Songify.create_db_connection('songify_test') } + + before(:each) do + Songify.clear_db(db) + end + + it "gets all genres" do + genre = repo.save(db, { 'name' => "The Ally" }) + genre = repo.save(db, { 'name' => "Barnway Blues" }) + + genres = repo.all(db) + expect(genres).to be_a Array + expect(genres.count).to eq 2 + + titles = genres.map {|u| u['name'] } + expect(titles).to include "The Ally", "Barnway Blues" + end + + it "creates genres" do + expect(genre_count).to eq 0 + + genre = repo.save(db, { 'name' => "The Ally" }) + expect(genre['id']).to_not be_nil + expect(genre['name']).to eq "The Ally" + + # Check for persistence + expect(genre_count).to eq 1 + + genre = repo.all(db).first + expect(genre['name']).to eq "The Ally" + end + + it "requires a name" do + expect { repo.save(db, {}) }.to raise_error {|e| + expect(e.message).to match /name/ + } + end + + + it "finds genres" do + genre = repo.save(db, { 'name' => "The Ally" }) + retrieved_song = repo.find(db, genre['id']) + expect(retrieved_song['name']).to eq "The Ally" + end + + it "updates genres" do + song1 = repo.save(db, { 'name' => "The Ally" }) + song2 = repo.save(db, { 'id' => song1['id'], 'name' => "Alicia" }) + expect(song2['id']).to eq(song1['id']) + expect(song2['name']).to eq "Alicia" + + # Check for persistence + song3 = repo.find(db, song1['id']) + expect(song3['name']).to eq "Alicia" + end + +end diff --git a/spec/repos/song_repo_spec.rb b/spec/repos/song_repo_spec.rb new file mode 100644 index 00000000..d9a823e7 --- /dev/null +++ b/spec/repos/song_repo_spec.rb @@ -0,0 +1,84 @@ +require 'spec_helper' + +describe Songify::SongRepo do + + def song_count + repo.all(db).count + end + + let(:repo) { Songify::SongRepo } + let(:db) { Songify.create_db_connection('songify_test') } + + before(:each) do + Songify.clear_db(db) + @album_id = Songify::AlbumRepo.save(db, { 'title' => "MegaCorps" })['id'] + end + + it "gets all songs" do + song = repo.save(db, { 'album_id' => @album_id, 'title' => "The Ally" }) + song = repo.save(db, { 'album_id' => @album_id, 'title' => "Barnway Blues" }) + + songs = repo.all(db) + expect(songs).to be_a Array + expect(songs.count).to eq 2 + + titles = songs.map {|u| u['title'] } + expect(titles).to include "The Ally", "Barnway Blues" + end + + it "creates songs" do + expect(song_count).to eq 0 + + song = repo.save(db, { 'album_id' => @album_id, 'title' => "The Ally" }) + expect(song['id']).to_not be_nil + expect(song['title']).to eq "The Ally" + + # Check for persistence + expect(song_count).to eq 1 + + song = repo.all(db).first + expect(song['title']).to eq "The Ally" + end + + it "requires a title" do + expect { repo.save(db, {}) }.to raise_error {|e| + expect(e.message).to match /title/ + } + end + + it "requires an album id" do + expect { + repo.save(db, { 'title' => "The Ally" }) + } + .to raise_error {|e| + expect(e.message).to match /album_id/ + } + end + + it "requires an album id that exists" do + expect { + repo.save(db, { 'album_id' => 999, 'title' => "The Ally" }) + } + .to raise_error {|e| + expect(e.message).to match /album_id/ + } + end + + it "finds songs" do + song = repo.save(db, { 'album_id' => @album_id, 'title' => "The Ally" }) + retrieved_song = repo.find(db, song['id']) + expect(retrieved_song['title']).to eq "The Ally" + end + + it "updates songs" do + song1 = repo.save(db, { 'album_id' => @album_id, 'title' => "The Ally" }) + song2 = repo.save(db, { 'id' => song1['id'], 'title' => "Alicia" }) + expect(song2['id']).to eq(song1['id']) + expect(song2['title']).to eq "Alicia" + + # Check for persistence + song3 = repo.find(db, song1['id']) + expect(song3['title']).to eq "Alicia" + end + +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 00000000..b15d3bbc --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,13 @@ +require 'songify' + +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/views/albums/index.erb b/views/albums/index.erb new file mode 100644 index 00000000..fa67cd23 --- /dev/null +++ b/views/albums/index.erb @@ -0,0 +1,15 @@ +<- Back to Everything +

All Albums

+ + + +
+

New Album

+ + + +
diff --git a/views/genres/index.erb b/views/genres/index.erb new file mode 100644 index 00000000..e62f9b7d --- /dev/null +++ b/views/genres/index.erb @@ -0,0 +1,15 @@ +<- Back to Everything +

All Genres

+ + + +
+

New Genre

+ + + +
diff --git a/views/index.erb b/views/index.erb new file mode 100644 index 00000000..8f52ed98 --- /dev/null +++ b/views/index.erb @@ -0,0 +1,8 @@ +

The Songify System

+ +

You're gonna be big

+ + From cd385f1c46fd1d9af4ae1ecd447017db56315a9d Mon Sep 17 00:00:00 2001 From: Gilbert Date: Mon, 8 Dec 2014 14:58:05 -0600 Subject: [PATCH 2/7] Fix table create typo --- lib/songify.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/songify.rb b/lib/songify.rb index 90548c82..63a55233 100644 --- a/lib/songify.rb +++ b/lib/songify.rb @@ -22,7 +22,7 @@ def self.create_tables(db) ); CREATE TABLE songs( id SERIAL PRIMARY KEY, - album_id integer REFERENCES genres (id), + album_id integer REFERENCES albums (id), title VARCHAR ); CREATE TABLE genres( From 198bb163fe8f66f96d4b5b08128372cbe8cdce16 Mon Sep 17 00:00:00 2001 From: Spenser Filler Date: Mon, 8 Dec 2014 16:16:14 -0600 Subject: [PATCH 3/7] Add song from website --- Gemfile | 1 + Gemfile.lock | 14 ++++++++++++++ lib/songify.rb | 5 +++++ lib/songify/song_repo.rb | 2 +- server.rb | 15 ++++++++++++++- views/index.erb | 1 + 6 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index cc9b3f83..d73dc2fe 100644 --- a/Gemfile +++ b/Gemfile @@ -6,3 +6,4 @@ gem 'pry-byebug' gem 'pg' gem 'sinatra' gem 'rake' +gem 'sinatra-reloader' diff --git a/Gemfile.lock b/Gemfile.lock index 8da63939..a8e1c908 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,6 +1,7 @@ GEM remote: https://rubygems.org/ specs: + backports (3.6.4) byebug (3.5.1) columnize (~> 0.8) debugger-linecache (~> 1.2) @@ -10,6 +11,7 @@ GEM debugger-linecache (1.2.0) diff-lcs (1.2.5) method_source (0.8.2) + multi_json (1.10.1) pg (0.17.1) pry (0.10.1) coderay (~> 1.1.0) @@ -21,6 +23,8 @@ GEM rack (1.5.2) rack-protection (1.5.3) rack + rack-test (0.6.2) + rack (>= 1.0) rake (10.3.2) rspec (2.14.1) rspec-core (~> 2.14.0) @@ -34,6 +38,15 @@ GEM rack (~> 1.4) rack-protection (~> 1.4) tilt (~> 1.3, >= 1.3.4) + sinatra-contrib (1.4.2) + backports (>= 2.0) + multi_json + rack-protection + rack-test + sinatra (~> 1.4.0) + tilt (~> 1.3) + sinatra-reloader (1.0) + sinatra-contrib slop (3.6.0) tilt (1.4.1) @@ -46,3 +59,4 @@ DEPENDENCIES rake rspec (~> 2.14.1) sinatra + sinatra-reloader diff --git a/lib/songify.rb b/lib/songify.rb index 63a55233..2f63d8f0 100644 --- a/lib/songify.rb +++ b/lib/songify.rb @@ -30,6 +30,11 @@ def self.create_tables(db) name VARCHAR ); /* TODO: Create song_genres table */ + CREATE TABLE song_genres( + id SERIAL PRIMARY KEY, + album_id INTEGER REFERENCES albums (id), + genre INTEGER REFERENCES genres (id) + ); SQL end diff --git a/lib/songify/song_repo.rb b/lib/songify/song_repo.rb index a9fc10c0..3e740f65 100644 --- a/lib/songify/song_repo.rb +++ b/lib/songify/song_repo.rb @@ -22,7 +22,7 @@ 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 (album_id, title) VALUES ($1, $2) RETURNING id", [song_data['album_id'], song_data['title']]) song_data['id'] = result.entries.first['id'] song_data end diff --git a/server.rb b/server.rb index 361bacc7..5d704fc9 100644 --- a/server.rb +++ b/server.rb @@ -1,7 +1,8 @@ require 'sinatra' require './lib/songify.rb' +require 'sinatra/reloader' -# 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 @@ -23,9 +24,21 @@ get '/songs' do + db = Songify.create_db_connection('songify_dev') + @songs = Songify::SongRepo.all(db) + db = Songify.create_db_connection('songify_dev') + @albums = Songify::AlbumRepo.all(db) erb :"songs/index" end +post '/songs' do + song_data = {'title' => params['name'], 'album_id' => params['album-select']} + db = Songify.create_db_connection('songify_dev') + song = Songify::SongRepo.save(db, song_data) + redirect to '/songs' +end + + get '/genres' do db = Songify.create_db_connection('songify_dev') diff --git a/views/index.erb b/views/index.erb index 8f52ed98..10abf7f6 100644 --- a/views/index.erb +++ b/views/index.erb @@ -5,4 +5,5 @@ From f6860184b2fb08509546ce2e3e39776d52282564 Mon Sep 17 00:00:00 2001 From: Spenser Filler Date: Mon, 8 Dec 2014 16:58:22 -0600 Subject: [PATCH 4/7] Pre-genre addition --- lib/songify.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/songify.rb b/lib/songify.rb index 2f63d8f0..4cf75b98 100644 --- a/lib/songify.rb +++ b/lib/songify.rb @@ -7,8 +7,8 @@ def self.create_db_connection(dbname) def self.clear_db(db) db.exec <<-SQL - DELETE FROM albums; DELETE FROM songs; + DELETE FROM albums; DELETE FROM genres; /* TODO: Clear rest of the tables (books, etc.) */ SQL @@ -44,6 +44,7 @@ def self.drop_tables(db) DROP TABLE songs; DROP TABLE genres; /* TODO: Drop song_genres table */ + DROP TABLE song_genres; SQL end end From 76a85b9e93e2e467ca50e35dccc204870f94a489 Mon Sep 17 00:00:00 2001 From: Spenser Filler Date: Mon, 8 Dec 2014 22:20:17 -0600 Subject: [PATCH 5/7] Implenting find function --- lib/songify.rb | 3 ++- lib/songify/album_repo.rb | 8 ++++++++ lib/songify/song_repo.rb | 2 +- spec/repos/album_repo_spec.rb | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/songify.rb b/lib/songify.rb index 4cf75b98..180fdcd1 100644 --- a/lib/songify.rb +++ b/lib/songify.rb @@ -7,6 +7,7 @@ def self.create_db_connection(dbname) def self.clear_db(db) db.exec <<-SQL + DELETE FROM song_genres; DELETE FROM songs; DELETE FROM albums; DELETE FROM genres; @@ -40,8 +41,8 @@ def self.create_tables(db) def self.drop_tables(db) db.exec <<-SQL - DROP TABLE albums; DROP TABLE songs; + DROP TABLE albums; DROP TABLE genres; /* TODO: Drop song_genres table */ DROP TABLE song_genres; diff --git a/lib/songify/album_repo.rb b/lib/songify/album_repo.rb index 54b55451..58b6aa46 100644 --- a/lib/songify/album_repo.rb +++ b/lib/songify/album_repo.rb @@ -21,6 +21,12 @@ def self.save(db, album_data) album_data['id'] = result.entries.first['id'] album_data end + if album_data['genres'] + album_data['genre_ids'].each do |genre| + db.exec("INSERT INTO song_genres (album_id, genre) VALUES ($1, $2) RETURNING genre", [album_data['id'], genre]) + end + end + album_data end def self.destroy(db, album_id) @@ -31,3 +37,5 @@ def self.destroy(db, album_id) end end + + diff --git a/lib/songify/song_repo.rb b/lib/songify/song_repo.rb index 3e740f65..cb20eab0 100644 --- a/lib/songify/song_repo.rb +++ b/lib/songify/song_repo.rb @@ -22,7 +22,7 @@ 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 (album_id, title) VALUES ($1, $2) RETURNING id", [song_data['album_id'], song_data['title']]) + result = db.exec("INSERT INTO songs (album_id, title) VALUES ($1, $2) RETURNING id", [song_data['album'], song_data['title']]) song_data['id'] = result.entries.first['id'] song_data end 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' }) From 4a9db3d37ad7567f91a65c4000033265bdf21b10 Mon Sep 17 00:00:00 2001 From: Spenser Filler Date: Tue, 9 Dec 2014 12:56:39 -0600 Subject: [PATCH 6/7] passes all tests --- lib/songify/album_repo.rb | 23 ++++++++++++++++++----- spec/repos/album_repo_spec.rb | 1 + 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/lib/songify/album_repo.rb b/lib/songify/album_repo.rb index 58b6aa46..2cf7d983 100644 --- a/lib/songify/album_repo.rb +++ b/lib/songify/album_repo.rb @@ -8,7 +8,16 @@ def self.all(db) end def self.find(db, album_id) - db.exec("SELECT * FROM albums WHERE id=$1", [album_id]).first + result = db.exec("SELECT * FROM albums WHERE id=$1;", [album_id]).first + if result + genres = db.exec("Select genres.name, genres.id from song_genres Join genres on (song_genres.genre = genres.id) WHERE album_id = $1;", [album_id]).to_a + genres_array = [] + genres.each do |genre| + genres_array << genre + end + result['genres'] = genres_array + end + result end def self.save(db, album_data) @@ -21,10 +30,16 @@ def self.save(db, album_data) album_data['id'] = result.entries.first['id'] album_data end - if album_data['genres'] + if album_data['genre_ids'] album_data['genre_ids'].each do |genre| db.exec("INSERT INTO song_genres (album_id, genre) VALUES ($1, $2) RETURNING genre", [album_data['id'], genre]) end + genres = db.exec("Select genres.name from song_genres Join genres on (song_genres.genre = genres.id) WHERE album_id = $1;", [album_data['id']]).to_a + genres_array = [] + genres.each do |genre| + genres_array << genre['name'] + end + album_data['genres'] = genres_array end album_data end @@ -36,6 +51,4 @@ def self.destroy(db, album_id) end end -end - - +end \ No newline at end of file diff --git a/spec/repos/album_repo_spec.rb b/spec/repos/album_repo_spec.rb index 931ebde1..d29aba38 100644 --- a/spec/repos/album_repo_spec.rb +++ b/spec/repos/album_repo_spec.rb @@ -53,6 +53,7 @@ def album_count album = repo.save(db, { 'title' => 'Suspicious Activity?', 'genre_ids' => [gid_1['id'], gid_2['id'], gid_3['id']] }) album = repo.find(db, album['id']) + album expect(album['genres'].count).to eq 3 names = album['genres'].map {|g| g['name'] } From ca6f9d21ca6562d9302858f111fb90e8fa41d19e Mon Sep 17 00:00:00 2001 From: Spenser Filler Date: Tue, 9 Dec 2014 18:53:32 -0600 Subject: [PATCH 7/7] Add/delete button functional --- lib/songify/album_repo.rb | 2 +- server.rb | 3 ++- views/albums/index.erb | 35 ++++++++++++++++++++++++++++++++--- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/lib/songify/album_repo.rb b/lib/songify/album_repo.rb index 2cf7d983..2aca4445 100644 --- a/lib/songify/album_repo.rb +++ b/lib/songify/album_repo.rb @@ -32,7 +32,7 @@ def self.save(db, album_data) end if album_data['genre_ids'] album_data['genre_ids'].each do |genre| - db.exec("INSERT INTO song_genres (album_id, genre) VALUES ($1, $2) RETURNING genre", [album_data['id'], genre]) + db.exec("INSERT INTO song_genres (album_id, genre) VALUES ($1, $2) RETURNING genre;", [album_data['id'], genre]) end genres = db.exec("Select genres.name from song_genres Join genres on (song_genres.genre = genres.id) WHERE album_id = $1;", [album_data['id']]).to_a genres_array = [] diff --git a/server.rb b/server.rb index 5d704fc9..b3acf9fa 100644 --- a/server.rb +++ b/server.rb @@ -11,13 +11,14 @@ get '/albums' do db = Songify.create_db_connection('songify_dev') @albums = Songify::AlbumRepo.all(db) + @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], 'genre_ids' => params[:genre_ids] }) redirect to '/albums' end diff --git a/views/albums/index.erb b/views/albums/index.erb index fa67cd23..34848876 100644 --- a/views/albums/index.erb +++ b/views/albums/index.erb @@ -9,7 +9,36 @@

New Album

- - - + +
+ +
+
+ + +
+
+ Add
+ + + \ No newline at end of file