From 1352ea0a9a749c8aee8bd7c74439b9a893e1ab31 Mon Sep 17 00:00:00 2001 From: "xiaoqi.cxq" Date: Sun, 31 Jul 2022 02:23:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81Github=E5=9B=BE=E5=BA=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Modal.vue | 2 + src/components/modals/ImageModal.vue | 104 +++++++++++++----- .../providers/GithubImgStorageModal.vue | 77 +++++++++++++ src/services/providers/helpers/giteaHelper.js | 4 +- .../providers/helpers/githubHelper.js | 43 +++++++- 5 files changed, 198 insertions(+), 32 deletions(-) create mode 100644 src/components/modals/providers/GithubImgStorageModal.vue diff --git a/src/components/Modal.vue b/src/components/Modal.vue index 00d9a242..d5df5403 100644 --- a/src/components/Modal.vue +++ b/src/components/Modal.vue @@ -54,6 +54,7 @@ import GithubOpenModal from './modals/providers/GithubOpenModal'; import GithubSaveModal from './modals/providers/GithubSaveModal'; import GithubWorkspaceModal from './modals/providers/GithubWorkspaceModal'; import GithubPublishModal from './modals/providers/GithubPublishModal'; +import GithubImgStorageModal from './modals/providers/GithubImgStorageModal'; import GistSyncModal from './modals/providers/GistSyncModal'; import GistPublishModal from './modals/providers/GistPublishModal'; import GiteeAccountModal from './modals/providers/GiteeAccountModal'; @@ -118,6 +119,7 @@ export default { GithubSaveModal, GithubWorkspaceModal, GithubPublishModal, + GithubImgStorageModal, GistSyncModal, GistPublishModal, GiteeAccountModal, diff --git a/src/components/modals/ImageModal.vue b/src/components/modals/ImageModal.vue index 0c3bfb5b..423066f0 100644 --- a/src/components/modals/ImageModal.vue +++ b/src/components/modals/ImageModal.vue @@ -30,19 +30,25 @@ 自定义Form参数:{{token.params}} - + - -
Gitea图床 -
{{tokenStorage.uname}}, 仓库URL: {{tokenStorage.repoUrl}}, 路径: {{tokenStorage.path}}, 分支: {{tokenStorage.branch}}
+ + +
添加SM.MS图床账号 @@ -55,10 +61,10 @@ 添加Gitea图床仓库 -
- @@ -70,6 +76,7 @@ import MenuItem from '../menus/common/MenuItem'; import smmsHelper from '../../services/providers/helpers/smmsHelper'; import store from '../../store'; import giteaHelper from '../../services/providers/helpers/giteaHelper'; +import githubHelper from '../../services/providers/helpers/githubHelper'; import customHelper from '../../services/providers/helpers/customHelper'; import utils from '../../services/utils'; @@ -103,21 +110,34 @@ export default modalTemplate({ })), ]; }, - giteaTokensImgStorages() { - const giteaTokensBySub = store.getters['data/giteaTokensBySub']; + tokensImgStorages() { + const providerTokens = [ + ...Object.values(store.getters['data/giteaTokensBySub']).map(token => ({ + token, + providerId: 'gitea', + providerName: 'Gitea图床', + })), + ...Object.values(store.getters['data/githubTokensBySub']).map(token => ({ + token, + providerId: 'github', + providerName: 'GitHub图床', + })), + ]; const imgStorages = []; - Object.values(giteaTokensBySub) - .sort((token1, token2) => token1.name.localeCompare(token2.name)) + Object.values(providerTokens) + .sort((item1, item2) => item1.token.name.localeCompare(item2.token.name)) .forEach((it) => { - if (!it.imgStorages || it.imgStorages.length === 0) { + if (!it.token.imgStorages || it.token.imgStorages.length === 0) { return; } // 拼接上当前用户名 - it.imgStorages.forEach(storage => imgStorages.push({ + it.token.imgStorages.forEach(storage => imgStorages.push({ ...storage, - token: it, - uname: it.name, - repoUrl: `${it.serverUrl}/${storage.repoUri}`, + token: it.token, + uname: it.token.name, + providerId: it.providerId, + providerName: it.providerName, + repoUrl: it.providerId === 'gitea' ? `${it.serverUrl}/${storage.repoUri}` : `${storage.owner}/${storage.repo}`, })); }); return imgStorages; @@ -153,8 +173,8 @@ export default modalTemplate({ } catch (err) { store.dispatch('notification/error', err); } - } else if (currStorage.provider === 'gitea') { - const filterTokenStorages = this.giteaTokensImgStorages + } else if (currStorage.provider === 'gitea' || currStorage.provider === 'github') { + const filterTokenStorages = this.tokensImgStorages .filter(it => it.sid === currStorage.sub); if (!filterTokenStorages.length) { store.dispatch('notification/info', 'Gitea图床已失效,未自动上传图片!请选择图床后重新粘贴/拖拽图片!'); @@ -169,15 +189,28 @@ export default modalTemplate({ .replace('{MM}', `0${month}`.slice(-2)).replace('{DD}', `0${date}`.slice(-2)); path = `${path}${path.endsWith('/') ? '' : '/'}${utils.uid()}.${imgFile.type.split('/')[1]}`; try { - const result = await giteaHelper.uploadFile({ - token: tokenStorage.token, - projectId: tokenStorage.repoUri, - branch: tokenStorage.branch, - path, - content: imgFile, - isFile: true, - }); - this.url = result.content.download_url; + if (currStorage.provider === 'gitea') { + const result = await giteaHelper.uploadFile({ + token: tokenStorage.token, + projectId: tokenStorage.repoUri, + branch: tokenStorage.branch, + path, + content: imgFile, + isFile: true, + }); + this.url = result.content.download_url; + } else if (currStorage.provider === 'github') { + const result = await githubHelper.uploadFile({ + token: tokenStorage.token, + owner: tokenStorage.owner, + repo: tokenStorage.repo, + branch: tokenStorage.branch, + path, + content: imgFile, + isFile: true, + }); + this.url = result.content.download_url; + } } catch (err) { store.dispatch('notification/error', err); } @@ -218,6 +251,8 @@ export default modalTemplate({ }); } else if (proivderId === 'gitea') { giteaHelper.removeTokenImgStorage(item.token, item.sid); + } else if (proivderId === 'github') { + githubHelper.removeTokenImgStorage(item.token, item.sid); } } catch (e) { // Cancel @@ -242,9 +277,20 @@ export default modalTemplate({ giteaHelper.updateToken(token, imgStorageInfo); } catch (e) { /* Cancel */ } }, + async addGithubImgStorage() { + try { + await store.dispatch('modal/open', { type: 'githubAccount' }); + const token = await githubHelper.addAccount(store.getters['data/localSettings'].githubRepoFullAccess); + const imgStorageInfo = await store.dispatch('modal/open', { + type: 'githubImgStorage', + token, + }); + githubHelper.updateToken(token, imgStorageInfo); + } catch (e) { /* Cancel */ } + }, async checkedImgDest(sub, provider) { let type = 'token'; - if (provider === 'gitea') { + if (provider === 'gitea' || provider === 'github') { type = 'tokenRepo'; } store.dispatch('img/changeCheckedStorage', { diff --git a/src/components/modals/providers/GithubImgStorageModal.vue b/src/components/modals/providers/GithubImgStorageModal.vue new file mode 100644 index 00000000..6ad57b06 --- /dev/null +++ b/src/components/modals/providers/GithubImgStorageModal.vue @@ -0,0 +1,77 @@ + + + diff --git a/src/services/providers/helpers/giteaHelper.js b/src/services/providers/helpers/giteaHelper.js index 4e74f1b2..7fd8f6aa 100644 --- a/src/services/providers/helpers/giteaHelper.js +++ b/src/services/providers/helpers/giteaHelper.js @@ -58,7 +58,6 @@ export default { sub = null, silent = false, refreshToken, ) { let tokenBody; - const imgStorages = refreshToken && refreshToken.imgStorages; if (!silent) { // Get an OAuth2 code const { code } = await networkSvc.startOauth2( @@ -115,13 +114,14 @@ export default { throw new Error('Gitea account ID not expected.'); } + const oldToken = store.getters['data/giteaTokensBySub'][uniqueSub]; // Build token object including scopes and sub const token = { accessToken, name: user.username, applicationId, applicationSecret, - imgStorages, + imgStorages: oldToken && oldToken.imgStorages, refreshToken: tokenBody.refresh_token, expiresOn: Date.now() + (tokenBody.expires_in * 1000), serverUrl, diff --git a/src/services/providers/helpers/githubHelper.js b/src/services/providers/helpers/githubHelper.js index 41143597..542fed0b 100644 --- a/src/services/providers/helpers/githubHelper.js +++ b/src/services/providers/helpers/githubHelper.js @@ -104,12 +104,14 @@ export default { throw new Error('GitHub account ID not expected.'); } + const oldToken = store.getters['data/githubTokensBySub'][user.id]; // Build token object including scopes and sub const token = { scopes, accessToken, name: user.login, sub: `${user.id}`, + imgStorages: oldToken && oldToken.imgStorages, repoFullAccess: scopes.includes('repo'), }; @@ -173,13 +175,14 @@ export default { path, content, sha, + isFile, }) { return repoRequest(token, owner, repo, { method: 'PUT', url: `contents/${encodeURIComponent(path)}`, body: { message: getCommitMessage(sha ? 'updateFileMessage' : 'createFileMessage', path), - content: utils.encodeBase64(content), + content: isFile ? await utils.encodeFiletoBase64(content) : utils.encodeBase64(content), sha, branch, }, @@ -227,6 +230,44 @@ export default { data: utils.decodeBase64(content), }; }, + /** + * 获取仓库信息 + */ + async getRepoInfo(token, owner, repo) { + return request(token, { + url: `https://api.github.com/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}`, + }).then(res => res.body); + }, + async updateToken(token, imgStorageInfo) { + const imgStorages = token.imgStorages || []; + // 存储仓库唯一标识 + const sid = utils.hash(`${imgStorageInfo.owner}${imgStorageInfo.repo}${imgStorageInfo.path}${imgStorageInfo.branch}`); + // 查询是否存在 存在则更新 + const filterStorages = imgStorages.filter(it => it.sid === sid); + if (filterStorages && filterStorages.length > 0) { + filterStorages.owner = imgStorageInfo.owner; + filterStorages.repo = imgStorageInfo.repo; + filterStorages.path = imgStorageInfo.path; + filterStorages.branch = imgStorageInfo.branch; + } else { + imgStorages.push({ + sid, + owner: imgStorageInfo.owner, + repo: imgStorageInfo.repo, + path: imgStorageInfo.path, + branch: imgStorageInfo.branch, + }); + token.imgStorages = imgStorages; + } + store.dispatch('data/addGithubToken', token); + }, + async removeTokenImgStorage(token, sid) { + if (!token.imgStorages || token.imgStorages.length === 0) { + return; + } + token.imgStorages = token.imgStorages.filter(it => it.sid !== sid); + store.dispatch('data/addGithubToken', token); + }, /** * https://developer.github.com/v3/gists/#create-a-gist