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) { "
    " + "
  • " + "

    Album Name:

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

    Artist Name:

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

    Released date:

    " + - " " + "HARDCODED RELEASE DATE" + "" + + " " + album.releaseDate + "" + + "
  • " + + "
  • " + + "

    Songs:

    " + + " " + songStr + "" + + " " + "
  • " + "
" + "
" + @@ -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 @@
    -
    + +

    Welcome to tunely

    Your music binder!

    + +
    -
    -
    -

    Albums

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

      Album Name:

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

    Artist Name:

    - Ladyhawke -
  • -
  • -

    Released date:

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

    Albums

    +
    +
    +
    +
    + +
    -
    - + @@ -123,7 +156,7 @@