From 88d6cfc07bfd2be64a39f285d235e22aae8c1522 Mon Sep 17 00:00:00 2001 From: Jonathan Bennetts Date: Tue, 5 Jul 2022 08:02:25 +0100 Subject: [PATCH] feat(DeepL Node): Add support for longer texts + Credential tests (#3651) * Updated DeepL to send data with Body instead of QS allowing larger translations * Updated Credentials and added test --- .../credentials/DeepLApi.credentials.ts | 23 ++++++++++++++++++- packages/nodes-base/nodes/DeepL/DeepL.node.ts | 8 +++---- .../nodes/DeepL/GenericFunctions.ts | 16 ++++++------- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/packages/nodes-base/credentials/DeepLApi.credentials.ts b/packages/nodes-base/credentials/DeepLApi.credentials.ts index 818b14c207a22..5021ddc2e5460 100644 --- a/packages/nodes-base/credentials/DeepLApi.credentials.ts +++ b/packages/nodes-base/credentials/DeepLApi.credentials.ts @@ -1,4 +1,9 @@ -import { ICredentialType, INodeProperties } from 'n8n-workflow'; +import { + IAuthenticateGeneric, + ICredentialTestRequest, + ICredentialType, + INodeProperties, +} from 'n8n-workflow'; export class DeepLApi implements ICredentialType { name = 'deepLApi'; @@ -28,4 +33,20 @@ export class DeepLApi implements ICredentialType { default: 'pro', }, ]; + + authenticate: IAuthenticateGeneric = { + type: 'generic', + properties: { + qs: { + auth_key: '={{$credentials.apiKey}}', + }, + }, + }; + + test: ICredentialTestRequest = { + request: { + baseURL: '={{$credentials.apiPlan === "pro" ? "https://api.deepl.com/v2" : "https://api-free.deepl.com/v2" }}', + url: '/usage', + }, + }; } diff --git a/packages/nodes-base/nodes/DeepL/DeepL.node.ts b/packages/nodes-base/nodes/DeepL/DeepL.node.ts index 9d8ffd03d91c9..117c7e9f75af0 100644 --- a/packages/nodes-base/nodes/DeepL/DeepL.node.ts +++ b/packages/nodes-base/nodes/DeepL/DeepL.node.ts @@ -116,18 +116,18 @@ export class DeepL implements INodeType { if (resource === 'language') { if (operation === 'translate') { - + let body: IDataObject = {}; const text = this.getNodeParameter('text', i) as string; const translateTo = this.getNodeParameter('translateTo', i) as string; - const qs = { target_lang: translateTo, text } as IDataObject; + body = { target_lang: translateTo, 'text': text } as IDataObject; if (additionalFields.sourceLang !== undefined) { - qs.source_lang = ['EN-GB', 'EN-US'].includes(additionalFields.sourceLang as string) + body.source_lang = ['EN-GB', 'EN-US'].includes(additionalFields.sourceLang as string) ? 'EN' : additionalFields.sourceLang; } - const response = await deepLApiRequest.call(this, 'GET', '/translate', {}, qs); + const response = await deepLApiRequest.call(this, 'GET', '/translate', body); responseData.push(response.translations[0]); } } diff --git a/packages/nodes-base/nodes/DeepL/GenericFunctions.ts b/packages/nodes-base/nodes/DeepL/GenericFunctions.ts index 4986b5a04c0c1..2d3795e32a011 100644 --- a/packages/nodes-base/nodes/DeepL/GenericFunctions.ts +++ b/packages/nodes-base/nodes/DeepL/GenericFunctions.ts @@ -9,7 +9,9 @@ import { } from 'n8n-core'; import { - IDataObject, NodeApiError, NodeOperationError, + IDataObject, + JsonObject, + NodeApiError, } from 'n8n-workflow'; export async function deepLApiRequest( @@ -29,10 +31,10 @@ export async function deepLApiRequest( const options: OptionsWithUri = { headers: { - 'Content-Type': 'application/json', + 'Content-Type': 'application/x-www-form-urlencoded', }, method, - body, + form: body, qs, uri: uri || `${credentials.apiPlan === 'pro' ? proApiEndpoint : freeApiEndpoint}${resource}`, json: true, @@ -47,13 +49,9 @@ export async function deepLApiRequest( delete options.body; } - const credentials = await this.getCredentials('deepLApi'); - - options.qs.auth_key = credentials.apiKey; - - return await this.helpers.request!(options); + return await this.helpers.requestWithAuthentication.call(this, 'deepLApi', options); } catch (error) { - throw new NodeApiError(this.getNode(), error); + throw new NodeApiError(this.getNode(), error as JsonObject); } }