Skip to content

Commit

Permalink
@uppy/companion: sort Dropbox response & refactor to async/await (tra…
Browse files Browse the repository at this point in the history
  • Loading branch information
mifi committed Aug 4, 2022
1 parent 0ff4d5d commit 030f047
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 99 deletions.
4 changes: 0 additions & 4 deletions src/server/provider/dropbox/adapter.js
@@ -1,10 +1,6 @@
const mime = require('mime-types')
const querystring = require('node:querystring')

exports.getUsername = (data) => {
return data.user_email
}

exports.isFolder = (item) => {
return item['.tag'] === 'folder'
}
Expand Down
161 changes: 66 additions & 95 deletions src/server/provider/dropbox/index.js
Expand Up @@ -20,6 +20,27 @@ function httpHeaderSafeJson (v) {
})
}

function adaptData (res, email, buildURL) {
const items = adapter.getItemSubList(res).map((item) => ({
isFolder: adapter.isFolder(item),
icon: adapter.getItemIcon(item),
name: adapter.getItemName(item),
mimeType: adapter.getMimeType(item),
id: adapter.getItemId(item),
thumbnail: buildURL(adapter.getItemThumbnailUrl(item), true),
requestPath: adapter.getItemRequestPath(item),
modifiedDate: adapter.getItemModifiedDate(item),
size: adapter.getItemSize(item),
}))
items.sort((a, b) => a.name.localeCompare(b.name, 'en-US', { numeric: true }))

return {
username: email,
items,
nextPagePath: adapter.getNextPagePath(res),
}
}

/**
* Adapter for API https://www.dropbox.com/developers/documentation/http/documentation
*/
Expand All @@ -39,77 +60,48 @@ class DropBox extends Provider {
return 'dropbox'
}

_userInfo ({ token }, done) {
this.client
async _userInfo ({ token }) {
const client = this.client
.post('users/get_current_account')
.options({ version: '2' })
.auth(token)
.request(done)
return promisify(client.request.bind(client))()
}

/**
* Makes 2 requests in parallel - 1. to get files, 2. to get user email
* it then waits till both requests are done before proceeding with the callback
*
* @param {object} options
* @param {Function} done
*/
_list (options, done) {
let userInfoDone = false
let statsDone = false
let userInfo
let stats
let reqErr
const finishReq = () => {
if (reqErr) {
logger.error(reqErr, 'provider.dropbox.list.error')
done(reqErr)
} else {
stats.body.user_email = userInfo.body.email
done(null, this.adaptData(stats.body, options.companion))
}
async list (options) {
try {
const responses = await Promise.all([
this._stats(options),
this._userInfo(options),
])
responses.forEach((response) => {
if (response.statusCode !== 200) throw this._error(null, response)
})
const [{ body: stats }, { body: { email } }] = responses
return adaptData(stats, email, options.companion.buildURL)
} catch (err) {
logger.error(err, 'provider.dropbox.list.error')
throw err
}

this.stats(options, (err, resp) => {
statsDone = true
stats = resp
if (err || resp.statusCode !== 200) {
err = this._error(err, resp)
}
reqErr = reqErr || err
if (userInfoDone) {
finishReq()
}
})

this._userInfo(options, (err, resp) => {
userInfoDone = true
userInfo = resp
if (err || resp.statusCode !== 200) {
err = this._error(err, resp)
}

reqErr = reqErr || err
if (statsDone) {
finishReq()
}
})
}

stats ({ directory, query, token }, done) {
async _stats ({ directory, query, token }) {
if (query.cursor) {
this.client
const client = this.client
.post('files/list_folder/continue')
.options({ version: '2' })
.auth(token)
.json({
cursor: query.cursor,
})
.request(done)
return
return promisify(client.request.bind(client))()
}

this.client
const client = this.client
.post('files/list_folder')
.options({ version: '2' })
.qs(query)
Expand All @@ -118,7 +110,8 @@ class DropBox extends Provider {
path: `${directory || ''}`,
include_non_downloadable_files: false,
})
.request(done)

return promisify(client.request.bind(client))()
}

async download ({ id, token }) {
Expand Down Expand Up @@ -160,57 +153,37 @@ class DropBox extends Provider {
}
}

_size ({ id, token }, done) {
return this.client
async size ({ id, token }) {
const client = this.client
.post('files/get_metadata')
.options({ version: '2' })
.auth(token)
.json({ path: id })
.request((err, resp, body) => {
if (err || resp.statusCode !== 200) {
err = this._error(err, resp)
logger.error(err, 'provider.dropbox.size.error')
return done(err)
}
done(null, parseInt(body.size, 10))
})

try {
const resp = await promisify(client.request.bind(client))()
if (resp.statusCode !== 200) throw this._error(null, resp)
return parseInt(resp.body.size, 10)
} catch (err) {
logger.error(err, 'provider.dropbox.size.error')
throw err
}
}

_logout ({ token }, done) {
return this.client
async logout ({ token }) {
const client = this.client
.post('auth/token/revoke')
.options({ version: '2' })
.auth(token)
.request((err, resp) => {
if (err || resp.statusCode !== 200) {
logger.error(err, 'provider.dropbox.logout.error')
done(this._error(err, resp))
return
}
done(null, { revoked: true })
})
}

adaptData (res, companion) {
const data = { username: adapter.getUsername(res), items: [] }
const items = adapter.getItemSubList(res)
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: companion.buildURL(adapter.getItemThumbnailUrl(item), true),
requestPath: adapter.getItemRequestPath(item),
modifiedDate: adapter.getItemModifiedDate(item),
size: adapter.getItemSize(item),
})
})

data.nextPagePath = adapter.getNextPagePath(res)

return data
try {
const resp = await promisify(client.request.bind(client))()
if (resp.statusCode !== 200) throw this._error(null, resp)
return { revoked: true }
} catch (err) {
logger.error(err, 'provider.dropbox.logout.error')
throw err
}
}

_error (err, resp) {
Expand All @@ -224,8 +197,6 @@ class DropBox extends Provider {
}
}

DropBox.prototype.list = promisify(DropBox.prototype._list)
DropBox.prototype.size = promisify(DropBox.prototype._size)
DropBox.prototype.logout = promisify(DropBox.prototype._logout)
DropBox.version = 2

module.exports = DropBox

0 comments on commit 030f047

Please sign in to comment.