Получение списка подписок

Для получения списка подписок используется API-метод

При вызове без параметров метод возвращает все подписки на события.

Есть возможность отфильтровать параметры через OData $filter

В данном примере значение параметра active eq true and address/chatId eq '2341918'

Возможна выборка по содержимому secureContext и insecureContext

Пример результата:

{
  "$error": null,
  "$items": [
    {
      "id": "41631b7b-527a-4b4f-accd-1031d3e16d99",
      "accountId": "99bffda5-5bd1-49b1-b4f2-658854797c01",
      "user": {
        "externalId": "12345",
        "id": "41631b7b-527a-4b4f-accd-1031d3e16d99",
        "accountId": "99bffda5-5bd1-49b1-b4f2-658854797c01"
      },
      "insecureContext": {
        "externalId": "214214",
        "orederId": "22"
      },
      "secureContext": {
        "orderId": "4568"
      },
      "secureContextToken": null,
      "subject": null,
      "subscribedTs": "2017-04-04T08:37:30.43Z",
      "unsubscribedTs": null,
      "address": {
        "channel": "tg",
        "channelId": 76,
        "accountId": "99bffda5-5bd1-49b1-b4f2-658854797c01",
        "remoteAddress": "71418274",
        "chatId": "71418274"
      },
      "active": true
    }

  ],
  "$value": null,
  "$count": 40
}

в случае ошибки:

{
  "$error": {
    "sc": 500,
    "scn": "INTERNAL_ERROR",
    "msg": "Failed to encode as JSON: Direct self-reference leading to cycle (through reference chain: textback.restapi.ApiResponse[\"$error\"]->textback.restapi.ApiError[\"ex\"]->org.apache.olingo.odata2.api.uri.expression.ExpressionParserException[\"httpExceptionCause\"])",
    "ex": {
      "cause": null,
      "stackTrace": [
       {...}
      ],
      "message": "Failed to encode as JSON: Direct self-reference leading to cycle (through reference chain: textback.restapi.ApiResponse[\"$error\"]->textback.restapi.ApiError[\"ex\"]->org.apache.olingo.odata2.api.uri.expression.ExpressionParserException[\"httpExceptionCause\"])",
      "localizedMessage": "Failed to encode as JSON: Direct self-reference leading to cycle (through reference chain: textback.restapi.ApiResponse[\"$error\"]->textback.restapi.ApiError[\"ex\"]->org.apache.olingo.odata2.api.uri.expression.ExpressionParserException[\"httpExceptionCause\"])",
      "suppressed": []
    }
  },
  "$items": null,
  "$value": null,
  "$count": null
}

Отправка уведомлений подписанным клиентам

Тело запроса:

{
    "$filter":"1 eq 1",
    "text":"Test notification for all subscribers",
    "location": {
        "longitude":34.5,
        "latitude":34.5
    }
}

Рекомендуется слать либо текст, либо локацию. В Viber приходит только одно поле в одном сообщении.

В поле $filter задается OData-фильтр, такой-же как при поиске подписок. Рекомендуем сначала проверить фильтр через /api/endUserNotifications/subscriptions, а потом использовать его для рассылки. Единственное ограничение: рассылка будет осуществлена только на активные подписки.

Формат ответа:

{
  "$error": null,
  "$items": null,
  "$value": {
    "id": "3c1a89b0-051c-4679-a1e0-84b47eb831c9",
    "accountId": "99bffda5-5bd1-49b1-b4f2-658854797c01",
    "affectedSubscriptions": 40,
    "affectedAddresses": 6,
    "subject": null,
    "text": null,
    "chatTitle": null,
    "location": {
      "longitude": 34.5,
      "latitude": 34.5
    },
    "attachments": [],
    "sentTimestamp": "2017-04-04T16:09:48.004+03:00",
    "textMarkup": "PLAIN",
    "$filter": "1 eq 1 and active eq true"
  },
  "$count": 1
}

Поле affectedSubscriptions указывает, сколько подписок соответствовало данному критерию.

Поле affectedAddresses указывает, на сколько уникальных "адресов" было отправлено сообщения.

Secure Context

Безопасный контекст формируется на основе JWT-токена. Json, из которого создан токен, может иметь следующий вид:

{
  "orderId" : "4568",

  "iat" : 1491311737,
  "exp" : 1492175737,
  "iss" : "99bffda5-5bd1-49b1-b4f2-658854797c01",
  "sub" : "12345"
}

Поле iss является обязательным и должно равняться TextBackAccountId

Поле sub — это ID пользователя в вашей системе.

Поля iat и exp — служебные поля JWT, сигнализирующие о времени жизни токена.

Можно добавлять любое количество полей, все они попадут в поле secureContext созданной подписки.