From 127ce90bb344f9cb374b757b6f71c13f2d064406 Mon Sep 17 00:00:00 2001 From: xream Date: Thu, 14 Sep 2023 15:16:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=A8=A1=E5=9D=97=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/package.json | 2 +- backend/src/constants.js | 1 + backend/src/restful/index.js | 2 + backend/src/restful/module.js | 106 ++++++++++++++++++++++++++++++++++ 4 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 backend/src/restful/module.js diff --git a/backend/package.json b/backend/package.json index 81fbaa3..8ea7343 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.14.53", + "version": "2.14.54", "description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.", "main": "src/main.js", "scripts": { diff --git a/backend/src/constants.js b/backend/src/constants.js index 492305a..7481357 100644 --- a/backend/src/constants.js +++ b/backend/src/constants.js @@ -3,6 +3,7 @@ export const SETTINGS_KEY = 'settings'; export const SUBS_KEY = 'subs'; export const COLLECTIONS_KEY = 'collections'; export const FILES_KEY = 'files'; +export const MODULES_KEY = 'modules'; export const ARTIFACTS_KEY = 'artifacts'; export const RULES_KEY = 'rules'; export const GIST_BACKUP_KEY = 'Auto Generated Sub-Store Backup'; diff --git a/backend/src/restful/index.js b/backend/src/restful/index.js index 7d9de34..8c2f7b5 100644 --- a/backend/src/restful/index.js +++ b/backend/src/restful/index.js @@ -5,6 +5,7 @@ import registerSubscriptionRoutes from './subscriptions'; import registerCollectionRoutes from './collections'; import registerArtifactRoutes from './artifacts'; import registerFileRoutes from './file'; +import registerModuleRoutes from './module'; import registerSyncRoutes from './sync'; import registerDownloadRoutes from './download'; import registerSettingRoutes from './settings'; @@ -25,6 +26,7 @@ export default function serve() { registerSettingRoutes($app); registerArtifactRoutes($app); registerFileRoutes($app); + registerModuleRoutes($app); registerSyncRoutes($app); registerNodeInfoRoutes($app); registerMiscRoutes($app); diff --git a/backend/src/restful/module.js b/backend/src/restful/module.js new file mode 100644 index 0000000..54374a3 --- /dev/null +++ b/backend/src/restful/module.js @@ -0,0 +1,106 @@ +import { deleteByName, findByName, updateByName } from '@/utils/database'; +import { MODULES_KEY } from '@/constants'; +import { failed, success } from '@/restful/response'; +import $ from '@/core/app'; +import { RequestInvalidError, ResourceNotFoundError } from '@/restful/errors'; + +export default function register($app) { + if (!$.read(MODULES_KEY)) $.write([], MODULES_KEY); + + $app.route('/api/module/:name') + .get(getModule) + .patch(updateModule) + .delete(deleteModule); + + $app.route('/api/modules') + .get(getAllModules) + .post(createModule) + .put(replaceModule); +} + +// module API +function createModule(req, res) { + const module = req.body; + $.info(`正在创建模块:${module.name}`); + const allModules = $.read(MODULES_KEY); + if (findByName(allModules, module.name)) { + failed( + res, + new RequestInvalidError( + 'DUPLICATE_KEY', + `Module ${module.name} already exists.`, + ), + ); + } + allModules.push(module); + $.write(allModules, MODULES_KEY); + success(res, module, 201); +} + +function getModule(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + const allModules = $.read(MODULES_KEY); + const module = findByName(allModules, name); + if (module) { + success(res, module); + } else { + failed( + res, + new ResourceNotFoundError( + `MODULE_NOT_FOUND`, + `Module ${name} does not exist`, + 404, + ), + ); + } +} + +function updateModule(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + let module = req.body; + const allModules = $.read(MODULES_KEY); + const oldModule = findByName(allModules, name); + if (oldModule) { + const newModule = { + ...oldModule, + ...module, + }; + $.info(`正在更新模块:${name}...`); + + updateByName(allModules, name, newModule); + $.write(allModules, MODULES_KEY); + success(res, newModule); + } else { + failed( + res, + new ResourceNotFoundError( + 'RESOURCE_NOT_FOUND', + `Module ${name} does not exist!`, + ), + 404, + ); + } +} + +function deleteModule(req, res) { + let { name } = req.params; + name = decodeURIComponent(name); + $.info(`正在删除模块:${name}`); + let allModules = $.read(MODULES_KEY); + deleteByName(allModules, name); + $.write(allModules, MODULES_KEY); + success(res); +} + +function getAllModules(req, res) { + const allModules = $.read(MODULES_KEY); + success(res, allModules); +} + +function replaceModule(req, res) { + const allModules = req.body; + $.write(allModules, MODULES_KEY); + success(res); +}