From bc7dfd97de43814e8600331c0e6c27b7b55afc40 Mon Sep 17 00:00:00 2001 From: Jan Oberhauser Date: Mon, 30 Mar 2020 00:43:26 +0200 Subject: [PATCH] :zap: Fix OneDrive-Node --- .../Microsoft/OneDrive/FileDescription.ts | 2 +- .../Microsoft/OneDrive/FolderDescriptiont.ts | 75 ------------------ .../OneDrive/MicrosoftOneDrive.node.ts | 61 +++++++------- .../nodes/Microsoft/OneDrive/oneDrive.png | Bin 4123 -> 1088 bytes 4 files changed, 29 insertions(+), 109 deletions(-) delete mode 100644 packages/nodes-base/nodes/Microsoft/OneDrive/FolderDescriptiont.ts diff --git a/packages/nodes-base/nodes/Microsoft/OneDrive/FileDescription.ts b/packages/nodes-base/nodes/Microsoft/OneDrive/FileDescription.ts index 32fe70a948..0e9bc26cba 100644 --- a/packages/nodes-base/nodes/Microsoft/OneDrive/FileDescription.ts +++ b/packages/nodes-base/nodes/Microsoft/OneDrive/FileDescription.ts @@ -1,4 +1,4 @@ -import { INodeProperties } from "n8n-workflow"; +import { INodeProperties } from 'n8n-workflow'; export const fileOperations = [ { diff --git a/packages/nodes-base/nodes/Microsoft/OneDrive/FolderDescriptiont.ts b/packages/nodes-base/nodes/Microsoft/OneDrive/FolderDescriptiont.ts deleted file mode 100644 index 83bd871143..0000000000 --- a/packages/nodes-base/nodes/Microsoft/OneDrive/FolderDescriptiont.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { INodeProperties } from "n8n-workflow"; - -export const folderOperations = [ - { - displayName: 'Operation', - name: 'operation', - type: 'options', - displayOptions: { - show: { - resource: [ - 'folder', - ], - }, - }, - options: [ - { - name: 'Get Children', - value: 'getChildren', - description: 'Get items inside a folder', - }, - { - name: 'Search', - value: 'search', - description: 'Search a folder', - }, - ], - default: 'getChildren', - description: 'The operation to perform.', - }, -] as INodeProperties[]; - -export const folderFields = [ - -/* -------------------------------------------------------------------------- */ -/* folder:getChildren */ -/* -------------------------------------------------------------------------- */ - { - displayName: 'Folder ID', - name: 'folderId', - type: 'string', - displayOptions: { - show: { - operation: [ - 'getChildren', - ], - resource: [ - 'folder', - ], - }, - }, - default: '', - description: 'Folder ID', - }, -/* -------------------------------------------------------------------------- */ -/* folder:search */ -/* -------------------------------------------------------------------------- */ - { - displayName: 'Query', - name: 'query', - type: 'string', - displayOptions: { - show: { - operation: [ - 'search', - ], - resource: [ - 'folder', - ], - }, - }, - default: '', - description: `The query text used to search for items. Values may be matched - across several fields including filename, metadata, and file content.`, - }, -] as INodeProperties[]; diff --git a/packages/nodes-base/nodes/Microsoft/OneDrive/MicrosoftOneDrive.node.ts b/packages/nodes-base/nodes/Microsoft/OneDrive/MicrosoftOneDrive.node.ts index cee6733bd5..199dd48798 100644 --- a/packages/nodes-base/nodes/Microsoft/OneDrive/MicrosoftOneDrive.node.ts +++ b/packages/nodes-base/nodes/Microsoft/OneDrive/MicrosoftOneDrive.node.ts @@ -1,16 +1,14 @@ import { - IExecuteFunctions, BINARY_ENCODING, + IExecuteFunctions, } from 'n8n-core'; import { + IBinaryKeyData, IDataObject, INodeExecutionData, - INodeTypeDescription, INodeType, - ILoadOptionsFunctions, - INodePropertyOptions, - IBinaryKeyData, + INodeTypeDescription, } from 'n8n-workflow'; import { @@ -19,14 +17,14 @@ import { } from './GenericFunctions'; import { - fileOperations, fileFields, + fileOperations, } from './FileDescription'; import { + folderFields, folderOperations, - folderFields -} from './FolderDescriptiont'; +} from './FolderDescription'; export class MicrosoftOneDrive implements INodeType { description: INodeTypeDescription = { @@ -113,10 +111,17 @@ export class MicrosoftOneDrive implements INodeType { const dataPropertyNameDownload = this.getNodeParameter('binaryPropertyName', i) as string; responseData = await microsoftApiRequest.call(this, 'GET', `/drive/items/${fileId}`); + const fileName = responseData.name; + if (responseData.file === undefined) { throw new Error('The ID you provided does not belong to a file.'); } + let mimeType: string | undefined; + if (responseData.file.mimeType) { + mimeType = responseData.file.mimeType; + } + responseData = await microsoftApiRequest.call(this, 'GET', `/drive/items/${fileId}/content`, {}, {}, undefined, {}, { encoding: null, resolveWithFullResponse: true }); const newItem: INodeExecutionData = { @@ -124,8 +129,7 @@ export class MicrosoftOneDrive implements INodeType { binary: {}, }; - let mimeType: string | undefined; - if (responseData.headers['content-type']) { + if (mimeType === undefined && responseData.headers['content-type']) { mimeType = responseData.headers['content-type']; } @@ -140,7 +144,7 @@ export class MicrosoftOneDrive implements INodeType { const data = Buffer.from(responseData.body); - items[i].binary![dataPropertyNameDownload] = await this.helpers.prepareBinaryData(data as unknown as Buffer, undefined, mimeType); + items[i].binary![dataPropertyNameDownload] = await this.helpers.prepareBinaryData(data as unknown as Buffer, fileName, mimeType); } //https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/driveitem_get?view=odsp-graph-online if (operation === 'get') { @@ -151,17 +155,17 @@ export class MicrosoftOneDrive implements INodeType { //https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/driveitem_search?view=odsp-graph-online if (operation === 'search') { const query = this.getNodeParameter('query', i) as string; - responseData = await microsoftApiRequestAllItems.call(this, 'value', 'GET', `/drive/root/search(q='{${query}}')`); + responseData = await microsoftApiRequestAllItems.call(this, 'value', 'GET', `/drive/root/search(q='${query}')`); responseData = responseData.filter((item: IDataObject) => item.file); - returnData.push(responseData as IDataObject); + returnData.push.apply(returnData, responseData as IDataObject[]); } //https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/driveitem_put_content?view=odsp-graph-online#example-upload-a-new-file if (operation === 'upload') { const parentId = this.getNodeParameter('parentId', i) as string; - const binaryData = this.getNodeParameter('binaryData', 0) as boolean; - let fileName = this.getNodeParameter('fileName', 0) as string; + const isBinaryData = this.getNodeParameter('binaryData', i) as boolean; + const fileName = this.getNodeParameter('fileName', i) as string; - if (binaryData) { + if (isBinaryData) { const binaryPropertyName = this.getNodeParameter('binaryPropertyName', 0) as string; if (items[i].binary === undefined) { @@ -174,20 +178,16 @@ export class MicrosoftOneDrive implements INodeType { const binaryData = (items[i].binary as IBinaryKeyData)[binaryPropertyName]; - if (fileName !== '') { - fileName = `${fileName}.${binaryData.fileExtension}`; - } - const body = Buffer.from(binaryData.data, BINARY_ENCODING); - responseData = await microsoftApiRequest.call(this, 'PUT', `/drive/items/${parentId}:/${fileName || binaryData.fileName}:/content`, body , {}, undefined, { 'Content-Type': binaryData.mimeType, 'Content-length': body.length } ); - returnData.push(responseData as IDataObject); + responseData = await microsoftApiRequest.call(this, 'PUT', `/drive/items/${parentId}:/${fileName || binaryData.fileName}:/content`, body, {}, undefined, { 'Content-Type': binaryData.mimeType, 'Content-length': body.length }, {} ); + returnData.push(JSON.parse(responseData) as IDataObject); } else { - const body = Buffer.from(this.getNodeParameter('fileContent', i) as string, 'utf8'); + const body = this.getNodeParameter('fileContent', i) as string; if (fileName === '') { - throw new Error('File name must be defined'); + throw new Error('File name must be set!'); } - responseData = await microsoftApiRequest.call(this, 'PUT', `/drive/items/${parentId}:/${fileName}.txt:/content`, body , {}, undefined, { 'Content-Type': 'text/plain' } ); + responseData = await microsoftApiRequest.call(this, 'PUT', `/drive/items/${parentId}:/${fileName}:/content`, body , {}, undefined, { 'Content-Type': 'text/plain' } ); returnData.push(responseData as IDataObject); } } @@ -197,14 +197,14 @@ export class MicrosoftOneDrive implements INodeType { if (operation === 'getChildren') { const folderId = this.getNodeParameter('folderId', i) as string; responseData = await microsoftApiRequestAllItems.call(this, 'value', 'GET', `/drive/items/${folderId}/children`); - returnData.push(responseData as IDataObject); + returnData.push.apply(returnData, responseData as IDataObject[]); } //https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/driveitem_search?view=odsp-graph-online if (operation === 'search') { const query = this.getNodeParameter('query', i) as string; - responseData = await microsoftApiRequestAllItems.call(this, 'value', 'GET', `/drive/root/search(q='{${query}}')`); + responseData = await microsoftApiRequestAllItems.call(this, 'value', 'GET', `/drive/root/search(q='${query}')`); responseData = responseData.filter((item: IDataObject) => item.folder); - returnData.push(responseData as IDataObject); + returnData.push.apply(returnData, responseData as IDataObject[]); } } } @@ -212,11 +212,6 @@ export class MicrosoftOneDrive implements INodeType { // For file downloads the files get attached to the existing items return this.prepareOutputData(items); } else { - if (Array.isArray(responseData)) { - returnData.push.apply(returnData, responseData as IDataObject[]); - } else if (responseData !== undefined) { - returnData.push(responseData as IDataObject); - } return [this.helpers.returnJsonArray(returnData)]; } } diff --git a/packages/nodes-base/nodes/Microsoft/OneDrive/oneDrive.png b/packages/nodes-base/nodes/Microsoft/OneDrive/oneDrive.png index b33d98a8bb25e5b516df50c7769df1e617a38509..44f3f594ffe7233c976100cd21fb6b472b0497b0 100644 GIT binary patch delta 1078 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