From af45a07f21d8448bad5c12ed702b7aa983017a2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Taha=20S=C3=B6nmez?= <35905778+tahasonmez@users.noreply.github.com> Date: Sun, 10 Jul 2022 11:07:16 +0300 Subject: [PATCH] fix(Telegram Node): Fix sending binaryData media (photo, document, video etc.) (#3408) * fixed send media (photo, document, video etc.) issues on Telegram Node * fixed send media (photo, document, video etc.) issues on Telegram Node * file name is optional now * :zap: lock file and linter fix * :zap: improvements * :zap: fixes * :zap: Improvements * :zap: Add placeholder to File Name * :zap: Add error message * :fire: Remove requestWithAuthentication * :zap: Fix typo * :shirt: Fix linting issues Co-authored-by: Michael Kret Co-authored-by: ricardo --- .../credentials/TelegramApi.credentials.ts | 8 ++ .../nodes/Telegram/Telegram.node.ts | 79 +++++++++---------- 2 files changed, 46 insertions(+), 41 deletions(-) diff --git a/packages/nodes-base/credentials/TelegramApi.credentials.ts b/packages/nodes-base/credentials/TelegramApi.credentials.ts index cc824580721da..6edcf45fe9f82 100644 --- a/packages/nodes-base/credentials/TelegramApi.credentials.ts +++ b/packages/nodes-base/credentials/TelegramApi.credentials.ts @@ -1,4 +1,5 @@ import { + ICredentialTestRequest, ICredentialType, INodeProperties, } from 'n8n-workflow'; @@ -17,4 +18,11 @@ export class TelegramApi implements ICredentialType { description: 'Chat with the bot father to obtain the access token', }, ]; + test: ICredentialTestRequest = { + request: { + baseURL: `=https://api.telegram.org/bot{{$credentials?.accessToken}}`, + url: '/getMe', + method: 'GET', + }, + }; } diff --git a/packages/nodes-base/nodes/Telegram/Telegram.node.ts b/packages/nodes-base/nodes/Telegram/Telegram.node.ts index 2f23bdae55b8e..14c6702ab3e37 100644 --- a/packages/nodes-base/nodes/Telegram/Telegram.node.ts +++ b/packages/nodes-base/nodes/Telegram/Telegram.node.ts @@ -4,10 +4,7 @@ import { import { IBinaryData, - ICredentialsDecrypted, - ICredentialTestFunctions, IDataObject, - INodeCredentialTestResult, INodeExecutionData, INodeType, INodeTypeDescription, @@ -20,7 +17,6 @@ import { getPropertyName, } from './GenericFunctions'; - export class Telegram implements INodeType { description: INodeTypeDescription = { displayName: 'Telegram', @@ -39,7 +35,6 @@ export class Telegram implements INodeType { { name: 'telegramApi', required: true, - testedBy: 'telegramBotTest', }, ], properties: [ @@ -801,7 +796,6 @@ export class Telegram implements INodeType { placeholder: '', description: 'Name of the binary property that contains the data to upload', }, - { displayName: 'Message ID', name: 'messageId', @@ -1151,6 +1145,7 @@ export class Telegram implements INodeType { default: 'HTML', description: 'How to parse the text', }, + ], }, ], @@ -1686,6 +1681,31 @@ export class Telegram implements INodeType { default: 0, description: 'Duration of clip in seconds', }, + { + displayName: 'File Name', + name: 'fileName', + type: 'string', + default: '', + displayOptions: { + show: { + '/operation': [ + 'sendAnimation', + 'sendAudio', + 'sendDocument', + 'sendPhoto', + 'sendVideo', + 'sendSticker', + ], + '/resource': [ + 'message', + ], + '/binaryData': [ + true, + ], + }, + }, + placeholder: 'image.jpeg', + }, { displayName: 'Height', name: 'height', @@ -1819,39 +1839,6 @@ export class Telegram implements INodeType { ], }; - methods = { - credentialTest: { - async telegramBotTest(this: ICredentialTestFunctions, credential: ICredentialsDecrypted): Promise { - const credentials = credential.data; - const options = { - uri: `https://api.telegram.org/bot${credentials!.accessToken}/getMe`, - json: true, - }; - try { - const response = await this.helpers.request(options); - if (!response.ok) { - return { - status: 'Error', - message: 'Token is not valid.', - }; - } - } catch (err) { - return { - status: 'Error', - message: `Token is not valid; ${err.message}`, - }; - } - - return { - status: 'OK', - message: 'Authentication successful!', - }; - - }, - }, - }; - - async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); const returnData: INodeExecutionData[] = []; @@ -2186,6 +2173,16 @@ export class Telegram implements INodeType { const binaryData = items[i].binary![binaryPropertyName] as IBinaryData; const dataBuffer = await this.helpers.getBinaryDataBuffer(i, binaryPropertyName); const propertyName = getPropertyName(operation); + const fileName = this.getNodeParameter('additionalFields.fileName', 0, '') as string; + + const filename = fileName || binaryData.fileName?.toString(); + + if (!fileName && !binaryData.fileName) { + throw new NodeOperationError(this.getNode(), + `File name is needed to ${operation}. Make sure the property that holds the binary data + has the file name property set or set it manually in the node using the File Name parameter under + Additional Fields.`); + } body.disable_notification = body.disable_notification?.toString() || 'false'; @@ -2194,11 +2191,12 @@ export class Telegram implements INodeType { [propertyName]: { value: dataBuffer, options: { - filename: binaryData.fileName, + filename, contentType: binaryData.mimeType, }, }, }; + responseData = await apiRequest.call(this, requestMethod, endpoint, {}, qs, { formData }); } else { responseData = await apiRequest.call(this, requestMethod, endpoint, body, qs); @@ -2233,7 +2231,6 @@ export class Telegram implements INodeType { // chat: responseData.result[0].message.chat, // }; // } - returnData.push({ json: responseData }); } catch (error) { if (this.continueOnFail()) {