Handle duplicate/delete actions

Code cleanup
Improve error handling
This commit is contained in:
Romain Dunand
2019-11-13 00:00:58 +01:00
parent bcfb7afe73
commit 78070497cc
2 changed files with 72 additions and 18 deletions

View File

@@ -213,7 +213,7 @@ export class FileMaker implements INodeType {
name: 'responseLayout', name: 'responseLayout',
type: 'options', type: 'options',
typeOptions: { typeOptions: {
loadOptionsMethod: 'getLayouts', loadOptionsMethod: 'getResponseLayouts',
}, },
options: [], options: [],
default: '', default: '',
@@ -557,7 +557,7 @@ export class FileMaker implements INodeType {
// ---------------------------------- // ----------------------------------
// create/edit // create/edit
// ---------------------------------- // ----------------------------------
{ /*{
displayName: 'fieldData', displayName: 'fieldData',
name: 'fieldData', name: 'fieldData',
placeholder: '{"field1": "value", "field2": "value", ...}', placeholder: '{"field1": "value", "field2": "value", ...}',
@@ -572,7 +572,7 @@ export class FileMaker implements INodeType {
], ],
}, },
} }
}, },*/
{ {
displayName: 'Mod Id', displayName: 'Mod Id',
name: 'modId', name: 'modId',
@@ -679,6 +679,28 @@ export class FileMaker implements INodeType {
// select them easily // select them easily
async getLayouts(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> { async getLayouts(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
const returnData: INodePropertyOptions[] = []; const returnData: INodePropertyOptions[] = [];
let layouts;
try {
layouts = await layoutsApiRequest.call(this);
} catch (err) {
throw new Error(`FileMaker Error: ${err}`);
}
for (const layout of layouts) {
returnData.push({
name: layout.name,
value: layout.name,
});
}
return returnData;
},
async getResponseLayouts(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
const returnData: INodePropertyOptions[] = [];
returnData.push({
name: 'Use main layout',
value: '',
});
let layouts; let layouts;
try { try {
layouts = await layoutsApiRequest.call(this); layouts = await layoutsApiRequest.call(this);
@@ -760,14 +782,16 @@ export class FileMaker implements INodeType {
const credentials = this.getCredentials('FileMaker'); const credentials = this.getCredentials('FileMaker');
const action = this.getNodeParameter('action', 0) as string;
if (credentials === undefined) { if (credentials === undefined) {
throw new Error('No credentials got returned!'); throw new Error('No credentials got returned!');
} }
const token = await getToken.call(this);
const staticData = this.getWorkflowStaticData('global'); let token;
try {
token = await getToken.call(this);
} catch (e) {
throw new Error(`Login fail: ${e}`);
}
let requestOptions: OptionsWithUri; let requestOptions: OptionsWithUri;
@@ -776,6 +800,8 @@ export class FileMaker implements INodeType {
const url = `https://${host}/fmi/data/v1`; const url = `https://${host}/fmi/data/v1`;
const action = this.getNodeParameter('action', 0) as string;
for (let i = 0; i < items.length; i++) { for (let i = 0; i < items.length; i++) {
// Reset all values // Reset all values
requestOptions = { requestOptions = {
@@ -785,7 +811,6 @@ export class FileMaker implements INodeType {
}, },
method: 'GET', method: 'GET',
json: true json: true
//rejectUnauthorized: !this.getNodeParameter('allowUnauthorizedCerts', itemIndex, false) as boolean,
}; };
const layout = this.getNodeParameter('layout', 0) as string; const layout = this.getNodeParameter('layout', 0) as string;
@@ -802,10 +827,13 @@ export class FileMaker implements INodeType {
requestOptions.qs = { requestOptions.qs = {
'_offset': this.getNodeParameter('offset', 0), '_offset': this.getNodeParameter('offset', 0),
'_limit': this.getNodeParameter('limit', 0), '_limit': this.getNodeParameter('limit', 0),
'_sort': JSON.stringify(parseSort.call(this)),
'portal': JSON.stringify(parsePortals.call(this)), 'portal': JSON.stringify(parsePortals.call(this)),
...parseScripts.call(this) ...parseScripts.call(this)
}; };
const sort = parseSort.call(this);
if (sort) {
requestOptions.body.sort = sort;
}
} else if (action === 'find') { } else if (action === 'find') {
requestOptions.uri = url + `/databases/${database}/layouts/${layout}/_find`; requestOptions.uri = url + `/databases/${database}/layouts/${layout}/_find`;
requestOptions.method = 'POST'; requestOptions.method = 'POST';
@@ -823,7 +851,7 @@ export class FileMaker implements INodeType {
} else if (action === 'create') { } else if (action === 'create') {
requestOptions.uri = url + `/databases/${database}/layouts/${layout}/records`; requestOptions.uri = url + `/databases/${database}/layouts/${layout}/records`;
requestOptions.method = 'POST'; requestOptions.method = 'POST';
requestOptions.headers['Content-Type'] = 'application/json'; requestOptions.headers!['Content-Type'] = 'application/json';
//TODO: handle portalData //TODO: handle portalData
requestOptions.body = { requestOptions.body = {
@@ -835,7 +863,7 @@ export class FileMaker implements INodeType {
const recid = this.getNodeParameter('recid', 0) as string; const recid = this.getNodeParameter('recid', 0) as string;
requestOptions.uri = url + `/databases/${database}/layouts/${layout}/records/${recid}`; requestOptions.uri = url + `/databases/${database}/layouts/${layout}/records/${recid}`;
requestOptions.method = 'PATCH'; requestOptions.method = 'PATCH';
requestOptions.headers['Content-Type'] = 'application/json'; requestOptions.headers!['Content-Type'] = 'application/json';
//TODO: handle portalData //TODO: handle portalData
requestOptions.body = { requestOptions.body = {
@@ -849,6 +877,21 @@ export class FileMaker implements INodeType {
requestOptions.qs = { requestOptions.qs = {
'script.param': this.getNodeParameter('scriptParam', 0), 'script.param': this.getNodeParameter('scriptParam', 0),
}; };
} else if (action === 'duplicate') {
const recid = this.getNodeParameter('recid', 0) as string;
requestOptions.uri = url + `/databases/${database}/layouts/${layout}/records/${recid}`;
requestOptions.method = 'POST';
requestOptions.headers!['Content-Type'] = 'application/json';
requestOptions.qs = {
...parseScripts.call(this)
};
} else if (action === 'delete') {
const recid = this.getNodeParameter('recid', 0) as string;
requestOptions.uri = url + `/databases/${database}/layouts/${layout}/records/${recid}`;
requestOptions.method = 'DELETE';
requestOptions.qs = {
...parseScripts.call(this)
};
} else { } else {
throw new Error(`The action "${action}" is not implemented yet!`); throw new Error(`The action "${action}" is not implemented yet!`);
} }

View File

@@ -10,8 +10,16 @@ import {
} from 'n8n-workflow'; } from 'n8n-workflow';
import { OptionsWithUri } from 'request'; import { OptionsWithUri } from 'request';
import {Url} from "url";
interface ScriptsOptions {
script?: any; //tslint:disable-line:no-any
'script.param'?: any; //tslint:disable-line:no-any
'script.prerequest'?: any; //tslint:disable-line:no-any
'script.prerequest.param'?: any; //tslint:disable-line:no-any
'script.presort'?: any; //tslint:disable-line:no-any
'script.presort.param'?: any; //tslint:disable-line:no-any
}
/** /**
* Make an API request to ActiveCampaign * Make an API request to ActiveCampaign
* *
@@ -205,12 +213,16 @@ export async function getToken(this: ILoadOptionsFunctions | IExecuteFunctions |
} catch (error) { } catch (error) {
console.error(error); console.error(error);
const errorMessage = error.response.body.messages[0].message + '(' + error.response.body.messages[0].message + ')'; let errorMessage;
if (error.response) {
errorMessage = error.response.body.messages[0].message + '(' + error.response.body.messages[0].message + ')';
} else {
errorMessage = `${error.message} (${error.name})`;
}
if (errorMessage !== undefined) { if (errorMessage !== undefined) {
throw errorMessage; throw errorMessage;
} }
throw error.response.body; throw error.message;
} }
} }
@@ -286,11 +298,10 @@ export function parseScripts(this: IExecuteFunctions): object | null {
if (!setScriptAfter && setScriptBefore && setScriptSort) { if (!setScriptAfter && setScriptBefore && setScriptSort) {
return {}; return {};
} else { } else {
const scripts = { const scripts = {} as ScriptsOptions;
};
if (setScriptAfter) { if (setScriptAfter) {
scripts.script = this.getNodeParameter('scriptAfter', 0); scripts.script = this.getNodeParameter('scriptAfter', 0);
scripts['script.param'] = this.getNodeParameter('scriptAfter', 0); scripts!['script.param'] = this.getNodeParameter('scriptAfter', 0);
} }
if (setScriptBefore) { if (setScriptBefore) {
scripts['script.prerequest'] = this.getNodeParameter('scriptBefore', 0); scripts['script.prerequest'] = this.getNodeParameter('scriptBefore', 0);