Skip to content
Snippets Groups Projects
Commit 73a78023 authored by Markus Grigull's avatar Markus Grigull
Browse files

Add simulator model and fix routes

parent 0c2638cf
No related branches found
No related tags found
No related merge requests found
......@@ -5,7 +5,7 @@ This is the backend for the VILLASweb frontend. It is build upon NodeJS, Express
## To-Do
- Don't send user password (select: false)
- Only get projects which are accessible by the user
- Only get objects which are accessible by the user
- Add support for config.js with docker volumes
- Add support for key-secret for bcrypt
- Let user change own properties if not admin
......@@ -13,5 +13,6 @@ This is the backend for the VILLASweb frontend. It is build upon NodeJS, Express
- Add proper 404 to all routes
- Add proper error messages to all routes
- Handle missing objects (e.g. visualization is removed and belonging project does not exist anymore)
- Save model creation date
- Add project/visualization sharing
- Save objects creation date
- Add object sharing
- Add project to simulation when updating
......@@ -4,6 +4,8 @@ node:
- "3000:3000"
links:
- mongo
environment:
- NODE_ENV=development
mongo:
image: mongo
......
......@@ -19,7 +19,7 @@ var projectSchema = new Schema({
name: { type: String, required: true },
owner: { type: Schema.Types.ObjectId, ref: 'User', required: true },
visualizations: [{ type: Schema.Types.ObjectId, ref: 'Visualization', default: [] }],
simulation: [{ type: Schema.Types.ObjectId, ref: 'Simulation' }]
simulation: { type: Schema.Types.ObjectId, ref: 'Simulation', required: true }
});
projectSchema.pre('remove', function(callback) {
......
......@@ -18,7 +18,7 @@
var simulationSchema = new Schema({
name: { type: String, required: true },
running: { type: Boolean, default: false },
owner: { type: Schema.Types.ObjectId, ref: 'User' },
owner: { type: Schema.Types.ObjectId, ref: 'User', required: true },
models: [{ type: Schema.Types.ObjectId, ref: 'SimulationModel', default: [] }],
projects: [{ type: Schema.Types.ObjectId, ref: 'Project', default: [] }]
});
......
/**
* File: simulation.js
* Author: Markus Grigull <mgrigull@eonerc.rwth-aachen.de>
* Date: 28.09.2016
* Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC
* This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential.
* Unauthorized copying of this file, via any medium is strictly prohibited.
**********************************************************************************/
// include
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
// simulator model
var simulatorSchema = new Schema({
name: { type: String, required: true },
running: { type: Boolean, default: false },
simulatorid: { type: Number, required: true },
endpoint: { type: String, required: true }
});
module.exports = mongoose.model('Simulator', simulatorSchema);
......@@ -15,6 +15,7 @@ var auth = require('../auth');
// models
var Project = require('../models/project');
var User = require('../models/user');
var Simulation = require('../models/simulation');
// create router
var router = express.Router();
......@@ -22,66 +23,67 @@ var router = express.Router();
// all project routes need authentication
router.use('/projects', auth.validateToken);
// authorize user function
function authorizeUser(req, project) {
// get logged-in user id
var userId = req.decoded._doc._id;
var userAdminLevel = req.decoded._doc.adminLevel;
if (project.owner == userId) {
return true;
} else if (userAdminLevel >= 1) {
return true;
}
return false;
}
// routes
router.get('/projects', function(req, res) {
// get all projects
Project.find(function(err, projects) {
if (err) {
return res.send(err);
return res.status(400).send(err);
}
res.send({ projects: projects });
});
});
router.route('/projects').post(function(req, res) {
router.post('/projects', function(req, res) {
// create new project
var project = new Project(req.body.project);
// save project
project.save(function(err) {
if (err) {
return res.send(err);
return res.status(500).send(err);
}
res.send({ project: project });
});
// add project to user
User.findOne({ _id: project.owner }, function(err, user) {
if (err) {
return res.status(400).send(err);
}
// add project to user
User.findOne({ _id: project.owner }, function(err, user) {
if (err) {
return console.log(err);
}
user.projects.push(project._id);
user.save(function(err) {
if (err) {
return res.status(500).send(err);
}
user.projects.push(project._id);
// add project to simulation
Simulation.findOne({ _id: project.simulation }, function(err, simulation) {
if (err) {
return res.status(400).send(err);
}
user.save(function(err) {
if (err) {
console.log(err);
}
simulation.projects.push(project._id);
simulation.save(function(err) {
if (err) {
return res.status(500).send(err);
}
res.send({ project: project });
});
});
});
});
});
});
router.route('/projects/:id').put(function(req, res) {
router.put('/projects/:id', function(req, res) {
// get project
Project.findOne({ _id: req.params.id }, function(err, project) {
if (err) {
return res.send(err);
return res.status(400).send(err);
}
// update all properties
......@@ -92,7 +94,7 @@ router.route('/projects/:id').put(function(req, res) {
// save the changes
project.save(function(err) {
if (err) {
return res.send(err);
return res.status(500).send(err);
}
res.send({ project: project });
......@@ -100,26 +102,26 @@ router.route('/projects/:id').put(function(req, res) {
});
});
router.route('/projects/:id').get(function(req, res) {
router.get('/projects/:id', function(req, res) {
Project.findOne({ _id: req.params.id }, function(err, project) {
if (err) {
return res.send(err);
return res.status(400).send(err);
}
res.send({ project: project });
});
});
router.route('/projects/:id').delete(function(req, res) {
router.delete('/projects/:id', function(req, res) {
Project.findOne({ _id: req.params.id }, function(err, project) {
if (err) {
return res.send(err);
return res.status(400).send(err);
}
// remove from owner's list
User.findOne({ _id: project.owner }, function(err, user) {
if (err) {
return console.log(err);
return res.status(400).send(err);
}
for (var i = 0; user.projects.length; i++) {
......@@ -131,17 +133,18 @@ router.route('/projects/:id').delete(function(req, res) {
user.save(function(err) {
if (err) {
return console.log(err);
return res.status(500).send(err);
}
});
});
project.remove(function(err) {
if (err) {
return res.send(err);
}
// remove the project
project.remove(function(err) {
if (err) {
return res.status(500).send(err);
}
res.send({});
res.send({});
});
});
});
});
});
......
......@@ -27,7 +27,7 @@ router.get('/simulationModels', function(req, res) {
// get all models
SimulationModel.find(function(err, models) {
if (err) {
return res.send(err);
return res.status(400).send(err);
}
res.send({ simulationModel: models });
......@@ -40,24 +40,24 @@ router.post('/simulationModels', function(req, res) {
model.save(function(err) {
if (err) {
return res.send(err);
return res.status(400).send(err);
}
res.send({ simulationModel: model });
});
// add model to simulation
Simulation.findOne({ _id: model.simulation }, function(err, simulation) {
if (err) {
return res.status(500).send(err);
}
// add model to simulation
Simulation.findOne({ _id: model.simulation }, function(err, simulation) {
if (err) {
return console.log(err);
}
simulation.models.push(model._id);
simulation.models.push(model._id);
simulation.save(function(err) {
if (err) {
return res.status(500).send(err);
}
simulation.save(function(err) {
if (err) {
console.log(err);
}
res.send({ simulationModel: model });
});
});
});
});
......@@ -66,7 +66,7 @@ router.put('/simulationModels/:id', function(req, res) {
// get model
SimulationModel.findOne({ _id: req.params.id }, function(err, model) {
if (err) {
return res.send(err);
return res.status(400).send(err);
}
// update all properties
......@@ -77,7 +77,7 @@ router.put('/simulationModels/:id', function(req, res) {
// save the changes
model.save(function(err) {
if (err) {
return res.send(err);
return res.status(500).send(err);
}
res.send({ simulationModel: model });
......@@ -88,7 +88,7 @@ router.put('/simulationModels/:id', function(req, res) {
router.get('/simulationModels/:id', function(req, res) {
SimulationModel.findOne({ _id: req.params.id }, function(err, model) {
if (err) {
return res.send(err);
return res.status(400).send(err);
}
res.send({ simulationModel: model });
......@@ -98,13 +98,13 @@ router.get('/simulationModels/:id', function(req, res) {
router.delete('/simulationModels/:id', function(req, res) {
SimulationModel.findOne({ _id: req.params.id }, function(err, model) {
if (err) {
return res.send(err);
return res.status(400).send(err);
}
// remove from simulation's list
Simulation.findOne({ _id: model.simulation }, function(err, simulation) {
if (err) {
return console.log(err);
return res.status(500).send(err);
}
for (var i = 0; simulation.models.length; i++) {
......@@ -116,17 +116,17 @@ router.delete('/simulationModels/:id', function(req, res) {
simulation.save(function(err) {
if (err) {
return console.log(err);
return res.status(500).send(err);
}
});
});
model.remove(function(err) {
if (err) {
return res.send(err);
}
model.remove(function(err) {
if (err) {
return res.status(500).send(err);
}
res.send({});
res.send({});
});
});
});
});
});
......
......@@ -40,24 +40,25 @@ router.post('/simulations', function(req, res) {
simulation.save(function(err) {
if (err) {
return res.send(err);
return res.status(400).send(err);
}
res.send({ simulation: simulation });
});
// add simulation to user
User.findOne({ _id: simulation.owner }, function(err, user) {
if (err) {
return res.status(400).send(err);
}
// add simulation to user
User.findOne({ _id: simulation.owner }, function(err, user) {
if (err) {
return console.log(err);
}
user.simulations.push(simulation._id);
user.simulations.push(simulation._id);
user.save(function(err) {
if (err) {
res.status(500).send(err);
}
user.save(function(err) {
if (err) {
console.log(err);
}
// send response
res.send({ simulation: simulation });
});
});
});
});
......@@ -66,7 +67,7 @@ router.put('/simulations/:id', function(req, res) {
// get simulation
Simulation.findOne({ _id: req.params.id }, function(err, simulation) {
if (err) {
return res.send(err);
return res.status(400).send(err);
}
// update all properties
......@@ -77,7 +78,7 @@ router.put('/simulations/:id', function(req, res) {
// save the changes
simulation.save(function(err) {
if (err) {
return res.send(err);
return res.status(400).send(err);
}
res.send({ simulation: simulation });
......@@ -98,13 +99,13 @@ router.get('/simulations/:id', function(req, res) {
router.delete('/simulations/:id', function(req, res) {
Simulation.findOne({ _id: req.params.id }, function(err, simulation) {
if (err) {
return res.send(err);
return res.status(400).send(err);
}
// remove from owner's list
User.findOne({ _id: simulation.owner }, function(err, user) {
if (err) {
return console.log(err);
return res.status(500).send(err);
}
for (var i = 0; user.simulations.length; i++) {
......@@ -116,17 +117,18 @@ router.delete('/simulations/:id', function(req, res) {
user.save(function(err) {
if (err) {
return console.log(err);
return res.status(500).send(err);
}
});
});
simulation.remove(function(err) {
if (err) {
return res.send(err);
}
// remove simulation itself
simulation.remove(function(err) {
if (err) {
return res.status(500).send(err);
}
res.send({});
res.send({});
});
});
});
});
});
......
/**
* File: simulators.js
* Author: Markus Grigull <mgrigull@eonerc.rwth-aachen.de>
* Date: 28.09.2016
* Copyright: 2016, Institute for Automation of Complex Power Systems, EONERC
* This file is part of VILLASweb. All Rights Reserved. Proprietary and confidential.
* Unauthorized copying of this file, via any medium is strictly prohibited.
**********************************************************************************/
// include
var express = require('express');
var auth = require('../auth');
// models
var Simulator = require('../models/simulator');
// create router
var router = express.Router();
// all model routes need authentication
router.use('/simulators', auth.validateToken);
// routes
router.get('/simulators', function(req, res) {
// get all simulators
Simulator.find(function(err, simulators) {
if (err) {
return res.status(400).send(err);
}
res.send({ simulators: simulators });
});
});
router.post('/simulators', function(req, res) {
// create new simulator
var simulator = new Simulator(req.body.simulator);
simulator.save(function(err) {
if (err) {
return res.status(400).send(err);
}
res.send({ simulator: simulator });
});
});
router.put('/simulators/:id', function(req, res) {
// get simulator
Simulator.findOne({ _id: req.params.id }, function(err, simulator) {
if (err) {
return res.status(400).send(err);
}
// update all properties
for (property in req.body.simulator) {
simulator[property] = req.body.simulator[property];
}
// save the changes
simulator.save(function(err) {
if (err) {
return res.status(500).send(err);
}
res.send({ simulator: simulator });
});
});
});
router.get('/simulators/:id', function(req, res) {
Simulator.findOne({ _id: req.params.id }, function(err, simulator) {
if (err) {
return res.status(400).send(err);
}
res.send({ simulator: simulator });
});
});
router.delete('/simulators/:id', function(req, res) {
Simulator.findOne({ _id: req.params.id }, function(err, simulator) {
if (err) {
return res.status(400).send(err);
}
simulator.remove(function(err) {
if (err) {
return res.status(500).send(err);
}
res.send({});
});
});
});
module.exports = router;
......@@ -23,6 +23,7 @@ var visualizations = require('./routes/visualizations');
var plots = require('./routes/plots');
var simulations = require('./routes/simulations');
var simulationModels = require('./routes/simulationModels');
var simulators = require('./routes/simulators');
var User = require('./models/user');
......@@ -45,6 +46,7 @@ app.use('/api/v1', visualizations);
app.use('/api/v1', plots);
app.use('/api/v1', simulations);
app.use('/api/v1', simulationModels);
app.use('/api/v1', simulators);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
......@@ -57,14 +59,14 @@ app.use(function(req, res, next) {
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', { message: err.message, error: err });
res.send({ error: err, message: err.message });
});
}
// production error handler
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', { message: err.message, error: {} });
res.send({ error: {}, message: err.message });
});
// start the app
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment