* @author Joseph Bielawski */ class Issue extends AbstractApi { use AcceptHeaderTrait; /** * Configure the body type. * * @link https://developer.github.com/v3/issues/#custom-media-types * * @param string|null $bodyType * * @return $this */ public function configure($bodyType = null) { if (!in_array($bodyType, ['text', 'html', 'full'])) { $bodyType = 'raw'; } $this->acceptHeaderValue = sprintf('application/vnd.github.%s.%s+json', $this->getApiVersion(), $bodyType); return $this; } /** * List issues by username, repo and state. * * @link http://developer.github.com/v3/issues/ * * @param string $username the username * @param string $repository the repository * @param array $params the additional parameters like milestone, assignees, labels, sort, direction * * @return array list of issues found */ public function all($username, $repository, array $params = []) { return $this->get('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/issues', array_merge(['page' => 1], $params)); } /** * List issues by organization. * * @link http://developer.github.com/v3/issues/ * * @param string $organization the organization * @param string $state the issue state, can be open or closed * @param array $params the additional parameters like milestone, assignees, labels, sort, direction * * @return array list of issues found */ public function org($organization, $state, array $params = []) { if (!in_array($state, ['open', 'closed'])) { $state = 'open'; } return $this->get('/orgs/'.rawurlencode($organization).'/issues', array_merge(['page' => 1, 'state' => $state], $params)); } /** * Get extended information about an issue by its username, repo and number. * * @link http://developer.github.com/v3/issues/ * * @param string $username the username * @param string $repository the repository * @param int $id the issue number * * @return array information about the issue */ public function show($username, $repository, $id) { return $this->get('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/issues/'.$id); } /** * Create a new issue for the given username and repo. * The issue is assigned to the authenticated user. Requires authentication. * * @link http://developer.github.com/v3/issues/ * * @param string $username the username * @param string $repository the repository * @param array $params the new issue data * * @throws MissingArgumentException * * @return array information about the issue */ public function create($username, $repository, array $params) { if (!isset($params['title'])) { throw new MissingArgumentException(['title']); } return $this->post('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/issues', $params); } /** * Update issue information's by username, repo and issue number. Requires authentication. * * @link http://developer.github.com/v3/issues/ * * @param string $username the username * @param string $repository the repository * @param int $id the issue number * @param array $params key=>value user attributes to update. * key can be title or body * * @return array information about the issue */ public function update($username, $repository, $id, array $params) { return $this->patch('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/issues/'.$id, $params); } /** * Lock an issue. Users with push access can lock an issue's conversation. * * @link https://developer.github.com/v3/issues/#lock-an-issue * * @param string $username * @param string $repository * @param int $id * * @return string */ public function lock($username, $repository, $id) { return $this->put('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/issues/'.$id.'/lock'); } /** * Unlock an issue. Users with push access can unlock an issue's conversation. * * @link https://developer.github.com/v3/issues/#lock-an-issue * * @param string $username * @param string $repository * @param int $id * * @return string */ public function unlock($username, $repository, $id) { return $this->delete('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/issues/'.$id.'/lock'); } /** * List an issue comments. * * @link http://developer.github.com/v3/issues/comments/ * * @return Comments */ public function comments() { return new Comments($this->getClient()); } /** * List all project events. * * @link http://developer.github.com/v3/issues/events/ * * @return Events */ public function events() { return new Events($this->getClient()); } /** * List all project labels. * * @link http://developer.github.com/v3/issues/labels/ * * @return Labels */ public function labels() { return new Labels($this->getClient()); } /** * List all project milestones. * * @link http://developer.github.com/v3/issues/milestones/ * * @return Milestones */ public function milestones() { return new Milestones($this->getClient()); } /** * List all assignees. * * @link https://developer.github.com/v3/issues/assignees/ * * @return Assignees */ public function assignees() { return new Assignees($this->getClient()); } /** * List all events. * * @link https://developer.github.com/v3/issues/timeline/ * * @return Timeline */ public function timeline() { return new Timeline($this->getClient()); } }