2022-08-01 13:47:55 -07:00
import { IExecuteFunctions } from 'n8n-core' ;
2021-03-01 04:12:37 -08:00
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 : {
2022-08-01 13:47:55 -07:00
resource : [ 'image' , 'pdf' ] ,
2021-03-01 04:12:37 -08:00
} ,
} ,
} ,
{
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 : {
2022-08-01 13:47:55 -07:00
resource : [ 'account' ] ,
2021-03-01 04:12:37 -08:00
} ,
} ,
} ,
{
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-08-01 13:47:55 -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 : {
2022-08-01 13:47:55 -07:00
resource : [ 'image' ] ,
operation : [ 'create' ] ,
2021-03-01 04:12:37 -08:00
} ,
} ,
} ,
{
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-08-01 13:47:55 -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 : {
2022-08-01 13:47:55 -07:00
resource : [ 'pdf' ] ,
operation : [ 'create' ] ,
2021-03-01 04:12:37 -08:00
} ,
} ,
} ,
{
displayName : 'JSON Parameters' ,
name : 'jsonParameters' ,
type : 'boolean' ,
default : false ,
displayOptions : {
show : {
2022-08-01 13:47:55 -07:00
resource : [ 'pdf' , 'image' ] ,
operation : [ 'create' ] ,
2021-03-01 04:12:37 -08:00
} ,
} ,
} ,
{
displayName : 'Download' ,
name : 'download' ,
type : 'boolean' ,
default : false ,
displayOptions : {
show : {
2022-08-01 13:47:55 -07:00
resource : [ 'pdf' , 'image' ] ,
operation : [ 'create' ] ,
2021-03-01 04:12:37 -08:00
} ,
} ,
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 : {
2022-08-01 13:47:55 -07:00
resource : [ 'pdf' , 'image' ] ,
operation : [ 'create' ] ,
download : [ true ] ,
2021-03-01 04:12:37 -08:00
} ,
} ,
} ,
{
displayName : 'Overrides (JSON)' ,
name : 'overridesJson' ,
type : 'json' ,
default : '' ,
displayOptions : {
show : {
2022-08-01 13:47:55 -07:00
resource : [ 'image' ] ,
operation : [ 'create' ] ,
jsonParameters : [ true ] ,
2021-03-01 04:12:37 -08:00
} ,
} ,
placeholder : ` [ {"name": "text_1", "text": "hello world", "textBackgroundColor": "rgba(246, 243, 243, 0)" } ] ` ,
} ,
{
displayName : 'Properties (JSON)' ,
name : 'propertiesJson' ,
type : 'json' ,
default : '' ,
displayOptions : {
show : {
2022-08-01 13:47:55 -07:00
resource : [ 'pdf' ] ,
operation : [ 'create' ] ,
jsonParameters : [ true ] ,
2021-03-01 04:12:37 -08:00
} ,
} ,
placeholder : ` { "name": "text_1" } ` ,
} ,
{
displayName : 'Overrides' ,
name : 'overridesUi' ,
placeholder : 'Add Override' ,
type : 'fixedCollection' ,
typeOptions : {
multipleValues : true ,
} ,
displayOptions : {
show : {
2022-08-01 13:47:55 -07:00
resource : [ 'image' ] ,
operation : [ 'create' ] ,
jsonParameters : [ false ] ,
2021-03-01 04:12:37 -08:00
} ,
} ,
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 : {
2022-08-01 13:47:55 -07:00
resource : [ 'pdf' ] ,
operation : [ 'create' ] ,
jsonParameters : [ false ] ,
2021-03-01 04:12:37 -08:00
} ,
} ,
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 : {
2022-08-01 13:47:55 -07:00
operation : [ 'create' ] ,
resource : [ 'pdf' , 'image' ] ,
download : [ true ] ,
2021-03-01 04:12:37 -08:00
} ,
} ,
default : { } ,
options : [
{
displayName : 'File Name' ,
name : 'fileName' ,
type : 'string' ,
default : '' ,
2022-08-01 13:47:55 -07:00
description :
'The name of the downloaded image/pdf. It has to include the extension. For example: report.pdf' ,
2021-03-01 04:12:37 -08:00
} ,
] ,
} ,
] ,
} ;
methods = {
loadOptions : {
async getImageTemplates ( this : ILoadOptionsFunctions ) : Promise < INodePropertyOptions [ ] > {
2022-12-02 12:54:28 -08:00
return loadResource . call ( this , 'image' ) ;
2021-03-01 04:12:37 -08:00
} ,
async getPdfTemplates ( this : ILoadOptionsFunctions ) : Promise < INodePropertyOptions [ ] > {
2022-12-02 12:54:28 -08:00
return loadResource . call ( this , 'pdf' ) ;
2021-03-01 04:12:37 -08:00
} ,
} ,
} ;
async execute ( this : IExecuteFunctions ) {
const items = this . getInputData ( ) ;
const returnData : IDataObject [ ] = [ ] ;
const length = items . length ;
let responseData ;
2022-12-02 03:53:59 -08:00
const resource = this . getNodeParameter ( 'resource' , 0 ) ;
const operation = this . getNodeParameter ( 'operation' , 0 ) ;
2021-03-01 04:12:37 -08:00
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 ( ) ) {
2022-08-01 13:47:55 -07:00
returnData . push ( { json : { error : error.message } } ) ;
2021-07-19 23:58:54 -07:00
continue ;
}
throw error ;
}
2021-03-01 04:12:37 -08:00
}
}
} else if ( resource === 'image' ) {
// *********************************************************************
// image
// *********************************************************************
if ( operation === 'create' ) {
// ----------------------------------
// image: create
// ----------------------------------
2022-11-18 05:31:38 -08:00
const download = this . getNodeParameter ( 'download' , 0 ) ;
2021-03-01 04:12:37 -08:00
// 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 {
2022-11-18 05:31:38 -08:00
const jsonParameters = this . getNodeParameter ( 'jsonParameters' , i ) ;
2021-03-01 04:12:37 -08:00
2021-12-10 08:29:31 -08:00
let options : IDataObject = { } ;
if ( download ) {
2022-11-18 07:29:44 -08:00
options = this . getNodeParameter ( 'options' , i ) ;
2021-12-10 08:29:31 -08:00
}
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 ;
2022-12-02 12:54:28 -08:00
if ( ! jsonParameters ) {
2022-08-01 13:47:55 -07:00
const overrides =
2022-12-02 12:54:28 -08:00
( ( this . getNodeParameter ( 'overridesUi' , i ) as IDataObject )
? . overrideValues as IDataObject [ ] ) || [ ] ;
2021-07-19 23:58:54 -07:00
if ( overrides . length !== 0 ) {
const data : IDataObject [ ] = [ ] ;
for ( const override of overrides ) {
2022-08-01 13:47:55 -07:00
const properties =
2022-12-02 12:54:28 -08:00
( ( override . propertiesUi as IDataObject ) ? . propertyValues as IDataObject [ ] ) || [ ] ;
2022-08-01 13:47:55 -07:00
data . push (
properties . reduce (
( obj , value ) = > Object . assign ( obj , { [ ` ${ value . key } ` ] : value . value } ) ,
{ } ,
) ,
) ;
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
} else {
const overrideJson = this . getNodeParameter ( 'overridesJson' , i ) as string ;
if ( overrideJson !== '' ) {
const data = validateJSON ( overrideJson ) ;
if ( data === undefined ) {
2022-08-01 13:47:55 -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 ) ;
2022-12-02 12:54:28 -08:00
if ( download ) {
2022-12-02 03:53:59 -08:00
const binaryProperty = this . getNodeParameter ( 'binaryProperty' , i ) ;
2021-07-19 23:58:54 -07:00
const data = await downloadImage . call ( this , responseData . download_url ) ;
const fileName = responseData . download_url . split ( '/' ) . pop ( ) ;
2022-08-01 13:47:55 -07:00
const binaryData = await this . helpers . prepareBinaryData (
data ,
options . fileName || fileName ,
) ;
2021-07-19 23:58:54 -07:00
responseData = {
json : responseData ,
binary : {
[ binaryProperty ] : binaryData ,
} ,
} ;
}
returnData . push ( responseData ) ;
} catch ( error ) {
if ( this . continueOnFail ( ) ) {
2022-08-01 13:47:55 -07:00
returnData . push ( { json : { error : error.message } } ) ;
2021-07-19 23:58:54 -07:00
continue ;
}
throw error ;
2021-03-01 04:12:37 -08:00
}
}
2022-12-02 12:54:28 -08:00
if ( download ) {
2021-03-01 04:12:37 -08:00
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
2022-11-18 05:31:38 -08:00
const download = this . getNodeParameter ( 'download' , 0 ) ;
2021-03-01 04:12:37 -08:00
for ( let i = 0 ; i < length ; i ++ ) {
2021-07-19 23:58:54 -07:00
try {
2022-11-18 05:31:38 -08:00
const jsonParameters = this . getNodeParameter ( 'jsonParameters' , i ) ;
2021-03-01 04:12:37 -08:00
2021-12-11 10:41:36 -08:00
let options : IDataObject = { } ;
if ( download ) {
2022-11-18 07:29:44 -08:00
options = this . getNodeParameter ( 'options' , i ) ;
2021-12-11 10:41:36 -08:00
}
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
2022-12-02 12:54:28 -08:00
if ( ! jsonParameters ) {
2022-08-01 13:47:55 -07:00
const properties =
2022-12-02 12:54:28 -08:00
( ( this . getNodeParameter ( 'propertiesUi' , i ) as IDataObject )
? . propertyValues as IDataObject [ ] ) || [ ] ;
2021-07-19 23:58:54 -07:00
if ( properties . length === 0 ) {
2022-08-01 13:47:55 -07:00
throw new NodeOperationError (
this . getNode ( ) ,
'The parameter properties cannot be empty' ,
{ itemIndex : i } ,
) ;
2021-07-19 23:58:54 -07:00
}
2022-08-01 13:47:55 -07:00
data = properties . reduce (
( obj , value ) = > Object . assign ( obj , { [ ` ${ value . key } ` ] : value . value } ) ,
{ } ,
) ;
2021-07-19 23:58:54 -07:00
} else {
const propertiesJson = this . getNodeParameter ( 'propertiesJson' , i ) as string ;
data = validateJSON ( propertiesJson ) ;
if ( data === undefined ) {
2022-08-01 13:47:55 -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 ) ;
2022-12-02 12:54:28 -08:00
if ( download ) {
2022-12-02 03:53:59 -08:00
const binaryProperty = this . getNodeParameter ( 'binaryProperty' , i ) ;
2022-12-02 12:54:28 -08:00
const imageData = await downloadImage . call ( this , responseData . download_url ) ;
2021-07-19 23:58:54 -07:00
const fileName = responseData . download_url . split ( '/' ) . pop ( ) ;
2022-08-01 13:47:55 -07:00
const binaryData = await this . helpers . prepareBinaryData (
2022-12-02 12:54:28 -08:00
imageData ,
2022-08-01 13:47:55 -07:00
options . fileName || fileName ,
) ;
2021-07-19 23:58:54 -07:00
responseData = {
json : responseData ,
binary : {
[ binaryProperty ] : binaryData ,
} ,
} ;
}
returnData . push ( responseData ) ;
} catch ( error ) {
if ( this . continueOnFail ( ) ) {
2022-08-01 13:47:55 -07:00
returnData . push ( { json : { error : error.message } } ) ;
2021-07-19 23:58:54 -07:00
continue ;
}
throw error ;
2021-03-01 04:12:37 -08:00
}
}
2022-12-02 12:54:28 -08:00
if ( download ) {
2021-03-01 04:12:37 -08:00
return this . prepareOutputData ( returnData as unknown as INodeExecutionData [ ] ) ;
}
}
}
return [ this . helpers . returnJsonArray ( returnData ) ] ;
}
}