* multiple team kanban board implementation added
* active flag is now working as intended * iframe slide type added * team-slide connection is now many-to-many
This commit is contained in:
177
src/App/Service/JiraCollectorService.php
Normal file → Executable file
177
src/App/Service/JiraCollectorService.php
Normal file → Executable file
@@ -9,6 +9,7 @@ use App\Entity\JiraIssueType;
|
||||
use App\Entity\JiraStatus;
|
||||
use App\Entity\KanbanBoard;
|
||||
use App\Entity\KanbanEntry;
|
||||
use App\Entity\Team;
|
||||
use Zend\Cache\Storage\StorageInterface;
|
||||
use Zend\Config\Config;
|
||||
use Zend\Expressive\Router\RouterInterface;
|
||||
@@ -20,6 +21,10 @@ class JiraCollectorService
|
||||
{
|
||||
|
||||
const CACHE_KEY_KANBANBOARD = 'kanbanBoard';
|
||||
const BACKLOG_FIELD_DELIMITER = ';';
|
||||
|
||||
const EPIC_TICKET_LINK = 'customfield_11711';
|
||||
const EPIC_NAME_FIELD = 'customfield_11712';
|
||||
|
||||
/** @var StorageInterface */
|
||||
private $cache;
|
||||
@@ -33,39 +38,54 @@ class JiraCollectorService
|
||||
/** @var RouterInterface */
|
||||
private $router;
|
||||
|
||||
/** @var TeamService */
|
||||
private $teamService;
|
||||
|
||||
/** @var array */
|
||||
private $cachedEpics = [];
|
||||
|
||||
/**
|
||||
* JiraClientService constructor.
|
||||
* @param StorageInterface $cache
|
||||
* @param Client $client
|
||||
* @param Config $config
|
||||
* @param RouterInterface $router
|
||||
* @param TeamService $teamService
|
||||
*/
|
||||
public function __construct(StorageInterface $cache, Client $client, Config $config, RouterInterface $router)
|
||||
public function __construct(StorageInterface $cache,
|
||||
Client $client,
|
||||
Config $config,
|
||||
RouterInterface $router,
|
||||
TeamService $teamService)
|
||||
{
|
||||
$this->cache = $cache;
|
||||
$this->router = $router;
|
||||
$this->httpClient = $client;
|
||||
$this->config = $config;
|
||||
$this->teamService = $teamService;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $filterId
|
||||
* @param int $teamId
|
||||
* @param bool $forceReload
|
||||
* @return KanbanBoard
|
||||
*/
|
||||
public function getKanbanBoard(int $filterId = null, bool $forceReload = false): KanbanBoard
|
||||
public function getKanbanBoard(int $teamId = null, bool $forceReload = false): KanbanBoard
|
||||
{
|
||||
$kanbanBoard = $this->cache->getItem('kanbanBoard');
|
||||
$team = $this->teamService->getTeam($teamId);
|
||||
$teamName = $team->getName();
|
||||
$kanbanBoard = $this->cache->getItem(sprintf("%s-%s", self::CACHE_KEY_KANBANBOARD, $teamName));
|
||||
if ($forceReload || null === $kanbanBoard) {
|
||||
$user = $this->config->get('jira.user');
|
||||
$password = $this->config->get('jira.password');
|
||||
/** @var Config $kanbanBoardUriParams */
|
||||
$kanbanBoardUriParams = $this->config->get('url.jiraKanbanBoard');
|
||||
$kanbanBoardUri = $this->config->get('url.jiraKanbanBoard');
|
||||
$kanbanBoardFilter = $this->config->get('jira.filterFields')->toArray();
|
||||
|
||||
$kanbanBoardUri = sprintf(
|
||||
$kanbanBoardUriParams['baseUrl'],
|
||||
isset($filterId) ? $filterId : $kanbanBoardUriParams['filterId'],
|
||||
implode(",", $kanbanBoardUriParams['fields']->toArray())
|
||||
$kanbanBoardUri,
|
||||
$team->getFilterId(),
|
||||
implode(",", $kanbanBoardFilter)
|
||||
);
|
||||
|
||||
$response = $this->httpClient
|
||||
@@ -79,8 +99,8 @@ class JiraCollectorService
|
||||
|
||||
$parsedJsonData = Decoder::decode($response->getBody(), Json::TYPE_ARRAY);
|
||||
|
||||
$kanbanBoard = $this->hydrateKanbanBoard($parsedJsonData);
|
||||
$this->cache->setItem(self::CACHE_KEY_KANBANBOARD, serialize($kanbanBoard));
|
||||
$kanbanBoard = $this->hydrateKanbanBoard($team, $parsedJsonData);
|
||||
$this->cache->setItem(sprintf("%s-%s", self::CACHE_KEY_KANBANBOARD, $teamName), serialize($kanbanBoard));
|
||||
} else {
|
||||
$kanbanBoard = unserialize($kanbanBoard);
|
||||
}
|
||||
@@ -89,22 +109,77 @@ class JiraCollectorService
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $parentKey
|
||||
* @return null|string
|
||||
*/
|
||||
private function getEpicNameFromParent(string $parentKey): ?string
|
||||
{
|
||||
if (array_key_exists($parentKey, $this->cachedEpics)) {
|
||||
return $this->cachedEpics[$parentKey];
|
||||
}
|
||||
|
||||
$user = $this->config->get('jira.user');
|
||||
$password = $this->config->get('jira.password');
|
||||
/** @var Config $kanbanBoardUriParams */
|
||||
$jiraIssueBaseUrl = $this->config->get('url.jiraIssue');
|
||||
$kanbanBoardFilter = $this->config->get('jira.filterFields')->toArray();
|
||||
$kanbanBoardFilterString = implode(",", $kanbanBoardFilter);
|
||||
$jiraIssueUri = sprintf($jiraIssueBaseUrl, $parentKey, $kanbanBoardFilterString);
|
||||
|
||||
$response = $this->httpClient
|
||||
->setUri($jiraIssueUri)
|
||||
->setAuth($user, $password)
|
||||
->send();
|
||||
|
||||
if (!$response->isSuccess()) {
|
||||
throw new \UnexpectedValueException("Bad JIRA result: $jiraIssueUri", $response->getStatusCode());
|
||||
}
|
||||
|
||||
$parsedJsonParentData = Decoder::decode($response->getBody(), Json::TYPE_ARRAY);
|
||||
if ($parsedJsonParentData['fields'][self::EPIC_TICKET_LINK]) {
|
||||
$jiraIssueUri = sprintf(
|
||||
$jiraIssueBaseUrl,
|
||||
$parsedJsonParentData['fields'][self::EPIC_TICKET_LINK],
|
||||
$kanbanBoardFilterString
|
||||
);
|
||||
$response = $this->httpClient
|
||||
->setUri($jiraIssueUri)
|
||||
->setAuth($user, $password)
|
||||
->send();
|
||||
|
||||
if (!$response->isSuccess()) {
|
||||
throw new \UnexpectedValueException("Bad JIRA result", $response->getStatusCode());
|
||||
}
|
||||
|
||||
$parsedJsonEpicData = Decoder::decode($response->getBody(), Json::TYPE_ARRAY);
|
||||
$this->cachedEpics[$parentKey] = $parsedJsonEpicData['fields'][self::EPIC_NAME_FIELD];
|
||||
return $this->cachedEpics[$parentKey];
|
||||
}
|
||||
$this->cachedEpics[$parentKey] = null;
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Team $team
|
||||
* @param $parsedJsonData
|
||||
* @return KanbanBoard
|
||||
* @todo check if avatar has to be locally cached
|
||||
*/
|
||||
private function hydrateKanbanBoard($parsedJsonData): KanbanBoard
|
||||
private function hydrateKanbanBoard(Team $team, $parsedJsonData): KanbanBoard
|
||||
{
|
||||
$kanbanBoard = new KanbanBoard();
|
||||
|
||||
$teamBacklogColumns = explode(self::BACKLOG_FIELD_DELIMITER, $team->getBacklogColumn()["jiraStatusName"]);
|
||||
$teamInprogressColumns = explode(self::BACKLOG_FIELD_DELIMITER, $team->getInprogressColumn()["jiraStatusName"]);
|
||||
$teamVerificationColumns = explode(self::BACKLOG_FIELD_DELIMITER, $team->getVerificationColumn()["jiraStatusName"]);
|
||||
$teamDoneColumns = explode(self::BACKLOG_FIELD_DELIMITER, $team->getDoneColumn()["jiraStatusName"]);
|
||||
|
||||
foreach ($parsedJsonData['issues'] as $jsonIssue) {
|
||||
set_time_limit(30);
|
||||
$kanbanEntry = new KanbanEntry();
|
||||
$kanbanEntry->setId(intval($jsonIssue['id']))
|
||||
->setKey($jsonIssue['key'])
|
||||
->setSummary($jsonIssue['fields']['summary'])
|
||||
->setExternalLink($jsonIssue['fields']['customfield_10850'])
|
||||
->setMhwebStatus($jsonIssue['fields']['customfield_10844'])
|
||||
->setAnswerCode($jsonIssue['fields']['customfield_11692'])
|
||||
->setIssuePriority($jsonIssue['fields']['priority']['name'])
|
||||
->setIssuePriorityIcon($jsonIssue['fields']['priority']['iconUrl'])
|
||||
->setLabels($jsonIssue['fields']['labels'])
|
||||
@@ -143,48 +218,13 @@ class JiraCollectorService
|
||||
}
|
||||
}
|
||||
|
||||
// externalId : customfield_10010
|
||||
if (isset($jsonIssue['fields']['customfield_10010'])) {
|
||||
$kanbanEntry->setExternalId($jsonIssue['fields']['customfield_10010']);
|
||||
}
|
||||
|
||||
// prio : customfield_10840
|
||||
if (isset($jsonIssue['fields']['customfield_11226'])) {
|
||||
$kanbanEntry->setPrio($jsonIssue['fields']['customfield_11226']);
|
||||
}
|
||||
|
||||
// functional area : customfield_11225
|
||||
if (isset($jsonIssue['fields']['customfield_11225'])) {
|
||||
foreach ($jsonIssue['fields']['customfield_11225'] as $functionalArea) {
|
||||
$kanbanEntry->addFunctionalArea($functionalArea['value']);
|
||||
}
|
||||
}
|
||||
|
||||
// project : customfield_10840
|
||||
if (isset($jsonIssue['fields']['customfield_10840'])) {
|
||||
$kanbanEntry->setProject($jsonIssue['fields']['customfield_10840']['value']);
|
||||
}
|
||||
|
||||
// mhweb hot : customfield_10847
|
||||
if (isset($jsonIssue['fields']['customfield_10847'])) {
|
||||
$boolVal = $jsonIssue['fields']['customfield_10847'][0]['value'] == 'yes';
|
||||
$kanbanEntry->setMhwebHot($boolVal);
|
||||
}
|
||||
|
||||
// mhweb external : customfield_10849
|
||||
if (isset($jsonIssue['fields']['customfield_10849'])) {
|
||||
$boolVal = $jsonIssue['fields']['customfield_10849'][0]['value'] == 'yes';
|
||||
$kanbanEntry->setMhwebExternal($boolVal);
|
||||
}
|
||||
|
||||
// team : customfield_10904
|
||||
if (isset($jsonIssue['fields']['customfield_10904'])) {
|
||||
$kanbanEntry->setTeam($jsonIssue['fields']['customfield_10904']['value']);
|
||||
}
|
||||
|
||||
// team : customfield_12500
|
||||
if (isset($jsonIssue['fields']['customfield_12500'])) {
|
||||
$kanbanEntry->setTaurusPrio($jsonIssue['fields']['customfield_12500']);
|
||||
// epicName: have to fetch 2 extra records
|
||||
if (isset($jsonIssue['fields'][self::EPIC_TICKET_LINK])) {
|
||||
$epicName = $this->getEpicNameFromParent($jsonIssue['key']);
|
||||
$kanbanEntry->setEpicName($epicName);
|
||||
} elseif (isset($jsonIssue['fields']['parent'])) {
|
||||
$epicName = $this->getEpicNameFromParent($jsonIssue['fields']['parent']['key']);
|
||||
$kanbanEntry->setEpicName($epicName);
|
||||
}
|
||||
|
||||
// jira status
|
||||
@@ -222,20 +262,17 @@ class JiraCollectorService
|
||||
}
|
||||
|
||||
$kanbanEntry->setUpdatedAt(new \DateTime($jsonIssue['fields']['updated']));
|
||||
|
||||
switch ($jiraStatus->getName()) {
|
||||
case "Backlog":
|
||||
$kanbanBoard->addInbox($kanbanEntry);
|
||||
break;
|
||||
case "In Progress":
|
||||
$kanbanBoard->addInProgress($kanbanEntry);
|
||||
break;
|
||||
case "Verification":
|
||||
$kanbanBoard->addVerification($kanbanEntry);
|
||||
break;
|
||||
case "Done":
|
||||
$kanbanBoard->addDone($kanbanEntry);
|
||||
break;
|
||||
if (in_array($jiraStatus->getName(), $teamBacklogColumns)) {
|
||||
$kanbanBoard->addInbox($kanbanEntry);
|
||||
}
|
||||
elseif (in_array($jiraStatus->getName(), $teamInprogressColumns)) {
|
||||
$kanbanBoard->addInProgress($kanbanEntry);
|
||||
}
|
||||
elseif (in_array($jiraStatus->getName(), $teamVerificationColumns)) {
|
||||
$kanbanBoard->addVerification($kanbanEntry);
|
||||
}
|
||||
elseif (in_array($jiraStatus->getName(), $teamDoneColumns)) {
|
||||
$kanbanBoard->addDone($kanbanEntry);
|
||||
}
|
||||
unset($kanbanEntry);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user