Initial commit
This commit is contained in:
86
src/App/Service/AvatarService.php
Normal file
86
src/App/Service/AvatarService.php
Normal file
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
namespace App\Service;
|
||||
|
||||
use Zend\Cache\Storage\StorageInterface;
|
||||
use Zend\Config\Config;
|
||||
use Zend\Expressive\Router\RouterInterface;
|
||||
use Zend\Http\Client;
|
||||
|
||||
class AvatarService
|
||||
{
|
||||
/**
|
||||
* @var Config
|
||||
*/
|
||||
private $config;
|
||||
|
||||
/**
|
||||
* @var Client
|
||||
*/
|
||||
private $httpClient;
|
||||
|
||||
/**
|
||||
* @var RouterInterface
|
||||
*/
|
||||
private $router;
|
||||
|
||||
/**
|
||||
* @var StorageInterface
|
||||
*/
|
||||
private $cache;
|
||||
|
||||
/**
|
||||
* JiraClientService constructor.
|
||||
* @param Client $client
|
||||
* @param Config $config
|
||||
* @param RouterInterface $router
|
||||
*/
|
||||
public function __construct(Client $client, Config $config, RouterInterface $router, StorageInterface $cache)
|
||||
{
|
||||
$this->httpClient = $client;
|
||||
$this->config = $config;
|
||||
$this->router = $router;
|
||||
$this->cache = $cache;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $jiraAvatarUrl
|
||||
* @param string $signum
|
||||
* @return string
|
||||
*/
|
||||
public function getJiraAvatarUrl(string $jiraAvatarUrl, string $signum): string
|
||||
{
|
||||
if (!$this->cache->hasItem($signum)) {
|
||||
$user = $this->config->get('jira.user');
|
||||
$password = $this->config->get('jira.password');
|
||||
|
||||
$response = $this->httpClient
|
||||
->setAuth($user, $password)
|
||||
->setUri($jiraAvatarUrl)
|
||||
->send();
|
||||
|
||||
if (!$response->isSuccess()) {
|
||||
throw new \UnexpectedValueException("Bad JIRA result", $response->getStatusCode());
|
||||
}
|
||||
|
||||
$this->cache->setItem($signum, $response->getBody());
|
||||
}
|
||||
|
||||
return $this->router->generateUri('user.avatar', [
|
||||
'signum' => $signum,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $signum
|
||||
* @return string
|
||||
*/
|
||||
public function getAvatarData(string $signum): string
|
||||
{
|
||||
if (!$this->cache->hasItem($signum)) {
|
||||
throw new \UnexpectedValueException("Missing avatar", 404);
|
||||
}
|
||||
|
||||
return $this->cache->getItem($signum);
|
||||
}
|
||||
}
|
||||
26
src/App/Service/AvatarServiceFactory.php
Normal file
26
src/App/Service/AvatarServiceFactory.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\Service;
|
||||
|
||||
use Interop\Container\ContainerInterface;
|
||||
use Zend\Config\Config;
|
||||
use Zend\Expressive\Router\RouterInterface;
|
||||
use Zend\Http\Client;
|
||||
|
||||
class AvatarServiceFactory
|
||||
{
|
||||
public function __invoke(ContainerInterface $container)
|
||||
{
|
||||
$router = $container->get(RouterInterface::class);
|
||||
$configArray = $container->get('config');
|
||||
$httpClient = new Client();
|
||||
$httpClient->getAdapter()->setOptions([
|
||||
'timeout' => 60,
|
||||
]);
|
||||
|
||||
$cache = $container->get('service.avatarCache');
|
||||
|
||||
$config = new Config($configArray['app.config']);
|
||||
return new AvatarService($httpClient, $config, $router, $cache);
|
||||
}
|
||||
}
|
||||
172
src/App/Service/DataCollectorService.php
Normal file
172
src/App/Service/DataCollectorService.php
Normal file
@@ -0,0 +1,172 @@
|
||||
<?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);
|
||||
}
|
||||
|
||||
$kanbanBoard->addKanbanEntry($kanbanEntry);
|
||||
unset($kanbanEntry);
|
||||
}
|
||||
|
||||
return $kanbanBoard;
|
||||
}
|
||||
}
|
||||
22
src/App/Service/DataCollectorServiceFactory.php
Normal file
22
src/App/Service/DataCollectorServiceFactory.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace App\Service;
|
||||
|
||||
use Interop\Container\ContainerInterface;
|
||||
use Zend\Config\Config;
|
||||
use Zend\Http\Client;
|
||||
|
||||
class DataCollectorServiceFactory
|
||||
{
|
||||
public function __invoke(ContainerInterface $container)
|
||||
{
|
||||
$configArray = $container->get('config');
|
||||
$httpClient = new Client();
|
||||
$httpClient->getAdapter()->setOptions([
|
||||
'timeout' => 60,
|
||||
]);
|
||||
$config = new Config($configArray['app.config']);
|
||||
$avatarService = $container->get(AvatarService::class);
|
||||
return new DataCollectorService($httpClient, $config, $avatarService);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user