import store from '../../store'; import googleHelper from './helpers/googleHelper'; import Provider from './common/Provider'; import utils from '../utils'; let syncStartPageToken; export default new Provider({ id: 'googleDriveAppData', 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; }, async getChanges() { const syncToken = store.getters['workspace/syncToken']; const startPageToken = store.getters['data/localSettings'].syncStartPageToken; const result = await googleHelper.getChanges(syncToken, startPageToken, true); const changes = result.changes.filter((change) => { if (change.file) { // Parse item from file name try { change.item = JSON.parse(change.file.name); } catch (e) { return false; } // Build sync data change.syncData = { id: change.fileId, itemId: change.item.id, type: change.item.type, hash: change.item.hash, }; } change.syncDataId = change.fileId; return true; }); syncStartPageToken = result.startPageToken; return changes; }, onChangesApplied() { store.dispatch('data/patchLocalSettings', { syncStartPageToken, }); }, async saveWorkspaceItem({ item, syncData, ifNotTooLate }) { const syncToken = store.getters['workspace/syncToken']; const file = await googleHelper.uploadAppDataFile({ token: syncToken, name: JSON.stringify(item), fileId: syncData && syncData.id, ifNotTooLate, }); // Build sync data return { id: file.id, itemId: item.id, type: item.type, hash: item.hash, }; }, removeWorkspaceItem({ syncData, ifNotTooLate }) { const syncToken = store.getters['workspace/syncToken']; return googleHelper.removeAppDataFile(syncToken, syncData.id, ifNotTooLate); }, async downloadWorkspaceContent({ token, contentSyncData }) { const data = await googleHelper.downloadAppDataFile(token, contentSyncData.id); const content = utils.addItemHash(JSON.parse(data)); return { content, contentSyncData: { ...contentSyncData, hash: content.hash, }, }; }, async downloadWorkspaceData({ token, syncData }) { if (!syncData) { return {}; } const data = await googleHelper.downloadAppDataFile(token, syncData.id); const item = utils.addItemHash(JSON.parse(data)); return { item, syncData: { ...syncData, hash: item.hash, }, }; }, async uploadWorkspaceContent({ token, content, contentSyncData, ifNotTooLate, }) { const gdriveFile = await googleHelper.uploadAppDataFile({ token, name: JSON.stringify({ id: content.id, type: content.type, hash: content.hash, }), media: JSON.stringify(content), fileId: contentSyncData && contentSyncData.id, ifNotTooLate, }); // Return new sync data return { contentSyncData: { id: gdriveFile.id, itemId: content.id, type: content.type, hash: content.hash, }, }; }, async uploadWorkspaceData({ token, item, syncData, ifNotTooLate, }) { const file = await googleHelper.uploadAppDataFile({ token, name: JSON.stringify({ id: item.id, type: item.type, hash: item.hash, }), media: JSON.stringify(item), fileId: syncData && syncData.id, ifNotTooLate, }); // Return new sync data return { syncData: { id: file.id, itemId: item.id, type: item.type, hash: item.hash, }, }; }, async listRevisions(token, fileId) { const syncData = Provider.getContentSyncData(fileId); const revisions = await googleHelper.getAppDataFileRevisions(token, syncData.id); return revisions.map(revision => ({ id: revision.id, sub: `go:${revision.lastModifyingUser.permissionId}`, created: new Date(revision.modifiedTime).getTime(), })) .sort((revision1, revision2) => revision2.created - revision1.created); }, async getRevisionContent(token, fileId, revisionId) { const syncData = Provider.getContentSyncData(fileId); const content = await googleHelper.downloadAppDataFileRevision(token, syncData.id, revisionId); return JSON.parse(content); }, });