diff --git a/models/album.js b/models/album.js
index 0411a57..a99cbd0 100644
--- a/models/album.js
+++ b/models/album.js
@@ -1,2 +1,19 @@
var mongoose = require("mongoose");
-var Schema = mongoose.Schema;
+var Song = require("./song");
+var AlbumSchema = mongoose.Schema({
+ artistName: String,
+ name: String,
+ releaseDate: String,
+ genres: [ String ],
+ description: String,
+ songs: [Song.schema]
+});
+
+var Album = mongoose.model('Album', AlbumSchema);
+
+module.exports = Album;
+
+
+
+
+
diff --git a/models/index.js b/models/index.js
index 6c10401..08055f4 100644
--- a/models/index.js
+++ b/models/index.js
@@ -1,2 +1,6 @@
var mongoose = require("mongoose");
-mongoose.connect("mongodb://localhost/tunely");
+var Album = require("./album");
+var Song = require("./song");
+// TODO: Whats up with the line below?
+// module.exports.Album = require('./album.js');
+mongoose.connect("mongodb://localhost/tunely");
\ No newline at end of file
diff --git a/models/song.js b/models/song.js
new file mode 100644
index 0000000..0ae3806
--- /dev/null
+++ b/models/song.js
@@ -0,0 +1,9 @@
+var mongoose = require("mongoose");
+var SongSchema = mongoose.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..5aaf099 100644
--- a/package.json
+++ b/package.json
@@ -17,6 +17,11 @@
},
"homepage": "https://github.com/tgaff/tunely#readme",
"dependencies": {
- "express": "^4.13.3"
+ "body-parser": "^1.15.0",
+ "ejs": "^2.4.1",
+ "express": "^4.13.3",
+ "method-override": "^2.3.4",
+ "mongoose": "^4.4.6",
+ "path": "^0.12.7"
}
}
diff --git a/public/js/app.js b/public/js/app.js
index 164eb55..b38ee7f 100644
--- a/public/js/app.js
+++ b/public/js/app.js
@@ -5,53 +5,99 @@
*
*/
-
-/* 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 */
-
-
-
-
+//MAIN FUNCTION
$(document).ready(function() {
- console.log('app.js loaded!');
+ var $albums = $('#albums');
+
+
+ //this is the get call to occupy the index page with data from the db
+ $.ajax({
+ type: 'GET',
+ // we're pulling the data from our own api
+ url: '/api/albums',
+ // data here is the JSON of albums from '/api/albums'
+ success: function(data){
+ $.each(data.albums, function(i, album) {
+ renderAlbum(album);
+ });
+ },
+ error: function(err) {
+ alert("error loading " + err);
+ }
+ });
+
+ // DELETE method
+ $('#albums').delegate('.deleteBtn','click', function(){
+ // var $album = $(this).closest('.album');
+
+ var $albumId = $(this).attr('delete-album-id');
+
+ $.ajax({
+ type: 'DELETE',
+ url: '/api/albums/' + $albumId,
+ success: function(){
+ $('[data-album-id='+ $albumId + ']').remove();
+ console.log("YAY DELETE");
+ },
+ error: function(){
+ console.log("SOMETHING AINT WORKING");
+ }
+ });
+ });
+
+ // #singlebutton is the name of the submit button to make a new album
+ $('#singlebutton').on('click', function(event) {
+ event.preventDefault();
+
+ var $name = $('#name').val();
+ var $artistName = $('#artistName').val();
+ var $releaseDate = $('#releaseDate').val();
+ var $genres = $('#genres').val();
+ var $description = $('#description').val();
+
+ // here we grab the info from the form to make a new album and create
+ // a new object, newAlbum, with the input info
+ var newAlbum = {
+ name: $name,
+ artistName: $artistName,
+ releaseDate: $releaseDate,
+ genres: $genres,
+ description: $description
+ };
+
+ $.ajax({
+ type: 'POST',
+ url: '/api/albums',
+ data: newAlbum,
+ success: function(newAlbum){
+ renderAlbum(newAlbum);
+ },
+ error: function(err) {
+ alert("woah, hang on there a minute. We've got an issue: " + err);
+ }
+ });
+ });
+
+//end of document ready
});
-
// this function takes a single album and renders it to the page
function renderAlbum(album) {
- console.log('rendering album:', album);
-
- var albumHtml =
+ // This defines a songStr that we will fill with the name and track number of each song,
+ // we will then add this onto the end of the album information
+ var songStr = "";
+ // This loops through each song on the album and adds it to songStr
+ album.songs.forEach(function(song) {
+ songStr = songStr + "(" + song.trackNumber + ") " + song.name + " – ";
+ });
+
+ // albumTemplate is the layout for what will be rendered for new albums
+ var albumTemplate =
" " +
- "
" +
+ "
" +
"
" +
"
" +
"
" +
@@ -64,15 +110,20 @@ function renderAlbum(album) {
"
" +
@@ -82,11 +133,105 @@ function renderAlbum(album) {
"
" + // end of panel-body
" " +
"
" +
"
" +
" ";
- // render to the page with jQuery
+
+ // getting album div in order to append the HTML
+ // var $albumDiv = $("#albums");
+
+ // $albumDiv.append(albumHtml);
+ // getting album div in order to append the HTML
+ // var $albumDiv = $("#albums");
+ // Here we are appending the above template with album info filled in
+ $("#albums").append(albumTemplate);
+
+
+ // var $songs = $(".songsSpan");
+
+ // var modalBtn = $(".songModalButton");
+ // $songs.delegate('.songModalButton', 'click', function() {
+ // $(this).modal();
+ // });
+
+
+ // var $albumName = $(".album-name");
+ // var $artistName = $(".artist-name");
+ // var $albumReleaseDate = $(".album-releaseDate");
+
+ // var $deleteButton = "";
+
+ // $albumName.last().html(album.name);
+ // $artistName.last().html(album.artistName);
+ // $albumReleaseDate.last().html(album.releaseDate);
}
+
+
+//this will build out our songs in each album and append it to the list
+
+// function buildSongsHtml (songs) {
+// var songStr = "";
+
+// // console.log(songs);
+// songs.forEach(function(song) {
+// songStr = songStr + "(" + song.trackNumber + ") " + song.name + "– ";
+// });
+// var songHtml =
+// "
" +
+// "
Songs:
" +
+// "" + songStr + "" +
+// "
";
+// return songHtml;
+// }
+
+
+
+// function handleNewSongButtonClick(albums) {
+// $('#albums').on('click', '.add-song', function(e) {
+
+// var id= $(this).parents('.album').data('album-id'); // "5665ff1678209c64e51b4e7b"
+
+// $('#songModal').attr('album-id', id);
+// $('#songModal').modal();
+
+// handleNewSongSubmit(albums, id);
+
+// });
+// }
+
+
+// function handleNewSongSubmit(albums, id) {
+// $('#saveSong').on('click', function(event) {
+// event.preventDefault();
+
+// var album = albums.filter(function(selectedAlbum){
+
+// if(id == selectedAlbum._id){
+// return selectedAlbum;
+// // console.log(selectedAlbum._id);
+// }
+// });
+
+
+// console.log(album[0].songs);
+
+
+// var $songName = $("#songName").val();
+// var $trackNumber = $("#trackNumber").val();
+
+// var songObject = {
+// name: $songName,
+// trackNumber: $trackNumber
+// };
+// // console.log(songObject);
+// // $.postJSON( "/api/albums", function( data ) {
+// album[0].songs.push(songObject);
+// // });
+// });
+// }
diff --git a/seed.js b/seed.js
index 1943f8f..254c8af 100644
--- a/seed.js
+++ b/seed.js
@@ -1,19 +1,79 @@
// This file allows us to seed our application with data
// simply run: `node seed.js` from the root of this project folder.
-var db = require("./models");
+var db = require("./models/");
+var Album = require('./models/album');
+var mongoose = require('mongoose');
var albumsList =[
// put data here!
+ {
+ artistName: 'Nine Inch Nails',
+ name: 'The Downward Spiral',
+ releaseDate: '1994, March 8',
+ genres: [ 'industrial', 'industrial metal' ]
+ },
+ {
+ artistName: 'Metallica',
+ name: 'Metallica',
+ releaseDate: '1991, August 12',
+ genres: [ 'heavy metal' ]
+ },
+ {
+ artistName: 'The Prodigy',
+ name: 'Music for the Jilted Generation',
+ releaseDate: '1994, July 4',
+ genres: [ 'electronica', 'breakbeat hardcore', 'rave', 'jungle' ]
+ },
+ {
+ artistName: 'Johnny Cash',
+ name: 'Unchained',
+ releaseDate: '1996, November 5',
+ genres: [ 'country', 'rock' ]
+ }
];
-db.Album.remove({}, function(err, albums){
+var sampleSongs = [];
- db.Album.create(albumsList, function(err, albums){
- if (err) { return console.log('ERROR', err); }
- console.log("all albums:", albums);
- console.log("created", albums.length, "albums");
- process.exit();
+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
+});
+
+
+albumsList.forEach(function(album) {
+ album.songs = sampleSongs;
+});
+
+Album.remove({}, function(err, albums){
+
+ Album.create(albumsList, function(err, albums){
+ if (err) {
+ return console.log('ERROR', err);
+ } else {
+ console.log("all albums:", albums);
+ console.log("created", albums.length, "albums");
+ process.exit();
+ mongoose.connection.close();
+ }
});
});
+
diff --git a/server.js b/server.js
index 5da137b..3606017 100644
--- a/server.js
+++ b/server.js
@@ -4,6 +4,17 @@
var express = require('express');
// generate a new express app and call it 'app'
var app = express();
+var bodyParser = require('body-parser');
+var db = require('./models');
+var Album = require('./models/album');
+var path = require('path');
+
+app.use(bodyParser.json());
+app.use(bodyParser.urlencoded({extended: true}));
+
+app.set('views', path.join(__dirname, 'views'));
+app.engine('ejs', require('ejs').renderFile);
+app.set('view engine', 'ejs');
// serve static files from public folder
app.use(express.static(__dirname + '/public'));
@@ -12,37 +23,6 @@ app.use(express.static(__dirname + '/public'));
* 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' ]
- });
-
/**********
@@ -53,11 +33,13 @@ albums.push({
* HTML Endpoints
*/
+//
app.get('/', function homepage (req, res) {
- res.sendFile(__dirname + '/views/index.html');
+ res.render(__dirname + '/views/index.ejs');
});
+
/*
* JSON API Endpoints
*/
@@ -73,6 +55,74 @@ app.get('/api', function api_index (req, res){
});
});
+//SHOW ALL ALBUMS (index)
+app.get('/api/albums', function album_index (req, res) {
+ Album.find(function(err, albums){
+ if (err) {
+ console.log("OH FUCK AN ERROR!" + err);
+ } else {
+ res.json({albums: albums});
+ }
+ });
+});
+
+//CREATE
+app.post('/api/albums', function create (req, res) {
+
+ var name = req.body.name;
+ var artistName = req.body.artistName;
+ var releaseDate = req.body.releaseDate;
+ var genres = req.body.genres;
+ var description = req.body.description;
+
+ Album.create({name: name, artistName: artistName, releaseDate: releaseDate,
+ genres: genres, description: description}, function(err, album){
+ if(err){
+ console.log("OH FUCK AN ERROR! ", err);
+ } else {
+ // res.render(__dirname + '/views/index');
+ res.json(album);
+
+ // res.redirect('/');
+ }
+ });
+});
+
+//SHOW INDIVIDUAL ALBUM
+app.get('/api/albums/:id', function show_api_album (req, res){
+ var id = req.params.id;
+ var album = Album.find({_id: id}, function(err, album){
+ if (err){
+ console.log("ERROR WITH API ID", err);
+ }
+ else{
+ res.json({album: album});
+ }
+ });
+
+});
+
+//DELETE INDIVIDUAL ALBUM
+app.delete('/api/albums/:id', function delete_album (req, res){
+ var id = req.params.id;
+ console.log("DELETE ALBUM: ", id);
+
+ Album.remove({_id: id}, function(err){
+ if(err){
+ console.log("ERROR WITH DELETE", err);
+ }
+ else{
+ console.log("REMOVING ALBUM: " + id + " THIS WORKED");
+ res.status(200).send();
+ }
+ });
+});
+
+
+
+
+
+
/**********
* SERVER *
**********/
diff --git a/views/index.html b/views/index.ejs
similarity index 51%
rename from views/index.html
rename to views/index.ejs
index 5cb6501..10ae019 100644
--- a/views/index.html
+++ b/views/index.ejs
@@ -19,68 +19,101 @@