* watcher api endpoint implemented

This commit is contained in:
Dávid Danyi
2018-09-12 17:20:15 +02:00
parent 9d3fa5fa9d
commit 3d42f16c38
9 changed files with 378 additions and 14 deletions

View File

@@ -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