From 1040238935ef8c9ba4ce85a3694c236613e33ebc Mon Sep 17 00:00:00 2001
From: Markus Grigull <web@grigull.me>
Date: Tue, 28 Jun 2016 14:24:28 +0200
Subject: [PATCH] Add visualizations and plots routes and models

---
 models/plot.js           | 15 ++++++++
 models/project.js        |  3 +-
 models/visualization.js  | 12 ++++++
 routes/plots.js          | 81 ++++++++++++++++++++++++++++++++++++++++
 routes/projects.js       |  2 +-
 routes/visualizations.js | 81 ++++++++++++++++++++++++++++++++++++++++
 server.js                |  4 ++
 7 files changed, 196 insertions(+), 2 deletions(-)
 create mode 100644 models/plot.js
 create mode 100644 models/visualization.js
 create mode 100644 routes/plots.js
 create mode 100644 routes/visualizations.js

diff --git a/models/plot.js b/models/plot.js
new file mode 100644
index 0000000..41b163b
--- /dev/null
+++ b/models/plot.js
@@ -0,0 +1,15 @@
+// include
+var mongoose = require('mongoose');
+
+var Schema = mongoose.Schema;
+
+// plot model
+var plotSchema = new Schema({
+  name: { type: String, required: true },
+  signal: { type: String, required: true },
+  width: { type: Number, required: true },
+  height: { type: Number, required: true },
+  title: { type: String }
+});
+
+module.exports = mongoose.model('Plot', plotSchema);
diff --git a/models/project.js b/models/project.js
index c530a1d..84d2548 100644
--- a/models/project.js
+++ b/models/project.js
@@ -6,7 +6,8 @@ var Schema = mongoose.Schema;
 // project model
 var projectSchema = new Schema({
   name: { type: String, required: true },
-  owner: { type: Schema.Types.ObjectId, ref: 'User', required: true }
+  owner: { type: Schema.Types.ObjectId, ref: 'User', required: true },
+  visualizations: [{ type: Schema.Types.ObjectId, ref: 'Visualization' }]
 });
 
 module.exports = mongoose.model('Project', projectSchema);
diff --git a/models/visualization.js b/models/visualization.js
new file mode 100644
index 0000000..b90b06d
--- /dev/null
+++ b/models/visualization.js
@@ -0,0 +1,12 @@
+// include
+var mongoose = require('mongoose');
+
+var Schema = mongoose.Schema;
+
+// visualization model
+var visualizationSchema = new Schema({
+  name: { type: String, required: true },
+  plots: [{ type: Schema.Types.ObjectId, ref: 'Plot' }]
+});
+
+module.exports = mongoose.model('Visualization', visualizationSchema);
diff --git a/routes/plots.js b/routes/plots.js
new file mode 100644
index 0000000..e9d2acd
--- /dev/null
+++ b/routes/plots.js
@@ -0,0 +1,81 @@
+// include
+var express = require('express');
+
+var Plot = require('../models/plot');
+var auth = require('../auth');
+
+// create router
+var router = express.Router();
+
+// all plot routes need authentication
+router.use('/plots', auth.validateToken);
+
+// routes
+router.get('/plots', function(req, res) {
+  // get all plots
+  Plot.find(function(err, plots) {
+    if (err) {
+      return res.send(err);
+    }
+
+    res.send({ plots: plots });
+  });
+});
+
+router.route('/plots').post(function(req, res) {
+  // create new plot
+  var plot = new Plot(req.body.plot);
+
+  plot.save(function(err) {
+    if (err) {
+      return res.send(err);
+    }
+
+    res.send({ plot: plot });
+  });
+});
+
+router.route('/plots/:id').put(function(req, res) {
+  // get plot
+  Plot.findOne({ _id: req.params.id }, function(err, plot) {
+    if (err) {
+      return res.send(err);
+    }
+
+    // update all properties
+    for (property in req.body.plot) {
+      plot[property] = req.body.plot[property];
+    }
+
+    // save the changes
+    plot.save(function(err) {
+      if (err) {
+        return res.send(err);
+      }
+
+      res.send({ plot: plot });
+    });
+  });
+});
+
+router.route('/plots/:id').get(function(req, res) {
+  Plot.findOne({ _id: req.params.id }, function(err, plot) {
+    if (err) {
+      return res.send(err);
+    }
+
+    res.send({ plot: plot });
+  });
+});
+
+router.route('/plots/:id').delete(function(req, res) {
+  Plot.remove({ _id: req.params.id }, function(err, plot) {
+    if (err) {
+      return res.send(err);
+    }
+
+    res.send({ plot: plot });
+  });
+});
+
+module.exports = router;
diff --git a/routes/projects.js b/routes/projects.js
index 7d88f14..b65a593 100644
--- a/routes/projects.js
+++ b/routes/projects.js
@@ -33,7 +33,7 @@ router.get('/projects', function(req, res) {
       return res.send(err);
     }
 
-    res.json({ projects: projects });
+    res.send({ projects: projects });
   });
 });
 
diff --git a/routes/visualizations.js b/routes/visualizations.js
new file mode 100644
index 0000000..abf2a2d
--- /dev/null
+++ b/routes/visualizations.js
@@ -0,0 +1,81 @@
+// include
+var express = require('express');
+
+var Visualization = require('../models/visualization');
+var auth = require('../auth');
+
+// create router
+var router = express.Router();
+
+// all visualization routes need authentication
+router.use('/visualizations', auth.validateToken);
+
+// routes
+router.get('/visualizations', function(req, res) {
+  // get all visualizations
+  Visualization.find(function(err, visualizations) {
+    if (err) {
+      return res.send(err);
+    }
+
+    res.send({ visualizations: visualizations });
+  });
+});
+
+router.route('/visualizations').post(function(req, res) {
+  // create new visualization
+  var visualization = new Visualization(req.body.visualization);
+
+  visualization.save(function(err) {
+    if (err) {
+      return res.send(err);
+    }
+
+    res.send({ visualization: visualization });
+  });
+});
+
+router.route('/visualizations/:id').put(function(req, res) {
+  // get visualization
+  Visualization.findOne({ _id: req.params.id }, function(err, visualization) {
+    if (err) {
+      return res.send(err);
+    }
+
+    // update all properties
+    for (property in req.body.visualization) {
+      visualization[property] = req.body.visualization[property];
+    }
+
+    // save the changes
+    visualization.save(function(err) {
+      if (err) {
+        return res.send(err);
+      }
+
+      res.send({ visualization: visualization });
+    });
+  });
+});
+
+router.route('/visualizations/:id').get(function(req, res) {
+  Visualization.findOne({ _id: req.params.id }, function(err, visualization) {
+    if (err) {
+      return res.send(err);
+    }
+
+    res.send({ visualization: visualization });
+  });
+});
+
+router.route('/visualizations/:id').delete(function(req, res) {
+  Visualization.remove({ _id: req.params.id }, function(err, visualization) {
+    if (err) {
+      return res.send(err);
+    }
+
+    res.send({ visualization: visualization });
+  });
+});
+
+module.exports = router;
diff --git a/server.js b/server.js
index ccc58d3..1b07975 100644
--- a/server.js
+++ b/server.js
@@ -10,6 +10,8 @@ var config = require('./config');
 
 var users = require('./routes/users');
 var projects = require('./routes/projects');
+var visualizations = require('./routes/visualizations');
+var plots = require('./routes/plots')
 
 var User = require('./models/user');
 
@@ -28,6 +30,8 @@ mongoose.connect(config.databaseURL + config.databaseName);
 // register routes
 app.use('/api/v1', users);
 app.use('/api/v1', projects);
+app.use('/api/v1', visualizations);
+app.use('/api/v1', plots);
 
 // start the app
 app.listen(config.port, function() {
-- 
GitLab