diff --git a/models/album.js b/models/album.js index 0411a57..9de81c1 100644 --- a/models/album.js +++ b/models/album.js @@ -1,2 +1,16 @@ var mongoose = require("mongoose"); var Schema = mongoose.Schema; + +var Song = require('./song'); + +var AlbumSchema = new Schema ({ + artistName: String, + name: String, + releaseDate: String, + genres: [ String ], + songs: [ Song.schema ] +}); + +var Album = mongoose.model('Album', AlbumSchema); + +module.exports = Album; \ No newline at end of file diff --git a/models/index.js b/models/index.js index 6c10401..29f0ed2 100644 --- a/models/index.js +++ b/models/index.js @@ -1,2 +1,7 @@ var mongoose = require("mongoose"); mongoose.connect("mongodb://localhost/tunely"); + +var Album = require('./album'); +var Song = require('./song'); + +module.exports.Album = require("./album.js"); \ No newline at end of file diff --git a/models/song.js b/models/song.js new file mode 100644 index 0000000..8b84091 --- /dev/null +++ b/models/song.js @@ -0,0 +1,11 @@ +var mongoose = require("mongoose"); +var Schema = mongoose.Schema; + +var SongSchema = new Schema ({ + name: String, + trackNumber: Number, +}); + +var Song = mongoose.model('Song', SongSchema); + +module.exports = Song; \ No newline at end of file diff --git a/package.json b/package.json index 0d3e4f8..9e6d2ad 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,8 @@ }, "homepage": "https://github.com/tgaff/tunely#readme", "dependencies": { - "express": "^4.13.3" + "express": "^4.13.3", + "mongoose": "~4.2.10", + "body-parser": "~1.14.1" } } diff --git a/public/js/app.js b/public/js/app.js index 164eb55..33620dc 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -6,42 +6,87 @@ */ -/* hard-coded data! */ -var sampleAlbums = []; -sampleAlbums.push({ - artistName: 'Ladyhawke', - name: 'Ladyhawke', - releaseDate: '2008, November 18', - genres: [ 'new wave', 'indie rock', 'synth pop' ] - }); -sampleAlbums.push({ - artistName: 'The Knife', - name: 'Silent Shout', - releaseDate: '2006, February 17', - genres: [ 'synth pop', 'electronica', 'experimental' ] - }); -sampleAlbums.push({ - artistName: 'Juno Reactor', - name: 'Shango', - releaseDate: '2000, October 9', - genres: [ 'electronic', 'goa trance', 'tribal house' ] - }); -sampleAlbums.push({ - artistName: 'Philip Wesley', - name: 'Dark Night of the Soul', - releaseDate: '2008, September 12', - genres: [ 'piano' ] - }); -/* end of hard-coded data */ - - - $(document).ready(function() { console.log('app.js loaded!'); + $.get('/api/albums').success(function (albums) { + albums.forEach(function(album) { + renderAlbum(album); + }); + }); + + + $('#album-form form').on('submit', function (event) { + event.preventDefault(); + var formData = $(this).serialize(); + console.log('formData', formData); + $.post('/api/albums', formData, function (album) { + console.log('album after POST', album); + renderAlbum(album); //renders the server's response + }); + $(this).trigger("reset"); + }); + + + $('#albums').on('click', '.add-song', function (event) { + var id= $(this).parents('.album').data('album-id'); + console.log('id', id); + $('#songModal').data('album-id', id); + $('#songModal').modal(); + }); + + $('#saveSong').on('click', handleNewSongSubmit); + }); +// handles the modal fields and POSTing the form to the server +function handleNewSongSubmit (event) { + var albumId = $('#songModal').data('album-id'); + var songName = $('#songName').val(); + var trackNumber = $('#trackNumber').val(); + + var formData = { + name: songName, + trackNumber: trackNumber + }; + + var postUrl = '/api/albums/' + albumId + '/songs'; + console.log('posting to ', postUrl, ' with data ', formData); + + $.post(postUrl, formData) + .success(function(song) { + console.log('song', song); + + // re-get full album and render on the page + $.get('/api/albums/' + albumId).success(function(album) { + //remove old entry + $('[data-album-id=' + albumId + ']').remove(); + //render a replacement + renderAlbum(album); + }); + + // clear form + $('#songName').val(''); + $('#trackNumber').val(''); + $('#songModal').modal('hide'); + }); +} + + + +function buildSongsHtml(songs) { + var songText = " $ndash; "; + songs.forEach(function(song) { + songText = songText + "(" + song.trackNumber + ")" + song.name + " – "; + }); + var songsHtml = + "
  • " + + "

    Songs:

    " + + " " + songText + "" + + "
  • "; + return songsHtml; +} @@ -51,7 +96,7 @@ function renderAlbum(album) { var albumHtml = " " + - "
    " + + "
    " + "
    " + "
    " + "
    " + @@ -64,16 +109,20 @@ function renderAlbum(album) { "
      " + "
    • " + "

      Album Name:

      " + - " " + "HARDCODED ALBUM NAME" + "" + + " " + album.name + "" + "
    • " + "
    • " + "

      Artist Name:

      " + - " " + "HARDCODED ARTIST NAME" + "" + + " " + album.artistName + "" + "
    • " + "
    • " + "

      Released date:

      " + - " " + "HARDCODED RELEASE DATE" + "" + + " " + album.releaseDate + "" + "
    • " + + + buildSongsHtml(album.songs) + + + "
    " + "
    " + "
    " + @@ -82,6 +131,7 @@ function renderAlbum(album) { "
    " + // end of panel-body " " + "
    " + @@ -89,4 +139,5 @@ function renderAlbum(album) { " "; // render to the page with jQuery +$('#albums').prepend(albumHtml); } diff --git a/seed.js b/seed.js index 1943f8f..035861a 100644 --- a/seed.js +++ b/seed.js @@ -3,13 +3,66 @@ var db = require("./models"); -var albumsList =[ - // put data here! -]; +var albumList =[]; +albumList.push({ + artistName: 'Nine Inch Nails', + name: 'The Downward Spiral', + releaseDate: '1994, March 8', + genres: [ 'industrial', 'industrial metal' ] + }); +albumList.push({ + artistName: 'Metallica', + name: 'Metallica', + releaseDate: '1991, August 12', + genres: [ 'heavy metal' ] + }); +albumList.push({ + artistName: 'The Prodigy', + name: 'Music for the Jilted Generation', + releaseDate: '1994, July 4', + genres: [ 'electronica', 'breakbeat hardcore', 'rave', 'jungle' ] + }); +albumList.push({ + artistName: 'Johnny Cash', + name: 'Unchained', + releaseDate: '1996, November 5', + genres: [ 'country', 'rock' ] + }); + +var sampleSongs = []; + +sampleSongs.push({ name: 'Swamped', + trackNumber: 1 +}); +sampleSongs.push({ name: "Heaven's a Lie", + trackNumber: 2 +}); +sampleSongs.push({ name: 'Daylight Dancer', + trackNumber: 3 +}); +sampleSongs.push({ name: 'Humane', + trackNumber: 4 +}); +sampleSongs.push({ name: 'Self Deception', + trackNumber: 5 +}); +sampleSongs.push({ name: 'Aeon', + trackNumber: 6 +}); +sampleSongs.push({ name: 'Tight Rope', + trackNumber: 7 +}); + + +// populate each album's song list +albumList.forEach(function(album) { + album.songs = sampleSongs; +}); + db.Album.remove({}, function(err, albums){ - db.Album.create(albumsList, function(err, albums){ + db.Album.create(albumList, function(err, albums){ if (err) { return console.log('ERROR', err); } console.log("all albums:", albums); console.log("created", albums.length, "albums"); diff --git a/server.js b/server.js index 5da137b..1974eab 100644 --- a/server.js +++ b/server.js @@ -4,46 +4,18 @@ var express = require('express'); // generate a new express app and call it 'app' var app = express(); +var mongoose = require('mongoose'); +var bodyParser = require('body-parser'); // serve static files from public folder app.use(express.static(__dirname + '/public')); +app.use(bodyParser.urlencoded({ extended: true})); /************ * DATABASE * ************/ -/* hard-coded data */ -var albums = []; -albums.push({ - _id: 132, - artistName: 'Nine Inch Nails', - name: 'The Downward Spiral', - releaseDate: '1994, March 8', - genres: [ 'industrial', 'industrial metal' ] - }); -albums.push({ - _id: 133, - artistName: 'Metallica', - name: 'Metallica', - releaseDate: '1991, August 12', - genres: [ 'heavy metal' ] - }); -albums.push({ - _id: 134, - artistName: 'The Prodigy', - name: 'Music for the Jilted Generation', - releaseDate: '1994, July 4', - genres: [ 'electronica', 'breakbeat hardcore', 'rave', 'jungle' ] - }); -albums.push({ - _id: 135, - artistName: 'Johnny Cash', - name: 'Unchained', - releaseDate: '1996, November 5', - genres: [ 'country', 'rock' ] - }); - - +var db = require('./models'); /********** * ROUTES * @@ -73,6 +45,50 @@ app.get('/api', function api_index (req, res){ }); }); +app.get('/api/albums', function albumsIndex (req, res) { + db.Album.find({}, function (err, albums) { + res.json(albums); + }); +}); + +app.post('/api/albums', function albumCreate (req, res) { + console.log('body', req.body); + + db.Album.create(req.body, function (err, album) { + if (err) { console.log('error', err); } + console.log(album); + res.json(album); + }); + +}); + + +app.get('/api/albums/:id', function albumShow (req, res) { + console.log('requested album id=', req.params.id); + db.Album.findOne({_id: req.params.id}, function(err, album) { + res.json(album); + }); +}); + + +app.post('/api/albums/:album_id/songs', function songsCreate(req, res) { + console.log('body', req.body); + db.Album.findOne({_id: req.params.albumId}, function (err, album) { + if (err) { console.log('error', err); } + + var song = new db.Song(req.body); + album.songs.push(song); + album.save(function(err, savedAlbum) { + if (err) { console.log('error', err); } + console.log('album with new song saved:', savedAlbum); + res.json(song); + }); + }); + +}); + + + /********** * SERVER * **********/ diff --git a/views/index.html b/views/index.html index 5cb6501..049b32d 100644 --- a/views/index.html +++ b/views/index.html @@ -25,65 +25,83 @@

    Welcome to tunely

    -
    -
    -
    -

    Albums

    -
    -
    - -
    + - -
    +
    +
    +
    -
    -
    -
    +
    +
    + + Add New Album - -
    -
    - album image -
    + +
    + +
    + -
    -
      -
    • -

      Album Name:

      - Ladyhawke -
    • +
    +
    + + +
    + +
    + -
  • -

    Artist Name:

    - Ladyhawke -
  • +
    +
    + + +
    + +
    + -
  • -

    Released date:

    - 2008, November 18 -
  • - -
    +
    +
    -
    - + +
    + +
    + +
    +
    - -
    + +
    + +
    +
    -
    - + + +
    +
    +
    + + + +
    +
    +
    +

    Albums

    +
    +
    + +