* watcher api endpoint implemented
This commit is contained in:
@@ -10,6 +10,8 @@ use App\Entity\JiraStatus;
|
||||
use App\Entity\KanbanBoard;
|
||||
use App\Entity\KanbanEntry;
|
||||
use App\Entity\Team;
|
||||
use App\Entity\WatchedIssue;
|
||||
use App\Entity\WatchedIssueComment;
|
||||
use Zend\Cache\Storage\StorageInterface;
|
||||
use Zend\Config\Config;
|
||||
use Zend\Expressive\Router\RouterInterface;
|
||||
@@ -25,6 +27,20 @@ class JiraCollectorService
|
||||
const EPIC_TICKET_LINK = 'customfield_11711';
|
||||
const EPIC_NAME_FIELD = 'customfield_11712';
|
||||
|
||||
const STATUS_DONE = 'done';
|
||||
const STATUS_CLOSED = 'closed';
|
||||
const STATUS_ANSWERED = 'answered';
|
||||
const STATUS_RESOLVED = 'resolved';
|
||||
|
||||
const IGNORED_STATUSES = [
|
||||
self::STATUS_DONE,
|
||||
self::STATUS_CLOSED,
|
||||
self::STATUS_ANSWERED,
|
||||
self::STATUS_RESOLVED,
|
||||
];
|
||||
|
||||
const WATCH_FILTER = 'status NOT IN (%s) AND watcher in (%s) AND "Last change" not in (%s) ORDER BY "Last Comment"';
|
||||
|
||||
/** @var StorageInterface */
|
||||
private $cache;
|
||||
|
||||
@@ -110,6 +126,93 @@ class JiraCollectorService
|
||||
return $kanbanBoard;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $teamId
|
||||
* @return array
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function getTeamWatchedIssues(int $teamId)
|
||||
{
|
||||
$team = $this->teamService->getTeam($teamId);
|
||||
$members = array_map(function(array $member): string {
|
||||
return $member['signum'];
|
||||
}, $team->getMembers());
|
||||
$preparedMembers = sprintf('"%s"', implode('","', $members));
|
||||
$filter = sprintf(
|
||||
self::WATCH_FILTER,
|
||||
sprintf('"%s"', implode('","', self::IGNORED_STATUSES)),
|
||||
$preparedMembers, $preparedMembers
|
||||
);
|
||||
$user = $this->config->get('jira.user');
|
||||
$password = $this->config->get('jira.password');
|
||||
/** @var Config $kanbanBoardUriParams */
|
||||
$jiraWatchedIssues = $this->config->get('url.jiraWatchedIssues');
|
||||
$kanbanBoardFilterFields = [
|
||||
'assignee',
|
||||
'summary',
|
||||
'comment',
|
||||
];
|
||||
$issueFields = implode(",", $kanbanBoardFilterFields);
|
||||
$jiraIssueUri = sprintf($jiraWatchedIssues, $filter, $issueFields);
|
||||
|
||||
$response = $this->httpClient
|
||||
->setUri($jiraIssueUri)
|
||||
->setAuth($user, $password)
|
||||
->send();
|
||||
|
||||
if (!$response->isSuccess()) {
|
||||
throw new \UnexpectedValueException(sprintf(
|
||||
"Bad JIRA result for URL:\n%s",
|
||||
$jiraIssueUri
|
||||
), $response->getStatusCode());
|
||||
}
|
||||
|
||||
return $this->hydrateWatchedIssues(Decoder::decode($response->getBody(), Json::TYPE_ARRAY), $members);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $parsedJson
|
||||
* @param array $members
|
||||
* @return array
|
||||
* @throws \Exception
|
||||
*/
|
||||
private function hydrateWatchedIssues(array $parsedJson, array $members)
|
||||
{
|
||||
/** @var WatchedIssue[] $hydratedResult */
|
||||
$hydratedResult = [];
|
||||
|
||||
foreach ($parsedJson['issues'] as $issueJson) {
|
||||
$issueItem = new WatchedIssue();
|
||||
$issueItem->setIssue($issueJson['key'])
|
||||
->setAssignee($issueJson['fields']['assignee']['name'])
|
||||
->setSummary(html_entity_decode($issueJson['fields']['summary']));
|
||||
$issueComments = [];
|
||||
foreach ($issueJson['fields']['comment']['comments'] as $commentJson) {
|
||||
$issueComment = new WatchedIssueComment();
|
||||
$issueComment->setSignum($commentJson['updateAuthor']['name'])
|
||||
->setName($commentJson['updateAuthor']['displayName'])
|
||||
->setContent(html_entity_decode($commentJson['body']))
|
||||
->setDate(new \DateTimeImmutable($commentJson['updated']));
|
||||
$issueComments[] = $issueComment;
|
||||
}
|
||||
usort($issueComments, function(WatchedIssueComment $a, WatchedIssueComment $b) {
|
||||
return $a->getDate() <=> $b->getDate();
|
||||
});
|
||||
$lastComment = array_pop($issueComments);
|
||||
unset($issueComments);
|
||||
$issueItem->setComment($lastComment);
|
||||
$hydratedResult[] = $issueItem;
|
||||
}
|
||||
|
||||
/**
|
||||
* sanity check, we only want items where last change was a comment, but that is not possible
|
||||
* with JIRA jql at the moment.
|
||||
*/
|
||||
return array_filter($hydratedResult, function(WatchedIssue $issue) use ($members) {
|
||||
return !in_array($issue->getComment()->getSignum(), $members);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $parentKey
|
||||
* @return null|string
|
||||
|
||||
Reference in New Issue
Block a user