diff --git a/config/db.js b/config/db.js index 530771f8cd7dd998c069fa22fde4fef14390b32d..e84f81671d982fdc6fa3d3869b6eef70747b9249 100644 --- a/config/db.js +++ b/config/db.js @@ -1,4 +1,4 @@ const mongoose = require('mongoose'); -mongoose.createConnection('mongodb://localhost/tracker-q728j6'); +mongoose.connect('mongodb://localhost/tracker-q728j6', { useMongoClient: true }); module.exports = mongoose; diff --git a/middleware/common.js b/middleware/common.js new file mode 100644 index 0000000000000000000000000000000000000000..4305153b4bf832fe4c4ec6c00683ffd76122f521 --- /dev/null +++ b/middleware/common.js @@ -0,0 +1,8 @@ +requireOption = (objectRepository, propertyName) => { + if (objectRepository && objectRepository[propertyName]) { + return objectRepository[propertyName]; + } + throw new TypeError(propertyName + ' required'); +} + +module.exports.requireOption = requireOption; diff --git a/middleware/episode/deleteEpisode.js b/middleware/episode/deleteEpisode.js index cf38378595ccfc3e9eb1aa9879503612cbdee38e..b85875cca78a764434f91cb975c5e08b87906f2c 100644 --- a/middleware/episode/deleteEpisode.js +++ b/middleware/episode/deleteEpisode.js @@ -1,11 +1,14 @@ +const requireOption = require('../common').requireOption; +const ObjectId = require('mongoose').Types.ObjectId; /** * Deletes an episode with the :episodeId id if exists * */ module.exports = (objectRepository) => { + const episodeModel = requireOption(objectRepository, 'episodeModel'); return (req, res, next) => { - - - return next(); + episodeModel.findByIdAndRemove(new ObjectId(req.params.episodeId)) + .then(() => next()) + .catch(err => next(err)) }; }; diff --git a/middleware/episode/getEpisode.js b/middleware/episode/getEpisode.js index 6891a1d76c9b5383e155bf9e0e4b504aec3d1e93..b3159570beb2aff655a069828ce8c594f4822f2c 100644 --- a/middleware/episode/getEpisode.js +++ b/middleware/episode/getEpisode.js @@ -1,11 +1,21 @@ +const requireOption = require('../common').requireOption; +const ObjectId = require('mongoose').Types.ObjectId; /** * Returns an episode with the :episodeId id and put it in res.tpl.episode * */ module.exports = (objectRepository) => { + const episodeModel = requireOption(objectRepository, 'episodeModel'); return (req, res, next) => { - - - return next(); + episodeModel.findById(new ObjectId(req.params.episodeId)) + .then(episode => { + if (episode) { + res.tpl.episode = episode; + return next(); + } else { + res.redirect('/series') + } + }) + .catch(err => next(err)) }; }; diff --git a/middleware/episode/getEpisodes.js b/middleware/episode/getEpisodes.js index 19d56b6609e4bfac9084235aeaa226b766185714..f65da5bf343a9758b4114c1a596a3cc594537b69 100644 --- a/middleware/episode/getEpisodes.js +++ b/middleware/episode/getEpisodes.js @@ -1,11 +1,22 @@ +const requireOption = require('../common').requireOption; +const ObjectId = require('mongoose').Types.ObjectId; /** * Returns all the episodes for a given serie with :id and puts the list on res.tpl.episodes * */ module.exports = (objectRepository) => { + const episodeModel = requireOption(objectRepository, 'episodeModel'); return (req, res, next) => { - - - return next(); + episodeModel.find({ serie: new ObjectId(req.params.id )}) + .then(episodes => { + if (episodes) { + res.tpl.serie.episodes = episodes; + next(); + } else { + res.tpl.serie.episodes = []; + next(); + } + }) + .catch(err => next(err)); }; }; diff --git a/middleware/episode/postEpisode.js b/middleware/episode/postEpisode.js index e7deb78cc1a66cbc4c4c289a360328fab03e702a..0e31b6ae5f3e222cb5169ffae3e4958cfdbe0527 100644 --- a/middleware/episode/postEpisode.js +++ b/middleware/episode/postEpisode.js @@ -1,11 +1,29 @@ +const requireOption = require('../common').requireOption; +const ObjectId = require('mongoose').Types.ObjectId; /** * Creates a new episode for the serie with :id id with the data provided * */ module.exports = (objectRepository) => { + const episodeModel = requireOption(objectRepository, 'episodeModel'); return (req, res, next) => { + const { title, count, seen, rating } = req.body; + if (title === undefined || count === undefined || seen === undefined || rating === undefined) { + return next(); + } + const serieId = new ObjectId(req.params.id); + const episode = new episodeModel({ + title, + count, + seen, + rating, + serie: serieId + }); - - return next(); + episode.save() + .then(episode => { + return next(); + }) + .catch(err => next(err)) }; }; diff --git a/middleware/episode/updateEpisode.js b/middleware/episode/updateEpisode.js index 727e930f1c8763bb3e6e7d30834681046ecf34c2..777338bb5a6f0dd749045808f569e25e1864f582 100644 --- a/middleware/episode/updateEpisode.js +++ b/middleware/episode/updateEpisode.js @@ -1,11 +1,32 @@ +const requireOption = require('../common').requireOption; /** * Updates the episode with :episodeId id with the data provided * */ module.exports = (objectRepository) => { + const episodeModel = requireOption(objectRepository, 'episodeModel'); return (req, res, next) => { + const { title, count, seen, rating } = req.body; + if (title === undefined || count === undefined || seen === undefined || rating === undefined) { + return next(); + } + let episode; + if (res.tpl.episode !== undefined) { + episode = res.tpl.episode; + } else { + episode = new episodeModel(); + } - return next(); + episode.title = title; + episode.count = count; + episode.seen = seen; + episode.rating = rating; + + episode.save() + .then(episode => { + return next(); + }) + .catch(err => next(err)) }; }; diff --git a/middleware/generic/render.js b/middleware/generic/render.js index 6939a470d314fca1925285a7bfb0f62416ffcf95..77b58d6dd01fd3c86ffca262178c1c5e9eae94cd 100644 --- a/middleware/generic/render.js +++ b/middleware/generic/render.js @@ -4,6 +4,6 @@ */ module.exports = (objectRepository, view) => { return (req, res) => { - res.end(`Render: ${view}`); + res.render(view, res.tpl); }; }; diff --git a/middleware/serie/deleteSerie.js b/middleware/serie/deleteSerie.js index a0e24ddeabd66815ee3b79c05d6fbf8cfe02b5c8..4688fc6f2966c0755e62e71f3dd38eda99a625b6 100644 --- a/middleware/serie/deleteSerie.js +++ b/middleware/serie/deleteSerie.js @@ -1,11 +1,14 @@ +const requireOption = require('../common').requireOption; +const ObjectId = require('mongoose').Types.ObjectId; /** * Deletes a serie with given :id if exists * */ module.exports = (objectRepository) => { + const serieModel = requireOption(objectRepository, 'serieModel'); return (req, res, next) => { - - - return next(); + serieModel.findByIdAndRemove(new ObjectId(req.params.id)) + .then(() => next()) + .catch(err => next(err)) }; }; diff --git a/middleware/serie/getSerie.js b/middleware/serie/getSerie.js index b0b0292db2df071e7c779cf969e9082d7ddf8cad..7d5d287c6fa25c5df5a131d8b6b9f9c47752dcff 100644 --- a/middleware/serie/getSerie.js +++ b/middleware/serie/getSerie.js @@ -1,11 +1,21 @@ +const requireOption = require('../common').requireOption; +const ObjectId = require('mongoose').Types.ObjectId; /** * Returns the serie with :id id and put it in res.tpl.serie * */ module.exports = (objectRepository) => { + const serieModel = requireOption(objectRepository, 'serieModel'); return (req, res, next) => { - - - return next(); + serieModel.findById(new ObjectId(req.params.id)) + .then(serie => { + if (serie) { + res.tpl.serie = serie; + return next(); + } else { + res.redirect('/series') + } + }) + .catch(err => next(err)) }; }; diff --git a/middleware/serie/getSeries.js b/middleware/serie/getSeries.js index f3e43a7a0012b284f8901bfed339899ffb610c96..5d9e143fab5d60b6f5f4e062e78d8bb3702330ea 100644 --- a/middleware/serie/getSeries.js +++ b/middleware/serie/getSeries.js @@ -1,11 +1,21 @@ +const requireOption = require('../common').requireOption; /** * Returns all series in the database and puts the list on res.tpl.series * */ module.exports = (objectRepository) => { + const serieModel = requireOption(objectRepository, 'serieModel'); return (req, res, next) => { - - - return next(); + serieModel.find() + .then(series => { + if (series) { + res.tpl.series = series; + return next(); + } else { + res.tpl.series = []; + return next(); + } + }) + .catch(err => next(err)) }; }; diff --git a/middleware/serie/postSerie.js b/middleware/serie/postSerie.js index a88938bc682fb67295138ea0909efe38a486fe66..102f5e836b1066d0d6c4cb6c4b27a079bb89cb4b 100644 --- a/middleware/serie/postSerie.js +++ b/middleware/serie/postSerie.js @@ -1,11 +1,26 @@ +const requireOption = require('../common').requireOption; /** * Creates a new serie with the data provided * */ module.exports = (objectRepository) => { + const serieModel = requireOption(objectRepository, 'serieModel'); return (req, res, next) => { + const { title, image, description, progress } = req.body; + if (title === undefined || image === undefined || description === undefined || progress === undefined) { + return next(); + } + const serie = new serieModel({ + title, + image, + description, + progress + }); - - return next(); + serie.save() + .then(serie => { + return next(); + }) + .catch(err => next(err)) }; }; diff --git a/middleware/serie/postSeries.js b/middleware/serie/postSeries.js deleted file mode 100644 index a88938bc682fb67295138ea0909efe38a486fe66..0000000000000000000000000000000000000000 --- a/middleware/serie/postSeries.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Creates a new serie with the data provided - * -*/ -module.exports = (objectRepository) => { - return (req, res, next) => { - - - return next(); - }; -}; diff --git a/middleware/serie/updateSerie.js b/middleware/serie/updateSerie.js index ed9adb1022d5e4b6cc9e879077743fcd39312dce..c8046da454c1234ee08f1c2ae6465a9685919a2f 100644 --- a/middleware/serie/updateSerie.js +++ b/middleware/serie/updateSerie.js @@ -1,11 +1,32 @@ +const requireOption = require('../common').requireOption; /** * Updates the serie with :id id with the data provided * */ module.exports = (objectRepository) => { + const serieModel = requireOption(objectRepository, 'serieModel'); return (req, res, next) => { + const { title, image, description, progress } = req.body; + if (title === undefined || image === undefined || description === undefined || progress === undefined) { + return next(); + } + let serie; + if (res.tpl.serie !== undefined) { + serie = res.tpl.serie; + } else { + serie = new serieModel() + } - return next(); + serie.title = title; + serie.image = image; + serie.description = description; + serie.progress = progress; + + serie.save() + .then(serie => { + return next(); + }) + .catch(err => next(err)) }; }; diff --git a/models/episode.js b/models/episode.js index f2cb13262221b45fd90995a16f89f8cedd65a3fc..07676b53932a68a310f92de66081918506547262 100644 --- a/models/episode.js +++ b/models/episode.js @@ -6,7 +6,7 @@ const Episode = db.model('Episode', { count: Number, seen: String, rating: Number, - _assignedto: { + serie: { type: Schema.Types.ObjectId, ref: 'Serie' }, diff --git a/routes/index.js b/routes/index.js index 1c74bb1011a6ffe412945fd0dcd97e1378d23df6..a2eddcc9b9beb5cea423317171a2563aecc7e47b 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,7 +1,7 @@ const renderMW = require('../middleware/generic/render'); const getSeriesMW = require('../middleware/serie/getSeries'); const getSerieMW = require('../middleware/serie/getSerie'); -const postSerieMW = require('../middleware/serie/postSeries'); +const postSerieMW = require('../middleware/serie/postSerie'); const updateSerieMW = require('../middleware/serie/updateSerie'); const deleteSerieMW = require('../middleware/serie/deleteSerie'); const getEpisodesMW = require('../middleware/episode/getEpisodes'); @@ -40,7 +40,7 @@ module.exports = (app) => { app.post('/series', postSerieMW(objectRepository), (req, res, next) => ( - res.redirect('/series') + res.redirect(`/series/${res.tpl.id}`) ) ); @@ -53,8 +53,6 @@ module.exports = (app) => { ); app.delete('/series/:id', - getSerieMW(objectRepository), - getEpisodesMW(objectRepository), deleteSerieMW(objectRepository), (req, res, next) => ( res.redirect('/series') @@ -70,13 +68,11 @@ module.exports = (app) => { ); app.get('/series/:id/episode/:episodeId/edit', - getSerieMW(objectRepository), getEpisodeMW(objectRepository), renderMW(objectRepository, 'episodeEdit') ); app.post('/series/:id', - getSerieMW(objectRepository), postEpisodeMW(objectRepository), (req, res, next) => ( res.redirect(`/series/${req.params.id}`) @@ -84,7 +80,6 @@ module.exports = (app) => { ); app.put('/series/:id/episode/:episodeId', - getSerieMW(objectRepository), getEpisodeMW(objectRepository), updateEpisodeMW(objectRepository), (req, res, next) => ( @@ -93,8 +88,6 @@ module.exports = (app) => { ); app.delete('/series/:id/episode/:episodeId', - getSerieMW(objectRepository), - getEpisodeMW(objectRepository), deleteEpisodeMW(objectRepository), (req, res, next) => ( res.redirect(`/series/${req.params.id}`) diff --git a/views/serie.ejs b/views/serie.ejs index b0446dc55d8a300efd645e2a3713aecdb82d7b0a..b3737ec6eadcaa0dbd2fa7308a09b59eaf4420f0 100644 --- a/views/serie.ejs +++ b/views/serie.ejs @@ -27,7 +27,7 @@ </a> </div> <div class="description"> - <% stars.forEach(star => { + <% stars.forEach(star => { %> <% if (star.isFull) { %> <i class="star icon"></i> <% } else { %>