Публичное API

Какова схема авторизации

Для публичных методов API реализована авторизация через публичный ключ API – при отправке запросов по урлам вида api/public/* идёт проверка на наличие заголовка (Header) X-Auth-Token. Если заголовок присутствует, и соответствует указанному в конфиге, то авторизация проходит успешно

Публичный ключ API хранится в .env под названием PUBLIC_API_TOKEN

В панели администрирования публичный ключ API отображается в разделе НастройкиЛицензия.

При отсутствии публичного ключа API, либо если он указан неверно, в запросах возвращается ошибка 401 Authorization Required

Заголовки запросов

Header

Описание

Механика

Header

Описание

Механика

X-Auth-Token

Заголовок авторизации

Обязательный заголовок

При каждом обращении, не важно, POST или GET, в заголовках запроса нужно указывать параметр X-Auth-Token с предоставленным публичным ключом API в качестве значения

Locale

Язык запроса, на котором должен быть возвращён контент

  • Необязательный заголовок

  • Язык запроса передается с помощью заголовка Locale: <language> (одно значение)

  • Допустимые значения – en, ru, uz, ky. При добавлении на платформу новых языков появляется возможность указывать и их в заголовке.

  • Ответ возвращается на запрашиваемом языке, если:

    • В заголовке передано допустимое значение
      И

    • Для запрашиваемого элемента есть контент на запрашиваемом языке

  • Ответ возвращается на языке, установленном на платформе по умолчанию, если:

    • Заголовок запрашиваемого языка отсутствует
      ИЛИ

    • Значение заголовка не соответствует допустимым (опечатка, множественное значение, несуществующее значение)
      ИЛИ

    • Отсутствует контент на запрашиваемом языке

При этом если в теле запроса нет ошибок и если в описании метода не указано иное, запрос должен быть успешно выполнен и вернуть статус 200 с соответствующим сообщением.

Какие запросы можно использовать

Отчеты

Получение списка всех доступных отчётов

Чтобы получить список всех доступных отчётов, нужно сделать GET запрос на адрес:

  • GET /public/api/v1/reports/list

В ответ придёт JSON массив объектов, каждый из которых будет содержать Название (title) и Системное имя (type).

Получение метаданных

Чтобы получить метаданные о конкретном отчёте, нужно сделать GET запрос на адрес:

  • GET /public/api/v1/reports/metadata/{type}
    заменив в адресе type на нужное Системное имя, полученное на предыдущем этапе.

В ответ придёт JSON объект с двумя полями:

  • headersList — объект, содержащий предполагаемые заголовки отчёта;
    Количество полей может быть любое, зависит от отчёта, т.к каждый отчёт содержит различные поля;
    Ключами являются Системные имена полей, а значениями являются Названия полей (например, "email": "Почта");
    В сформированном отчёте может быть другое количество полей или их названия (например, в отчёте по тестированию могут быть поля, отвечающие за вопросы выбранного тестирования, но мы не можем знать эти вопросы (поля) до выбора самого тестирования, поэтому в метаданных этих полей заранее быть не может).

  • filtersList — объект, содержащий фильтры данного отчёта;
    Ключами являются Системные имена, а значениями объекты, с информацией о фильтре (пример полей: type — тип, label — название, values — значения, url — адрес, на который нужно делать запрос для получения списка значений и поиска по нему);

Генерация и получение отчёта

Обычный режим

Чтобы сгенерировать и получить отчёт, нужно отправить POST запрос на адрес:

  • post /public/api/v1/reports/generate/{type}
    заменив в адресе type на нужное Системное имя, полученное на этапе Получения списка всех доступных отчётов.

В body запроса нужно отправить JSON объект с полем filters, в котором будут поля, ключами которых будут Системные имена фильтров, полученных на этапе Получения метаданных, а значениями непосредственно значения фильтров (цифра, строка, массив и тд)

Если данные по фильтру Статус пользователя (user_status) не были переданы в body при запросе или был передан пустой массив, тогда отчёт будет сформирован только по активным сотрудникам, при этом в массиве объектов data, который придет в ответ, будет отсутствовать параметр user_status

В ответ придёт JSON объект со следующими полями:

  • title — строка с названием отчёта;
    Может не совпадать со значением, полученным на первом этапе, т.к может содержать дополнительные данные вроде даты и других значений.

  • isMultiple — булево значение;
    Если значение true, то в полях headers и data будет не объект, а массив объектов — каждый объект это отдельная страница отчёта.

  • headers — объект, содержащий заголовки таблицы отчёта, где ключи это Системные имена полей, а значения это Названия полей.

  • data — массив объектов, содержащий данные отчёта;
    Каждый объект в массиве — это одна строка;
    Каждый объект содержет поля, ключами которого являются Системные имена полей, а значениями являются данные (например, "status": "Активен").

  • metadata — объект, содержащий дополнительные данные об отчёте, например, выбранные фильтры;
    Ключами объекта являются Системные имена полей, а значениями сами данные (например, "metadataFieldName": "Тестовый пользователь").

  • hasErrors — булево значение;
    Были ли ошибки при попытке сформировать отчёт;
    Если значение true, значит отчёт не сформирован и нужно смотреть ошибки в поле errors.

  • errors — объект, содержащий ошибки;
    Ключами являются Системные имена полей, а значениями Текст ошибки.

Режим потокового скачивания

Чтобы сгенерировать отчёт, для дальнейшего его скачивания в потоковом режиме, нужно отправить POST запрос на адрес:

  • post /public/api/v1/reports/create/{type}
    заменив в адресе type на нужное Системное имя, полученное на этапе Получения списка всех доступных отчётов.

В body запроса нужно отправить JSON объект с полем filters, в котором будут поля, ключами которых будут Системные имена фильтров, полученных на этапе Получения метаданных, а значениями непосредственно значения фильтров (цифра, строка, массив и тд)

Если данные по фильтру Статус пользователя (user_status) не были переданы в body при запросе или был передан пустой массив, тогда отчёт будет сформирован только по активным сотрудникам, при этом в массиве объектов data, который придет в ответ, будет отсутствовать параметр user_status

В ответ придёт JSON объект с полем id, он же Идентификатор сгенерированного отчета.

Чтобы получить JSON данные отчёта, сгенерированного в предыдущем шаге, нужно отправить GET запрос на адрес:

  • GET /public/api/v1/reports/data/{id}
    заменив в адресе id на нужный Идентификатор, полученный в предыдущем шаге

Администратору платформы для обработки json необходимо включить на своей стороне поддержку потокового скачивания в принимаемом ПО

Описание режима потоковой передачи данных приведено на сайте Handle large messages in workflows using chunking - Azure Logic Apps

Важно:

  1. В потоковом режиме данные передаются дольше

  2. После запроса отчёта в потоковом режиме API не становится заблокированным, можно обратиться к другим методом или за формированием другого отчёта

В ответ придёт JSON объект со следующими полями:

  • title — строка с названием отчёта;
    Может не совпадать со значением, полученным на первом этапе, т.к может содержать дополнительные данные вроде даты и других значений.

  • isMultiple — булево значение;
    Если значение true, то в полях headers и data будет не объект, а массив объектов — каждый объект это отдельная страница отчёта.

  • headers — объект, содержащий заголовки таблицы отчёта, где ключи это Системные имена полей, а значения это Названия полей.

  • data — массив объектов, содержащий данные отчёта;
    Каждый объект в массиве — это одна строка;
    Каждый объект содержит поля, ключами которого являются Системные имена полей, а значениями являются данные (например, "status": "Активен").

  • metadata — объект, содержащий дополнительные данные об отчёте, например, выбранные фильтры;
    Ключами объекта являются Системные имена полей, а значениями сами данные (например, "metadataFieldName": "Тестовый пользователь").

  • hasErrors — булево значение;
    Были ли ошибки при попытке сформировать отчёт;
    Если значение true, значит отчёт не сформирован и нужно смотреть ошибки в поле errors.

  • errors — объект, содержащий ошибки;
    Ключами являются Системные имена полей, а значениями Текст ошибки.

Бейджи

Получение информации об имеющихся на платформе бейджах

Информация передается по всем неудаленным бейджам

Чтобы получить информацию об имеющихся на платформе бейджах, нужно сделать GET запрос на адрес:

  • GET /public/api/v1/badge
    Если требуется получить ответ на определенном языке, в заголовках запроса можно передать параметр Locale

В случае успешного запроса (200) в ответ придёт JSON объект со следующими полями:

  • id – идентификатор бейджа, INT

  • title – название бейджа (на запрашиваемом или языке, установленном по умолчанию), varchar

  • image – ссылка на загруженное изображение для бейджа, string

  • description – описание бейджа или NULL в случае его отсутствия, string

  • popupDescription – сообщение при получении бейджа, string

  • color – значение цвета для бейджа или NULL, если цвет не установлен, varchar

  • active – статус активности бейджа, 0 или 1, boolean

  • system 1 если бейдж системный, 0 если бейдж пользовательский, boolean

  • children – массив с уровнями бейджей, если бейдж содержит уровни, или пустой массив:

    • Для каждого дочернего бейджа отображаются все значения выше (кроме children) и дополнительное значение grade

    • grade – грейд бейджа, INT

[ { “id“: 93, “title“: “Спортивные достижения“, “image“: “https://support.motivationportal.ru/api/file/download/1386/28px-01.svg“, “description“: NULL, “popupDescription“: “Поздравляем!“, “color”: NULL, “active“: “1“, “system“: “0“, “children“: [ { “id“: 98, “title“: “Спортивные достижения 1 уровень“, “image“: “https://support.motivationportal.ru/api/file/download/1386/30px-01.svg“, “description“: “Поздравляем с первым уровнем!“, “popupDescription“: “Поздравляем с первым уровнем!“, “color”: NULL, “active“: “0“, “system“: “0“, “grade“: “1“ }, { “id“: 100, “title“: “Спортивные достижения 2 уровень“, “image“: “https://support.motivationportal.ru/api/file/download/1386/50px-01.svg“, “description“: “Поздравляем со вторым уровнем!“, “popupDescription“: “Поздравляем со вторым уровнем!“, “color”: NULL, “active“: “0“, “system“: “0“, “grade“: “2“ } ] } ]

Возвращается в случае отсутствия или некорректного публичного ключа API при запросе

{ "result": false, "message": "Invalid public API token" }

Начисление бейджа пользователю

Бейдж начисляется пользователю, если:

  • Пользователь существует и не удалён, статус активности не важен

  • Бейдж существует, активен, не удалён

  • Бейдж не является системным

  • Бейдж не является родительским для многоуровнего бейджа

  • Бейдж не является более низким грейдом уже назначенного грейда многоуровневого бейджа

Если бейдж существует и может быть назначен, запрос считается успешным, даже если были найдены не все пользователи из запроса. По каждому пользователю приходит информация со статусом начисления бейджа для него.

Если назначаемый бейдж относится к многоуровневому бейджу, ранее назначенный бейдж другого уровня снимается при назначении нового бейджа.

Чтобы начислить бейдж пользователю, нужно сделать POST запрос на адрес:

  • post /public/api/v1/badge/{badgeId}/assign
    в {badgeId} должен передаваться ID бейджа, который необходимо назначить пользователю или пользователям

В body запроса нужно отправить обязательный JSON объект userId, в котором перечислены уникальные идентификаторы пользователей (массив, должны совпадать c выбранным уникальным идентификатором на платформе)

Пример:

{ "userId": [ "example@example.ru", "example2@example.ru" ] }

В случае успешного запроса (200) в ответ придёт JSON объект со следующими полями:

  • result – значение true

  • data – массив данных по каждому пользователю, который был передан в запросе:

    • id – идентификатор пользователя

    • success

      • false – если пользователь не существует или удалён, и ему не был начислен бейдж

      • true – если пользователь существует, не удалён, ему был начислен бейдж (или он уже был начислен ранее)

    • error

      • "User not found" – если пользователь не существует или удалён

      • "User already has a higher grade badge, remove it first" – если у пользователю пытаются назначить многоуровневый бейдж более низкого уровня при наличии у него более высокого

      • null – для статуса true, при успешном начислении бейджа

Возвращается, если бейдж существует и может быть назначен пользователям

{ "result" : true, "data" : [ { "id" : "example@mail.com", "success" : true, "error" : null }, { "id" : "example1@mail.com", "success" : false, "error" : "User not found" } ] }

В случае неудачного запроса (400), т.е. при попытке назначить пользователям бейдж, который нельзя назначить, или при отсутствии обязательного параметра (идентификаторов пользователей), возвращается ответ, в котором перечисляются все ошибки в виде объектов в массиве errors с сообщением об ошибке и указанием на элемент, в котором возникла ошибка.

В зависимости от конкретной ошибки, message может отличаться.

Возможные ошибки:

  • Обязательный параметр не заполнен или заполнен некорректно

    • "message": "Required parameters are not filled in",

    • "cause" : "userId"

  • Бейдж не существует или удалён

    • "message": "Badge not found",

    • "cause" : "badgeId"

  • Бейдж неактивен

    • "message": "An inactive badge cannot be assigned",

    • "cause" : "badgeId"

  • Бейдж является системным

    • "message": "A system badge cannot be assigned",

    • "cause" : "badgeId"

  • Бейдж является родительским для многоуровневого бейджа

    • "message": "Select the badge grade for the assignment",

    • "cause" : "badgeId"

{ "errors": [ { “message”: “Required parameters are not filled in“, “cause” : “User ID is required“ }, { “message”: “An inactive badge cannot be assigned“, “cause” : “98“ } ] }

Возвращается в случае отсутствия или некорректного публичного ключа API при запросе

{ "result": false, "message": "Invalid public API token" }

Снятие бейджа с пользователя

Бейдж снимается с пользователя, если:

  • Пользователь существует и не удален, статус активности пользователя не важен

  • Бейдж не является системным

Если бейдж существует и может быть снят (не системный), запрос считается успешным, даже если были найдены не все пользователи из запроса. По каждому пользователю приходит информация со статусом снятия бейджа для него.

Если снимаемый бейдж относится к многоуровневому бейджу, бейджи другого уровня при снятии не назначаются.

Чтобы снять бейдж пользователю, нужно сделать POST запрос на адрес:

  • post /public/api/v1/badge/{badgeId}/remove
    в {badgeId} должен передаваться ID бейджа, который необходимо снять с пользователя или с пользователей

В body запроса нужно отправить обязательный JSON объект userId, в котором перечислены уникальные идентификаторы пользователей (массив, должны совпадать c выбранным уникальным идентификатором на платформе)

Пример:

{ "userId": [ "example@example.ru", "example2@example.ru", "example3@example.ru" ] }

В случае успешного запроса (200) в ответ придёт JSON объект со следующими полями:

  • result – значение true

  • data – массив данных по каждому пользователю, который был передан в запросе:

    • id – идентификатор пользователя

    • success

      • false – если пользователь не существует или удалён, и с него не был снят бейдж

      • true – если пользователь существует, не удалён, бейдж был с него снят (или этого бейджа у него и не было)

    • error

      • "User not found" – если пользователь не существует или удалён

      • null – для статуса true, при успешном снятии бейджа

Возвращается, если бейдж существует и может быть снят у пользователей администратором.

{ "result" : true, "data" : [ { "id" : "example@mail.com", "success" : true, "error" : null }, { "id" : "example1@mail.com", "success" : false, "error" : "User not found" } ] }

В случае неудачного запроса (400), т.е. при попытке снять с пользователей бейдж, который нельзя снять, или при отсутствии обязательного параметра (идентификаторов пользователей), возвращается ответ, в котором перечисляются все ошибки в виде объектов в массиве errors с сообщением об ошибке и указанием на элемент, в котором возникла ошибка.

В зависимости от конкретной ошибки, message может отличаться.

Возможные ошибки:

  • Обязательный параметр не заполнен или заполнен некорректно

    • "message": "Required parameters are not filled in",

    • "cause" : "userId"

  • Бейдж не существует или удалён

    • "message": "Badge not found",

    • "cause" : "badgeId"

  • Бейдж неактивен

    • "message": "An inactive badge cannot be assigned",

    • "cause" : "badgeId"

  • Бейдж является системным

    • "message": "A system badge cannot be assigned",

    • "cause" : "badgeId"

  • Бейдж является родительским для многоуровневого бейджа

    • "message": "Select the badge grade for the assignment",

    • "cause" : "badgeId"

{ "errors": [ { “message”: “Required parameters are not filled in“, “cause” : “User ID is required“ }, { “message”: “An inactive badge cannot be assigned“, “cause” : “98“ } ] }

Возвращается в случае отсутствия или некорректного публичного ключа API при запросе

{ "result": false, "message": "Invalid public API token" }

План развития

Получение информации о текущем состоянии целей пользователя

Чтобы получить информацию о текущем состоянии целей пользователя, нужно сделать GET запрос на адрес:

  • GET /public/api/v1/goals/user/{userId}(?type=active|completed|all)
    в адресе метода должны быть указаны следующие параметры:

    • userId – уникальный идентификатор пользователя, должен совпадать c выбранным уникальным идентификатором на платформе, STRING. Обязательный параметр

    • type – тип цели, информацию по которой надо вернуть. Необязательный параметр, при отсутствии возвращаются все цели пользователя. Возможные значения:

      • active – все незавершённые цели пользователя (значения completedAt и completedBy в базе данных Null)

      • completed – все завершённые цели пользователя

      • all – все цели пользователя (кроме удалённых)

В случае успешного запроса (200) в ответ придёт JSON со следующими параметрами:

  • result – должно вернуться значение true

  • items – массив всех целей пользователя указанного типа. Может вернуться пустой массив, если у пользователя нет неудалённых целей

    • id – уникальный идентификатор цели, по которому можно обратиться к ней для изменения, STRING

    • title – название цели, STRING

    • value – целевое значение цели, INT

    • progress – текущее значение цели, INT

    • priority – приоритет, установленный для цели, возможные значения - high, medium, low, STRING

    • deadlineAt – дедлайн цели с указанием даты наступления дела в формате ISO 8601 с указанием таймзоны, DATETIME

    • valueUnit – единица измерения значений цели, возможные значения – percents, numbers, roubles, dollars, euros, hours, STRING

    • inRisk – находится ли цель в зоне риска, возможные значение – true или false, boolean. Для ключевых результатов – наследуется из родительской цели

    • approvedAt:

      • Дата и время подтверждения цели в формате ISO 8601 с указанием таймзоны, если руководитель или HR-сотрудник подтвердил цель, DATETIME

      • null – если цель не была подтверждена руководителем или HR-сотрудником

      • Для ключевых результатов – наследуется из родительской цели

    • approvedById:

      • Идентификатор сотрудника, который подтвердил цель, если она подтверждена, STRING

      • null – если цель не была подтверждена руководителем или HR-сотрудником

      • Для ключевых результатов – наследуется из родительской цели

    • completedAt:

      • Дата и время завершения цели в формате ISO 8601 с указанием таймзоны, если цель завершена, DATETIME

      • null – если цель не завершена

      • Для ключевых результатов – наследуется из родительской цели

    • completedById:

      • Идентификатор сотрудника, который завершил цель, если она завершена, STRING

      • null – если цель не была завершена

      • Для ключевых результатов – наследуется из родительской цели

    • keyResults:

      • Массив всех ключевых результатов, если они заданы. Структура каждого элемента массива результатов повторяет структуру элемента массива цели

      • null – если для цели не заданы ключевые результаты или цель сама является ключевым результатом

  • limit – максимальное количество активных целей, которое может быть создано для одного пользователя

  • countActive – количество текущих активных целей пользователя. Значение должно возвращаться даже если в запросе запрашивается информация только по завершённым целям пользователя.

{ "result" : true, "items": [ { "id": 119, "title": "Первая цель", "value": 150, "progress": 81, "priority": "medium", "deadlineAt": "2023-10-25T00:00:00+03:00", "valueUnit": "roubles", "inRisk": true, "approvedAt": null, "approvedById": null, "completedAt": null, "completedById": null, "keyResults": null }, { "id": 121, "title": "Вторая цель", "value": 100, "progress": 0, "priority": "medium", "deadlineAt": "2023-11-30T00:00:00+03:00", "valueUnit": "percents", "inRisk": true, "approvedAt": null, "approvedById": null, "completedAt": null, "completedById": null, "keyResults": [ { "id": 122, "title": "Первый результат", "value": 50, "progress": 0, "priority": "medium", "deadlineAt": "2023-11-30T00:00:00+03:00", "valueUnit": "percents", "inRisk": false, "approvedAt": null, "approvedById": null, "completedAt": null, "completedById": null, "keyResults": null }, { "id": 123, "title": "Второй результат", "value": 80, "progress": 0, "priority": "medium", "deadlineAt": "2023-11-30T00:00:00+03:00", "valueUnit": "percents", "inRisk": false, "approvedAt": null, "approvedById": null, "completedAt": null, "completedById": null, "keyResults": null } ] } ], "limit": 10, "countActive": 2 }

Возвращается в случае попытки получить информацию по удалённому или отсутствующему пользователю или некорректного заполнения необязательного параметра. Все ошибки перечисляются как объекты в массиве с сообщением об ошибке и указанием на элемент, в котором возникла ошибка.

В зависимости от конкретной ошибки, message может отличаться.

{ "result" : false, "errors": [ { “message”: “Invalid user id“, “cause” : “userId“ }, { “message”: “Incorrect value of type“, “cause” : “type“} ] }

Возвращается в случае отсутствия или некорректного публичного ключа API при запросе

{ "result": false, "message": "Invalid public API token" }

Cоздания новых целей для пользователей

Цель должна создаваться, если:

  • Количество активных целей указанного пользователя < лимита целей

  • Все параметры заполнены корректно

Если хотя бы одно из этих условий не выполняется, цель не должна создаваться, возвращается ошибка

Чтобы создать новую цель для пользователя, нужно сделать POST запрос на адрес:

  • post /public/api/v1/goals/user/{userId}
    в адресе метода должен быть указан параметр userId – уникальный идентификатор пользователя, должен совпадать c выбранным уникальным идентификатором на платформе, STRING. Обязательный параметр

В body запроса нужно отправить обязательный JSON, каждый элемент которого должен содержать следующие параметры:

Если для одного пользователя необходимо создать несколько целей, необходимо перечислять их в массиве отдельными элементами.

  • authorId – уникальный идентификатор пользователя, от имени которого должна быть создана цель, STRING. Обязательный параметр. Возможные значения:

    • Совпадает с userId, если цель должна быть создана от имени пользователя

    • Совпадает с id руководителя пользователя или пользователя с разрешением План развития \ Управление целями и планами. Если цель создаётся от руководителя или пользователя с указанным разрешением, она сразу должна создаваться подтверждённой

  • title – название цели, STRING, до 3000 символов. Обязательный параметр

  • value – целевое значение цели, целое положительное число больше 0, до 10 символов, INTEGER

    • Обязательное, если для цели нет ключевых значений

    • null, если для цели есть ключевые значения

    • Другие значения value для цели будут игнорироваться, для цели устанавливается значение 100

  • valueUnit – единица измерения значений цели, возможные значения – percents, numbers, roubles, dollars, euros, hours, STRING

    • Обязательное, если для цели нет ключевых значений.

    • null, если для цели есть ключевые значения

    • Другие значения valueUnit для цели будут игнорируется, для цели устанавливается значение percents

  • priority – приоритет цели, возможные значения - high, medium, low, STRING. Обязательный параметр

  • deadlineAt – дедлайн цели в формате ISO 8601 с указанием таймзоны, должен быть больше текущего дня, DATETIME. Обязательный параметр. Время учитывается только для выставление корректной даты в соответствии с таймзонами, все уведомления о дедлайнах будут отправляться пользователю относительно 00:00 указанной даты.

  • keyResults – массив объектов для указания ключевых результатов цели. Обязательный:

    • null, если для цели не должны быть заданы ключевые параметры

    • Если передаётся массив, то для каждого элемента массива должны быть указаны следующие параметры (требования к ним см. выше):

      • title

      • value

      • valueUnit

[ { "authorId": "example@example.ru", "title": "Новая цель", "value": 100, "valueUnit": "percents", "priority": "low", "deadlineAt": "2024-12-11T00:00:00+03:00", "keyResults":[ { "title": "Первый результат", "value": 50, "valueUnit": "dollars" }, { "title": "Второй результат", "value": 150, "valueUnit": "euros" } ] }, { "authorId": "example2@example.ru", "title": "Другая цель", "value": 300, "valueUnit": "hours", "priority": "medium", "deadlineAt": "2024-10-11T00:00:00+03:00", "keyResults": null } ]

В случае успешного запроса (200) в ответ придёт JSON со следующими полями:

  • result – должно вернуться значение true

  • userId – идентификатор пользователя, для которого производились изменения

  • data – массив данных по каждому элементу, который был передан в запросе:

    • success:

      • true, если цель была успешно создана

      • false, если цель не удалось создать

    • goalnull, если цель не была создана, иначе массив всех созданных целей пользователя:

      • id – уникальный идентификатор цели, по которому можно обратиться к ней для изменения, STRING

      • title – название цели, STRING

      • value – целевое значение цели, INT

      • progress – текущее значение цели, INT

      • priority – приоритет, установленный для цели, возможные значения - high, medium, low, STRING

      • deadlineAt – дедлайн цели с указанием даты наступления дела в формате ISO 8601 с указанием таймзоны, DATETIME

      • valueUnit – единица измерения значений цели, возможные значения – percents, numbers, roubles, dollars, euros, hours, STRING

      • inRisk – находится ли цель в зоне риска, возможные значение – true или false, boolean. Для ключевых результатов – наследуется из родительской цели

      • approvedAt:

        • Дата и время подтверждения цели в формате ISO 8601 с указанием таймзоны, если руководитель или HR-сотрудник подтвердил цель, DATETIME

        • null – если цель не была подтверждена руководителем или HR-сотрудником

        • Для ключевых результатов – наследуется из родительской цели

      • approvedById:

        • Идентификатор сотрудника, который подтвердил цель, если она подтверждена, STRING

        • null – если цель не была подтверждена руководителем или HR-сотрудником

        • Для ключевых результатов – наследуется из родительской цели

      • completedAt:

        • Дата и время завершения цели в формате ISO 8601 с указанием таймзоны, если цель завершена, DATETIME

        • null – если цель не завершена

        • Для ключевых результатов – наследуется из родительской цели

      • completedById:

        • Идентификатор сотрудника, который завершил цель, если она завершена, STRING

        • null – если цель не была завершена

        • Для ключевых результатов – наследуется из родительской цели

      • keyResults:

        • Массив всех ключевых результатов, если они заданы. Структура каждого элемента массива результатов повторяет структуру элемента массива цели

        • null – если для цели не заданы ключевые результаты или цель сама является ключевым результатом

    • errorsnull, если цель была создана успешно, массив ошибок, если цель создать не удалось. Возможные ошибки:

      • Обязательный параметр не заполнен или заполнен некорректно (если таких параметров несколько, по каждому должна вернуться своя ошибка. Для ошибки параметра внутри ключевого результата должен возвращаться путь до параметра внутри структуры в JSON в формате keyResults.0.title)

        • "message": "Required parameters are not filled in",

        • "cause" : "идентификатор_параметра"
          Например:

          • Если в поле deadlineAt некорректные данные (не тот формат, дата в прошлом)

            • "message": "Invalid date. You can only specify the current and future date"

            • "cause": "deadlineAt"

          • Если в поле priority некорректные данные

            • "message": "Invalid value. Allowed values: high, medium, low"

            • "cause": "priority"

          • Если в поле value = 0

            • "message": "Invalid value. Value should be greater than 0"

            • "cause": "keyResults[0].value"

          • Если в поле value или keyResults[0].value больше 10 символов

            • "message": "Value is too long. Allowed length 10 characters"

            • "cause": "value"

      • Пользователь (userId или authorId) деактивирован, не существует или удалён:

        • "message": "User not found",

        • "cause" : "userId или authorId"

      • Лимит целей для пользователя достигнут, новые цели создать нельзя:

        • "message": "Goal limit reached",

        • "cause" : "значение_limit"

      • В качестве автора указан пользователь, который не может создавать цели данному сотруднику:

        • "message": "Author has no rights to create goals",

        • "cause" : "authorId"

Возвращается, если структура запроса корректная и элементы массива могут быть обработаны системой

{ "result" : true, "userId" : "example@mail.com", "data" : [ { "success" : true, "goal": [ { "id": 119, "title": "Первая цель", "value": 150, "progress": 81, "priority": "medium", "deadlineAt": "2023-10-25T00:00:00+03:00", "valueUnit": "roubles", "inRisk": true, "approvedAt": null, "approvedById": null, "completedAt": null, "completedById": null, "keyResults": null }, { "id": 121, "title": "Вторая цель", "value": 100, "progress": 0, "priority": "medium", "deadlineAt": "2023-11-30T00:00:00+03:00", "valueUnit": "percents", "inRisk": true, "approvedAt": null, "approvedById": null, "completedAt": null, "completedById": null, "keyResults": [ { "id": 122, "title": "Первый результат", "value": 50, "progress": 0, "priority": "medium", "deadlineAt": "2023-11-30T00:00:00+03:00", "valueUnit": "percents", "inRisk": false, "approvedAt": null, "approvedById": null, "completedAt": null, "completedById": null, "keyResults": null }, { "id": 123, "title": "Второй результат", "value": 80, "progress": 0, "priority": "medium", "deadlineAt": "2023-11-30T00:00:00+03:00", "valueUnit": "percents", "inRisk": false, "approvedAt": null, "approvedById": null, "completedAt": null, "completedById": null, "keyResults": null } ], "errors" : null }, { "success" : false, "goal": null, "errors": [ { “message”: “Required parameters are not filled in“, “cause” : “title“ }, { “message”: “Goal limit reached“, “cause” : “10“} ] } ] }

Возвращается в случае некорректного формата запроса, который не может быть обработан (пустой запрос, отдельные значения вне массива данных, объект содержит свойства, которые сервер не ожидает)

Возможные ошибки:

  • Если в запросе на создание цели был передан массив объектов и при валидации структуры каждого объекта произошла ошибка или объект содержит свойства, которые сервер не ожидает

    • "message": "Invalid request format. Unexpected properties: <список неизвестных свойств через запятую>"

{ "result": false, "message": "Required parameters are not filled in" }

Возвращается в случае отсутствия или некорректного публичного ключа API при запросе

{ "result": false, "message": "Invalid public API token" }

Изменение созданной цели пользователя

Изменения доступны только для незавершённой и неудалённой цели и контрольного значения

Чтобы изменить созданную цель пользователя, нужно сделать PUT запрос на адрес:

  • pUt /public/api/v1/goals/{goalId}
    в адресе метода должен быть указан параметр goalId – уникальный идентификатор цели, должен совпадать c выбранным уникальным идентификатором на платформе, STRING. Обязательный параметр

В body запроса нужно отправить обязательный JSON, каждый элемент которого должен содержать следующие параметры:

  • authorId – уникальный идентификатор пользователя, от имени которого должна быть изменена цель, STRING. Обязательный параметр. Возможные значения:

    • Совпадает с id пользователя, цель которого редактируется. Изменения будут применены только для неподтверждённых целей

    • Совпадает с id руководителя пользователя или пользователя с разрешением План развития \ Управление целями и планами

  • title – название цели, STRING, до 3000 символов:

    • Новое значение, если title необходимо изменить

    • null, если title менять не нужно

  • value – целевое значение цели, целое положительное число больше 0, до 10 символов, INTEGER

    • Новое значение, если value необходимо изменить

    • null, если value менять не нужно или для цели есть ключевые значения

    • Если для цели есть ключевые значения, указанные значения игнорируются

  • progress – текущее значение цели, которое необходимо установить. Целое положительное число больше 0, INTEGER

    • Новое значение, если progress необходимо изменить

    • null, если progress менять не нужно или для цели есть ключевые значения

    • Если для цели есть ключевые значения, указанные значения игнорируются

  • valueUnit – единица измерения значений цели, возможные значения – percents, numbers, roubles, dollars, euros, hours, STRING

    • Новое значение, если valueUnit необходимо изменить

    • null, если valueUnit менять не нужно или для цели есть ключевые значения

    • Если для цели есть ключевые значения, указанные значения игнорируются

  • priority – приоритет цели, возможные значения – high, medium, low, STRING

    • Новое значение, если priority необходимо изменить

    • null, если priority менять не нужно или для цели, которая является ключевым значением

    • Если для цель является ключевым значением, указанные значения игнорируются

  • deadlineAt – дедлайн цели в формате ISO 8601 с указанием таймзоны, должен быть больше текущего дня, DATETIME

    • Новое значение, если deadlineAt необходимо изменить

    • null, если deadlineAt менять не нужно или для цели является ключевым значением

    • Если для цель является ключевым значением, указанные значения игнорируются

  • keyResults – массив объектов для указания ключевых результатов цели. Необходим если нужно добавить в цель новые ключевые результаты. Если необходимо отредактировать созданные ключевые результаты, необходимо обращаться к ним по goalId. Игнорируется для ключевых результатов цели

    • null, если в цель не надо добавлять ключевые значения

    • Если заполнен, то для каждого элемента массива должны быть указаны следующие параметры (требования к ним см. выше):

      • title

      • value

      • valueUnit

{ "authorId": "example2@example.ru", "title": null, "value": null, "progress": null, "valueUnit": null, "priority": "high", "deadlineAt": null, "keyResults":[ { "title": "Третий результат", "value": 50, "valueUnit": "dollars" }, { "title": "Четвёртый результат", "value": 150, "valueUnit": "euros" } ] }

В случае успешного запроса (200) в ответ придёт JSON со следующими полями:

  • result – должно вернуться значение true

  • goal :

    • id – уникальный идентификатор цели, STRING

    • title – название цели, STRING

    • value – целевое значение цели, INT

    • progress – текущее значение цели, INT

    • priority – приоритет, установленный для цели, возможные значения - high, medium, low, STRING

    • deadlineAt – дедлайн цели с указанием даты наступления дела в формате ISO 8601 с указанием таймзоны, DATETIME

    • valueUnit – единица измерения значений цели, возможные значения – percents, numbers, roubles, dollars, euros, hours, STRING

    • inRisk – находится ли цель в зоне риска, возможные значение – true или false, boolean. Для ключевых результатов – наследуется из родительской цели

    • approvedAt:

      • Дата и время подтверждения цели в формате ISO 8601 с указанием таймзоны, если руководитель или HR-сотрудник подтвердил цель, DATETIME

      • null – если цель не была подтверждена руководителем или HR-сотрудником

      • Для ключевых результатов – наследуется из родительской цели

    • approvedById:

      • Идентификатор сотрудника, который подтвердил цель, если она подтверждена, STRING

      • null – если цель не была подтверждена руководителем или HR-сотрудником

      • Для ключевых результатов – наследуется из родительской цели

    • completedAt:

      • Дата и время завершения цели в формате ISO 8601 с указанием таймзоны, если цель завершена, DATETIME

      • null – если цель не завершена

      • Для ключевых результатов – наследуется из родительской цели

    • completedById:

      • Идентификатор сотрудника, который завершил цель, если она завершена, STRING

      • null – если цель не была завершена

      • Для ключевых результатов – наследуется из родительской цели

    • keyResults:

      • Массив всех ключевых результатов, если они заданы. Структура каждого элемента массива результатов повторяет структуру элемента массива цели

      • null – если для цели не заданы ключевые результаты или цель сама является ключевым результатом

Возвращается, если структура запроса корректная и цель была изменена.

В ответе должна быть указана информация об изменённой цели. Для каждого элемента должно отображаться его актуальное значение (новое - если было успешно изменено, старое - если в запросе не было отправлено новое значение для элемента)

{ "result": true, "goal": { "id": 121, "title": "Вторая цель", "value": 100, "progress": 0, "priority": "medium", "deadlineAt": "2023-11-30T00:00:00+03:00", "valueUnit": "percents", "inRisk": true, "approvedAt": null, "approvedById": null, "completedAt": null, "completedById": null, "keyResults": [ { "id": 122, "title": "Первый результат", "value": 50, "progress": 0, "priority": "medium", "deadlineAt": "2023-11-30T00:00:00+03:00", "valueUnit": "percents", "inRisk": false, "approvedAt": null, "approvedById": null, "completedAt": null, "completedById": null, "keyResults": null }, { "id": 123, "title": "Второй результат", "value": 80, "progress": 0, "priority": "medium", "deadlineAt": "2023-11-30T00:00:00+03:00", "valueUnit": "percents", "inRisk": false, "approvedAt": null, "approvedById": null, "completedAt": null, "completedById": null, "keyResults": null } ] } }

Возвращается в случае если цель не может быть изменена: структура запроса некорректная, цель не существует, завершена или удалена, относится к удалённому пользователю, пользователь с authorId не существует, удалён или не может править указанную цель, формат параметров некорректный. Возвращается массив с ошибками.

Возможные ошибки:

  • Обязательный параметр не заполнен или заполнен некорректно (если таких параметров несколько, по каждому должна вернуться своя ошибка. Для ошибки параметра внутри ключевого результата должен возвращаться путь до параметра внутри структуры в JSON в формате keyResults.0.title)

    • "message": "Required parameters are not filled in",

    • "cause" : "идентификатор_параметра"

  • Пользователь (authorId) не существует или удалён:

    • "message": "User not found",

    • "cause" : "authorId"

  • В качестве автора указан пользователь, который не может редактировать цели данному сотруднику:

    • "message": "Author has no rights to edit goals",

    • "cause" : "authorId"

  • Цель не найдена, завершена или удалена, относится к удалённому пользователю:

    • "message": "Goal is not found or cannot be edited",

    • "cause" : "goalId"

{ "result": false, "errors": [ { “message”: “Required parameters are not filled in“, “cause” : “title“ } ] }

Возвращается в случае отсутствия или некорректного публичного ключа API при запросе

{ "result": false, "message": "Invalid public API token" }

Подтверждение цели пользователя

Можно подтвердить только неподтвержденную, незавершённую и неудалённую цель неудалённого пользователя

Чтобы подтвердить цель, нужно сделать POST запрос на адрес:

  • post /public/api/v1/goals/{goalId}/approve
    в адресе метода должен быть указан параметр goalId – уникальный идентификатор цели, должен совпадать c выбранным уникальным идентификатором на платформе, STRING. Обязательный параметр

В body запроса нужно отправить обязательный JSON, который содержит следующий параметр:

  • authorId – уникальный идентификатор пользователя, от имени которого должна быть подтверждена цель, STRING. Обязательный параметр. Должен совпадать с id руководителя пользователя или пользователя с разрешением План развития \ Управление целями и планами.

{ "authorId": "example2@example.ru" }

В случае успешного запроса (200) в ответ придёт JSON со следующими полями:

  • result – должно вернуться значение true

  • goal :

    • id – уникальный идентификатор цели, STRING

    • title – название цели, STRING

    • value – целевое значение цели, INT

    • progress – текущее значение цели, INT

    • priority – приоритет, установленный для цели, возможные значения - high, medium, low, STRING

    • deadlineAt – дедлайн цели с указанием даты наступления дела в формате ISO 8601 с указанием таймзоны, DATETIME

    • valueUnit – единица измерения значений цели, возможные значения – percents, numbers, roubles, dollars, euros, hours, STRING

    • inRisk – находится ли цель в зоне риска, возможные значение – true или false, boolean. Для ключевых результатов – наследуется из родительской цели

    • approvedAt:

      • Дата и время подтверждения цели в формате ISO 8601 с указанием таймзоны, если руководитель или HR-сотрудник подтвердил цель, DATETIME

      • null – если цель не была подтверждена руководителем или HR-сотрудником

      • Для ключевых результатов – наследуется из родительской цели

    • approvedById:

      • Идентификатор сотрудника, который подтвердил цель, если она подтверждена, STRING

      • null – если цель не была подтверждена руководителем или HR-сотрудником

      • Для ключевых результатов – наследуется из родительской цели

    • completedAt:

      • Дата и время завершения цели в формате ISO 8601 с указанием таймзоны, если цель завершена, DATETIME

      • null – если цель не завершена

      • Для ключевых результатов – наследуется из родительской цели

    • completedById:

      • Идентификатор сотрудника, который завершил цель, если она завершена, STRING

      • null – если цель не была завершена

      • Для ключевых результатов – наследуется из родительской цели

    • keyResults:

      • Массив всех ключевых результатов, если они заданы. Структура каждого элемента массива результатов повторяет структуру элемента массива цели

      • null – если для цели не заданы ключевые результаты или цель сама является ключевым результатом

Возвращается, если структура запроса корректная и цель была подтверждена.

{ "result": true, "goal": { "id": 121, "title": "Вторая цель", "value": 100, "progress": 0, "priority": "medium", "deadlineAt": "2023-11-30T00:00:00+03:00", "valueUnit": "percents", "inRisk": true, "approvedAt": null, "approvedById": null, "completedAt": null, "completedById": null, "keyResults": [ { "id": 122, "title": "Первый результат", "value": 50, "progress": 0, "priority": "medium", "deadlineAt": "2023-11-30T00:00:00+03:00", "valueUnit": "percents", "inRisk": false, "approvedAt": null, "approvedById": null, "completedAt": null, "completedById": null, "keyResults": null }, { "id": 123, "title": "Второй результат", "value": 80, "progress": 0, "priority": "medium", "deadlineAt": "2023-11-30T00:00:00+03:00", "valueUnit": "percents", "inRisk": false, "approvedAt": null, "approvedById": null, "completedAt": null, "completedById": null, "keyResults": null } ] } }

Возвращается в случае если цель не может быть подтверждена: структура запроса некорректная, цель не существует, завершена или удалена, относится к удалённому пользователю, пользователь с authorId не существует, удалён или не может править указанную цель, цель уже была подтверждена ранее. Возвращается массив с ошибками.

Возможные ошибки:

  • Пользователь (authorId) не существует или удалён:

    • "message": "User not found",

    • "cause" : "authorId"

  • В качестве автора указан пользователь, который не может редактировать цели данному сотруднику:

    • "message": "Author has no rights to edit goals",

    • "cause" : "authorId"

  • Цель не найдена, завершена или удалена, относится к удалённому пользователю:

    • "message": "Goal is not found or cannot be approved",

    • "cause" : "goalId"

  • Цель уже была подтверждена:

    • "message": "Goal is already approved",

    • "cause" : "goalId"

{ "result": false, "errors": [ { “message”: “Author has no rights to edit goals“, “cause” : “authorId“ } ] }

Возвращается в случае отсутствия или некорректного публичного ключа API при запросе

{ "result": false, "message": "Invalid public API token" }

Завершение цели пользователя

Можно завершить только незавершённую и неудалённую цель неудалённого пользователя

Чтобы завершить цель, нужно сделать POST запрос на адрес:

  • post /public/api/v1/goals/{goalId}/complete
    в адресе метода должен быть указан параметр goalId – уникальный идентификатор цели, должен совпадать c выбранным уникальным идентификатором на платформе, STRING. Обязательный параметр

В body запроса нужно отправить обязательный JSON, который содержит следующий параметр:

  • authorId – уникальный идентификатор пользователя, от имени которого должна быть завершена цель, STRING. Обязательный параметр. Должен совпадать с id руководителя пользователя или пользователя с разрешением План развития \ Управление целями и планами.

{ "authorId": "example2@example.ru" }

В случае успешного запроса (200) в ответ придёт JSON со следующими полями:

  • result – должно вернуться значение true

  • goal :

    • id – уникальный идентификатор цели, STRING

    • title – название цели, STRING

    • value – целевое значение цели, INT

    • progress – текущее значение цели, INT

    • priority – приоритет, установленный для цели, возможные значения - high, medium, low, STRING

    • deadlineAt – дедлайн цели с указанием даты наступления дела в формате ISO 8601 с указанием таймзоны, DATETIME

    • valueUnit – единица измерения значений цели, возможные значения – percents, numbers, roubles, dollars, euros, hours, STRING

    • inRisk – находится ли цель в зоне риска, возможные значение – true или false, boolean. Для ключевых результатов – наследуется из родительской цели

    • approvedAt:

      • Дата и время подтверждения цели в формате ISO 8601 с указанием таймзоны, если руководитель или HR-сотрудник подтвердил цель, DATETIME

      • null – если цель не была подтверждена руководителем или HR-сотрудником

      • Для ключевых результатов – наследуется из родительской цели

    • approvedById:

      • Идентификатор сотрудника, который подтвердил цель, если она подтверждена, STRING

      • null – если цель не была подтверждена руководителем или HR-сотрудником

      • Для ключевых результатов – наследуется из родительской цели

    • completedAt:

      • Дата и время завершения цели в формате ISO 8601 с указанием таймзоны, если цель завершена, DATETIME

      • null – если цель не завершена

      • Для ключевых результатов – наследуется из родительской цели

    • completedById:

      • Идентификатор сотрудника, который завершил цель, если она завершена, STRING

      • null – если цель не была завершена

      • Для ключевых результатов – наследуется из родительской цели

    • keyResults:

      • Массив всех ключевых результатов, если они заданы. Структура каждого элемента массива результатов повторяет структуру элемента массива цели

      • null – если для цели не заданы ключевые результаты или цель сама является ключевым результатом

Возвращается, если структура запроса корректная и цель была завершена

{ "result": true, "goal": { "id": 121, "title": "Вторая цель", "value": 100, "progress": 0, "priority": "medium", "deadlineAt": "2023-11-30T00:00:00+03:00", "valueUnit": "percents", "inRisk": true, "approvedAt": null, "approvedById": null, "completedAt": null, "completedById": null, "keyResults": [ { "id": 122, "title": "Первый результат", "value": 50, "progress": 0, "priority": "medium", "deadlineAt": "2023-11-30T00:00:00+03:00", "valueUnit": "percents", "inRisk": false, "approvedAt": null, "approvedById": null, "completedAt": null, "completedById": null, "keyResults": null }, { "id": 123, "title": "Второй результат", "value": 80, "progress": 0, "priority": "medium", "deadlineAt": "2023-11-30T00:00:00+03:00", "valueUnit": "percents", "inRisk": false, "approvedAt": null, "approvedById": null, "completedAt": null, "completedById": null, "keyResults": null } ] } }

Возвращается в случае если цель не может быть завершена: структура запроса некорректная, цель не существует или удалена, относится к удалённому пользователю, пользователь с authorId не существует, удалён или не может править указанную цель, цель уже была завершена ранее. Возвращается массив с ошибками.

Возможные ошибки:

  • Пользователь (authorId) не существует или удалён:

    • "message": "User not found",

    • "cause" : "authorId"

  • В качестве автора указан пользователь, который не может редактировать цели данному сотруднику:

    • "message": "Author has no rights to complete goals",

    • "cause" : "authorId"

  • Цель не найдена, завершена или удалена, относится к удалённому пользователю:

    • "message": "Goal is not found or cannot be completed",

    • "cause" : "goalId"

  • Цель уже была завершена:

    • "message": "Goal is already completed",

    • "cause" : "goalId"

{ "result": false, "errors": [ { “message”: “Author has no rights to complete goals“, “cause” : “authorId“ } ] }

Возвращается в случае отсутствия или некорректного публичного ключа API при запросе

{ "result": false, "message": "Invalid public API token" }

Удаление созданной цели пользователя

Действие не может быть отменено. Если ключевой результат или цель были удалены некорректно, необходимо будет создавать новый ключевой результат или цель, восстановить удалённые результаты и цели нельзя

Изменения доступны только для незавершённой и неудалённой цели, но руководитель и пользователь с разрешением План развития \ Управление целями и планами могут удалить завершенную цель

Чтобы удалить цель, нужно сделать POST запрос на адрес:

  • post /public/api/v1/goals/{goalId}/delete
    в адресе метода должен быть указан параметр goalId – уникальный идентификатор цели, должен совпадать c выбранным уникальным идентификатором на платформе, STRING. Обязательный параметр

В body запроса нужно отправить обязательный JSON, который содержит следующий параметр:

  • authorId – уникальный идентификатор пользователя, от имени которого должна быть удалена цель, STRING. Обязательный параметр. Должен совпадать с id руководителя пользователя или пользователя с разрешением План развития \ Управление целями и планами.

{ "authorId": "example2@example.ru" }

В случае успешного запроса (200) в ответ придёт JSON со следующими полями:

  • result – должно вернуться значение true

  • message – сообщение об успешном удалении цели

Возвращается, если структура запроса корректная, цель существует и пользователь с authorId существует, не удалён и может править указанную цель.

{ "result": true, "message": "Goal has been deleted" }

Возвращается в случае если структура запроса некорректная, цель не существует, завершена или удалена, относится к удалённому пользователю, пользователь с authorId не существует, удалён или не может править указанную цель. Возвращается первая найденная ошибка.

В зависимости от конкретной ошибки, message может отличаться.

Возможные ошибки:

  • Пользователь (authorId) не существует или удалён:

    • "message": "User not found",

    • "cause" : "authorId"

  • В качестве автора указан пользователь, который не может редактировать цели данному сотруднику:

    • "message": "Author has no rights to delete goals",

    • "cause" : "authorId"

  • Цель не найдена или относится к удалённому пользователю:

    • "message": "Goal is not found or cannot be deleted",

    • "cause" : "goalId"

{ "result": false, "errors": [ { “message”: “Author has no rights to delete goals“, “cause” : “authorId“ } ] }

Возвращается в случае отсутствия или некорректного публичного ключа API при запросе

{ "result": false, "message": "Invalid public API token" }

Баллы

Изменение баланса баллов пользователя

Баллы пользователя могут быть изменены, если:

  • Пользователь существует и не удалён, статус активности при этом не важен

  • Модуль Каталог призов подключен (для баланса с типом payment) – есть лицензия и она не истекла

  • Соблюдаются ограничения по типу и длине полей

При уменьшении баланса – баланс не уходит в минус

Чтобы изменить баланс баллов пользователя, нужно сделать POST запрос на адрес:

  • POST /public/api/v1/points/
    в заголовках запроса можно передать параметр Locale, который будет использоваться для выбора языка при подстановке формулировки начисления баллов по умолчанию, если в теле запроса не был передан параметр message

В body запроса нужно отправить обязательный JSON массив, который содержит следующие параметры:

  • userId – уникальный идентификатор пользователя, должен совпадать c выбранным уникальным идентификатором на платформе, STRING. Обязательный параметр.

  • balanceType – тип баланса, который необходимо изменить. Допустимые значения: score, karma, payment, STRING. Обязательный параметр.

  • amount – значение, на которое необходимо изменить баланс, целое число, отрицательное или положительное, INT. Обязательный параметр.

  • message – формулировка для отображения в личном кабинете, до 80 символов, STRING. Необязательный параметр. Если параметр не передаётся, используется формулировка по умолчанию на языке, переданном в заголовке или установленном для платформы как язык по умолчанию.

userId может быть одинаковым в нескольких элементах массива. В этом случае для пользователя должны быть последовательно произведены изменения баллов, указанные во всех элементах массива.

Пример:

[ { "userId": "example@example.ru", "balanceType": "karma", "amount": "200", "message": "За активности на субботнике" }, { "userId": "example2@example.ru", "balanceType": "score", "amount": "-200", "message": "За выявленные нарушения при прохождении тестирований" } ]

В случае успешного запроса (200) в ответ придёт JSON со следующими параметрами:

  • result – со значением true

  • data – массив данных по каждому элементу, который был передан в запросе:

    • userId – идентификатор пользователя, для которого производились изменения

    • balanceType – тип баланса, с которым производились изменения

    • success:

      • true если баланс баллов был изменён успешно

      • false если баланс баллов изменить не удалось

    • balance:

      • Значение баланса после изменения, если он был изменён успешно, или его текущее значение, если баланс баллов изменить не удалось

      • null, если пользователь не найден или был указан некорректный balanceType

    • errorsnull, если баланс баллов был изменён успешно, массив ошибок, если баланс баллов изменить не удалось. Возможные ошибки:

      • Пользователь деактивирован, не существует или удалён:

        • "message": "User not found",

        • "cause" : "userId"

      • Обязательный параметр не заполнен или заполнен некорректно (если таких параметров несколько, по каждому должна вернуться своя ошибка):

        • "message": "Required parameters are not filled in",

        • "cause" : "идентификатор_параметра"

      • Значение баланса не является целым числом

        • "message": "The "amount" field must contain an integer value",

        • "cause" : "amount"

      • При попытке вычесть из баланса больше баллов, чем есть у пользователя

        • "message": "Attempting to deduct more than the available points",

        • "cause" : "amount"

      • Тип баланса не совпадает с возможными значениями или в методе указан баланс каталога призов payment при неподключенном модуле Каталог призов

        • "message": "Balance not found",

        • "cause" : "balanceType"

      • Длина формулировки превышает 80 символов

        • "message": "The length of the "message" field cannot exceed 80 characters",

        • "cause" : "message"

Если данные содержат несколько ошибок (например, дробные баллы пытаются начислить несуществующему пользователю в неподключенный баланс), должен отображаться текст, соответствующий первой найденной ошибке.

Возвращается, если структура запроса корректная и элементы массива могут быть обработаны системой

{ "result" : true, "data" : [ { "userId" : "example@mail.com", "balanceType": "karma", "success" : true, "balance": "500", "errors" : null }, { "id" : "example1@mail.com", "balanceType": "score", "success" : false, "balance": "50", "errors" : [ { "message" : "User not found", "cause" : "userId" }, { "message" : "The "amount" field must contain an integer value", "cause" : "amount" }, { "message" : "Balance not found", "cause" : "balanceType" } ] } ] }

Возвращается в случае некорректного формата запроса, который не может быть обработан (пустой запрос, отдельные значения вне массива данных)

{ "result": false, "message": "Required parameters are not filled in" }

Возвращается в случае отсутствия или некорректного публичного ключа API при запросе

{ "result": false, "message": "Invalid public API token" }

Файлы

Скачивание файла по его уникальному идентификатору

Для скачивания файла по его идентификатору, нужно сделать POST запрос на адрес:

  • post /public/api/v1/file/{fileId}
    в адресе метода должен быть указан следующий параметр:

    • fileId – внутренний идентификатор файла, используемого на платформе Мотивити (прикреплённые к заданию, комментарию, записи в пульсе, элементу в библиотеке и пр.), INT

В случае успешного запроса (200) в ответ придёт JSON со следующими параметрами:

  • result – со значением true

  • fileId – идентификатор файла из запроса, INT

  • file – данные файла, STRING

{ "result" : true, "fileId" : 125, "file" : "https://support.motivationportal.ru/file/0/c/8e42c8a.jpg" }

Возвращается в случае попытки получить ссылку для скачивания несуществующего файла

В ответе указываются:

  • result – со значением false

  • message:"File not found"

{ "result": false, “message”: “File not found“ }

Возвращается в случае отсутствия или некорректного публичного ключа API при запросе

{ "result": false, "message": "Invalid public API token" }

Загрузка файла и получение его уникального идентификатора

Для загрузки файла и получения его идентификатора, нужно сделать POST запрос на адрес:

  • post /public/api/v1/file/upload
    В header запроса требуется указать заголовки, где file_name – название файла, file_type – формат файла, например, file=@new.jpg;type=image\jpg:

    Content-Type: multipart/form-data file=@file_name;type=file_type

Ответ будет успешным, если заголовок указан корректно и был передан один файл допустимого формата (bmp, doc, docx, epub, flv, gif, heic, jfi, jfif, jpeg, jpg, jpg_large, m4a, mov, mp4, pdf, png, ppt, pptx, svg, webp, xls, xlsx), размер до 10 Гб

В случае успешного запроса (200) в ответ придёт JSON со следующими параметрами:

  • result – со значением true

  • file – ключ структуры информации о файле со следующими элементами:

    • id – уникальный идентификатор файла, INT

    • name – полное название файла с расширением, STRING

    • size – размер файла в байтах, INT

{ "result" : true, "files" : [ { "id": 1462, "name": "Ответ на вопрос.xls", "size": 95446 } }

Возвращается в случае отсутствия переданного файла или попытке передать более одного файла, попытке загрузить файл недопустимого формата.

В ответе указываются:

  • result – со значением false

  • message - текст возникшей ошибки

В зависимости от конкретной ошибки, message может отличаться.

Возможные ошибки:

  • Отсутствует файл:

    • "message": "File not transmitted. File required"

  • Передано более одного файла:

    • "message": "Only one file allowed"

  • Передан файл в недопустимом формате:

    • "message": "File format not allowed"

  • Передан файл недопустимого размера:

    • "message": "File size not allowed"

{ "result": false, “message”: “File not transmitted. File required“ }

Возвращается в случае отсутствия или некорректного публичного ключа API при запросе

{ "result": false, "message": "Invalid public API token" }

Квесты

Получение информации о заданиях, назначенных на пользователей в рамках квеста

Чтобы получить информацию по заданиям, назначенных на пользователей в рамках необходимого квеста, нужно сделать GET запрос на адрес:

GET /public/api/v1/quest/{questId}/task

  • в адресе метода должен быть указан следующий параметр:

    • questId – уникальный идентификатор неудалённого активного квеста, доступного в публичной части по датам видимости, INT. Обязательный параметр

  • дополнительно в query-параметрах могут быть указаны следующие фильтры:

    • studentId – уникальный идентификатор пользователя, задания которого необходимо вернуть, STRING. Необязательный параметр, при отсутствии возвращаются задания для всех неудалённых активных студентов указанного квеста

    • taskId – уникальный идентификатор задания, информацию по которому необходимо вернуть, INT. Необязательный параметр, при отсутствии возвращаются все задания

    • status – статус задания, информацию по которому надо вернуть. Необязательный параметр, можно передавать массив статусов, при отсутствии должны быть возвращены все задания, назначенные в рамках квеста на неудалённых активных пользователей. Возможные значения:

      • in_progress – работа по заданию не проводилась или задание было переназначено

      • checking – задание отправлено на проверку наставнику

      • redo – задание было возвращено на доработку

      • complete – задание было успешно завершено

      • fail – задание было провалено

    • page – номер страницы с результатами, которую необходимо вернуть. Необязательный параметр, при отсутствии возвращается первая страница, INT

    • pageSize – количество результатов на одной странице, целое значение от 1 до 100, INT. Необязательный параметр, при отсутствии возвращается 20 результатов на странице

В случае успешного запроса (200) в ответ придёт JSON со следующими параметрами:

  • result – со значением true

  • quest – ключ структуры информации по квесту со следующими элементами:

    • id – уникальный идентификатор квеста, INT

    • title – заголовок квеста, STRING

    • textForMentor – текст для наставника, STRING

    • urlForMentor – ссылка для наставника, может быть null, STRING

    • textForStudent – текст для студента, может быть null, STRING

    • previewImage – ключ структуры информации о файле со следующими элементами:

      • id – уникальный идентификатор файла, INT

      • name – полное название файла с расширением, STRING

      • size – размер файла в байтах, INT

    • mentors – массив уникальных идентификатор пользователей, ответственных за квест, может быть null, каждый элемент STRING

    • open – дата начала доступности квеста, может быть null, DATETIME

    • close – дата окончания доступности квеста, может быть null, DATETIME

    • deadlineType – тип дедлайна, возможные значения: 'date' (до определённой даты), 'delay' (спустя установленное количество дней после назначения), 'none' (не установлен)

    • deadlineDelay – количество дней, за которые надо пройти квест после назначения, для delay, иначе null, INT

    • deadlineDate – дата, до которой надо пройти квест, для date, иначе null, DATETIME

    • threshold – порог, за прохождение которого студент получит баллы, может быть null, INT

    • scoreThreshold – количество баллов, которые студент получает при прохождении квеста на пороговом значении, может быть null, INT

    • score – баллы за прохождение квеста на 100 процентов, может быть null, INT

    • certificate – уникальный идентификатор сертификата за прохождение квеста на указанное количество процентов, может быть null, INT

    • certificateCompleted – уникальный идентификатор сертификата за прохождение квеста на 100 процентов, может быть null, INT

    • mentorScore – баллы для наставника за прохождение его студентом квеста на 100 процентов, может быть null, INT

    • scoreInTime – баллы за прохождение квеста в дедлайн, может быть null, INT

    • certificateDeadline – уникальный идентификатор сертификата за прохождение квеста в дедлайн, может быть null, INT

    • quizId – идентификатор прикреплённого опроса, может быть null, INT

  • items – массив всех заданий, которые назначены пользователям в рамках указанного квеста

    • task – ключ структуры информации по заданию со следующими элементами:

      • id – уникальный идентификатор задания, INT

      • title – заголовок задания, STRING

      • summary – краткое описание задания, может быть null, STRING

      • text – полное описание задания, STRING

      • mentorTip – заметки для наставника, может быть null, STRING

      • score – количество баллов за успешное прохождение задания, может быть null, INT

      • previewImage – ключ структуры информации о файле со следующими элементами:

        • id – уникальный идентификатор файла, INT

        • name – полное название файла с расширением, STRING

        • size – размер файла в байтах, INT

      • quizId – идентификатор прикреплённого опроса, может быть null, INT

    • studentId – пользователь, которому было назначено задание в рамках указанного квеста, STRING

    • taskStatus – статус, в котором в настоящий момент находится задание у указанного пользователя. Возможные значения:

      • in_progress – работа по заданию не проводилась или задание было переназначено

      • checking – задание отправлено на проверку наставнику

      • redo – задание было возвращено на доработку

      • complete – задание было успешно завершено

      • fail – задание было провалено

  • pagination – стандартный элемент с данными следующей структуры:

    • currentPage – номер текущей страницы с данными, возвращённой в запросе

    • recordsPerPage – количество записей на странице

    • totalRecords – общее количество записей по запросу с выбранными фильтрами

    • totalPages – общее количество страниц с записями по запросу с выбранными фильтрами

Массив items может вернуться пустым, если:

  • В квесте нет заданий

  • Квест не назначен ни одному активному неудалённому пользователю

  • Нет элементов, соответствующих установленным фильтрам

  • Нет элементов на указанной странице пагинации

Результаты должны сортироваться по возрастанию сначала по идентификатору задания в квесте, затем по идентификатору студента.

{ "result": true, "quest": { "id": 123, "title": "Квест новичка", "textForMentor": "Будьте внимательны и справедливы", "urlForMentor": null, "textForStudent": null, "previewImage": { "id": 5, "name": "cat.jpg", "size": 225 }, "mentors": [ "example@example.ru", "example2@example.ru" ], "open": null, "close": null, "deadlineType": "delay", "deadlineDelay": 10, "deadlineDate": null, "threshold": null, "scoreThreshold": null, "score": 50, "certificate": null, "certificateCompleted": 999, "mentorScore": 10, "scoreInTime": null, "certificateDeadline": null, "quizId": 444 }, "items": [ { "studentId": "example@example.ru", "task":{ "id": 5, "title": "Первое задание новичка", "summary": null, "text": "Напиши свои впечатления о первом рабочем дне", "mentorTip": "Принимаются любые ответы", "score": 5, "previewImage": { "id": 5, "name": "cat.jpg", "size": 225 }, "quizId": 8 }, "taskStatus": "in_progress" }, { "studentId": "example3@example.ru", "task":{ "id": 13, "title": "Восьмое задание новичка", "summary": null, "text": "Расскажи о себе", "mentorTip": "Не забудь про твои хобби и увлечения", "score": 4, "previewImage": { "id": 6, "name": "dog.jpg", "size": 205 }, "quizId": 3 }, "taskStatus": "checking" } ] "pagination": { "currentPage": 1, "recordsPerPage": 20, "totalRecords": 2, "totalPages": 1 } }

Возвращается в случае попытки получить информацию по удалённому, неактивному или отсутствующему квесту или некорректного заполнения необязательного параметра.

В ответе указываются:

  • result – со значением false

  • errors – массив ошибок

Для каждой ошибки указываются message и cause

В зависимости от конкретной ошибки, message может отличаться.

Возможные ошибки:

  • Квест не найден, неактивен или удалён:

    • "message": "Quest not found",

    • "cause" : "QuestId"

  • Задание не найдено, неактивно или удалено:

    • "message": "Task not found",

    • "cause" : "taskId"

  • Пользователь не найден, неактивен или удалён:

    • "message": "User not found",

    • "cause" : "StudentId"

  • Пользователю не назначен квест:

    • "message": "User is not a quest student",

    • "cause" : "StudentId"

  • Необязательный параметр status заполнен некорректно:

    • "message": "Incorrect value of status",

    • "cause" : "Allowed values: in_progress, checking, redo, complete, fail"

  • Необязательный параметр pageSize заполнен некорректно:

    • "message": "Incorrect value of pageSize",

    • "cause" : "Allowed values 1-100"

{ "result": false, "errors": [ { "message”: "Quest not found", "cause” : "questId" }, { "message”: "Incorrect value of status", "cause” : "Allowed values: in_progress, checking, redo, complete, fail" } ] }

Возвращается в случае отсутствия или некорректного публичного ключа API при запросе

{ "result": false, "message": "Invalid public API token" }

Получение информации об ответе пользователя на задание

Чтобы получить информацию об ответе пользователя на конкретное задание в конкретном квесте, нужно сделать GET запрос на адрес:

  • GET /public/api/v1/quest/{questId}/task/{taskId}/student/{studentId}
    в адресе метода должны быть указаны следующие параметры:

    • questId – идентификатор неудалённого активного квеста, доступного в публичной части по датам видимости, в котором находится необходимое задание, INT,

    • studentId – уникальный идентификатор неудалённого активного пользователя, которому назначен квест, STRING,

    • taskId – идентификатор задания, для которого запрашивается информация, INT

Чтобы запрос был выполнен успешно, в указанный квест должно быть добавлено задание с указанными идентификатором, и указанный пользователь должен быть его студентом

В случае успешного запроса (200) в ответ придёт JSON со следующими параметрами:

  • result – со значением true

  • quest – ключ структуры информации по квесту со следующими элементами:

    • id – уникальный идентификатор квеста, INT

    • title – заголовок квеста, STRING

    • textForMentor – текст для наставника, STRING

    • urlForMentor – ссылка для наставника, может быть null, STRING

    • textForStudent – текст для студента, может быть null, STRING

    • previewImage – ключ структуры информации о файле со следующими элементами:

      • id – уникальный идентификатор файла, INT

      • name – полное название файла с расширением, STRING

      • size – размер файла в байтах, INT

    • mentors – массив уникальных идентификатор пользователей, ответственных за квест, может быть null, каждый элемент STRING

    • open – дата начала доступности квеста, может быть null, DATETIME

    • close – дата окончания доступности квеста, может быть null, DATETIME

    • deadlineType – тип дедлайна, возможные значения: 'date' (до определённой даты), 'delay' (спустя установленное количество дней после назначения), 'none' (не установлен)

    • deadlineDelay – количество дней, за которые надо пройти квест после назначения, для delay, иначе null, INT

    • deadlineDate – дата, до которой надо пройти квест, для date, иначе null, DATETIME

    • threshold – порог, за прохождение которого студент получит баллы, может быть null, INT

    • scoreThreshold – количество баллов, которые студент получает при прохождении квеста на пороговом значении, может быть null, INT

    • score – баллы за прохождение квеста на 100 процентов, может быть null, INT

    • certificate – уникальный идентификатор сертификата за прохождение квеста на указанное количество процентов, может быть null, INT

    • certificateCompleted – уникальный идентификатор сертификата за прохождение квеста на 100 процентов, может быть null, INT

    • mentorScore – баллы для наставника за прохождение его студентом квеста на 100 процентов, может быть null, INT

    • scoreInTime – баллы за прохождение квеста в дедлайн, может быть null, INT

    • certificateDeadline – уникальный идентификатор сертификата за прохождение квеста в дедлайн, может быть null, INT

    • quizId – идентификатор прикреплённого опроса, может быть null, INT

  • data:

    • messages – массив ответов на задание (как со стороны студента, так и со стороны его наставника). Если на задание ещё не было дано ни одного ответа, вместо массива возвращается null. Каждый элемент массива должен содержать следующие поля:

      • authorId – уникальный идентификатор пользователя, который оставил сообщение для задания, STRING

      • date – дата и время оставления сообщения, DATETIME

      • text – текст оставленного сообщения, STRING

      • status – статус, в который было переведено задание после отправки сообщения

      • files – массив данных по файлам, прикреплённых к сообщению, или null, если файлы не были прикреплены. Для каждого элемента массива должна быть передана следующая информация:

        • id – идентификатор файла, который можно использовать для его скачивания в отдельном методе, INT

        • name – полное название файла с расширением, STRING

        • size – размер файла в байтах, INT

    • studentId – идентификатор студента из запроса, STRING

    • task – ключ структуры информации по заданию со следующими элементами:

      • id – уникальный идентификатор задания, INT

      • title – заголовок задания, STRING

      • summary – краткое описание задания, может быть null, STRING

      • text – полное описание задания, STRING

      • mentorTip – заметки для наставника, может быть null, STRING

      • score – количество баллов за успешное прохождение задания, может быть null, INT

      • previewImage – ключ структуры информации о файле со следующими элементами:

        • id – уникальный идентификатор файла, INT

        • name – полное название файла с расширением, STRING

        • size – размер файла в байтах, INT

      • quizId – идентификатор прикреплённого опроса, может быть null, INT

    • taskStatus – текущий статус выполнения задания, возможные значения - in_progress, checking, redo, complete, fail

{ "result" : true, "quest": { "id": 123, "title": "Квест новичка", "textForMentor": "Будьте внимательны и справедливы", "urlForMentor": null, "textForStudent": null, "previewImage": { "id": 5, "name": "cat.jpg", "size": 225 }, "mentors": [ "example@example.ru", "example2@example.ru" ], "open": null, "close": null, "deadlineType": "delay", "deadlineDelay": 10, "deadlineDate": null, "threshold": null, "scoreThreshold": null, "score": 50, "certificate": null, "certificateCompleted": 999, "mentorScore": 10, "scoreInTime": null, "certificateDeadline": null, "quizId": 444 }, "data": { "messages" : [ { "authorId" : "example3@example.ru", "date" : "2023-10-25T00:00:00+03:00", "text" : "Мой ответ на вопрос", "status" : checking, "files" : [ { "id": 1462, "name": "Ответ на вопрос.xls", "size": 95446 }, { "id": 1412, "name": "Дополнение.ppt", "size": 58291 }, ] } ], "studentId" : "example3@example.ru", "task":{ "id": 5, "title": "Первое задание новичка", "summary": null, "text": "Напиши свои впечатления о первом рабочем дне", "mentorTip": "Принимаются любые ответы", "score": 5, "previewImage": { "id": 5, "name": "cat.jpg", "size": 225 }, "quizId": 8 }, "taskStatus" : checking, } }

Возвращается в случае попытки получить информацию по удалённому, неактивному или отсутствующему квесту, несуществующему пользователю или заданию.

В ответе указываются:

  • result – со значением false

  • errors – массив ошибок

Для каждой ошибки указываются message и cause

В зависимости от конкретной ошибки, message может отличаться.

Возможные ошибки:

  • Квест не найден, неактивен, удалён или не доступен по датам видимости:

    • "message": "Quest not found",

    • "cause" : "QuestId"

  • Пользователь не найден. неактивен или удалён:

    • "message": "User not found",

    • "cause" : "StudentId"

  • Пользователю не назначен квест:

    • "message": "User is not a quest student",

    • "cause" : "StudentId"

  • Задание не существует, неактивно или удалёно:

    • "message": "Task not found",

    • "cause" : "TasktId"

  • Задание не входит в состав квеста:

    • "message": "Task is not part of the quest",

    • "cause" : "TasktId"

{ "result": false, "errors": [ { “message”: “Quest not found“, “cause” : “questId“ }, { “message”: “Task not found“, “cause” : “tasktId“ } ] }

Возвращается в случае отсутствия или некорректного публичного ключа API при запросе

{ "result": false, "message": "Invalid public API token" }

Отправка ответа на задание пользователя

Отправить ответ на задание можно только при соблюдении следующих параметров:

  • Квест активен, не удалён, доступен по датам видимости

  • Студент активен, не удалён, ему назначен квест

  • В квесте существует задание с указанным идентификатором и для указанного студента оно находится в статусе checking

  • Автор ответа является наставником студента в указанном квесте или ответственным за квест, активен и не удалён

В других случаях ответ не отправляется, статус не меняется, возвращается сообщение об ошибке.

Чтобы загрузить ответ от наставника на задание, нужно сделать POST запрос на адрес:

  • post /public/api/v1/quest/{questId}/task/{taskId}/student/{studentId}
    в адресе метода должны быть указаны следующие параметры:

    • questId – идентификатор неудалённого активного квеста, доступного в публичной части по датам видимости, в котором находится необходимое задание, INT,

    • studentId – уникальный идентификатор неудалённого активного пользователя, которому назначен квест, STRING,

    • taskId – идентификатор задания, для которого запрашивается информация, INT

В body запроса нужно отправить обязательный JSON, который содержит следующие параметры:

  • mentorId – уникальный идентификатор пользователя, от имени которого должен быть оставлен ответ на задание, обязательное, STRING

  • text – текст ответа, который необходимо оставить пользователю, до 6000 символов, необязательное, STRING

  • files – массив идентификаторов файлов, которые необходимо прикрепить к ответу, необязательное

  • status – статус, который необходимо установить для задания, обязательное, возможные варианты:

    • redo – задание необходимо доработать

    • complete – задание пройдено успешно

    • fail – задание не пройдено

{ "mentorId" : "example10@example.ru", "text" : "Вот теперь всё правильно", "status" : "complete", "files": [ 12452, 51245 ] }

В случае успешного запроса (200) в ответ придёт JSON со следующими параметрами:

  • result – со значением true

  • quest – ключ структуры информации по квесту со следующими элементами:

    • id – уникальный идентификатор квеста, INT

    • title – заголовок квеста, STRING

    • textForMentor – текст для наставника, STRING

    • urlForMentor – ссылка для наставника, может быть null, STRING

    • textForStudent – текст для студента, может быть null, STRING

    • previewImage – ключ структуры информации о файле со следующими элементами:

      • id – уникальный идентификатор файла, INT

      • name – полное название файла с расширением, STRING

      • size – размер файла в байтах, INT

    • mentors – массив уникальных идентификатор пользователей, ответственных за квест, может быть null, каждый элемент STRING

    • open – дата начала доступности квеста, может быть null, DATETIME

    • close – дата окончания доступности квеста, может быть null, DATETIME

    • deadlineType – тип дедлайна, возможные значения: 'date' (до определённой даты), 'delay' (спустя установленное количество дней после назначения), 'none' (не установлен)

    • deadlineDelay – количество дней, за которые надо пройти квест после назначения, для delay, иначе null, INT

    • deadlineDate – дата, до которой надо пройти квест, для date, иначе null, DATETIME

    • threshold – порог, за прохождение которого студент получит баллы, может быть null, INT

    • scoreThreshold – количество баллов, которые студент получает при прохождении квеста на пороговом значении, может быть null, INT

    • score – баллы за прохождение квеста на 100 процентов, может быть null, INT

    • certificate – уникальный идентификатор сертификата за прохождение квеста на указанное количество процентов, может быть null, INT

    • certificateCompleted – уникальный идентификатор сертификата за прохождение квеста на 100 процентов, может быть null, INT

    • mentorScore – баллы для наставника за прохождение его студентом квеста на 100 процентов, может быть null, INT

    • scoreInTime – баллы за прохождение квеста в дедлайн, может быть null, INT

    • certificateDeadline – уникальный идентификатор сертификата за прохождение квеста в дедлайн, может быть null, INT

    • quizId – идентификатор прикреплённого опроса, может быть null, INT

  • data:

    • messages – массив ответов на задание (как со стороны студента, так и со стороны его наставника). Если на задание ещё не было дано ни одного ответа, вместо массива возвращается null. Каждый элемент массива должен содержать следующие поля:

      • authorId – уникальный идентификатор пользователя, который оставил сообщение для задания, STRING

      • date – дата и время оставления сообщения, DATETIME

      • text – текст оставленного сообщения, STRING

      • status – статус, в который было переведено задание после отправки сообщения

      • files – массив данных по файлам, прикреплённых к сообщению, или null, если файлы не были прикреплены. Для каждого элемента массива должна быть передана следующая информация:

        • id – идентификатор файла, который можно использовать для его скачивания в отдельном методе, INT

        • name – полное название файла с расширением, STRING

        • size – размер файла в байтах, INT

    • studentId – идентификатор студента из запроса, STRING

    • task – ключ структуры информации по заданию со следующими элементами:

      • id – уникальный идентификатор задания, INT

      • title – заголовок задания, STRING

      • summary – краткое описание задания, может быть null, STRING

      • text – полное описание задания, STRING

      • mentorTip – заметки для наставника, может быть null, STRING

      • score – количество баллов за успешное прохождение задания, может быть null, INT

      • previewImage – ключ структуры информации о файле со следующими элементами:

        • id – уникальный идентификатор файла, INT

        • name – полное название файла с расширением, STRING

        • size – размер файла в байтах, INT

      • quizId – идентификатор прикреплённого опроса, может быть null, INT

    • taskStatus – текущий статус выполнения задания, возможные значения - in_progress, checking, redo, complete, fail

{ "result" : true, "quest": { "id": 123, "title": "Квест новичка", "textForMentor": "Будьте внимательны и справедливы", "urlForMentor": null, "textForStudent": null, "previewImage": { "id": 5, "name": "cat.jpg", "size": 225 }, "mentors": [ "example@example.ru", "example2@example.ru" ], "open": null, "close": null, "deadlineType": "delay", "deadlineDelay": 10, "deadlineDate": null, "threshold": null, "scoreThreshold": null, "score": 50, "certificate": null, "certificateCompleted": 999, "mentorScore": 10, "scoreInTime": null, "certificateDeadline": null, "quizId": 444 }, "data": { "messages" : [ { "authorId" : "example3@example.ru", "date" : "2023-10-25T00:00:00+03:00", "text" : "Мой ответ на вопрос", "status" : checking, "files" : [ { "id": 1462, "name": "Ответ на вопрос.xls", "size": 95446 }, { "id": 1412, "name": "Дополнение.ppt", "size": 58291 }, ] } ], "studentId" : "example3@example.ru", "task":{ "id": 5, "title": "Первое задание новичка", "summary": null, "text": "Напиши свои впечатления о первом рабочем дне", "mentorTip": "Принимаются любые ответы", "score": 5, "previewImage": { "id": 5, "name": "cat.jpg", "size": 225 }, "quizId": 8 }, "taskStatus" : checking, } }

Возвращается в случае попытки оставить ответ для удалённого, неактивного или отсутствующего квесту, несуществующего пользователю или заданию, заданию в статусах, отличных от checking, или от имени пользователя, который не может проверять задания студента.

В ответе указываются:

  • result – со значением false

  • errors – массив ошибок

Для каждой ошибки указываются message и cause

В зависимости от конкретной ошибки, message может отличаться.

Возможные ошибки:

  • Квест не найден, неактивен, удалён или не доступен по датам видимости:

    • "message": "Quest not found",

    • "cause" : "QuestId"

  • Пользователь не найден. неактивен или удалён:

    • "message": "User not found",

    • "cause" : "StudentId или MentorId"

  • Пользователю не назначен квест:

    • "message": "User is not a quest student",

    • "cause" : "StudentId"

  • Задание не существует, неактивно или удалtно:

    • "message": "Task not found",

    • "cause" : "TasktId"

  • Задание не входит в состав квеста:

    • "message": "Task is not part of the quest",

    • "cause" : "TasktId"

  • Параметр status не заполнен:

    • "message": "Invalid value. Allowed values: redo, complete, fail"

    • "cause": "status"

  • Задание не находится в статусе checking:

    • "message": "Task must be in checking. Task has status %текущий_статус%",

    • "cause" : "field"

  • Пользователь, указанный в mentorId, не является наставником студента или ответственным за квест

    • "message": "User is not a student mentor",

    • "cause" : "MentorId"

  • Обязательное поле не заполнено:

    • "message": "Fields are required",

    • "cause" : "MentorId, status"

  • Поля заполнены некорректными значениями:

    • "message": "Could not decode request body",

    • "cause": "body"

  • В запрос пытаются передать несуществующий файл:

    • "message": "File not found",

    • "cause": "files[0]"

{ "result": false, "errors": [ { “message”: “Quest not found“, “cause” : “questId“ }, { “message”: “Task not found“, “cause” : “tasktId“ } ] }

Возвращается в случае отсутствия или некорректного публичного ключа API при запросе

{ "result": false, "message": "Invalid public API token" }