Creating tickets with attachments using serverless apps

In this post, let us see how we can make use of unirest package to create a :freshdesk: freshdesk ticket with attachments from our serverless app. We will be making use of unirest specifically because it offers a simple interface & can attach files that are located remotely (remote file stream). However, feel free to use a different package if it serves the purpose in a better way. Ideally, these files would reside in a file storage service that our app can securely access.

Note that this snippet should not be consumed as such and should ideally be refactored depending on the use-case. Developers should test the application for varying scenarios - extensions, file size, no of attachments, file storage service latency, and ensure if the approach works well.

Steps:

  1. Use fdk create to create a simple serverless boilerplate app.
  2. Proceed to add the code to server.js and modify manifest.json to include the dependencies
  3. Modify url and apiKey accordingly. Ensure to convert them to iparams while using them productively

server.js

var unirest = require('unirest');

exports = {
  events: [{
    event: 'onAppInstall',
    callback: 'aiHandler'
  }],
  aiHandler: function (args) {
    /* Substitute with the right handler and event. This is just to demo */
    logger('--Inside App Install Handler--');
    logger(args);
    attFile();
    renderData();
  }
};

function attFile(){
  logger("--Let's attach a file --");
  var url = "https://xxx.freshdesk.com/api/v2/tickets";
  var apiKey = "yyy";
  var headers = {
    "Content-Type": "multipart/form-data",
    "Authorization": "Basic " + apiKey
  };
  var fields = {
    "description": "support ticket....",
    "subject": "support ticket...",
    "email": "example@example.com",
    "status":"2", // certain fields are required during creation
    "priority":"1"
  };
// Lets make use of unirest to attach files from our secure file store/s3/...
  unirest.post(url)
  .headers(headers)
  .field(fields)
  .attach('attachments[]', 'https://i.imgur.com/lcB62xb.jpg')
  .attach('attachments[]', 'https://gist.githubusercontent.com/hemchander23/6708ad5595dd56ef31087d47d4f96a44/raw/89ab0df9685cac94bbb88e1ebfd3655bcade6c9d/DarkS1E4_Script.txt#')
  .attach('attachments[]', 'https://www.gstatic.com/covid19/mobility/2020-05-25_US_Mobility_Report_en.pdf')
  .end(function(response){
    logger(response.body)
    logger("Response Status : " + response.status)
    if(response.status == 201){
      logger("Location Header : "+ response.headers['location'])
    }
    else{
      logger("X-Request-Id :" + response.headers['x-request-id']);
    }
  });
}


function logger(dat){
  console.log(dat);
}

manifest.json

{
  "platform-version": "2.0",
  "product": {
    "freshdesk": {}
  },
  "dependencies":{
    "unirest":"0.6.0"
  }
}

will create a ticket like so:

It is very important to note that the file storage service that you use has to be secure and must generate short-lived (signed preferrably) links that are only valid for the ticket creation session. Upon creation of the ticket, you will notice that the attachments have a link of their own.

1 Like

can we use unirest in the public apps?

Yes, any well-maintained library can be used for HTTP requests with attachments. Attachments are not supported in Request API as it has restriction in the payload size.

It is allowed to use other libraries specifically for this use-case until it is supported within the platform.