Как получить все журналы работы в течение определенного периода времени с помощью JRE REST API?

Я пишу приложение с использованием PHP и Jira REST API, который должен генерировать отчет за определенный период времени с накоплением часов, потраченных человеком на конкретный проект.

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

например: For the period 01/01/2012 - 31/01/2012 give me the worklogs for project X.

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

Есть ли лучшая альтернатива?

Ответ 1

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

  • Запросить DB напрямую, чтобы вы могли получать рабочие журналы с помощью одного запроса. Обязательно не вставлять/удалять/обновлять БД напрямую, а только запрашивать его.
  • Используйте что-то вроде Jira Scripting Suite или Плагин поведения для добавления скриптов, которые будут записывать рабочие журналы где-нибудь на диске. Затем используйте другое приложение, чтобы прочитать записанную информацию с диска и отобразить ее пользователям.
  • Используйте Tempo plugin

Ответ 2

Как говорили многие, нет прямого пути. Однако, если вы значительно сократите пространство поиска, это не так уж плохо. Следующий код PHP работает довольно быстро в моей настройке, но, конечно, ваш пробег может отличаться:

<?php
$server   = 'jira.myserver.com';
$fromDate = '2012-01-01';
$toDate   = '2012-01-31';
$project  = 'X';
$assignee = 'bob';

$username = 'my_name';
$password = 'my_password';

$curl = curl_init();
curl_setopt($curl, CURLOPT_USERPWD, "$username:$password");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);

# Give me up to 1000 search results with the Key, where
# assignee = $assignee  AND  project = $project
#  AND created < $toDate  AND  updated > $fromDate
#  AND timespent > 0
curl_setopt($curl, CURLOPT_URL, 
            "https://$server/rest/api/2/search?startIndex=0&jql=".
            "assignee+%3D+$assignee+and+project+%3D+$project+".
            "and+created+%3C+$toDate+and+updated+%3E+$fromDate+".
            "and+timespent+%3E+0&fields=key&maxResults=1000");

$issues = json_decode(curl_exec($curl), true);
foreach ($issues['issues'] as $issue) {
    $key = $issue['key'];
    # for each issue in result, give me the full worklog for that issue
    curl_setopt($curl, CURLOPT_URL,
                "https://$server/rest/api/2/issue/$key/worklog");

    $worklog = json_decode(curl_exec($curl), true);
    foreach ($worklog['worklogs'] as $entry) {
        $shortDate = substr($entry['started'], 0, 10);
        # keep a worklog entry on $key item,
        # iff within the search time period
        if ($shortDate >= $fromDate && $shortDate <= $toDate)
            $periodLog[$key][] = $entry;
    }
}
# Show Result:
#  echo json_encode($periodLog);
#  var_dump($periodLog);
?>

Ответ 3

Стоит отметить, что запросы Jira имеют параметр expand, который позволяет вам указать, какие поля вы хотите привязать к вашему поиску:

// Javascript
$jql = 'project = MyProject and updated > 2016-02-01 and updated < 2016-03-01';

// note this definition
$fields = 'key,summary,worklog';

$query = "https://{server}/rest/api/2/search?maxResults=100&fields={fields}&jql={jql}"
  .replace(/{server}/g,$server)
  .replace(/{jql}/g,encodeURIComponent($jql))
  .replace(/{fields}/g,$fields)
  ;

Возвращенный возвращаемый объект JSON будет списком билетов, и каждый билет будет содержать набор рабочих элементов (потенциально нулевую длину).

Javascript, а не PHP, но та же идея:

function getJql(params){
    $.ajax({
        url: getJiraUrl() 
            + "/rest/api/2/search?startIndex=0&fields=worklog,assignee,status,key,summary&maxResults=1000&jql=" 
            + encodeURI(params.jql),
        success: function (resp) {
            resp.issues.forEach(function(issue) {
                issue.fields.worklog.worklogs.forEach(function(work){
                    alert(JSON.stringify(work));
                    db.AddWork(work);
                });
            });
        }
    });
}

опубликовано в GitLab: https://gitlab.com/jefferey-cave/ProductivityBlockers/blob/5c4cb33276e8403443d4d766fc94ab2f92292da6/plugin-data-jira.js

Ответ 4

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

Таким образом, вы также получите данные, если произойдет серьезная авария JIRA. Наша компания столкнулась с такой проблемой с экземпляром OnDemand, когда RAID-массив сгорел, и большая часть данных была невосстановимой.