2021-03-01 04:12:37 -08:00
import {
IExecuteFunctions ,
} from 'n8n-core' ;
import {
IDataObject ,
ILoadOptionsFunctions ,
INodeExecutionData ,
INodePropertyOptions ,
INodeType ,
INodeTypeDescription ,
2021-04-16 09:33:36 -07:00
NodeOperationError ,
2021-03-01 04:12:37 -08:00
} from 'n8n-workflow' ;
import {
apiTemplateIoApiRequest ,
downloadImage ,
loadResource ,
validateJSON ,
} from './GenericFunctions' ;
export class ApiTemplateIo implements INodeType {
description : INodeTypeDescription = {
displayName : 'APITemplate.io' ,
2021-03-04 03:54:42 -08:00
name : 'apiTemplateIo' ,
2021-03-01 04:12:37 -08:00
icon : 'file:apiTemplateIo.svg' ,
group : [ 'transform' ] ,
version : 1 ,
description : 'Consume the APITemplate.io API' ,
subtitle : '={{$parameter["operation"] + ": " + $parameter["resource"]}}' ,
defaults : {
name : 'APITemplate.io' ,
} ,
inputs : [ 'main' ] ,
outputs : [ 'main' ] ,
credentials : [
{
name : 'apiTemplateIoApi' ,
required : true ,
} ,
] ,
properties : [
{
displayName : 'Resource' ,
name : 'resource' ,
type : 'options' ,
2022-05-20 14:47:24 -07:00
noDataExpression : true ,
2021-03-01 04:12:37 -08:00
options : [
{
name : 'Account' ,
value : 'account' ,
} ,
{
name : 'Image' ,
value : 'image' ,
} ,
{
name : 'PDF' ,
value : 'pdf' ,
} ,
] ,
default : 'image' ,
} ,
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
2022-05-20 14:47:24 -07:00
noDataExpression : true ,
2021-03-01 04:12:37 -08:00
default : 'create' ,
required : true ,
options : [
{
name : 'Create' ,
value : 'create' ,
2022-07-10 13:50:51 -07:00
action : 'Create an image' ,
2021-03-01 04:12:37 -08:00
} ,
] ,
displayOptions : {
show : {
resource : [
'image' ,
'pdf' ,
] ,
} ,
} ,
} ,
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
2022-05-20 14:47:24 -07:00
noDataExpression : true ,
2021-03-01 04:12:37 -08:00
default : 'get' ,
required : true ,
options : [
{
name : 'Get' ,
value : 'get' ,
2022-07-10 13:50:51 -07:00
action : 'Get an account' ,
2021-03-01 04:12:37 -08:00
} ,
] ,
displayOptions : {
show : {
resource : [
'account' ,
] ,
} ,
} ,
} ,
{
2022-06-03 10:23:49 -07:00
displayName : 'Template Name or ID' ,
2021-03-01 04:12:37 -08:00
name : 'imageTemplateId' ,
type : 'options' ,
required : true ,
default : '' ,
2022-07-14 13:05:11 -07:00
description : 'ID of the image template to use. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.' ,
2021-03-01 04:12:37 -08:00
typeOptions : {
loadOptionsMethod : 'getImageTemplates' ,
} ,
displayOptions : {
show : {
resource : [
'image' ,
] ,
operation : [
'create' ,
] ,
} ,
} ,
} ,
{
2022-06-03 10:23:49 -07:00
displayName : 'Template Name or ID' ,
2021-03-01 04:12:37 -08:00
name : 'pdfTemplateId' ,
type : 'options' ,
required : true ,
default : '' ,
2022-07-14 13:05:11 -07:00
description : 'ID of the PDF template to use. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.' ,
2021-03-01 04:12:37 -08:00
typeOptions : {
loadOptionsMethod : 'getPdfTemplates' ,
} ,
displayOptions : {
show : {
resource : [
'pdf' ,
] ,
operation : [
'create' ,
] ,
} ,
} ,
} ,
{
displayName : 'JSON Parameters' ,
name : 'jsonParameters' ,
type : 'boolean' ,
default : false ,
displayOptions : {
show : {
resource : [
'pdf' ,
'image' ,
] ,
operation : [
'create' ,
] ,
} ,
} ,
} ,
{
displayName : 'Download' ,
name : 'download' ,
type : 'boolean' ,
default : false ,
displayOptions : {
show : {
resource : [
'pdf' ,
'image' ,
] ,
operation : [
'create' ,
] ,
} ,
} ,
2022-06-20 07:54:01 -07:00
// eslint-disable-next-line n8n-nodes-base/node-param-description-boolean-without-whether
2022-05-06 14:01:25 -07:00
description : 'Name of the binary property to which to write the data of the read file' ,
2021-03-01 04:12:37 -08:00
} ,
{
displayName : 'Binary Property' ,
name : 'binaryProperty' ,
type : 'string' ,
required : true ,
default : 'data' ,
2022-05-06 14:01:25 -07:00
description : 'Name of the binary property to which to write to' ,
2021-03-01 04:12:37 -08:00
displayOptions : {
show : {
resource : [
'pdf' ,
'image' ,
] ,
operation : [
'create' ,
] ,
download : [
true ,
] ,
} ,
} ,
} ,
{
displayName : 'Overrides (JSON)' ,
name : 'overridesJson' ,
type : 'json' ,
default : '' ,
displayOptions : {
show : {
resource : [
'image' ,
] ,
operation : [
'create' ,
] ,
jsonParameters : [
true ,
] ,
} ,
} ,
placeholder : ` [ {"name": "text_1", "text": "hello world", "textBackgroundColor": "rgba(246, 243, 243, 0)" } ] ` ,
} ,
{
displayName : 'Properties (JSON)' ,
name : 'propertiesJson' ,
type : 'json' ,
default : '' ,
displayOptions : {
show : {
resource : [
'pdf' ,
] ,
operation : [
'create' ,
] ,
jsonParameters : [
true ,
] ,
} ,
} ,
placeholder : ` { "name": "text_1" } ` ,
} ,
{
displayName : 'Overrides' ,
name : 'overridesUi' ,
placeholder : 'Add Override' ,
type : 'fixedCollection' ,
typeOptions : {
multipleValues : true ,
} ,
displayOptions : {
show : {
resource : [
'image' ,
] ,
operation : [
'create' ,
] ,
jsonParameters : [
false ,
] ,
} ,
} ,
default : { } ,
options : [
{
name : 'overrideValues' ,
displayName : 'Override' ,
values : [
{
displayName : 'Properties' ,
name : 'propertiesUi' ,
placeholder : 'Add Property' ,
type : 'fixedCollection' ,
typeOptions : {
multipleValues : true ,
} ,
default : { } ,
options : [
{
name : 'propertyValues' ,
displayName : 'Property' ,
values : [
{
displayName : 'Key' ,
name : 'key' ,
type : 'string' ,
default : '' ,
description : 'Name of the property' ,
} ,
{
displayName : 'Value' ,
name : 'value' ,
type : 'string' ,
default : '' ,
2022-05-06 14:01:25 -07:00
description : 'Value to the property' ,
2021-03-01 04:12:37 -08:00
} ,
] ,
} ,
] ,
} ,
] ,
} ,
] ,
} ,
{
displayName : 'Properties' ,
name : 'propertiesUi' ,
placeholder : 'Add Property' ,
type : 'fixedCollection' ,
typeOptions : {
multipleValues : true ,
} ,
default : { } ,
displayOptions : {
show : {
resource : [
'pdf' ,
] ,
operation : [
'create' ,
] ,
jsonParameters : [
false ,
] ,
} ,
} ,
options : [
{
name : 'propertyValues' ,
displayName : 'Property' ,
values : [
{
displayName : 'Key' ,
name : 'key' ,
type : 'string' ,
default : '' ,
description : 'Name of the property' ,
} ,
{
displayName : 'Value' ,
name : 'value' ,
type : 'string' ,
default : '' ,
2022-05-06 14:01:25 -07:00
description : 'Value to the property' ,
2021-03-01 04:12:37 -08:00
} ,
] ,
} ,
] ,
} ,
{
displayName : 'Options' ,
name : 'options' ,
type : 'collection' ,
placeholder : 'Add Field' ,
displayOptions : {
show : {
operation : [
'create' ,
] ,
resource : [
'pdf' ,
'image' ,
] ,
'download' : [
true ,
] ,
} ,
} ,
default : { } ,
options : [
{
displayName : 'File Name' ,
name : 'fileName' ,
type : 'string' ,
default : '' ,
description : 'The name of the downloaded image/pdf. It has to include the extension. For example: report.pdf' ,
} ,
] ,
} ,
] ,
} ;
methods = {
loadOptions : {
async getImageTemplates ( this : ILoadOptionsFunctions ) : Promise < INodePropertyOptions [ ] > {
return await loadResource . call ( this , 'image' ) ;
} ,
async getPdfTemplates ( this : ILoadOptionsFunctions ) : Promise < INodePropertyOptions [ ] > {
return await loadResource . call ( this , 'pdf' ) ;
} ,
} ,
} ;
async execute ( this : IExecuteFunctions ) {
const items = this . getInputData ( ) ;
const returnData : IDataObject [ ] = [ ] ;
const length = items . length ;
let responseData ;
const resource = this . getNodeParameter ( 'resource' , 0 ) as string ;
const operation = this . getNodeParameter ( 'operation' , 0 ) as string ;
if ( resource === 'account' ) {
// *********************************************************************
// account
// *********************************************************************
if ( operation === 'get' ) {
// ----------------------------------
// account: get
// ----------------------------------
for ( let i = 0 ; i < length ; i ++ ) {
2021-07-19 23:58:54 -07:00
try {
responseData = await apiTemplateIoApiRequest . call ( this , 'GET' , '/account-information' ) ;
returnData . push ( responseData ) ;
} catch ( error ) {
if ( this . continueOnFail ( ) ) {
returnData . push ( { json : { error : error.message } } ) ;
continue ;
}
throw error ;
}
2021-03-01 04:12:37 -08:00
}
}
} else if ( resource === 'image' ) {
// *********************************************************************
// image
// *********************************************************************
if ( operation === 'create' ) {
// ----------------------------------
// image: create
// ----------------------------------
const download = this . getNodeParameter ( 'download' , 0 ) as boolean ;
// https://docs.apitemplate.io/reference/api-reference.html#create-an-image-jpeg-and-png
for ( let i = 0 ; i < length ; i ++ ) {
2021-07-19 23:58:54 -07:00
try {
const jsonParameters = this . getNodeParameter ( 'jsonParameters' , i ) as boolean ;
2021-03-01 04:12:37 -08:00
2021-12-10 08:29:31 -08:00
let options : IDataObject = { } ;
if ( download ) {
options = this . getNodeParameter ( 'options' , i ) as IDataObject ;
}
2021-03-01 04:12:37 -08:00
2021-07-19 23:58:54 -07:00
const qs = {
template_id : this.getNodeParameter ( 'imageTemplateId' , i ) ,
} ;
2021-03-01 04:12:37 -08:00
2021-07-19 23:58:54 -07:00
const body = { overrides : [ ] } as IDataObject ;
if ( jsonParameters === false ) {
const overrides = ( this . getNodeParameter ( 'overridesUi' , i ) as IDataObject || { } ) . overrideValues as IDataObject [ ] || [ ] ;
if ( overrides . length !== 0 ) {
const data : IDataObject [ ] = [ ] ;
for ( const override of overrides ) {
const properties = ( override . propertiesUi as IDataObject || { } ) . propertyValues as IDataObject [ ] || [ ] ;
data . push ( properties . reduce ( ( obj , value ) = > Object . assign ( obj , { [ ` ${ value . key } ` ] : value . value } ) , { } ) ) ;
}
body . overrides = data ;
2021-03-01 04:12:37 -08:00
}
2021-07-19 23:58:54 -07:00
} else {
const overrideJson = this . getNodeParameter ( 'overridesJson' , i ) as string ;
if ( overrideJson !== '' ) {
const data = validateJSON ( overrideJson ) ;
if ( data === undefined ) {
2022-07-12 08:51:01 -07:00
throw new NodeOperationError ( this . getNode ( ) , 'A valid JSON must be provided.' , { itemIndex : i } ) ;
2021-07-19 23:58:54 -07:00
}
body . overrides = data ;
2021-03-01 04:12:37 -08:00
}
}
2021-07-19 23:58:54 -07:00
responseData = await apiTemplateIoApiRequest . call ( this , 'POST' , '/create' , qs , body ) ;
if ( download === true ) {
const binaryProperty = this . getNodeParameter ( 'binaryProperty' , i ) as string ;
const data = await downloadImage . call ( this , responseData . download_url ) ;
const fileName = responseData . download_url . split ( '/' ) . pop ( ) ;
const binaryData = await this . helpers . prepareBinaryData ( data , options . fileName || fileName ) ;
responseData = {
json : responseData ,
binary : {
[ binaryProperty ] : binaryData ,
} ,
} ;
}
returnData . push ( responseData ) ;
} catch ( error ) {
if ( this . continueOnFail ( ) ) {
returnData . push ( { json : { error : error.message } } ) ;
continue ;
}
throw error ;
2021-03-01 04:12:37 -08:00
}
}
if ( download === true ) {
return this . prepareOutputData ( returnData as unknown as INodeExecutionData [ ] ) ;
}
}
} else if ( resource === 'pdf' ) {
// *********************************************************************
// pdf
// *********************************************************************
if ( operation === 'create' ) {
// ----------------------------------
// pdf: create
// ----------------------------------
// https://docs.apitemplate.io/reference/api-reference.html#create-a-pdf
const download = this . getNodeParameter ( 'download' , 0 ) as boolean ;
for ( let i = 0 ; i < length ; i ++ ) {
2021-07-19 23:58:54 -07:00
try {
const jsonParameters = this . getNodeParameter ( 'jsonParameters' , i ) as boolean ;
2021-03-01 04:12:37 -08:00
2021-12-11 10:41:36 -08:00
let options : IDataObject = { } ;
if ( download ) {
options = this . getNodeParameter ( 'options' , i ) as IDataObject ;
}
2021-03-01 04:12:37 -08:00
2021-07-19 23:58:54 -07:00
const qs = {
template_id : this.getNodeParameter ( 'pdfTemplateId' , i ) ,
} ;
2021-03-01 04:12:37 -08:00
2021-07-19 23:58:54 -07:00
let data ;
2021-03-01 04:12:37 -08:00
2021-07-19 23:58:54 -07:00
if ( jsonParameters === false ) {
const properties = ( this . getNodeParameter ( 'propertiesUi' , i ) as IDataObject || { } ) . propertyValues as IDataObject [ ] || [ ] ;
if ( properties . length === 0 ) {
2022-07-12 08:51:01 -07:00
throw new NodeOperationError ( this . getNode ( ) , 'The parameter properties cannot be empty' , { itemIndex : i } ) ;
2021-07-19 23:58:54 -07:00
}
data = properties . reduce ( ( obj , value ) = > Object . assign ( obj , { [ ` ${ value . key } ` ] : value . value } ) , { } ) ;
} else {
const propertiesJson = this . getNodeParameter ( 'propertiesJson' , i ) as string ;
data = validateJSON ( propertiesJson ) ;
if ( data === undefined ) {
2022-07-12 08:51:01 -07:00
throw new NodeOperationError ( this . getNode ( ) , 'A valid JSON must be provided.' , { itemIndex : i } ) ;
2021-07-19 23:58:54 -07:00
}
2021-03-01 04:12:37 -08:00
}
2021-07-19 23:58:54 -07:00
responseData = await apiTemplateIoApiRequest . call ( this , 'POST' , '/create' , qs , data ) ;
if ( download === true ) {
const binaryProperty = this . getNodeParameter ( 'binaryProperty' , i ) as string ;
const data = await downloadImage . call ( this , responseData . download_url ) ;
const fileName = responseData . download_url . split ( '/' ) . pop ( ) ;
const binaryData = await this . helpers . prepareBinaryData ( data , options . fileName || fileName ) ;
responseData = {
json : responseData ,
binary : {
[ binaryProperty ] : binaryData ,
} ,
} ;
}
returnData . push ( responseData ) ;
} catch ( error ) {
if ( this . continueOnFail ( ) ) {
returnData . push ( { json : { error : error.message } } ) ;
continue ;
}
throw error ;
2021-03-01 04:12:37 -08:00
}
}
if ( download === true ) {
return this . prepareOutputData ( returnData as unknown as INodeExecutionData [ ] ) ;
}
}
}
return [ this . helpers . returnJsonArray ( returnData ) ] ;
}
}