瀏覽代碼

refactor: [WIP] move provider data adapter code to companion

Ifedapo Olarewaju 6 年之前
父節點
當前提交
1afdd31976

+ 60 - 0
packages/@uppy/companion/src/server/provider/drive/adapter.js

@@ -0,0 +1,60 @@
+exports.getUsername = (data) => {
+  for (const item of data.files) {
+    if (item.ownedByMe) {
+      for (const permission of item.permissions) {
+        if (permission.role === 'owner') {
+          return permission.emailAddress
+        }
+      }
+    }
+  }
+}
+
+exports.isFolder = (item) => {
+  return item.mimeType === 'application/vnd.google-apps.folder'
+}
+
+exports.getItemData = (item) => {
+  return Object.assign({}, item, { size: parseFloat(item.size) })
+}
+
+exports.getItemIcon = (item) => {
+  return item.iconLink
+}
+
+exports.getItemSubList = (item) => {
+  return item.files.filter((i) => {
+    return this.isFolder(i) || !i.mimeType.startsWith('application/vnd.google')
+  })
+}
+
+exports.getItemName = (item) => {
+  return item.name ? item.name : '/'
+}
+
+exports.getMimeType = (item) => {
+  return item.mimeType
+}
+
+exports.getItemId = (item) => {
+  return item.id
+}
+
+exports.getItemRequestPath = (item) => {
+  // If it's from a Team Drive, add the Team Drive ID as a query param.
+  // The server needs the Team Drive ID to list files in a Team Drive folder.
+  if (item.teamDriveId) {
+    item.id += `?teamDriveId=${item.teamDriveId}`
+    delete item.teamDriveId
+  }
+
+  return this.getItemId(item)
+}
+
+exports.getItemModifiedDate = (item) => {
+  return item.modifiedTime
+}
+
+exports.getItemThumbnailUrl = (item) => {
+  return `${this.opts.serverUrl}/${this.GoogleDrive.id}/thumbnail/${this.getItemRequestPath(item)}`
+}

+ 5 - 1
packages/@uppy/companion/src/server/provider/drive.js → packages/@uppy/companion/src/server/provider/drive/index.js

@@ -1,7 +1,7 @@
 const request = require('request')
 const request = require('request')
 // @ts-ignore
 // @ts-ignore
 const purest = require('purest')({ request })
 const purest = require('purest')({ request })
-const logger = require('../logger')
+const logger = require('../../logger')
 const DRIVE_FILE_FIELDS = 'kind,id,name,mimeType,ownedByMe,permissions(role,emailAddress),size,modifiedTime,iconLink,thumbnailLink,teamDriveId'
 const DRIVE_FILE_FIELDS = 'kind,id,name,mimeType,ownedByMe,permissions(role,emailAddress),size,modifiedTime,iconLink,thumbnailLink,teamDriveId'
 const DRIVE_FILES_FIELDS = `kind,nextPageToken,incompleteSearch,files(${DRIVE_FILE_FIELDS})`
 const DRIVE_FILES_FIELDS = `kind,nextPageToken,incompleteSearch,files(${DRIVE_FILE_FIELDS})`
 const TEAM_DRIVE_FIELDS = 'teamDrives(kind,id,name,backgroundImageLink)'
 const TEAM_DRIVE_FIELDS = 'teamDrives(kind,id,name,backgroundImageLink)'
@@ -105,6 +105,10 @@ class Drive {
       done(parseInt(body.size))
       done(parseInt(body.size))
     })
     })
   }
   }
+
+  adaptData () {
+    
+  }
 }
 }
 
 
 module.exports = Drive
 module.exports = Drive

+ 40 - 0
packages/@uppy/companion/src/server/provider/dropbox/adapter.js

@@ -0,0 +1,40 @@
+exports.getUsername = (data) => {
+  return data.user_email
+}
+
+exports.isFolder = (item) => {
+  return item['.tag'] === 'folder'
+}
+
+exports.getItemIcon = (item) => {
+  return item['.tag']
+}
+
+exports.getItemSubList = (item) => {
+  return item.entries
+}
+
+exports.getItemName = (item) => {
+  return item.name || ''
+}
+
+exports.getMimeType = (item) => {
+  // mime types aren't supported.
+  return null
+}
+
+exports.getItemId = (item) => {
+  return item.id
+}
+
+exports.getItemRequestPath = (item) => {
+  return encodeURIComponent(item.path_lower)
+}
+
+exports.getItemModifiedDate = (item) => {
+  return item.server_modified
+}
+
+exports.getItemThumbnailUrl = (item) => {
+  return `${this.opts.serverUrl}/${this.Dropbox.id}/thumbnail/${this.getItemRequestPath(item)}`
+}

+ 5 - 1
packages/@uppy/companion/src/server/provider/dropbox.js → packages/@uppy/companion/src/server/provider/dropbox/index.js

@@ -1,6 +1,6 @@
 const request = require('request')
 const request = require('request')
 const purest = require('purest')({ request })
 const purest = require('purest')({ request })
-const logger = require('../logger')
+const logger = require('../../logger')
 
 
 /**
 /**
  *
  *
@@ -128,6 +128,10 @@ class DropBox {
         done(body.size)
         done(body.size)
       })
       })
   }
   }
+
+  adaptData() {
+
+  }
 }
 }
 
 
 module.exports = DropBox
 module.exports = DropBox

+ 74 - 0
packages/@uppy/companion/src/server/provider/instagram/adapter.js

@@ -0,0 +1,74 @@
+exports.getUsername = (data) => {
+  return data.data[0].user.username
+}
+
+exports.isFolder = (item) => {
+  return false
+}
+
+exports.getItemIcon = (item) => {
+  if (!item.images) {
+    return 'video'
+  }
+  return item.images.low_resolution.url
+}
+
+exports.getItemSubList = (item) => {
+  const subItems = []
+  item.data.forEach((subItem) => {
+    if (subItem.carousel_media) {
+      subItem.carousel_media.forEach((i, index) => {
+        const { id, created_time } = subItem
+        const newSubItem = Object.assign({}, i, { id, created_time })
+        newSubItem.carousel_id = index
+        subItems.push(newSubItem)
+      })
+    } else {
+      subItems.push(subItem)
+    }
+  })
+  return subItems
+}
+
+exports.getItemName = (item) => {
+  if (item && item['created_time']) {
+    const ext = item.type === 'video' ? 'mp4' : 'jpeg'
+    let date = new Date(item['created_time'] * 1000)
+    const name = date.toLocaleDateString([], {
+      year: 'numeric',
+      month: 'short',
+      day: 'numeric',
+      hour: 'numeric',
+      minute: 'numeric'
+    })
+    // adding both date and carousel_id, so the name is unique
+    return `Instagram ${name}${item.carousel_id ? ' ' + item.carousel_id : ''}.${ext}`
+  }
+  return ''
+}
+
+exports.getMimeType = (item) => {
+  return item.type === 'video' ? 'video/mp4' : 'image/jpeg'
+}
+
+exports.getItemId = (item) => {
+  return `${item.id}${item.carousel_id || ''}`
+}
+
+exports.getItemRequestPath = (item) => {
+  const suffix = isNaN(item.carousel_id) ? '' : `?carousel_id=${item.carousel_id}`
+  return `${item.id}${suffix}`
+}
+
+exports.getItemModifiedDate = (item) => {
+  return item.created_time
+}
+
+exports.getItemThumbnailUrl = (item) => {
+  return item.images.thumbnail.url
+}
+
+exports.getNextPagePath = (data) => {
+  const { files } = this.getPluginState()
+  return `recent?max_id=${this.getItemId(files[files.length - 1])}`
+}

+ 26 - 2
packages/@uppy/companion/src/server/provider/instagram.js → packages/@uppy/companion/src/server/provider/instagram/index.js

@@ -1,7 +1,8 @@
 const request = require('request')
 const request = require('request')
 const purest = require('purest')({ request })
 const purest = require('purest')({ request })
-const utils = require('../helpers/utils')
-const logger = require('../logger')
+const utils = require('../../helpers/utils')
+const logger = require('../../logger')
+const adapter = require('./adapter')
 
 
 class Instagram {
 class Instagram {
   constructor (options) {
   constructor (options) {
@@ -86,6 +87,29 @@ class Instagram {
           })
           })
       })
       })
   }
   }
+
+  /** {username: string, items: [{
+   * items: [], icon: string, mimeType: string, id: string, isFolder: bool, name: string, requestPath: string, thumbnail: string, nextPagePath: string, modifiedDate: string
+   * }]} */
+  adaptData(res) {
+    const data = { username: adapter.getUsername(res), items: [] }
+    const items = adapter.getItemSubList(data)
+    items.forEach((item) => {
+      data.items.push({
+        isFolder: adapter.isFolder(item),
+        icon: adapter.getItemIcon(item),
+        name: adapter.getItemName(item),
+        mimeType: adapter.getMimeType(item),
+        id: adapter.getItemId(item),
+        thumbnail: adapter.getItemThumbnailUrl(item),
+        nextPagePath: adapter.getNextPagePath(item),
+        requestPath: adapter.getItemRequestPath(item),
+        modifiedDate: adapter.getItemModifiedDate(item)
+      })
+    })
+
+    return data
+  }
 }
 }
 
 
 module.exports = Instagram
 module.exports = Instagram