Selaa lähdekoodia

Set gsuite file extensions (#2194)

* companion: add file extensions to gsuite file names + send back target mimetypes

* companion: don't iterate "undefined"
Ifedapo .A. Olarewaju 5 vuotta sitten
vanhempi
commit
9979d38bfa

+ 44 - 2
packages/@uppy/companion/src/server/provider/drive/adapter.js

@@ -2,7 +2,7 @@ const querystring = require('querystring')
 
 exports.getUsername = (data) => {
   for (const item of data.files) {
-    if (item.ownedByMe) {
+    if (item.ownedByMe && item.permissions) {
       for (const permission of item.permissions) {
         if (permission.role === 'owner') {
           return permission.emailAddress
@@ -38,14 +38,40 @@ exports.getItemIcon = (item) => {
 }
 
 exports.getItemSubList = (item) => {
-  return item.files
+  const allowedGSuiteTypes = [
+    'application/vnd.google-apps.document',
+    'application/vnd.google-apps.drawing',
+    'application/vnd.google-apps.script',
+    'application/vnd.google-apps.spreadsheet',
+    'application/vnd.google-apps.presentation'
+  ]
+
+  return item.files.filter((i) => {
+    return exports.isFolder(i) || !exports.isGsuiteFile(i.mimeType) || allowedGSuiteTypes.includes(i.mimeType)
+  })
 }
 
 exports.getItemName = (item) => {
+  const extensionMaps = {
+    'application/vnd.google-apps.document': '.docx',
+    'application/vnd.google-apps.drawing': '.png',
+    'application/vnd.google-apps.script': '.json',
+    'application/vnd.google-apps.spreadsheet': '.xlsx',
+    'application/vnd.google-apps.presentation': '.ppt'
+  }
+
+  const extension = extensionMaps[item.mimeType]
+  if (extension && item.name && !item.name.endsWith(extension)) {
+    return item.name + extension
+  }
+
   return item.name ? item.name : '/'
 }
 
 exports.getMimeType = (item) => {
+  if (exports.isGsuiteFile(item.mimeType)) {
+    return exports.getGsuiteExportType(item.mimeType)
+  }
   return item.mimeType
 }
 
@@ -78,3 +104,19 @@ exports.getNextPagePath = (data, currentQuery, currentPath) => {
   })
   return `${currentPath}?${querystring.stringify(query)}`
 }
+
+exports.isGsuiteFile = (mimeType) => {
+  return mimeType.startsWith('application/vnd.google')
+}
+
+exports.getGsuiteExportType = (mimeType) => {
+  const typeMaps = {
+    'application/vnd.google-apps.document': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+    'application/vnd.google-apps.drawing': 'image/png',
+    'application/vnd.google-apps.script': 'application/vnd.google-apps.script+json',
+    'application/vnd.google-apps.spreadsheet': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+    'application/vnd.google-apps.presentation': 'application/vnd.openxmlformats-officedocument.presentationml.presentation'
+  }
+
+  return typeMaps[mimeType] || 'application/pdf'
+}

+ 4 - 20
packages/@uppy/companion/src/server/provider/drive/index.js

@@ -122,22 +122,6 @@ class Drive extends Provider {
       .request(onDone)
   }
 
-  _getGsuiteExportType (mimeType) {
-    const typeMaps = {
-      'application/vnd.google-apps.document': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
-      'application/vnd.google-apps.drawing': 'image/png',
-      'application/vnd.google-apps.script': 'application/vnd.google-apps.script+json',
-      'application/vnd.google-apps.spreadsheet': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
-      'application/vnd.google-apps.presentation': 'application/vnd.openxmlformats-officedocument.presentationml.presentation'
-    }
-
-    return typeMaps[mimeType] || 'application/pdf'
-  }
-
-  _isGsuiteFile (mimeType) {
-    return mimeType.startsWith('application/vnd.google')
-  }
-
   download ({ id, token }, onData) {
     this.stats({ id, token }, (err, resp, body) => {
       if (err) {
@@ -147,8 +131,8 @@ class Drive extends Provider {
       }
 
       let requestStream
-      if (this._isGsuiteFile(body.mimeType)) {
-        requestStream = this._exportGsuiteFile(id, token, this._getGsuiteExportType(body.mimeType))
+      if (adapter.isGsuiteFile(body.mimeType)) {
+        requestStream = this._exportGsuiteFile(id, token, adapter.getGsuiteExportType(body.mimeType))
       } else {
         requestStream = this.client
           .query()
@@ -183,7 +167,7 @@ class Drive extends Provider {
         return done(err)
       }
 
-      if (this._isGsuiteFile(body.mimeType)) {
+      if (adapter.isGsuiteFile(body.mimeType)) {
         // Google Docs file sizes can be determined
         // while Google sheets file sizes can't be determined
         const googleDocMimeType = 'application/vnd.google-apps.document'
@@ -193,7 +177,7 @@ class Drive extends Provider {
           return
         }
 
-        this._getGsuiteFileMeta(id, token, this._getGsuiteExportType(body.mimeType), (err, resp) => {
+        this._getGsuiteFileMeta(id, token, adapter.getGsuiteExportType(body.mimeType), (err, resp) => {
           if (err || resp.statusCode !== 200) {
             err = this._error(err, resp)
             logger.error(err, 'provider.drive.docs.size.error')