dropbox.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. const request = require('request')
  2. const purest = require('purest')({ request })
  3. const logger = require('../logger')
  4. /**
  5. *
  6. */
  7. class DropBox {
  8. constructor (options) {
  9. this.authProvider = options.provider = DropBox.authProvider
  10. this.client = purest(options)
  11. }
  12. static get authProvider () {
  13. return 'dropbox'
  14. }
  15. _userInfo ({ token }, done) {
  16. this.client
  17. .post('users/get_current_account')
  18. .options({ version: '2' })
  19. .auth(token)
  20. .request(done)
  21. }
  22. /**
  23. * Makes 2 requests in parallel - 1. to get files, 2. to get user email
  24. * it then waits till both requests are done before proceeding with the callback
  25. *
  26. * @param {object} options
  27. * @param {function} done
  28. */
  29. list (options, done) {
  30. let userInfoDone = false
  31. let statsDone = false
  32. let userInfo
  33. let stats
  34. let reqErr
  35. const finishReq = () => {
  36. if (!reqErr) {
  37. stats.body.user_email = userInfo.body.email
  38. }
  39. done(reqErr, stats, stats.body)
  40. }
  41. this.stats(options, (err, resp) => {
  42. statsDone = true
  43. stats = resp
  44. reqErr = reqErr || err
  45. if (userInfoDone) {
  46. finishReq()
  47. }
  48. })
  49. this._userInfo(options, (err, resp) => {
  50. userInfoDone = true
  51. userInfo = resp
  52. reqErr = reqErr || err
  53. if (statsDone) {
  54. finishReq()
  55. }
  56. })
  57. }
  58. stats ({ directory, query, token }, done) {
  59. this.client
  60. .post('files/list_folder')
  61. .options({version: '2'})
  62. .where(query)
  63. .auth(token)
  64. .json({
  65. path: `${directory || ''}`,
  66. include_media_info: true
  67. })
  68. .request(done)
  69. }
  70. download ({ id, token }, onData) {
  71. return this.client
  72. .post('https://content.dropboxapi.com/2/files/download')
  73. .options({
  74. version: '2',
  75. headers: {
  76. 'Dropbox-API-Arg': JSON.stringify({path: `${id}`})
  77. }
  78. })
  79. .auth(token)
  80. .request()
  81. .on('data', onData)
  82. .on('end', () => onData(null))
  83. .on('error', (err) => {
  84. logger.error(err, 'provider.dropbox.download.error')
  85. })
  86. }
  87. thumbnail ({id, token}, done) {
  88. return this.client
  89. .post('https://content.dropboxapi.com/2/files/get_thumbnail')
  90. .options({
  91. version: '2',
  92. headers: {
  93. 'Dropbox-API-Arg': JSON.stringify({path: `${id}`})
  94. }
  95. })
  96. .auth(token)
  97. .request()
  98. .on('response', done)
  99. .on('error', (err) => {
  100. logger.error(err, 'provider.dropbox.thumbnail.error')
  101. })
  102. }
  103. size ({id, token}, done) {
  104. return this.client
  105. .post('files/get_metadata')
  106. .options({ version: '2' })
  107. .auth(token)
  108. .json({
  109. path: id,
  110. include_media_info: true
  111. })
  112. .request((err, resp, body) => {
  113. if (err) {
  114. logger.error(err, 'provider.dropbox.size.error')
  115. return done(null)
  116. }
  117. done(body.size)
  118. })
  119. }
  120. }
  121. module.exports = DropBox