taurus-api/src/App/Service/DataCollectorService.php
2017-08-02 18:49:50 +02:00

186 lines
6.4 KiB
PHP

<?php
namespace App\Service;
use App\Entity\JiraAssignee;
use App\Entity\JiraIssueType;
use App\Entity\JiraStatus;
use App\Entity\KanbanBoard;
use App\Entity\KanbanEntry;
use Zend\Config\Config;
use Zend\Http\Client;
use Zend\Json\Decoder;
use Zend\Json\Json;
class DataCollectorService
{
/**
* @var Config
*/
private $config;
/**
* @var Client
*/
private $httpClient;
/**
* @var AvatarService
*/
private $avatarService;
/**
* JiraClientService constructor.
* @param Client $client
* @param Config $config
*/
public function __construct(Client $client, Config $config, AvatarService $avatarService)
{
$this->avatarService = $avatarService;
$this->httpClient = $client;
$this->config = $config;
}
/**
* @return KanbanBoard
*/
public function getKanbanBoard(): KanbanBoard
{
$user = $this->config->get('jira.user');
$password = $this->config->get('jira.password');
/** @var Config $kanbanBoardUriParams */
$kanbanBoardUriParams = $this->config->get('url.jiraKanbanBoard');
$kanbanBoardUri = sprintf(
$kanbanBoardUriParams['baseUrl'],
$kanbanBoardUriParams['filterId'],
implode(",", $kanbanBoardUriParams['fields']->toArray())
);
$response = $this->httpClient
->setAuth($user, $password)
->setUri($kanbanBoardUri)
->send();
if(!$response->isSuccess()) {
throw new \UnexpectedValueException("Bad JIRA result", $response->getStatusCode());
}
$parsedJsonData = Decoder::decode($response->getBody(), Json::TYPE_ARRAY);
return $this->hydrateKanbanBoard($parsedJsonData);
}
/**
* @param $parsedJsonData
* @return KanbanBoard
* @todo check if avatar has to be locally cached
*/
private function hydrateKanbanBoard($parsedJsonData): KanbanBoard
{
$kanbanBoard = new KanbanBoard();
foreach($parsedJsonData['issues'] as $jsonIssue) {
$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'])
;
// externalId : customfield_10010
if(isset($jsonIssue['fields']['customfield_10010'])) {
$kanbanEntry->setPrio(intval($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']);
}
// jira status
$jiraStatus = new JiraStatus();
$jiraStatus->setName($jsonIssue['fields']['status']['name'])
->setColor($jsonIssue['fields']['status']['statusCategory']['colorName']);
$kanbanEntry->setStatus($jiraStatus);
// assignee
if($jsonIssue['fields']['assignee']) {
$avatarUrl = $this->avatarService->getJiraAvatarUrl(
$jsonIssue['fields']['assignee']['avatarUrls']['48x48'],
$jsonIssue['fields']['assignee']['key']
);
$jiraAssignee = new JiraAssignee();
$jiraAssignee->setName($jsonIssue['fields']['assignee']['displayName'])
->setSignum($jsonIssue['fields']['assignee']['key'])
->setEmail(strtolower($jsonIssue['fields']['assignee']['emailAddress']))
->setAvatar($avatarUrl)
->setActive($jsonIssue['fields']['assignee']['active']);
$kanbanEntry->setAssignee($jiraAssignee);
unset($jiraAssignee);
}
// issue type
if($jsonIssue['fields']['issuetype']) {
$jiraIssueType = new JiraIssueType();
$jiraIssueType->setName($jsonIssue['fields']['issuetype']['name'])
->setDescription($jsonIssue['fields']['issuetype']['description'])
->setIcon($jsonIssue['fields']['issuetype']['iconUrl']);
$kanbanEntry->setIssueType($jiraIssueType);
unset($jiraIssueType);
}
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;
}
unset($kanbanEntry);
}
return $kanbanBoard;
}
}