GraphQL Subscriptions

GraphQL schema subscriptions.

Skedulo API GraphQL subscription support is provided through the Apollo subscription transport protocol.

Note that you must have an API user defined to register subscriptions. The WebSocket subscription endpoint is available at /graphql/subscriptions. Note that only subscription operations can be performed using this endpoint.

Subscriptions can be created on the Job, JobAllocation, and Shift objects.

Customers using Skedulo and Skedulo for Salesforce have access to all fields on these objects including any custom fields they have defined. A subscription can also provide the previous values of fields on the changed object.

Customers using Skedulo also have access to the Activities and Availabilities objects.

An introspection query can be used to determine exactly which fields are available to you. You can also use the GraphiQL page in the web application to find which fields are available.

Schema Subscriptions

When creating a schema subscription, results will only be returned when one of the fields that you requested changes. In the following example as only the UID and Duration fields are requested this subscription will only return results when either of those two fields changes. In addition to this implicit filtering, you can also explicitly filter which operations are returned and add additional filters on the data using an EQL filters query. The example below will only return when an UPDATE occurs that increases the duration of the job to more than one hour.

subscription {
  schemaJobs(operation: UPDATE, filter: "Duration > duration(3600 seconds)") {
    operation
    timestamp
    data {
      UID
      Duration
    }
    previous {
      Duration
    }
  }
}

Connecting

As per the subscription protocol, clients must send the Sec-WebSocket-Protocol header with a value of graphql-ws when connecting. Once connected a connection_init message should be sent with the payload containing authentication information in the form of a bearer authorization header. An example is displayed below.

{
  "type": "connection_init",
  "payload": {
    "Authorization": "Bearer $ACCESS_TOKEN"
  }
}

If the credentials are successful, the server will respond with a connection_ack message.

{
  "type": "connection_ack"
}

After this message has been received, you can send subscription queries. Each subscription must have a unique ID and contain a valid GraphQL subscription query. As multiple subscriptions can be started, the id field allows you to determine which response belongs to which subscription.

When creating a schema subscription, results will only be returned when one of the fields that you requested changes. In the following example as only the UID and Duration fields are requested this subscription will only return results when either of those two fields changes.

{
  "id": "1",
  "type": "start",
  "payload": {
    "query": "subscription {\n  schemaJobs {\n    operation\n    timestamp\n    data {\n      UID\n      Duration\n    }\n    previous {\n      Duration\n    }\n  }\n}",
    "variables": {}
  }
}

The server will only respond to a start message if there is a problem.

{
  "type": "error",
  "id": "2",
  "payload": {
    "data": null,
    "errors": [
      {
        "message": "Cannot query field 'UIDs' on type 'SchemaSubscriptionJobs'. Did you mean 'UID'? (line 6, column 7):\n      UIDs\n      ^",
        "locations": [
          {
            "line": 6,
            "column": 7
          }
        ]
      }
    ]
  }
}

Events that match the subscription are sent with the data message type.

{
  "type": "data",
  "id": "1",
  "payload": {
    "data": {
      "schemaJobs": {
        "operation": "INSERT",
        "timestamp": "2018-06-08T05:48:51.091Z",
        "data": {
          "UID": "0014f570-c710-4a20-863f-2b33d583a49d",
          "Duration": 90
        },
        "previous": {
          "Duration": 90
        }
      }
    }
  }
}

Last modified August 1, 2019: updated to end of connected pages (8161217)