diff --git a/packages/nodes-base/credentials/WekanApi.credentials.ts b/packages/nodes-base/credentials/WekanApi.credentials.ts index 43ded80703..bac7578435 100644 --- a/packages/nodes-base/credentials/WekanApi.credentials.ts +++ b/packages/nodes-base/credentials/WekanApi.credentials.ts @@ -1,4 +1,11 @@ -import { ICredentialType, INodeProperties } from 'n8n-workflow'; +import { + IAuthenticateGeneric, + ICredentialDataDecryptedObject, + ICredentialTestRequest, + ICredentialType, + IHttpRequestHelper, + INodeProperties, +} from 'n8n-workflow'; export class WekanApi implements ICredentialType { name = 'wekanApi'; @@ -15,6 +22,9 @@ export class WekanApi implements ICredentialType { displayName: 'Password', name: 'password', type: 'string', + typeOptions: { + password: true, + }, default: '', }, { @@ -24,5 +34,43 @@ export class WekanApi implements ICredentialType { default: '', placeholder: 'https://wekan.yourdomain.com', }, + { + displayName: 'Session Token', + name: 'token', + type: 'hidden', + typeOptions: { + expirable: true, + }, + default: '', + }, ]; + + async preAuthentication(this: IHttpRequestHelper, credentials: ICredentialDataDecryptedObject) { + const url = credentials.url as string; + const { token } = (await this.helpers.httpRequest({ + method: 'POST', + url: `${url.endsWith('/') ? url.slice(0, -1) : url}/users/login`, + body: { + username: credentials.username, + password: credentials.password, + }, + })) as { token: string }; + return { token }; + } + + authenticate: IAuthenticateGeneric = { + type: 'generic', + properties: { + headers: { + Authorization: '=Bearer {{$credentials.token}}', + }, + }, + }; + + test: ICredentialTestRequest = { + request: { + baseURL: '={{$credentials.url.replace(new RegExp("/$"), "")}}', + url: '/api/user', + }, + }; } diff --git a/packages/nodes-base/nodes/Wekan/GenericFunctions.ts b/packages/nodes-base/nodes/Wekan/GenericFunctions.ts index 7142aea3ef..a181663b9c 100644 --- a/packages/nodes-base/nodes/Wekan/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Wekan/GenericFunctions.ts @@ -1,52 +1,8 @@ -import { - IExecuteFunctions, - IExecuteSingleFunctions, - IHookFunctions, - ILoadOptionsFunctions, - IWebhookFunctions, -} from 'n8n-core'; +import { IExecuteFunctions, IHookFunctions, ILoadOptionsFunctions } from 'n8n-core'; import { OptionsWithUri } from 'request'; -import { - ICredentialDataDecryptedObject, - IDataObject, - NodeApiError, - NodeOperationError, -} from 'n8n-workflow'; - -export async function getAuthorization( - this: - | IHookFunctions - | IExecuteFunctions - | IExecuteSingleFunctions - | ILoadOptionsFunctions - | IWebhookFunctions, - credentials?: ICredentialDataDecryptedObject, -): Promise { - if (credentials === undefined) { - throw new NodeOperationError(this.getNode(), 'No credentials got returned!'); - } - - const { password, username } = credentials; - const options: OptionsWithUri = { - method: 'POST', - form: { - username, - password, - }, - uri: `${credentials.url}/users/login`, - json: true, - }; - - try { - const response = await this.helpers.request!(options); - - return { token: response.token, userId: response.id }; - } catch (error) { - throw new NodeApiError(this.getNode(), error); - } -} +import { IDataObject, JsonObject, NodeApiError, NodeOperationError } from 'n8n-workflow'; export async function apiRequest( this: IHookFunctions | IExecuteFunctions | ILoadOptionsFunctions, @@ -60,12 +16,9 @@ export async function apiRequest( query = query || {}; - const { token } = await getAuthorization.call(this, credentials); - const options: OptionsWithUri = { headers: { Accept: 'application/json', - Authorization: `Bearer ${token}`, }, method, body, @@ -75,12 +28,11 @@ export async function apiRequest( }; try { - return await this.helpers.request!(options); + return await this.helpers.requestWithAuthentication.call(this, 'wekanApi', options); } catch (error) { if (error.statusCode === 401) { throw new NodeOperationError(this.getNode(), 'The Wekan credentials are not valid!'); } - - throw error; + throw new NodeApiError(this.getNode(), error as JsonObject); } }