265 lines
6.5 KiB
JavaScript
265 lines
6.5 KiB
JavaScript
import store from '../../store';
|
|
import giteeHelper from './helpers/giteeHelper';
|
|
import Provider from './common/Provider';
|
|
import gitWorkspaceSvc from '../gitWorkspaceSvc';
|
|
import userSvc from '../userSvc';
|
|
|
|
const appDataRepo = 'stackedit-app-data';
|
|
const appDataBranch = 'master';
|
|
|
|
export default new Provider({
|
|
id: 'giteeAppData',
|
|
name: 'Gitee应用数据',
|
|
getToken() {
|
|
return store.getters['workspace/syncToken'];
|
|
},
|
|
getWorkspaceParams() {
|
|
// No param as it's the main workspace
|
|
return {};
|
|
},
|
|
getWorkspaceLocationUrl() {
|
|
// No direct link to app data
|
|
return null;
|
|
},
|
|
getSyncDataUrl() {
|
|
// No direct link to app data
|
|
return null;
|
|
},
|
|
getSyncDataDescription({ id }) {
|
|
return id;
|
|
},
|
|
async initWorkspace() {
|
|
// Nothing much to do since the main workspace isn't necessarily synchronized
|
|
// Return the main workspace
|
|
return store.getters['workspace/workspacesById'].main;
|
|
},
|
|
getChanges() {
|
|
const token = this.getToken();
|
|
return giteeHelper.getTree({
|
|
owner: token.name,
|
|
repo: appDataRepo,
|
|
branch: appDataBranch,
|
|
token,
|
|
});
|
|
},
|
|
prepareChanges(tree) {
|
|
return gitWorkspaceSvc.makeChanges(tree);
|
|
},
|
|
async saveWorkspaceItem({ item }) {
|
|
const syncData = {
|
|
id: store.getters.gitPathsByItemId[item.id],
|
|
type: item.type,
|
|
hash: item.hash,
|
|
};
|
|
|
|
// Files and folders are not in git, only contents
|
|
if (item.type === 'file' || item.type === 'folder') {
|
|
return { syncData };
|
|
}
|
|
|
|
// locations are stored as paths, so we upload an empty file
|
|
const syncToken = store.getters['workspace/syncToken'];
|
|
await giteeHelper.uploadFile({
|
|
owner: syncToken.name,
|
|
repo: appDataRepo,
|
|
branch: appDataBranch,
|
|
token: syncToken,
|
|
path: syncData.id,
|
|
content: '',
|
|
sha: gitWorkspaceSvc.shaByPath[syncData.id],
|
|
commitMessage: item.commitMessage,
|
|
});
|
|
|
|
// Return sync data to save
|
|
return { syncData };
|
|
},
|
|
async removeWorkspaceItem({ syncData }) {
|
|
if (gitWorkspaceSvc.shaByPath[syncData.id]) {
|
|
const syncToken = store.getters['workspace/syncToken'];
|
|
await giteeHelper.removeFile({
|
|
owner: syncToken.name,
|
|
repo: appDataRepo,
|
|
branch: appDataBranch,
|
|
token: syncToken,
|
|
path: syncData.id,
|
|
sha: gitWorkspaceSvc.shaByPath[syncData.id],
|
|
});
|
|
}
|
|
},
|
|
async downloadWorkspaceContent({
|
|
token,
|
|
contentId,
|
|
contentSyncData,
|
|
fileSyncData,
|
|
}) {
|
|
const { sha, data } = await giteeHelper.downloadFile({
|
|
owner: token.name,
|
|
repo: appDataRepo,
|
|
branch: appDataBranch,
|
|
token,
|
|
path: fileSyncData.id,
|
|
});
|
|
gitWorkspaceSvc.shaByPath[fileSyncData.id] = sha;
|
|
const content = Provider.parseContent(data, contentId);
|
|
return {
|
|
content,
|
|
contentSyncData: {
|
|
...contentSyncData,
|
|
hash: content.hash,
|
|
sha,
|
|
},
|
|
};
|
|
},
|
|
async downloadWorkspaceData({ token, syncData }) {
|
|
if (!syncData) {
|
|
return {};
|
|
}
|
|
const path = `.stackedit-data/${syncData.id}.json`;
|
|
// const path = store.getters.gitPathsByItemId[syncData.id];
|
|
// const path = syncData.id;
|
|
const { sha, data } = await giteeHelper.downloadFile({
|
|
owner: token.name,
|
|
repo: appDataRepo,
|
|
branch: appDataBranch,
|
|
token,
|
|
path,
|
|
});
|
|
if (!sha) {
|
|
return {};
|
|
}
|
|
gitWorkspaceSvc.shaByPath[path] = sha;
|
|
const item = JSON.parse(data);
|
|
return {
|
|
item,
|
|
syncData: {
|
|
...syncData,
|
|
hash: item.hash,
|
|
sha,
|
|
type: 'data',
|
|
},
|
|
};
|
|
},
|
|
async uploadWorkspaceContent({
|
|
token,
|
|
content,
|
|
file,
|
|
commitMessage,
|
|
}) {
|
|
const path = store.getters.gitPathsByItemId[file.id];
|
|
const res = await giteeHelper.uploadFile({
|
|
owner: token.name,
|
|
repo: appDataRepo,
|
|
branch: appDataBranch,
|
|
token,
|
|
path,
|
|
content: Provider.serializeContent(content),
|
|
sha: gitWorkspaceSvc.shaByPath[path],
|
|
commitMessage,
|
|
});
|
|
|
|
// Return new sync data
|
|
return {
|
|
contentSyncData: {
|
|
id: store.getters.gitPathsByItemId[content.id],
|
|
type: content.type,
|
|
hash: content.hash,
|
|
sha: res.content.sha,
|
|
},
|
|
fileSyncData: {
|
|
id: path,
|
|
type: 'file',
|
|
hash: file.hash,
|
|
},
|
|
};
|
|
},
|
|
async uploadWorkspaceData({
|
|
token,
|
|
item,
|
|
syncData,
|
|
}) {
|
|
const path = `.stackedit-data/${item.id}.json`;
|
|
// const path = store.getters.gitPathsByItemId[item.id];
|
|
// const path = syncData.id;
|
|
const res = await giteeHelper.uploadFile({
|
|
token,
|
|
owner: token.name,
|
|
repo: appDataRepo,
|
|
branch: appDataBranch,
|
|
path,
|
|
content: JSON.stringify(item),
|
|
sha: gitWorkspaceSvc.shaByPath[path],
|
|
});
|
|
|
|
return {
|
|
syncData: {
|
|
...syncData,
|
|
type: item.type,
|
|
hash: item.hash,
|
|
data: item.data,
|
|
sha: res.content.sha,
|
|
},
|
|
};
|
|
},
|
|
async listFileRevisions({ token, fileSyncDataId }) {
|
|
const { owner, repo, branch } = {
|
|
owner: token.name,
|
|
repo: appDataRepo,
|
|
branch: appDataBranch,
|
|
};
|
|
const entries = await giteeHelper.getCommits({
|
|
token,
|
|
owner,
|
|
repo,
|
|
sha: branch,
|
|
path: fileSyncDataId,
|
|
});
|
|
|
|
return entries.map(({
|
|
author,
|
|
committer,
|
|
commit,
|
|
sha,
|
|
}) => {
|
|
let user;
|
|
if (author && author.login) {
|
|
user = author;
|
|
} else if (committer && committer.login) {
|
|
user = committer;
|
|
}
|
|
const sub = `${giteeHelper.subPrefix}:${user.login}`;
|
|
if (user.avatar_url && user.avatar_url.endsWith('.png') && !user.avatar_url.endsWith('no_portrait.png')) {
|
|
user.avatar_url = `${user.avatar_url}!avatar60`;
|
|
}
|
|
userSvc.addUserInfo({ id: sub, name: user.login, imageUrl: user.avatar_url });
|
|
const date = (commit.author && commit.author.date)
|
|
|| (commit.committer && commit.committer.date)
|
|
|| 1;
|
|
return {
|
|
id: sha,
|
|
sub,
|
|
message: commit.message,
|
|
created: new Date(date).getTime(),
|
|
};
|
|
});
|
|
},
|
|
async loadFileRevision() {
|
|
// Revisions are already loaded
|
|
return false;
|
|
},
|
|
async getFileRevisionContent({
|
|
token,
|
|
contentId,
|
|
fileSyncDataId,
|
|
revisionId,
|
|
}) {
|
|
const { data } = await giteeHelper.downloadFile({
|
|
owner: token.name,
|
|
repo: appDataRepo,
|
|
branch: revisionId,
|
|
token,
|
|
path: fileSyncDataId,
|
|
});
|
|
return Provider.parseContent(data, contentId);
|
|
},
|
|
});
|