Correct a parameter order swap in "diffusion.historyquery" for Mercurial
[phabricator.git] / src / applications / doorkeeper / bridge / DoorkeeperBridgeGitHubIssue.php
blobb5d7ddeea5a320f6f148ab607175dbf87a7b147a
1 <?php
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)) {
10 return false;
13 if ($ref->getObjectType() !== self::OBJTYPE_GITHUB_ISSUE) {
14 return false;
17 return true;
20 public function pullRefs(array $refs) {
21 $token = $this->getGitHubAccessToken();
22 if (!strlen($token)) {
23 return null;
26 $template = id(new PhutilGitHubFuture())
27 ->setAccessToken($token);
29 $futures = array();
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}";
34 $data = array();
35 $futures[$key] = id(clone $template)
36 ->setRawGitHubQuery($uri, $data);
39 $results = array();
40 $failed = array();
41 foreach (new FutureIterator($futures) as $key => $future) {
42 try {
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
48 // objects?
49 } else {
50 phlog($ex);
51 $failed[$key] = $ex;
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());
62 if ($did_fail) {
63 $ref->setSyncFailed(true);
64 continue;
67 $result = idx($results, $ref->getObjectKey());
68 if (!$result) {
69 continue;
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);