From 3fc3d075983f1d0721f012a59eb875182d388aed Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 15 May 2021 18:33:59 +0200 Subject: [PATCH] Config model and controllers --- controllers/config.js | 93 +++++++++++++++++++++++++++++++++++++++++++ models/App.js | 2 +- models/Config.js | 26 ++++++++++++ routes/config.js | 23 +++++++++++ server.js | 1 + 5 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 controllers/config.js create mode 100644 models/Config.js create mode 100644 routes/config.js diff --git a/controllers/config.js b/controllers/config.js new file mode 100644 index 0000000..ff94e4f --- /dev/null +++ b/controllers/config.js @@ -0,0 +1,93 @@ +const asyncWrapper = require('../middleware/asyncWrapper'); +const ErrorResponse = require('../utils/ErrorResponse'); +const Config = require('../models/Config'); + +// @desc Insert new key:value pair +// @route POST /api/config +// @access Public +exports.createPair = asyncWrapper(async (req, res, next) => { + const pair = await Config.create(req.body); + + res.status(201).json({ + success: true, + data: pair + }) +}) + +// @desc Get all key:value pairs +// @route GET /api/config +// @access Public +exports.getAllPairs = asyncWrapper(async (req, res, next) => { + const pairs = await Config.findAll(); + + res.status(201).json({ + success: true, + data: pairs + }) +}) + +// @desc Get single key:value pair +// @route GET /api/config/:key +// @access Public +exports.getSinglePair = asyncWrapper(async (req, res, next) => { + const pair = await Config.findOne({ + where: { key: req.params.key } + }); + + if (!pair) { + return next(new ErrorResponse(`Key ${req.params.key} was not found`, 404)); + } + + res.status(201).json({ + success: true, + data: pair + }) +}) + +// @desc Update value +// @route PUT /api/config/:key +// @access Public +exports.updateValue = asyncWrapper(async (req, res, next) => { + let pair = await Config.findOne({ + where: { key: req.params.key } + }); + + if (!pair) { + return next(new ErrorResponse(`Key ${req.params.key} was not found`, 404)); + } + + if (pair.isLocked) { + return next(new ErrorResponse(`Value of key ${req.params.key} is locked and can not be changed`, 400)); + } + + pair = await pair.update({ ...req.body }); + + res.status(200).json({ + success: true, + data: pair + }) +}) + +// @desc Delete key:value pair +// @route DELETE /api/config/:key +// @access Public +exports.deletePair = asyncWrapper(async (req, res, next) => { + const pair = await Config.findOne({ + where: { key: req.params.key } + }); + + if (!pair) { + return next(new ErrorResponse(`Key ${req.params.key} was not found`, 404)); + } + + if (pair.isLocked) { + return next(new ErrorResponse(`Value of key ${req.params.key} is locked and can not be deleted`, 400)); + } + + await pair.destroy(); + + res.status(200).json({ + success: true, + data: {} + }) +}) \ No newline at end of file diff --git a/models/App.js b/models/App.js index 57e5801..41c4605 100644 --- a/models/App.js +++ b/models/App.js @@ -1,4 +1,4 @@ -const { Sequelize, DataTypes } = require('sequelize'); +const { DataTypes } = require('sequelize'); const { sequelize } = require('../db'); const App = sequelize.define('App', { diff --git a/models/Config.js b/models/Config.js new file mode 100644 index 0000000..4578b86 --- /dev/null +++ b/models/Config.js @@ -0,0 +1,26 @@ +const { DataTypes } = require('sequelize'); +const { sequelize } = require('../db'); + +const Config = sequelize.define('Config', { + key: { + type: DataTypes.STRING, + allowNull: false, + unique: true + }, + value: { + type: DataTypes.STRING, + allowNull: false + }, + valueType: { + type: DataTypes.STRING, + allowNull: false + }, + isLocked: { + type: DataTypes.BOOLEAN, + defaultValue: false + } +}, { + freezeTableName: true +}); + +module.exports = Config; \ No newline at end of file diff --git a/routes/config.js b/routes/config.js new file mode 100644 index 0000000..bcb66ac --- /dev/null +++ b/routes/config.js @@ -0,0 +1,23 @@ +const express = require('express'); +const router = express.Router(); + +const { + createPair, + getAllPairs, + getSinglePair, + updateValue, + deletePair +} = require('../controllers/config'); + +router + .route('') + .post(createPair) + .get(getAllPairs); + +router + .route('/:key') + .get(getSinglePair) + .put(updateValue) + .delete(deletePair); + +module.exports = router; \ No newline at end of file diff --git a/server.js b/server.js index a631422..ed43611 100644 --- a/server.js +++ b/server.js @@ -18,6 +18,7 @@ app.use(express.json()); // Link controllers with routes app.use('/api/apps', require('./routes/apps')); +app.use('/api/config', require('./routes/config')); // Custom error handler app.use(errorHandler);