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 =
+ "
" +
+ " " +
+ " " + songText + "" +
+ " ";
+ return songsHtml;
+}
@@ -51,7 +96,7 @@ function renderAlbum(album) {
var albumHtml =
" " +
- " " +
+ "
" +
"
" +
"
" +
"
" +
@@ -64,16 +109,20 @@ function renderAlbum(album) {
"
" +
" - " +
" " +
- " " + "HARDCODED ALBUM NAME" + "" +
+ " " + album.name + "" +
"
" +
" - " +
" " +
- " " + "HARDCODED ARTIST NAME" + "" +
+ " " + album.artistName + "" +
"
" +
" - " +
" " +
- " " + "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
-