2021-11-25 09:48:52 -08:00
import {
IExecuteFunctions ,
} from 'n8n-core' ;
import {
ICredentialDataDecryptedObject ,
ICredentialsDecrypted ,
ICredentialTestFunctions ,
IDataObject ,
2022-02-05 13:55:43 -08:00
INodeCredentialTestResult ,
2021-11-25 09:48:52 -08:00
INodeExecutionData ,
INodeType ,
INodeTypeDescription ,
} from 'n8n-workflow' ;
import {
dhlApiRequest ,
2022-06-13 12:41:18 -07:00
validateCredentials ,
2021-11-25 09:48:52 -08:00
} from './GenericFunctions' ;
export class Dhl implements INodeType {
description : INodeTypeDescription = {
displayName : 'DHL' ,
name : 'dhl' ,
icon : 'file:dhl.svg' ,
group : [ 'input' ] ,
version : 1 ,
subtitle : '={{$parameter["operation"] + ": " + $parameter["resource"]}}' ,
description : 'Consume DHL API' ,
defaults : {
name : 'DHL' ,
} ,
inputs : [ 'main' ] ,
outputs : [ 'main' ] ,
credentials : [
{
name : 'dhlApi' ,
required : true ,
testedBy : 'dhlApiCredentialTest' ,
} ,
] ,
properties : [
{
displayName : 'Resource' ,
name : 'resource' ,
noDataExpression : true ,
type : 'hidden' ,
options : [
{
name : 'Shipment' ,
value : 'shipment' ,
} ,
] ,
default : 'shipment' ,
} ,
{
displayName : 'Operation' ,
name : 'operation' ,
type : 'options' ,
noDataExpression : true ,
displayOptions : {
show : {
resource : [
'shipment' ,
] ,
} ,
} ,
options : [
{
name : 'Get Tracking Details' ,
value : 'get' ,
} ,
] ,
default : 'get' ,
} ,
{
displayName : 'Tracking Number' ,
name : 'trackingNumber' ,
type : 'string' ,
required : true ,
default : '' ,
} ,
{
displayName : 'Options' ,
name : 'options' ,
type : 'collection' ,
placeholder : 'Add Option' ,
default : { } ,
options : [
{
displayName : ` Recipient's Postal Code ` ,
name : 'recipientPostalCode' ,
type : 'string' ,
default : '' ,
2022-05-06 14:01:25 -07:00
description : 'DHL will return more detailed information on the shipment when you provide the Recipient\'s Postal Code - it acts as a verification step' ,
2021-11-25 09:48:52 -08:00
} ,
] ,
} ,
] ,
} ;
methods = {
credentialTest : {
2022-02-05 13:55:43 -08:00
async dhlApiCredentialTest ( this : ICredentialTestFunctions , credential : ICredentialsDecrypted ) : Promise < INodeCredentialTestResult > {
2021-11-25 09:48:52 -08:00
try {
2022-06-13 12:41:18 -07:00
await validateCredentials . call ( this , credential . data as ICredentialDataDecryptedObject ) ;
2021-11-25 09:48:52 -08:00
} catch ( error ) {
if ( error . statusCode === 401 ) {
return {
status : 'Error' ,
message : 'The API Key included in the request is invalid' ,
} ;
}
}
return {
status : 'OK' ,
message : 'Connection successful!' ,
} ;
} ,
} ,
} ;
async execute ( this : IExecuteFunctions ) : Promise < INodeExecutionData [ ] [ ] > {
const items = this . getInputData ( ) ;
const returnData : IDataObject [ ] = [ ] ;
let qs : IDataObject = { } ;
let responseData ;
const resource = this . getNodeParameter ( 'resource' , 0 ) as string ;
const operation = this . getNodeParameter ( 'operation' , 0 ) as string ;
for ( let i = 0 ; i < items . length ; i ++ ) {
try {
if ( resource === 'shipment' ) {
if ( operation === 'get' ) {
const trackingNumber = this . getNodeParameter ( 'trackingNumber' , i ) as string ;
const options = this . getNodeParameter ( 'options' , i ) as IDataObject ;
qs = {
trackingNumber ,
} ;
Object . assign ( qs , options ) ;
responseData = await dhlApiRequest . call ( this , 'GET' , ` /track/shipments ` , { } , qs ) ;
returnData . push ( . . . responseData . shipments ) ;
}
}
} catch ( error ) {
if ( this . continueOnFail ( ) ) {
returnData . push ( { error : error.description } ) ;
continue ;
}
throw error ;
}
}
return [ this . helpers . returnJsonArray ( returnData ) ] ;
}
}