diff --git a/packages/nodes-base/credentials/StrapiApi.credentials.ts b/packages/nodes-base/credentials/StrapiApi.credentials.ts index 55b1383e7..1c8ef6963 100644 --- a/packages/nodes-base/credentials/StrapiApi.credentials.ts +++ b/packages/nodes-base/credentials/StrapiApi.credentials.ts @@ -8,6 +8,12 @@ export class StrapiApi implements ICredentialType { documentationUrl = 'strapi'; properties: INodeProperties[] = [ + { + displayName: 'Make sure you are using a user account not an admin account', + name: 'notice', + type: 'notice', + default: '', + }, { displayName: 'Email', name: 'email', diff --git a/packages/nodes-base/nodes/Strapi/GenericFunctions.ts b/packages/nodes-base/nodes/Strapi/GenericFunctions.ts index c8d8a02fa..9c3fd5ed6 100644 --- a/packages/nodes-base/nodes/Strapi/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Strapi/GenericFunctions.ts @@ -10,11 +10,17 @@ import type { } from 'n8n-workflow'; import { NodeApiError } from 'n8n-workflow'; +export const removeTrailingSlash = (url: string) => { + if (url.endsWith('/')) { + return url.slice(0, -1); + } + return url; +}; + export async function strapiApiRequest( this: IExecuteFunctions | ILoadOptionsFunctions | IHookFunctions | IWebhookFunctions, method: string, resource: string, - body: IDataObject = {}, qs: IDataObject = {}, uri?: string, @@ -22,16 +28,15 @@ export async function strapiApiRequest( ) { const credentials = await this.getCredentials('strapiApi'); + const url = removeTrailingSlash(credentials.url as string); + try { const options: OptionsWithUri = { headers: {}, method, body, qs, - uri: - uri || credentials.apiVersion === 'v4' - ? `${credentials.url}/api${resource}` - : `${credentials.url}${resource}`, + uri: uri || credentials.apiVersion === 'v4' ? `${url}/api${resource}` : `${url}${resource}`, json: true, qsStringifyOptions: { arrayFormat: 'indice', @@ -54,6 +59,9 @@ export async function getToken( this: IExecuteFunctions | ILoadOptionsFunctions | IHookFunctions | IWebhookFunctions, ): Promise { const credentials = await this.getCredentials('strapiApi'); + + const url = removeTrailingSlash(credentials.url as string); + let options = {} as OptionsWithUri; options = { headers: { @@ -64,10 +72,7 @@ export async function getToken( identifier: credentials.email, password: credentials.password, }, - uri: - credentials.apiVersion === 'v4' - ? `${credentials.url}/api/auth/local` - : `${credentials.url}/auth/local`, + uri: credentials.apiVersion === 'v4' ? `${url}/api/auth/local` : `${url}/auth/local`, json: true, }; return this.helpers.request(options); diff --git a/packages/nodes-base/nodes/Strapi/Strapi.node.ts b/packages/nodes-base/nodes/Strapi/Strapi.node.ts index 7f2328b0e..b4f5250aa 100644 --- a/packages/nodes-base/nodes/Strapi/Strapi.node.ts +++ b/packages/nodes-base/nodes/Strapi/Strapi.node.ts @@ -14,6 +14,7 @@ import { NodeOperationError } from 'n8n-workflow'; import { getToken, + removeTrailingSlash, strapiApiRequest, strapiApiRequestAllItems, validateJSON, @@ -70,6 +71,8 @@ export class Strapi implements INodeType { const credentials = credential.data as IDataObject; let options = {} as OptionsWithUri; + const url = removeTrailingSlash(credentials.url as string); + options = { headers: { 'content-type': 'application/json', @@ -79,12 +82,10 @@ export class Strapi implements INodeType { identifier: credentials.email, password: credentials.password, }, - uri: - credentials.apiVersion === 'v4' - ? `${credentials.url}/api/auth/local` - : `${credentials.url}/auth/local`, + uri: credentials.apiVersion === 'v4' ? `${url}/api/auth/local` : `${url}/auth/local`, json: true, }; + try { await this.helpers.request(options); return {