From 16c79ac0fca8e1d7d3329eb5776b11c80d926c42 Mon Sep 17 00:00:00 2001 From: xream Date: Wed, 17 Jan 2024 01:10:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E4=BB=8E=20gist=20?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E4=B8=8D=E5=9C=A8=E5=90=8C=E6=AD=A5=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E4=B8=AD=E7=9A=84=20gist=20=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/package.json | 2 +- backend/src/restful/artifacts.js | 60 ++++++++++++++++++++++++++++++-- backend/src/restful/settings.js | 4 +-- backend/src/restful/sync.js | 6 ++-- 4 files changed, 64 insertions(+), 8 deletions(-) diff --git a/backend/package.json b/backend/package.json index 56f20bf..df915df 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "sub-store", - "version": "2.14.170", + "version": "2.14.171", "description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.", "main": "src/main.js", "scripts": { diff --git a/backend/src/restful/artifacts.js b/backend/src/restful/artifacts.js index f6f11a3..76afa20 100644 --- a/backend/src/restful/artifacts.js +++ b/backend/src/restful/artifacts.js @@ -19,6 +19,8 @@ export default function register($app) { if (!$.read(ARTIFACTS_KEY)) $.write({}, ARTIFACTS_KEY); // RESTful APIs + $app.get('/api/artifacts/restore', restoreArtifacts); + $app.route('/api/artifacts') .get(getAllArtifacts) .post(createArtifact) @@ -30,6 +32,60 @@ export default function register($app) { .delete(deleteArtifact); } +async function restoreArtifacts(_, res) { + $.info('开始恢复远程配置...'); + try { + const { gistToken } = $.read(SETTINGS_KEY); + if (!gistToken) { + return Promise.reject('未设置 GitHub Token!'); + } + const manager = new Gist({ + token: gistToken, + key: ARTIFACT_REPOSITORY_KEY, + }); + + try { + const gist = await manager.locate(); + if (!gist?.files) { + throw new Error(`找不到 Sub-Store Gist 文件列表`); + } + const allArtifacts = $.read(ARTIFACTS_KEY); + Object.keys(gist.files).map((key) => { + const filename = gist.files[key]?.filename; + if (filename) { + const artifact = findByName(allArtifacts, filename); + if (artifact) { + updateByName(allArtifacts, filename, { + ...artifact, + url: gist.files[key]?.raw_url, + }); + } else { + allArtifacts.push({ + name: `${filename}`, + url: gist.files[key]?.raw_url, + }); + } + } + }); + $.write(allArtifacts, ARTIFACTS_KEY); + } catch (err) { + $.error(`查找 Sub-Store Gist 时发生错误: ${err.message ?? err}`); + throw err; + } + success(res); + } catch (e) { + $.error(`恢复远程配置失败,原因:${e.message ?? e}`); + failed( + res, + new InternalServerError( + `FAILED_TO_RESTORE_ARTIFACTS`, + `Failed to restore artifacts`, + `Reason: ${e.message ?? e}`, + ), + ); + } +} + function getAllArtifacts(req, res) { const allArtifacts = $.read(ARTIFACTS_KEY); success(res, allArtifacts); @@ -137,7 +193,7 @@ async function deleteArtifact(req, res) { if (artifact.updated) { // delete gist const files = {}; - files[encodeURIComponent(artifact.name)] = { + files[artifact.name] = { content: '', }; // 当别的Sub 删了同步订阅 或 gist里面删了 当前设备没有删除 时 无法删除的bug @@ -171,7 +227,7 @@ function validateArtifactName(name) { async function syncToGist(files) { const { gistToken } = $.read(SETTINGS_KEY); if (!gistToken) { - return Promise.reject('未设置Gist Token!'); + return Promise.reject('未设置 GitHub Token!'); } const manager = new Gist({ token: gistToken, diff --git a/backend/src/restful/settings.js b/backend/src/restful/settings.js index 83c7874..5ba91d5 100644 --- a/backend/src/restful/settings.js +++ b/backend/src/restful/settings.js @@ -64,8 +64,8 @@ export async function updateGitHubAvatar() { export async function updateArtifactStore() { $.log('Updating artifact store'); const settings = $.read(SETTINGS_KEY); - const { githubUser, gistToken } = settings; - if (githubUser && gistToken) { + const { gistToken } = settings; + if (gistToken) { const manager = new Gist({ token: gistToken, key: ARTIFACT_REPOSITORY_KEY, diff --git a/backend/src/restful/sync.js b/backend/src/restful/sync.js index baa8508..78437a8 100644 --- a/backend/src/restful/sync.js +++ b/backend/src/restful/sync.js @@ -490,16 +490,16 @@ async function syncAllArtifacts(_, res) { try { await syncArtifacts(); success(res); - } catch (err) { + } catch (e) { + $.error(`同步订阅失败,原因:${e.message ?? e}`); failed( res, new InternalServerError( `FAILED_TO_SYNC_ARTIFACTS`, `Failed to sync all artifacts`, - `Reason: ${err}`, + `Reason: ${e.message ?? e}`, ), ); - $.info(`同步订阅失败,原因:${err}`); } }