Актуальная документация по работе с Youtrack тут.
Как это работает:
Чтобы получить доступ к Youtrack из стороннего приложения, нужен токен для работы.
- Логинимся в YouTrack в браузере
- Идем в профиль «example.youtrack.com/users/me»
- Находим пункт «Update personal information and manage logins»
- Открываем вкладку «Authentication»
- Жмем кнопку «New token…»
- Заполняем поле клиента «YoutrackTimerec»
- Выбираем к каким подсистемам нам нужен доступ — для начала «YouTrack»
- Нажимаем кнопку «Create Token»
- Копируем токен, потому что он показывается только один раз.
Примеры в виде сurl запросов, но их легко переложить в нужную форму.
Для начала нужно проверить, что введенный адрес корректный и на стороне сервера есть REST API.
curl -X GET "https://example.myjetbrains.com/api/admin/users/me?fields=id,login,name,email"
-H "Accept: application/json"
-H "Authorization: Bearer perm:token"
-H "Cache-Control: no-cache"
-H "Content-Type: application/json"
если сервис доступен и ключ верный, в ответ придет json c данными учетки
{"login":"s.user", "email":"s.user@example.team", "name":"S User", "id":"1-325", "$type":"Me"}
Какой же Agile без задач? Упрощенно, задачи живут обычно в спринтах, а спринты в бордах. Как раз активные борды и надо получить, чтобы потом выбрать задачи для учета времени.
curl -X GET "https://example.myjetbrains.com/api/agiles?fields=name,id,projects(id,shortName,name),columnSettings(columns(presentation))&$top=100"
-H "Accept: application/json"
-H "Authorization: Bearer perm:token"
-H "Cache-Control: no-cache"
-H "Content-Type: application/json"
Ответ содержит список доступных бордов для конкретного пользователя:
[ { "projects":[{ "shortName":"OPS", "name":"Operations", "id":"04", "$type":"Project" }], "columnSettings":{ "columns":[ { "presentation":"Open", "$type":"AgileColumn"}, { "presentation":"In Progress, Paused","$type":"AgileColumn" }, { "presentation":"Postponed", "$type":"AgileColumn" }, { "presentation":"Closed, Resolved", "$type":"AgileColumn" }, { "presentation":"Feedback, On Review", "$type":"AgileColumn" } ], "$type":"ColumnSettings" }, "name":"Web", "id":"15", "$type":"Agile" } ]
Следующий этап — получение задач из борды:
— `Board Some Name:` указывается имя после пробела, заканчиваем `:`
— `{Current sprint}` берутся только задачи из текущего спринта
— `#Unresolved` берутся только незакрытые задачи
curl -X GET "https://example.myjetbrains.com/rest/issue?filter=for:me%20Board%20Some%20Name:%7BCurrent%20sprint%7D%20%23Unresolved%20"
-H "Accept: application/json"
-H "Authorization: Bearer perm:token"
-H "Cache-Control: no-cache"
-H "Content-Type: application/json"
Задачи придут массивом объектов, там довольно много свойств, но для учета времени будут нужны поля ID, Summary — заголовок, Spent Time — потраченное время в минутах, и sprint — ID спринта, если понадобится с ним работать.
{ "issue":[ { "id":"38-1234", "entityId":"2-12345", "jiraId":null, "field":[ { "name":"projectShortName", "value":"38" }, { "name":"summary", "value":"[system] [tech] Huge hard task" }, { "name":"created", "value":"1582624816973" }, { "name":"Spent time", "value":[ "399" ], "valueId":["6h 39m"],"color":null }, { "name":"sprint", "value":[ { "value":"Value", "id":"ID" } ] } ], }] }
Полученных данных достаточно для отображений и перемещения по списку задач. Основная идея приложения считать время, проведенное в работе над конкретной задачей. Для этого надо послать серверу количество минут (WorkItem), следующим запросом
curl -i -X POST "https://example.myjetbrains.com/rest/issue/38-1234/timetracking/workitem"
-H "Accept: application/json"
-H "Authorization: Bearer perm:token"
-H "Cache-Control: no-cache"
-H "Content-Type: application/xml"
-d <?xml version=\"1.0\" encoding=\"UTF-8\"?> <workItem> <date>UnixEpocTime*1000</date> <duration>10</duration> <description>added by Honsu</description> <worktype> <name>Development</name> </worktype> </workItem>
Почему XML? По какой-то причине, тестовый сервер не принимает WorkItem в виде json-объекта.
История задач по дням:
Можно запросить задачи, у которых поле Spent Time > 0, обработав их WorkItem можно составить историю работы.
Запрос всех задач текущего спринта
curl -X GET "https://example.myjetbrains.com/rest/issue?filter=for:me%20Board%20Some%20Name:%7BCurrent%20sprint%7D"
-H "Accept: application/json"
-H "Authorization: Bearer perm:token"
-H "Cache-Control: no-cache"
-H "Content-Type: application/json"
Далее обрабатываем пришедший массив задач, и делаем запросы для тех, которые имеют списанное время
curl -X GET "https://example.myjetbrains.com/rest/issue/38-1234/timetracking/workitem"
-H "Accept: application/json"
-H "Authorization: Bearer perm:token"
-H "Cache-Control: no-cache"
-H "Content-Type: application/json"
Обработав пришедшие данные, можно показать его в удобном виде
Где живет Honsu: github.com/dalerank/nanogui/tree/master/honsu
Собирается вместе с остальными примерами
Или тут в виде exe (Windows): github.com/dalerank/nanogui/releases
Для чего это сделано:
+ вести учет времени, потраченного на задачи
+ посмотреть как работать rest api youtrack
+ по возможности сделать моноапп, без зависимостей
+ интересно 🙂
Что умеет:
+ забирать таски из youtrack
+ показывает активные boards
+ отмечать собранное время в виде workItem в задаче
+ отсекать время простоя
+ напоминать об отсутствии задачи при обнаружении активности
+ показывать историю учета времени с разбивкой по дням
+ не хранит локально данные, кроме ключа и сервера
Чего не умеет:
+ использовать несколько аккаунтов
+ хранить потреканное время если нет инета
+ создавать новые задачи инапп
+ отображать цвет задачек
+ строить графики времени работы
+ обновляться из релизов гита
На чем написано:
+ CMake + С++11 + OpenGL (или другой gapi)
+ OpenSSL
+ cpp-httplib
+ Активно поддерживается версия под Windows, на другие платформы (Ubuntu\MacOS) собирается и даже работает
ссылка на оригинал статьи https://habr.com/ru/post/493068/