components_tasks_PostTask.bs

import "pkg:/source/api/baserequest.bs"
import "pkg:/source/utils/misc.bs"

sub init()
  m.top.functionName = "postItems"
end sub

' Main function for PostTask.
' Posts either an array of data
' or a string of data to an API endpoint.
' Saves the response information
sub postItems()
  if m.top.apiUrl = ""
    print "ERROR in PostTask. Invalid API URL provided"
    return
  end if
  if m.top.arrayData.count() > 0 and m.top.stringData = ""
    print "PostTask Started - Posting array to " + m.top.apiUrl
    req = APIRequest(m.top.apiUrl)
    req.SetRequest("POST")
    httpResponse = asyncPost(req, FormatJson(m.top.arrayData))
    m.top.responseCode = httpResponse
    print "PostTask Finished. " + m.top.apiUrl + " Response = " + httpResponse.toStr()
  else if m.top.arrayData.count() = 0 and m.top.stringData <> ""
    print "PostTask Started - Posting string(" + m.top.stringData + ") to " + m.top.apiUrl
    req = APIRequest(m.top.apiUrl)
    req.SetRequest("POST")
    httpResponse = asyncPost(req, m.top.stringData)
    m.top.responseCode = httpResponse
    print "PostTask Finished. " + m.top.apiUrl + " Response = " + httpResponse.toStr()
  else
    print "ERROR processing data for PostTask"
  end if
end sub

' Post data and wait for response code
function asyncPost(req, data = "" as string) as integer
  ' response code 0 means there was an error
  respCode = 0

  req.setMessagePort(CreateObject("roMessagePort"))
  req.AddHeader("Content-Type", "application/json")
  req.AsyncPostFromString(data)
  ' wait up to m.top.timeoutSeconds for a response
  ' NOTE: wait() uses milliseconds - multiply by 1000 to convert
  resp = wait(m.top.timeoutSeconds * 1000, req.GetMessagePort())

  respString = resp.GetString()
  if isValidAndNotEmpty(respString)
    m.top.responseBody = ParseJson(respString)
    print "m.top.responseBody=", m.top.responseBody
  end if

  respCode = resp.GetResponseCode()
  if respCode < 0
    ' there was an unexpected error
    m.top.failureReason = resp.GetFailureReason()
  else if respCode >= 200 and respCode < 300
    ' save response headers if they're available
    m.top.responseHeaders = resp.GetResponseHeaders()
  end if

  return respCode
end function

' Revert PostTask to default state
sub empty()
  ' These should match the defaults set in PostTask.xml
  m.top.apiUrl = ""
  m.top.timeoutSeconds = 30

  m.top.arrayData = {}
  m.top.stringData = ""

  m.top.responseCode = invalid
  m.top.responseBody = {}
  m.top.responseHeaders = {}
  m.top.failureReason = ""
end sub