3 final class DoorkeeperBridgeGitHubIssue
4 extends DoorkeeperBridgeGitHub
{
6 const OBJTYPE_GITHUB_ISSUE
= 'github.issue';
8 public function canPullRef(DoorkeeperObjectRef
$ref) {
9 if (!parent
::canPullRef($ref)) {
13 if ($ref->getObjectType() !== self
::OBJTYPE_GITHUB_ISSUE
) {
20 public function pullRefs(array $refs) {
21 $token = $this->getGitHubAccessToken();
22 if (!strlen($token)) {
26 $template = id(new PhutilGitHubFuture())
27 ->setAccessToken($token);
30 $id_map = mpull($refs, 'getObjectID', 'getObjectKey');
31 foreach ($id_map as $key => $id) {
32 list($user, $repository, $number) = $this->parseGitHubIssueID($id);
33 $uri = "/repos/{$user}/{$repository}/issues/{$number}";
35 $futures[$key] = id(clone $template)
36 ->setRawGitHubQuery($uri, $data);
41 foreach (new FutureIterator($futures) as $key => $future) {
43 $results[$key] = $future->resolve();
44 } catch (Exception
$ex) {
45 if (($ex instanceof HTTPFutureResponseStatus
) &&
46 ($ex->getStatusCode() == 404)) {
47 // TODO: Do we end up here for deleted objects and invisible
56 $viewer = $this->getViewer();
58 foreach ($refs as $ref) {
59 $ref->setAttribute('name', pht('GitHub Issue %s', $ref->getObjectID()));
61 $did_fail = idx($failed, $ref->getObjectKey());
63 $ref->setSyncFailed(true);
67 $result = idx($results, $ref->getObjectKey());
72 $body = $result->getBody();
74 $ref->setIsVisible(true);
75 $ref->setAttribute('api.raw', $body);
76 $ref->setAttribute('name', $body['title']);
78 $obj = $ref->getExternalObject();
80 $this->fillObjectFromData($obj, $result);
81 $this->saveExternalObject($ref, $obj);
85 public function fillObjectFromData(DoorkeeperExternalObject
$obj, $result) {
86 $body = $result->getBody();
87 $uri = $body['html_url'];
88 $obj->setObjectURI($uri);
90 $title = idx($body, 'title');
91 $description = idx($body, 'body');
93 $created = idx($body, 'created_at');
94 $created = strtotime($created);
96 $state = idx($body, 'state');
98 $obj->setProperty('task.title', $title);
99 $obj->setProperty('task.description', $description);
100 $obj->setProperty('task.created', $created);
101 $obj->setProperty('task.state', $state);