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