From ad91e7006e41f8ee5b8dcefee30f99e8ca44133a Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Wed, 10 Jul 2019 16:59:53 +0200 Subject: WIP plugins: plugin settings on server side --- server/controllers/api/index.ts | 2 + server/controllers/api/plugins.ts | 121 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 server/controllers/api/plugins.ts (limited to 'server/controllers') diff --git a/server/controllers/api/index.ts b/server/controllers/api/index.ts index ea2615e28..0876283a2 100644 --- a/server/controllers/api/index.ts +++ b/server/controllers/api/index.ts @@ -14,6 +14,7 @@ import { searchRouter } from './search' import { overviewsRouter } from './overviews' import { videoPlaylistRouter } from './video-playlist' import { CONFIG } from '../../initializers/config' +import { pluginsRouter } from '../plugins' const apiRouter = express.Router() @@ -42,6 +43,7 @@ apiRouter.use('/videos', videosRouter) apiRouter.use('/jobs', jobsRouter) apiRouter.use('/search', searchRouter) apiRouter.use('/overviews', overviewsRouter) +apiRouter.use('/plugins', pluginsRouter) apiRouter.use('/ping', pong) apiRouter.use('/*', badRequest) diff --git a/server/controllers/api/plugins.ts b/server/controllers/api/plugins.ts new file mode 100644 index 000000000..89cc67f54 --- /dev/null +++ b/server/controllers/api/plugins.ts @@ -0,0 +1,121 @@ +import * as express from 'express' +import { getFormattedObjects } from '../../helpers/utils' +import { + asyncMiddleware, + authenticate, + ensureUserHasRight, + paginationValidator, + setDefaultPagination, + setDefaultSort +} from '../../middlewares' +import { pluginsSortValidator } from '../../middlewares/validators' +import { PluginModel } from '../../models/server/plugin' +import { UserRight } from '../../../shared/models/users' +import { + enabledPluginValidator, + installPluginValidator, + listPluginsValidator, + uninstallPluginValidator, + updatePluginSettingsValidator +} from '../../middlewares/validators/plugins' +import { PluginManager } from '../../lib/plugins/plugin-manager' +import { InstallPlugin } from '../../../shared/models/plugins/install-plugin.model' +import { ManagePlugin } from '../../../shared/models/plugins/manage-plugin.model' + +const pluginRouter = express.Router() + +pluginRouter.get('/', + authenticate, + ensureUserHasRight(UserRight.MANAGE_PLUGINS), + listPluginsValidator, + paginationValidator, + pluginsSortValidator, + setDefaultSort, + setDefaultPagination, + asyncMiddleware(listPlugins) +) + +pluginRouter.get('/:pluginName/settings', + authenticate, + ensureUserHasRight(UserRight.MANAGE_PLUGINS), + asyncMiddleware(enabledPluginValidator), + asyncMiddleware(listPluginSettings) +) + +pluginRouter.put('/:pluginName/settings', + authenticate, + ensureUserHasRight(UserRight.MANAGE_PLUGINS), + updatePluginSettingsValidator, + asyncMiddleware(enabledPluginValidator), + asyncMiddleware(updatePluginSettings) +) + +pluginRouter.post('/install', + authenticate, + ensureUserHasRight(UserRight.MANAGE_PLUGINS), + installPluginValidator, + asyncMiddleware(installPlugin) +) + +pluginRouter.post('/uninstall', + authenticate, + ensureUserHasRight(UserRight.MANAGE_PLUGINS), + uninstallPluginValidator, + asyncMiddleware(uninstallPlugin) +) + +// --------------------------------------------------------------------------- + +export { + pluginRouter +} + +// --------------------------------------------------------------------------- + +async function listPlugins (req: express.Request, res: express.Response) { + const type = req.query.type + + const resultList = await PluginModel.listForApi({ + type, + start: req.query.start, + count: req.query.count, + sort: req.query.sort + }) + + return res.json(getFormattedObjects(resultList.data, resultList.total)) +} + +async function installPlugin (req: express.Request, res: express.Response) { + const body: InstallPlugin = req.body + + await PluginManager.Instance.install(body.npmName) + + return res.sendStatus(204) +} + +async function uninstallPlugin (req: express.Request, res: express.Response) { + const body: ManagePlugin = req.body + + await PluginManager.Instance.uninstall(body.npmName) + + return res.sendStatus(204) +} + +async function listPluginSettings (req: express.Request, res: express.Response) { + const plugin = res.locals.plugin + + const settings = await PluginManager.Instance.getSettings(plugin.name) + + return res.json({ + settings + }) +} + +async function updatePluginSettings (req: express.Request, res: express.Response) { + const plugin = res.locals.plugin + + plugin.settings = req.body.settings + await plugin.save() + + return res.sendStatus(204) +} -- cgit v1.2.3