routes/access/visualizations.js

/**
 * @module access/visualization
 */

var express = require('express');
var router = express.Router();
var secured = require('../../lib/middleware/secured');
var wrapAsync = require('../../lib/middleware/asyncWrap');
const {VisualizationDatabase, DeviceDatabase} = require('../../database/models');

/**
 * API Endpoint to create a new visualization object for the passed device.
 * @function newVisualization
 *
 * @swagger
 * /access/visualization/new:
 *      post:
 *          description: Creates a new visualization.
 *          tags:
 *              - access
 *              - visualization
 *          requestBody:
 *              required: true
 *              content:
 *                  'application/json':
 *                      schema:
 *                          type: object
 *                          required:
 *                              - device_id
 *                          properties:
 *                              device_id:
 *                                  type: string
 *                                  description: The id of the device given by spool during registration. 
 *                          example:
 *                              device_id: asdg034kajd024lc94
 *                              
 */
router.post('/new', wrapAsync(async (req, res) => {

	let visualizationData = req.body;

	//get the device id
	const device_id = req.body.device_id;

	try {
		if	(await DeviceDatabase.checkPermissions(device_id, ['edit'], req.apiKey)) {

			const _ = await VisualizationDatabase.create(visualizationData, device_id, req.apiUser);
			res.sendStatus(200);
        }
        else {
			res.sendStatus(404);
        }

	}
	catch(error) {
		console.log(error);
		res.sendStatus(404);
	}
}));

/**
 * API Endpoint to retrieve all the visualizations for a device.
 * @function getVisualizations
 *
 * @swagger
 * /access/visualization/{device_id}:
 *      get:
 *          description: Creates a new visualization.
 *          tags:
 *              - access
 *              - visualization
 *          parameters:
 *              - in: path
 *                name: device
 *                schema:
 *                  type: string
 *                required: true
 *                description: The id of the device to get visualizations for.
 */
router.get('/:device_id', secured, wrapAsync(async (req, res) => {

	const device_id = req.params.device_id;

	try {
		if (await DeviceDatabase.checkPermissions(device_id, ['view'], req.apiUser)) {
			const visualizations = await VisualizationDatabase.getByDevice(device_id, req.apiUser);
			res.send(visualizations);
		}
		else {
			res.sendStatus(404);
		}

	}
	catch (error) {
		console.error(error);
		res.sendStatus(404);
	}
}));

/**
 * API Endpoint to update a visualization.
 * @function updateVisualization
 *
 * @swagger
 *  /access/visualization/{device_id}:
 *      post:
 *          description: Updates a visualization.
 *          tags:
 *              - access
 *              - visualization
 *         
 */
router.post('/update/', secured, wrapAsync(async (req, res) => {

	const visualization_id = req.body.visualization_id;

	try {
		if (await VisualizationDatabase.checkPermissions(visualization_id, ['edit'], req.apiUser)) {
			await VisualizationDatabase.update(visualization_id, req.body);
			res.sendStatus(200);
		}
		else {
			res.send(404);
		}

	}
	catch(error) {
		res.sendStatus(401);
		/* TODO: Add an APIErrorResponseHandler class/function to deal with different types of errors and send meaningful messages to the client. */
	}
}));

/**
 * API Endpoint to delete a visualization.
 * @function deleteVisualization
 * 
 * @swagger
 * /access/visualization/:
 *      post:
 *          description: Deletes a visualization.
 *          tags:
 *              - access
 *              - visualization
 *          requestBody:
 *              required: true
 *              content:
 *                  'application/json':
 *                      schema:
 *                          type: object
 *                          required:
 *                              - device_id
 *                          properties:
 *                              device_id:
 *                                  type: string
 *                                  description: The id of the device given by spool during registration.
 *                          example:
 *                              device_id: asdg034kajd024lc94
 */
router.post('/delete/', secured, wrapAsync(async (req, res) => {

	const visualization_id = req.body.visualization_id;

	try {
		if (await VisualizationDatabase.checkPermissions(visualization_id, ['edit'], req.apiUser)) {
			VisualizationDatabase.del(visualization_id, req.apiUser);
			res.sendStatus(200);
		}
		else {
			res.sendStatus(404);
		}
	}
	catch(error) {
		res.sendStatus(401);
	}
}));

module.exports = router;