diff --git a/public/openapi/write.yaml b/public/openapi/write.yaml index 17cb6290fc95..4bd7e2fed9e6 100644 --- a/public/openapi/write.yaml +++ b/public/openapi/write.yaml @@ -1022,6 +1022,32 @@ paths: response: type: object properties: {} + /admin/settings/{setting}: + put: + tags: + - admin + summary: update configuration setting + description: This operation updates a configuration setting in the backend. The calling user must have the `admin:settings` privilege (or be a superadmin) in order for this call to proceed. + parameters: + - in: path + name: setting + schema: + type: string + required: true + description: backend id of the setting to update + responses: + '200': + description: Admin setting updated + content: + application/json: + schema: + type: object + properties: + status: + $ref: '#/components/schemas/Status' + response: + type: object + properties: {} components: schemas: Status: diff --git a/src/controllers/write/admin.js b/src/controllers/write/admin.js new file mode 100644 index 000000000000..e8e8986909e8 --- /dev/null +++ b/src/controllers/write/admin.js @@ -0,0 +1,16 @@ +'use strict'; + +const meta = require('../../meta'); + +const helpers = require('../helpers'); + +const Admin = module.exports; + +Admin.updateSetting = async (req, res) => { + if (!res.locals.privileges['admin:settings']) { + return helpers.formatApiResponse(403, res); + } + + await meta.configs.set(req.params.setting, req.body.value); + helpers.formatApiResponse(200, res); +}; diff --git a/src/controllers/write/index.js b/src/controllers/write/index.js index b3dec622389e..7bf5776b1c8e 100644 --- a/src/controllers/write/index.js +++ b/src/controllers/write/index.js @@ -7,3 +7,4 @@ Write.groups = require('./groups'); Write.categories = require('./categories'); Write.topics = require('./topics'); Write.posts = require('./posts'); +Write.admin = require('./admin'); diff --git a/src/routes/write/admin.js b/src/routes/write/admin.js new file mode 100644 index 000000000000..692257ba5bdf --- /dev/null +++ b/src/routes/write/admin.js @@ -0,0 +1,16 @@ +'use strict'; + +const router = require('express').Router(); +const middleware = require('../../middleware'); +const controllers = require('../../controllers'); +const routeHelpers = require('../helpers'); + +const setupApiRoute = routeHelpers.setupApiRoute; + +module.exports = function () { + const middlewares = [middleware.authenticate]; + + setupApiRoute(router, '/settings/:setting', middleware, [...middlewares, middleware.checkRequired.bind(null, ['value']), middleware.exposePrivilegeSet], 'put', controllers.write.admin.updateSetting); + + return router; +}; diff --git a/src/routes/write/index.js b/src/routes/write/index.js index c5dfead24151..58bcc2ef20ac 100644 --- a/src/routes/write/index.js +++ b/src/routes/write/index.js @@ -25,7 +25,7 @@ Write.reload = (params) => { router.use('/api/v3/categories', require('./categories')()); router.use('/api/v3/topics', require('./topics')()); router.use('/api/v3/posts', require('./posts')()); - // router.use('/api/v3/util', require('./util')()); + router.use('/api/v3/admin', require('./admin')()); router.get('/api/v3/ping', function (req, res) { helpers.formatApiResponse(200, res, {