Path: blob/master/src/applications/doorkeeper/bridge/DoorkeeperBridgeGitHubIssue.php
12256 views
<?php12final class DoorkeeperBridgeGitHubIssue3extends DoorkeeperBridgeGitHub {45const OBJTYPE_GITHUB_ISSUE = 'github.issue';67public function canPullRef(DoorkeeperObjectRef $ref) {8if (!parent::canPullRef($ref)) {9return false;10}1112if ($ref->getObjectType() !== self::OBJTYPE_GITHUB_ISSUE) {13return false;14}1516return true;17}1819public function pullRefs(array $refs) {20$token = $this->getGitHubAccessToken();21if (!strlen($token)) {22return null;23}2425$template = id(new PhutilGitHubFuture())26->setAccessToken($token);2728$futures = array();29$id_map = mpull($refs, 'getObjectID', 'getObjectKey');30foreach ($id_map as $key => $id) {31list($user, $repository, $number) = $this->parseGitHubIssueID($id);32$uri = "/repos/{$user}/{$repository}/issues/{$number}";33$data = array();34$futures[$key] = id(clone $template)35->setRawGitHubQuery($uri, $data);36}3738$results = array();39$failed = array();40foreach (new FutureIterator($futures) as $key => $future) {41try {42$results[$key] = $future->resolve();43} catch (Exception $ex) {44if (($ex instanceof HTTPFutureResponseStatus) &&45($ex->getStatusCode() == 404)) {46// TODO: Do we end up here for deleted objects and invisible47// objects?48} else {49phlog($ex);50$failed[$key] = $ex;51}52}53}5455$viewer = $this->getViewer();5657foreach ($refs as $ref) {58$ref->setAttribute('name', pht('GitHub Issue %s', $ref->getObjectID()));5960$did_fail = idx($failed, $ref->getObjectKey());61if ($did_fail) {62$ref->setSyncFailed(true);63continue;64}6566$result = idx($results, $ref->getObjectKey());67if (!$result) {68continue;69}7071$body = $result->getBody();7273$ref->setIsVisible(true);74$ref->setAttribute('api.raw', $body);75$ref->setAttribute('name', $body['title']);7677$obj = $ref->getExternalObject();7879$this->fillObjectFromData($obj, $result);80$this->saveExternalObject($ref, $obj);81}82}8384public function fillObjectFromData(DoorkeeperExternalObject $obj, $result) {85$body = $result->getBody();86$uri = $body['html_url'];87$obj->setObjectURI($uri);8889$title = idx($body, 'title');90$description = idx($body, 'body');9192$created = idx($body, 'created_at');93$created = strtotime($created);9495$state = idx($body, 'state');9697$obj->setProperty('task.title', $title);98$obj->setProperty('task.description', $description);99$obj->setProperty('task.created', $created);100$obj->setProperty('task.state', $state);101}102103}104105106