Просмотр исходного кода

fix: load full file list for syncing

close #2290
Gerald 1 месяц назад
Родитель
Сommit
e3030ea99e
4 измененных файлов с 53 добавлено и 16 удалено
  1. 1 0
      .eslintrc.js
  2. 25 4
      src/background/sync/dropbox.js
  3. 11 5
      src/background/sync/googledrive.js
  4. 16 7
      src/background/sync/onedrive.js

+ 1 - 0
.eslintrc.js

@@ -21,6 +21,7 @@ module.exports = {
   plugins: ['jest'],
   plugins: ['jest'],
   rules: {
   rules: {
     'prettier/prettier': 'off',
     'prettier/prettier': 'off',
+    'no-constant-condition': 'off',
     'no-shadow': 2,
     'no-shadow': 2,
     'no-unused-expressions': 2,
     'no-unused-expressions': 2,
     'no-use-before-define': ['error', {
     'no-use-before-define': ['error', {

+ 25 - 4
src/background/sync/dropbox.js

@@ -48,7 +48,8 @@ const Dropbox = BaseService.extend({
     if (res.status !== 409) throw res;
     if (res.status !== 409) throw res;
   },
   },
   async list() {
   async list() {
-    const data = await this.loadData({
+    let files = [];
+    let data = await this.loadData({
       method: 'POST',
       method: 'POST',
       url: 'https://api.dropboxapi.com/2/files/list_folder',
       url: 'https://api.dropboxapi.com/2/files/list_folder',
       body: {
       body: {
@@ -56,9 +57,29 @@ const Dropbox = BaseService.extend({
       },
       },
       responseType: 'json',
       responseType: 'json',
     });
     });
-    return data.entries
-      .filter((item) => item['.tag'] === 'file' && isScriptFile(item.name))
-      .map(normalize);
+    files = [
+      ...files,
+      ...data.entries
+        .filter((item) => item['.tag'] === 'file' && isScriptFile(item.name))
+        .map(normalize),
+    ];
+    while (data.has_more) {
+      data = await this.loadData({
+        method: 'POST',
+        url: 'https://api.dropboxapi.com/2/files/list_folder/continue',
+        body: {
+          cursor: data.cursor,
+        },
+        responseType: 'json',
+      });
+      files = [
+        ...files,
+        ...data.entries
+          .filter((item) => item['.tag'] === 'file' && isScriptFile(item.name))
+          .map(normalize),
+      ];
+    }
+    return files;
   },
   },
   get(item) {
   get(item) {
     const name = getItemFilename(item);
     const name = getItemFilename(item);

+ 11 - 5
src/background/sync/googledrive.js

@@ -62,12 +62,18 @@ const GoogleDrive = BaseService.extend({
   async getSyncData() {
   async getSyncData() {
     const params = {
     const params = {
       spaces: 'appDataFolder',
       spaces: 'appDataFolder',
-      fields: 'files(id,name,size)',
+      fields: 'files(id,name,size),nextPageToken',
     };
     };
-    const { files } = await this.loadData({
-      url: `/files?${dumpQuery(params)}`,
-      responseType: 'json',
-    });
+    let files = [];
+    while (true) {
+      const result = await this.loadData({
+        url: `/files?${dumpQuery(params)}`,
+        responseType: 'json',
+      });
+      files = [...files, ...result.files];
+      params.pageToken = result.nextPageToken;
+      if (!params.pageToken) break;
+    }
     let metaFile;
     let metaFile;
     const remoteData = files
     const remoteData = files
       .filter((item) => {
       .filter((item) => {

+ 16 - 7
src/background/sync/onedrive.js

@@ -50,13 +50,22 @@ const OneDrive = BaseService.extend({
     }
     }
   },
   },
   async list() {
   async list() {
-    const data = await this.loadData({
-      url: '/drive/special/approot/children',
-      responseType: 'json',
-    });
-    return data.value
-      .filter((item) => item.file && isScriptFile(item.name))
-      .map(normalize);
+    let files = [];
+    let url = '/drive/special/approot/children';
+    while (url) {
+      const data = await this.loadData({
+        url,
+        responseType: 'json',
+      });
+      url = data['@odata.nextLink'] || '';
+      files = [
+        ...files,
+        ...data.value
+          .filter((item) => item.file && isScriptFile(item.name))
+          .map(normalize),
+      ];
+    }
+    return files;
   },
   },
   get(item) {
   get(item) {
     const name = getItemFilename(item);
     const name = getItemFilename(item);