BxGitHubApi.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <?php defined('BX_DOL') or die('hack attempt');
  2. /**
  3. * Copyright (c) UNA, Inc - https://una.io
  4. * MIT License - https://opensource.org/licenses/MIT
  5. *
  6. * @defdroup GitHub GitHub
  7. * @indroup UnaModules
  8. *
  9. * @{
  10. */
  11. /*
  12. *
  13. * Creating a fine-grained personal access token
  14. * https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-fine-grained-personal-access-token
  15. *
  16. * Creating a personal access token (classic)
  17. * https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic
  18. *
  19. * Web application flow
  20. * https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/authorizing-oauth-apps#web-application-flow
  21. *
  22. * PHP GitHub API
  23. * https://github.com/KnpLabs/php-github-api/tree/master/doc
  24. *
  25. */
  26. class BxGitHubApi extends BxDol
  27. {
  28. protected $_oModule;
  29. protected $_oClient;
  30. protected $_sToken;
  31. protected $_bInit;
  32. public function __construct(&$oModule)
  33. {
  34. $this->_oModule = $oModule;
  35. $this->_oClient = new \Github\Client();
  36. $this->_sToken = '';
  37. $this->_bInit = false;
  38. }
  39. public function init($iProfileId)
  40. {
  41. $aSettings = $this->_oModule->_oDb->getSettings(['sample' => 'profile_id', 'profile_id' => $iProfileId]);
  42. if(empty($aSettings) || !is_array($aSettings) || empty($aSettings['pat']))
  43. return false;
  44. $this->_sToken = $aSettings['pat'];
  45. $this->_bInit = true;
  46. }
  47. public function authenticate()
  48. {
  49. if(!$this->_bInit)
  50. return false;
  51. $this->_oClient->authenticate($this->_sToken, '', Github\AuthMethod::ACCESS_TOKEN);
  52. return true;
  53. }
  54. public function getRepositories($sUsername)
  55. {
  56. if(!$this->authenticate())
  57. return [];
  58. return $this->_oClient->api('user')->repositories($sUsername);
  59. }
  60. public function getIssues($sUsername, $sRepository, $sState = 'open', $bAuthenticate = true)
  61. {
  62. $aIssues = [];
  63. if($bAuthenticate && !$this->authenticate())
  64. return $aIssues;
  65. try {
  66. $aIssues = $this->_oClient->api('issue')->all($sUsername, $sRepository, ['state' => $sState]);
  67. }
  68. catch (Exception $oException) {
  69. $this->_processException('Get Issues:', $oException);
  70. }
  71. return $aIssues;
  72. }
  73. public function getIssue($sUsername, $sRepository, $iIssue, $bAuthenticate = true)
  74. {
  75. $aIssue = [];
  76. if($bAuthenticate && !$this->authenticate())
  77. return $aIssue;
  78. try {
  79. $aIssue = $this->_oClient->api('issue')->show($sUsername, $sRepository, $iIssue);
  80. }
  81. catch (Exception $oException) {
  82. $this->_processException('Get Issue:', $oException);
  83. }
  84. return $aIssue;
  85. }
  86. public function createIssue($sUsername, $sRepository, $sTitle, $sText = '', $aParams = [])
  87. {
  88. $aIssue = [];
  89. if(!$this->authenticate())
  90. return $aIssue;
  91. try {
  92. $aIssue = $this->_oClient->api('issue')->create($sUsername, $sRepository, array_merge(['title' => $sTitle, 'body' => $sText], $aParams));
  93. }
  94. catch (Exception $oException) {
  95. $this->_processException('Create Issue:', $oException);
  96. }
  97. return $aIssue;
  98. }
  99. public function updateIssue($sUsername, $sRepository, $iIssue, $aParams)
  100. {
  101. if(!$this->authenticate() || !$aParams || !is_array($aParams))
  102. return false;
  103. $aIssue = false;
  104. try {
  105. $aIssue = $this->_oClient->api('issue')->update($sUsername, $sRepository, $iIssue, $aParams);
  106. }
  107. catch (Exception $oException) {
  108. $this->_processException('Update issue:', $oException);
  109. }
  110. return $aIssue;
  111. }
  112. public function createLabel($sUsername, $sRepository, $mixedLabel, $bAuthenticate = true)
  113. {
  114. $aResult = [];
  115. if($bAuthenticate && !$this->authenticate())
  116. return $aResult;
  117. return $this->_oClient->api('issue')->labels()->create($sUsername, $sRepository, is_array($mixedLabel) ? $mixedLabel : [
  118. 'name' => $mixedLabel
  119. ]);
  120. }
  121. public function addLabel($sUsername, $sRepository, $iIssue, $mixedLabel)
  122. {
  123. if(!$this->authenticate() || !$mixedLabel)
  124. return false;
  125. return $this->_oClient->api('issue')->labels()->add($sUsername, $sRepository, $iIssue, is_array($mixedLabel) ? $mixedLabel : [
  126. 'name' => $mixedLabel
  127. ]);
  128. }
  129. protected function _processException($sMessage, &$oException)
  130. {
  131. $sError = $oException->getMessage();
  132. $this->_log($sMessage . ' ' . $sError);
  133. return false;
  134. }
  135. protected function _log($sContents)
  136. {
  137. $CNF = &$this->_oModule->_oConfig->CNF;
  138. if (is_array($sContents))
  139. $sContents = var_export($sContents, true);
  140. else if (is_object($sContents))
  141. $sContents = json_encode($sContents);
  142. bx_log($CNF['OBJECT_LOG_API'], $sContents, BX_LOG_ERR);
  143. }
  144. }