drive.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. const request = require('request')
  2. // @ts-ignore
  3. const purest = require('purest')({ request })
  4. const logger = require('../logger')
  5. const DRIVE_FILE_FIELDS = 'kind,id,name,mimeType,ownedByMe,permissions(role,emailAddress),size,modifiedTime,iconLink,thumbnailLink'
  6. const DRIVE_FILES_FIELDS = `kind,nextPageToken,incompleteSearch,files(${DRIVE_FILE_FIELDS})`
  7. /**
  8. * @class
  9. * @implements {Provider}
  10. */
  11. class Drive {
  12. constructor (options) {
  13. this.authProvider = options.provider = Drive.authProvider
  14. options.alias = 'drive'
  15. options.version = 'v3'
  16. this.client = purest(options)
  17. }
  18. static get authProvider () {
  19. return 'google'
  20. }
  21. list (options, done) {
  22. const directory = options.directory || 'root'
  23. const trashed = options.trashed || false
  24. return this.client
  25. .query()
  26. .get('files')
  27. .where({
  28. fields: DRIVE_FILES_FIELDS,
  29. q: `'${directory}' in parents and trashed=${trashed}`
  30. })
  31. .auth(options.token)
  32. .request(done)
  33. }
  34. stats ({ id, token }, done) {
  35. return this.client
  36. .query()
  37. .get(`files/${id}`)
  38. .where({fields: DRIVE_FILE_FIELDS})
  39. .auth(token)
  40. .request(done)
  41. }
  42. download ({ id, token }, onData) {
  43. return this.client
  44. .query()
  45. .get(`files/${id}`)
  46. .where({ alt: 'media' })
  47. .auth(token)
  48. .request()
  49. .on('data', onData)
  50. .on('end', () => onData(null))
  51. .on('error', (err) => {
  52. logger.error(err, 'provider.drive.download.error')
  53. })
  54. }
  55. thumbnail ({id, token}, done) {
  56. return this.stats({id, token}, (err, resp, body) => {
  57. if (err) {
  58. logger.error(err, 'provider.drive.thumbnail.error')
  59. return done(null)
  60. }
  61. done(body.thumbnailLink ? request(body.thumbnailLink) : null)
  62. })
  63. }
  64. size ({id, token}, done) {
  65. return this.stats({ id, token }, (err, resp, body) => {
  66. if (err) {
  67. logger.error(err, 'provider.drive.size.error')
  68. return done(null)
  69. }
  70. done(parseInt(body.size))
  71. })
  72. }
  73. }
  74. module.exports = Drive