Xojo Plugin Requires Chilkat v11.5.0+
Xojo Plugin
Box: Poll User Events and Save a Checkpoint
See more Box Examples
Poll the authenticated user event stream in bounded batches. The local JSON checkpoint keeps processed event IDs and the next stream position. This single-process demonstration logs events; a production worker should commit its business action, deduplication record, and cursor transactionally and prune old IDs.
See the Box API guide for setup and the complete workflow.
Chilkat Xojo Plugin Downloads
Dim success As Boolean
success = False
// Requires Chilkat 11.5.0 or later and a previously unlocked Chilkat bundle.
// See Global Unlock Sample.
// Guide: Box API Guide.
success = False
// Supply an unexpired token obtained with one of the Box authentication examples.
// A token represents a particular user or service account. IDs must be accessible to it.
Dim curl As New Chilkat.HttpCurl
curl.SetVar "access_token","BOX_ACCESS_TOKEN"
Dim state As New Chilkat.JsonObject
Dim files As New Chilkat.FileAccess
Dim statePath As String
statePath = "qa_data/box_events_state.json"
If (files.FileExists(statePath) = True) Then
success = state.LoadFile(statePath)
If (success <> True) Then
System.DebugLog(state.LastErrorText)
Return
End If
If (state.HasMember("position") <> True) Then
System.DebugLog("Invalid checkpoint: position missing.")
Return
End If
Else
// "now" starts a new subscription. It deliberately skips historical events.
success = state.UpdateString("position","now")
End If
curl.SetVar "position",state.StringOf("position")
Dim page As New Chilkat.JsonObject
Dim seenPath As New Chilkat.StringBuilder
Dim eventId As String
Dim nextPosition As String
Dim batch As Int32
batch = 0
Dim i As Int32
Dim count As Int32
Dim more As Boolean
more = True
While (more = True) And (batch < 20)
curl.ClearTargetOutput "*"
Dim authorizedCommand1 As New Chilkat.StringBuilder
success = authorizedCommand1.SetString("curl -X GET ""https://api.box.com/2.0/events?stream_type=all&stream_position={{position}}&limit=100"" -H ""Authorization: Bearer {{access_token}}""")
Dim headerReplacement1 As Int32
headerReplacement1 = authorizedCommand1.Replace("{{access_token}}",curl.GetVar("access_token"))
success = curl.DoYourThing(authorizedCommand1.GetAsString())
If ((success <> True) Or (curl.StatusCode <> 200)) Then
System.DebugLog("Box request failed. HTTP status: " + Str(curl.StatusCode))
System.DebugLog("Failure reason: " + Str(curl.FailReason))
System.DebugLog(curl.ResponseBodyStr)
Return
End If
success = curl.GetResponseJson(page)
If (success <> True) Then
System.DebugLog(curl.LastErrorText)
Return
End If
count = page.SizeOfArray("entries")
i = 0
While i < count
page.I = i
eventId = page.StringOf("entries[i].event_id")
If (eventId = "") Then
System.DebugLog("Event without an event_id; checkpoint not advanced.")
Return
End If
seenPath.Clear
success = seenPath.Append("seen.")
success = seenPath.Append(eventId)
If (state.HasMember(seenPath.GetAsString()) = False) Then
// Replace this logging with your idempotent business operation.
// Record success only after that operation succeeds.
System.DebugLog(eventId + " " + page.StringOf("entries[i].event_type") + " " + page.StringOf("entries[i].source.id"))
success = state.UpdateBool(seenPath.GetAsString(),True)
End If
i = i + 1
Wend
nextPosition = page.StringOf("next_stream_position")
If (nextPosition = "") Then
System.DebugLog("Missing next_stream_position; checkpoint not advanced.")
Return
End If
more = (count > 0) And (nextPosition <> curl.GetVar("position"))
success = state.UpdateString("position",nextPosition)
success = state.WriteFile(statePath)
If (success <> True) Then
System.DebugLog(state.LastErrorText)
Return
End If
curl.SetVar "position",nextPosition
batch = batch + 1
Wend
System.DebugLog("Checkpoint saved. Run again later to continue polling.")