UNPKG

2.15 kBJavaScriptView Raw
1const _ = require('lodash')
2const qs = require('querystring')
3const fetch = require('node-fetch')
4const FormData = require('form-data')
5
6const getAccessToken = (client) => {
7 const oauth1Token = _.get(client, 'qs.access_token')
8 return client.accessToken || oauth1Token
9}
10
11const getFormData = (fileDetails, data) => {
12 const formData = new FormData()
13
14 if (!_.isNil(fileDetails.folderId)) formData.append('folder_ids', fileDetails.folderId)
15 if (!_.isNil(fileDetails.folderPath)) formData.append('folder_paths', fileDetails.folderPath)
16
17 formData.append('file_names', fileDetails.name)
18 formData.append('files', Buffer.from(data), fileDetails.name)
19 return formData
20}
21
22const getUrlForFileUpload = (client, override, hidden) => {
23 const hapikey = _.get(client, 'qs.hapikey')
24 const params = {}
25 if (override) params.override = override
26 if (hidden) params.override = hidden
27 if (hapikey) params.hapikey = hapikey
28 const queryPart = _.isEmpty(params) ? '' : `?${qs.stringify(params)}`
29
30 return `${client.baseUrl}/filemanager/api/v2/files${queryPart}`
31}
32
33class File {
34 constructor(client) {
35 this.client = client
36 }
37
38 get() {
39 return this.client._request({
40 method: 'GET',
41 path: '/filemanager/api/v2/files',
42 })
43 }
44
45 getOne(id) {
46 return this.client._request({
47 method: 'GET',
48 path: `/filemanager/api/v2/files/${id}`,
49 })
50 }
51
52 upload(fileDetails, override, hidden) {
53 return fetch(fileDetails.url)
54 .then((response) => response.blob())
55 .then((blob) => blob.arrayBuffer())
56 .then((arrayBuffer) => {
57 const body = getFormData(fileDetails, arrayBuffer)
58 const headers = body.getHeaders()
59 headers.authorization = `Bearer ${getAccessToken(this.client)}`
60
61 // can't use the request-promise based client because they don't handle formdata inside
62 // of body correctly. See: https://github.com/request/request-promise/issues/271
63 return fetch(getUrlForFileUpload(this.client, override, hidden), {
64 method: 'POST',
65 body,
66 headers,
67 })
68 })
69 .then((data) => data.json())
70 }
71}
72
73module.exports = File