Skip to content

Commit

Permalink
Merge pull request #2 from eventum/note-unfurl
Browse files Browse the repository at this point in the history
  • Loading branch information
glensc committed May 28, 2020
2 parents b5e5a71 + 8546953 commit f66bf58
Show file tree
Hide file tree
Showing 6 changed files with 135 additions and 43 deletions.
69 changes: 69 additions & 0 deletions src/ApiClient.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<?php

namespace Eventum\SlackUnfurl;

use Eventum\RPC\EventumXmlRpcClient;
use Eventum\RPC\XmlRpcException;

class ApiClient
{
/** @var EventumXmlRpcClient */
private $client;

public function __construct(EventumXmlRpcClient $client)
{
$this->client = $client;
}

/**
* Get issue details, but filter only needed keys.
*
* @param int $issueId
* @throws XmlRpcException
* @return array
*/
public function getIssueDetails(int $issueId): array
{
/** @var array $issue */
$issue = $this->client->getIssueDetails($issueId);

$fields = [
'assignments',
'iss_created_date',
'iss_created_date_ts',
'iss_description',
'iss_id',
'iss_last_internal_action_date',
'iss_last_public_action_date',
'iss_original_description',
'iss_summary',
'iss_updated_date',
'prc_title',
'pri_title',
'reporter',
'sta_title',
];

return array_intersect_key($issue, array_flip($fields));
}

/**
* @param int $noteId
* @throws XmlRpcException
* @return array
*/
public function getNoteDetails(int $noteId): array
{
$fields = [
'issue_url',
'not_id',
'not_iss_id',
'not_title',
'not_from',
'not_note',
'not_created_date_ts',
];

return $this->client->getNoteDetails($noteId, $fields);
}
}
1 change: 1 addition & 0 deletions src/Event/Subscriber/EventumUnfurler.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class EventumUnfurler implements EventSubscriberInterface

private const ROUTES = [
'issue' => Route\Issue::class,
'note' => Route\Note::class,
];

/** @var RouteMatcher */
Expand Down
1 change: 1 addition & 0 deletions src/Route/EventumRoutes.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ protected function buildRoutes(string $domain): array

return [
'issue' => "^${base}/view\.php\?id=(?P<id>\d+)",
'note' => "^${base}/view_note\.php\?id=(?P<id>\d+)",
];
}
}
48 changes: 6 additions & 42 deletions src/Route/Issue.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,49 +4,27 @@

use DateTime;
use DateTimeZone;
use Eventum\RPC\EventumXmlRpcClient;
use Eventum\RPC\XmlRpcException;
use Eventum\SlackUnfurl\ApiClient;
use Psr\Log\LoggerInterface;
use SlackUnfurl\Traits\LoggerTrait;

class Issue
{
use LoggerTrait;

/** @var EventumXmlRpcClient */
private $apiClient;
/** @var ApiClient */
private $client;
/** @var DateTimeZone */
private $utc;
/** @var DateTimeZone */
private $timeZone;

/**
* getDetails keys to retrieve
* @see getIssueDetails
*/
private const MATCH_KEYS = [
'assignments',
'iss_created_date',
'iss_created_date_ts',
'iss_description',
'iss_id',
'iss_last_internal_action_date',
'iss_last_public_action_date',
'iss_original_description',
'iss_summary',
'iss_updated_date',
'prc_title',
'pri_title',
'reporter',
'sta_title',
];

public function __construct(
EventumXmlRpcClient $apiClient,
ApiClient $client,
string $timeZone,
LoggerInterface $logger
) {
$this->apiClient = $apiClient;
$this->client = $client;
$this->logger = $logger;
$this->utc = new DateTimeZone('UTC');
$this->timeZone = new DateTimeZone($timeZone);
Expand All @@ -55,7 +33,7 @@ public function __construct(
public function unfurl(string $url, array $parts): ?array
{
$issueId = (int)$parts['id'];
$issue = $this->getIssueDetails($issueId);
$issue = $this->client->getIssueDetails($issueId);
$this->debug('issue', ['issue' => $issue]);

return [
Expand Down Expand Up @@ -88,20 +66,6 @@ public function unfurl(string $url, array $parts): ?array
];
}

/**
* Get issue details, but filter only needed keys.
*
* @param int $issueId
* @throws XmlRpcException
* @return array
*/
private function getIssueDetails(int $issueId): array
{
$issue = $this->apiClient->getIssueDetails($issueId);

return array_intersect_key($issue, array_flip(self::MATCH_KEYS));
}

/**
* Get issue last update in local timezone
*
Expand Down
45 changes: 45 additions & 0 deletions src/Route/Note.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

namespace Eventum\SlackUnfurl\Route;

use DateTimeZone;
use Eventum\SlackUnfurl\ApiClient;
use Psr\Log\LoggerInterface;
use SlackUnfurl\Traits\LoggerTrait;

class Note
{
use LoggerTrait;

/** @var ApiClient */
private $client;
/** @var DateTimeZone */
private $utc;
/** @var DateTimeZone */
private $timeZone;

public function __construct(
ApiClient $client,
LoggerInterface $logger
) {
$this->client = $client;
$this->logger = $logger;
}

public function unfurl(string $url, array $parts): ?array
{
$noteId = (int)$parts['id'];
$note = $this->client->getNoteDetails($noteId);
$this->debug(' note', ['note' => $note]);
$issueId = $note['not_iss_id'];
$issueUrl = $note['issue_url'];

return [
'title' => "Note in <$issueUrl|Issue #{$issueId}>: {$note['not_title']}",
'text' => $note['not_note'],
'color' => '#006486',
'ts' => $note['not_created_date_ts'],
'footer' => "Note by {$note['not_from']}",
];
}
}
14 changes: 13 additions & 1 deletion src/ServiceProvider/EventumUnfurlServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Eventum\SlackUnfurl\ServiceProvider;

use Eventum\RPC\EventumXmlRpcClient;
use Eventum\SlackUnfurl\ApiClient;
use Eventum\SlackUnfurl\Event\Subscriber\EventumUnfurler;
use Eventum\SlackUnfurl\Route;
use Eventum\SlackUnfurl\Route\EventumRoutes;
Expand All @@ -29,6 +30,10 @@ public function register(Container $app): void
return $client;
};

$app[ApiClient::class] = static function ($app) {
return new ApiClient($app[EventumXmlRpcClient::class]);
};

$app[EventumRoutes::class] = static function ($app) {
return new EventumRoutes($app['eventum.domain']);
};
Expand All @@ -44,11 +49,18 @@ public function register(Container $app): void

$app[Route\Issue::class] = static function ($app) {
return new Route\Issue(
$app[EventumXmlRpcClient::class],
$app[ApiClient::class],
$app['eventum.timezone'],
$app['logger']
);
};

$app[Route\Note::class] = static function ($app) {
return new Route\Note(
$app[ApiClient::class],
$app['logger']
);
};
}

public function subscribe(Container $app, EventDispatcherInterface $dispatcher): void
Expand Down

0 comments on commit f66bf58

Please sign in to comment.