import type { IAuthenticateGeneric, ICredentialDataDecryptedObject, ICredentialTestRequest, ICredentialType, IHttpRequestHelper, INodeProperties, } from 'n8n-workflow'; export class MetabaseApi implements ICredentialType { name = 'metabaseApi'; displayName = 'Metabase API'; documentationUrl = 'metabase'; properties: INodeProperties[] = [ { displayName: 'Session Token', name: 'sessionToken', type: 'hidden', // eslint-disable-next-line n8n-nodes-base/cred-class-field-type-options-password-missing typeOptions: { expirable: true, }, default: '', }, { displayName: 'URL', name: 'url', type: 'string', default: '', }, { displayName: 'Username', name: 'username', type: 'string', default: '', }, { displayName: 'Password', name: 'password', type: 'string', typeOptions: { password: true, }, default: '', }, ]; // method will only be called if "sessionToken" (the expirable property) // is empty or is expired async preAuthentication(this: IHttpRequestHelper, credentials: ICredentialDataDecryptedObject) { // make reques to get session token const url = credentials.url as string; const { id } = (await this.helpers.httpRequest({ method: 'POST', url: `${url.endsWith('/') ? url.slice(0, -1) : url}/api/session`, body: { username: credentials.username, password: credentials.password, }, })) as { id: string }; return { sessionToken: id }; } authenticate: IAuthenticateGeneric = { type: 'generic', properties: { headers: { 'X-Metabase-Session': '={{$credentials.sessionToken}}', }, }, }; test: ICredentialTestRequest = { request: { baseURL: '={{$credentials?.url}}', url: '/api/user/current', }, }; }