From f9a2b14aab0b142c98beb43574edb6c050e1ee87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20Szab=C3=B3?= <tamas@szaboo.com> Date: Mon, 27 Nov 2017 01:02:23 +0100 Subject: [PATCH] middleware implementation --- config/db.js | 2 +- middleware/common.js | 8 ++++++++ middleware/episode/deleteEpisode.js | 9 ++++++--- middleware/episode/getEpisode.js | 16 +++++++++++++--- middleware/episode/getEpisodes.js | 17 ++++++++++++++--- middleware/episode/postEpisode.js | 22 ++++++++++++++++++++-- middleware/episode/updateEpisode.js | 23 ++++++++++++++++++++++- middleware/generic/render.js | 2 +- middleware/serie/deleteSerie.js | 9 ++++++--- middleware/serie/getSerie.js | 16 +++++++++++++--- middleware/serie/getSeries.js | 16 +++++++++++++--- middleware/serie/postSerie.js | 19 +++++++++++++++++-- middleware/serie/postSeries.js | 11 ----------- middleware/serie/updateSerie.js | 23 ++++++++++++++++++++++- models/episode.js | 2 +- routes/index.js | 11 ++--------- views/serie.ejs | 2 +- 17 files changed, 160 insertions(+), 48 deletions(-) create mode 100644 middleware/common.js delete mode 100644 middleware/serie/postSeries.js diff --git a/config/db.js b/config/db.js index 530771f..e84f816 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 0000000..4305153 --- /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 cf38378..b85875c 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 6891a1d..b315957 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 19d56b6..f65da5b 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 e7deb78..0e31b6a 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 727e930..777338b 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 6939a47..77b58d6 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 a0e24dd..4688fc6 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 b0b0292..7d5d287 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 f3e43a7..5d9e143 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 a88938b..102f5e8 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 a88938b..0000000 --- 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 ed9adb1..c8046da 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 f2cb132..07676b5 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 1c74bb1..a2eddcc 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 b0446dc..b3737ec 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 { %> -- GitLab