mirror of
				https://github.com/sitelease/sugar-cube-client.git
				synced 2025-10-31 12:02:30 +01:00 
			
		
		
		
	Huge number of updates, too tired to list them all
+ Added a bunch of API handler classes that will use the already created models + Created a new Client class that will connect to new API handler classes + Created new collection classes
This commit is contained in:
		
							
								
								
									
										319
									
								
								src/Api/AbstractApi.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										319
									
								
								src/Api/AbstractApi.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,319 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Gitea\Api; | ||||
|  | ||||
| use Gitea\Client; | ||||
|  | ||||
| /** | ||||
|  * Abstract class for Api classes | ||||
|  * | ||||
|  * @author Benjamin Blake (sitelease.ca) | ||||
|  */ | ||||
| abstract class AbstractApi | ||||
| { | ||||
|     /** | ||||
|      * The client | ||||
|      * | ||||
|      * @var Client | ||||
|      */ | ||||
|     protected $client; | ||||
|  | ||||
|     /** | ||||
|      * The API authentication token for Gitea | ||||
|      * | ||||
|      * @var string | ||||
|      */ | ||||
|     private $authToken; | ||||
|  | ||||
|     /** | ||||
|      * The default parameters that should be sent | ||||
|      * in ALL requests to this api route | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $defaultParameters = []; | ||||
|  | ||||
|     /** | ||||
|      * The default headers that should be sent | ||||
|      * in ALL requests to this api route | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $defaultHeaders = [ | ||||
|       'Accept' => 'application/json' | ||||
|     ]; | ||||
|  | ||||
|     /** | ||||
|      * The default parameters that should be sent | ||||
|      * in all GET requests to this api route | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $getDefaultParameters = []; | ||||
|  | ||||
|     /** | ||||
|      * The default headers that should be sent | ||||
|      * in all GET requests to this api route | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $getDefaultHeaders = []; | ||||
|  | ||||
|     /** | ||||
|      * The default headers that should be sent | ||||
|      * in all POST requests to this api route | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $postDefaultHeaders = [ | ||||
|       'Content-Type' => 'application/json' | ||||
|     ]; | ||||
|  | ||||
|     /** | ||||
|      * The default headers that should be sent | ||||
|      * in all PUT requests to this api route | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $putDefaultHeaders = [ | ||||
|       'Content-Type' => 'application/json' | ||||
|     ]; | ||||
|  | ||||
|     /** | ||||
|      * The default headers that should be sent | ||||
|      * in all DELETE requests to this api route | ||||
|      * | ||||
|      * @var array | ||||
|      */ | ||||
|     protected $deleteDefaultHeaders = []; | ||||
|  | ||||
|     /** | ||||
|      * @param Client $client | ||||
|      */ | ||||
|     public function __construct(Client $client, $authToken) | ||||
|     { | ||||
|         $this->client = $client; | ||||
|         $this->authToken = $authToken; | ||||
|  | ||||
|         // Set authorization headers and parameters | ||||
|         $this->getDefaultParameters["access_token"] = $authToken; | ||||
|         $this->postDefaultHeaders["Authorization"] = "token $authToken"; | ||||
|         $this->putDefaultHeaders["Authorization"] = "token $authToken"; | ||||
|         $this->deleteDefaultHeaders["Authorization"] = "token $authToken"; | ||||
|     } | ||||
|  | ||||
|     public function getClient() { | ||||
|       return $this->client; | ||||
|     } | ||||
|  | ||||
|     public function getAuthToken() { | ||||
|       return $this->authToken; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the default parameters for a particular type of request | ||||
|      * | ||||
|      * If "all" is passed OR if the $type parameter is left blank | ||||
|      * an array of defaults for ALL request types will be returned | ||||
|      * | ||||
|      * @author Benjamin Blake (sitelease.ca) | ||||
|      * | ||||
|      * @param string $type The type of request ("all","get","post","put",etc.) | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getDefaultParametersForType($type = "all") { | ||||
|       if (!$type || $type == "all") { | ||||
|         return $this->defaultParameters; | ||||
|       } else { | ||||
|         $propertyName = $type."DefaultParameters"; | ||||
|         if (property_exists(__CLASS__, $propertyName) && is_array($this->$propertyName)) { | ||||
|           return array_merge($this->defaultParameters, $this->$propertyName); | ||||
|         } else { | ||||
|           return []; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Get the default headers for a particular type of request | ||||
|      * | ||||
|      * If "all" is passed OR if the $type parameter is left blank | ||||
|      * an array of defaults for ALL request types will be returned | ||||
|      * | ||||
|      * @author Benjamin Blake (sitelease.ca) | ||||
|      * | ||||
|      * @param string $type The type of request ("all", "get","post","put",etc.) | ||||
|      * @return array | ||||
|      */ | ||||
|     public function getDefaultHeadersForType($type = "all") { | ||||
|       if (!$type || $type == "all") { | ||||
|         return $this->defaultHeaders; | ||||
|       } else { | ||||
|         $propertyName = $type."DefaultHeaders"; | ||||
|         if (property_exists(__CLASS__, $propertyName) && is_array($this->$propertyName)) { | ||||
|           return array_merge($this->defaultParameters, $this->$propertyName); | ||||
|         } else { | ||||
|           return []; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return $this | ||||
|      * @codeCoverageIgnore | ||||
|      */ | ||||
|     public function configure() | ||||
|     { | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Performs a GET query and returns the response as a PSR-7 response object. | ||||
|      * | ||||
|      * @param string $path | ||||
|      * @param array $parameters | ||||
|      * @param array $requestHeaders | ||||
|      * @return ResponseInterface | ||||
|      */ | ||||
|     protected function getAsResponse($path, array $parameters = array(), $requestHeaders = array()) | ||||
|     { | ||||
|         $path = $this->preparePath($path, $parameters); | ||||
|  | ||||
|         return $this->client->getHttpClient()->get($path, $requestHeaders); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param string $path | ||||
|      * @param array $parameters | ||||
|      * @param array $requestHeaders | ||||
|      * @return mixed | ||||
|      */ | ||||
|     protected function get($path, array $parameters = array(), $requestHeaders = array(), $debugRequest = false) | ||||
|     { | ||||
|       $client = $this->getClient(); | ||||
|       $guzzleClient = $client->getGuzzleClient(); | ||||
|       $defaultParameters = $this->getDefaultParametersForType("get"); | ||||
|       $defaultHeaders = $this->getDefaultParametersForType("get"); | ||||
|  | ||||
|       // Create request options array | ||||
|       // and populate it with defaults | ||||
|       $requestOptions = []; | ||||
|       $requestOptions['query'] = $defaultParameters; | ||||
|       $requestOptions['headers'] = $defaultHeaders; | ||||
|       if ($debugRequest) { | ||||
|         $requestOptions['debug'] = true; | ||||
|       } | ||||
|  | ||||
|       if ($parameters) { | ||||
|         $requestOptions['query'] = array_merge($defaultParameters, $parameters); | ||||
|       } | ||||
|  | ||||
|       if ($requestHeaders) { | ||||
|         $requestOptions['headers'] = array_merge($defaultHeaders, $requestHeaders); | ||||
|       } | ||||
|  | ||||
|       return $guzzleClient->request('GET', $path, $requestOptions); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param string $path | ||||
|      * @param array $body | ||||
|      * @param array $requestHeaders | ||||
|      * @return mixed | ||||
|      */ | ||||
|     protected function post($path, $body, $requestHeaders = array(), $debugRequest = false) | ||||
|     { | ||||
|       $client = $this->getClient(); | ||||
|       $guzzleClient = $client->getGuzzleClient(); | ||||
|       $defaultHeaders = $this->getDefaultHeadersForType("post"); | ||||
|  | ||||
|       // Create request options array | ||||
|       // and populate it with defaults | ||||
|       $requestOptions = []; | ||||
|       $requestOptions['headers'] = $defaultHeaders; | ||||
|       $requestOptions['body'] = "{}"; | ||||
|       if ($debugRequest) { | ||||
|         $requestOptions['debug'] = true; | ||||
|       } | ||||
|  | ||||
|       if ($body) { | ||||
|         if (is_object($body)) { | ||||
|           $requestOptions['body'] = json_encode($body); | ||||
|         } | ||||
|  | ||||
|         if (is_string($body)) { | ||||
|           $requestOptions['body'] = $body; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       if ($requestHeaders) { | ||||
|         $requestOptions['headers'] = array_merge($defaultHeaders, $requestHeaders); | ||||
|       } | ||||
|  | ||||
|       return $guzzleClient->request('POST', $path, $requestOptions); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param string $path | ||||
|      * @param array $body | ||||
|      * @param array $requestHeaders | ||||
|      * @return mixed | ||||
|      */ | ||||
|     protected function put($path, $body, $requestHeaders = array(), $debugRequest = false) | ||||
|     { | ||||
|       $client = $this->getClient(); | ||||
|       $guzzleClient = $client->getGuzzleClient(); | ||||
|       $defaultHeaders = $this->getDefaultHeadersForType("put"); | ||||
|  | ||||
|       // Create request options array | ||||
|       // and populate it with defaults | ||||
|       $requestOptions = []; | ||||
|       $requestOptions['headers'] = $defaultHeaders; | ||||
|       $requestOptions['body'] = "{}"; | ||||
|       if ($debugRequest) { | ||||
|         $requestOptions['debug'] = true; | ||||
|       } | ||||
|  | ||||
|       if ($body) { | ||||
|         if (is_object($body)) { | ||||
|           $requestOptions['body'] = json_encode($body); | ||||
|         } | ||||
|  | ||||
|         if (is_string($body)) { | ||||
|           $requestOptions['body'] = $body; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       if ($requestHeaders) { | ||||
|         $requestOptions['headers'] = array_merge($defaultHeaders, $requestHeaders); | ||||
|       } | ||||
|  | ||||
|       return $guzzleClient->request('PUT', $path, $requestOptions); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @param string $path | ||||
|      * @param array $requestHeaders | ||||
|      * @return mixed | ||||
|      */ | ||||
|     protected function delete($path, $requestHeaders = array(), $debugRequest = false) | ||||
|     { | ||||
|       $client = $this->getClient(); | ||||
|       $guzzleClient = $client->getGuzzleClient(); | ||||
|       $defaultHeaders = $this->getDefaultHeadersForType("delete"); | ||||
|  | ||||
|       // Create request options array | ||||
|       // and populate it with defaults | ||||
|       $requestOptions = []; | ||||
|       $requestOptions['headers'] = $defaultHeaders; | ||||
|       if ($debugRequest) { | ||||
|         $requestOptions['debug'] = true; | ||||
|       } | ||||
|  | ||||
|       if ($requestHeaders) { | ||||
|         $requestOptions['headers'] = array_merge($defaultHeaders, $requestHeaders); | ||||
|       } | ||||
|  | ||||
|       return $guzzleClient->request('DELETE', $path, $requestOptions); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										46
									
								
								src/Api/Organizations.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/Api/Organizations.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,46 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Gitea\Api; | ||||
|  | ||||
| use GuzzleHttp\Psr7\Response; | ||||
|  | ||||
| use Gitea\Client; | ||||
| use Gitea\Models\Organization; | ||||
|  | ||||
| use Gitea\Api\AbstractApi; | ||||
|  | ||||
| class Organizations extends AbstractApi | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * Get an organization using its username and parse | ||||
|      * it's information into an organization object | ||||
|      * | ||||
|      * Example: | ||||
|      * ``` | ||||
|      * $giteaClient->organizations()->getByUsername($orgUsername); | ||||
|      * ``` | ||||
|      * | ||||
|      * @param string $username | ||||
|      * @author Benjamin Blake (sitelease.ca) | ||||
|      * | ||||
|      * @return Organization|Response | ||||
|      */ | ||||
|     public function getByUsername(string $username) | ||||
|     { | ||||
|         $client = $this->getClient(); | ||||
|         try { | ||||
|             $response = $this->get("orgs/$username"); | ||||
|             $statusCode = $response->getStatusCode(); | ||||
|             $body = $response->getBody(); | ||||
|             if ($statusCode == 200) { | ||||
|                 return Organization::fromJson(json_decode($body)); | ||||
|             } else { | ||||
|                 return $response; | ||||
|             } | ||||
|         } catch (ServerException $serverError) { | ||||
|             return $response; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										115
									
								
								src/Api/Repositories.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								src/Api/Repositories.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,115 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Gitea\Api; | ||||
|  | ||||
| use Gitea\Client; | ||||
| use Gitea\Collections\ApiItemCollection; | ||||
| use Gitea\Models\Repository; | ||||
|  | ||||
| use Gitea\Api\AbstractApi; | ||||
|  | ||||
| class Repositories extends AbstractApi | ||||
| { | ||||
|  | ||||
|     /** | ||||
|      * The maximum number of pages to process when | ||||
|      * retrieving all repositories | ||||
|      * | ||||
|      * NOTE: Each page will contain the number of items | ||||
|      * set in the $maxPageCount property (50 by default). | ||||
|      * So you can get the number of records that this will equate to | ||||
|      * by multiplying this number by the $maxPageCount | ||||
|      * | ||||
|      * @var integer | ||||
|      */ | ||||
|     private $maxPageCount = 25; | ||||
|  | ||||
|     /** | ||||
|      * The number of items per page | ||||
|      * | ||||
|      * @var integer | ||||
|      */ | ||||
|     private $itemsPerPage = 50; | ||||
|  | ||||
|     /** | ||||
|      * Return a collection of all the repositories | ||||
|      * | ||||
|      * @author Benjamin Blake (sitelease.ca) | ||||
|      * | ||||
|      * @return ApiItemCollection | ||||
|      */ | ||||
|     public function all() | ||||
|     { | ||||
|         $allItems = array(); | ||||
|         $maxPageCount = $this->getMaxPageCount(); | ||||
|         // Loop over pages until the $maxPageCount is reached | ||||
|         for ($pageNum=1; $pageNum < $maxPageCount; $pageNum++) { | ||||
|             $searchItemsCollection = $this->search("", $pageNum); | ||||
|             if ($searchItemsCollection && $searchItemsCollection->count() > 0) { | ||||
|                 $searchItemsArray = $searchItemsCollection->toArray(); | ||||
|                 $allItems = array_merge($allItems, $searchItemsArray); | ||||
|             } else { | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|         return new ApiItemCollection($allItems); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Search all repositories and return a list of them | ||||
|      * | ||||
|      * Example: | ||||
|      * ``` | ||||
|      * $giteaClient->repositories()->search($keyword, $page); | ||||
|      * ``` | ||||
|      * | ||||
|      * @param string $keyword Keyword to search by | ||||
|      * @param integer $page The page of items to return | ||||
|      * @param integer $limit Maximum number of items per page | ||||
|      * @param array $extraOptions An array of extra options to pass the API reoute | ||||
|      * @return void | ||||
|      * | ||||
|      * @return ApiItemCollection | ||||
|      */ | ||||
|     public function search(string $keyword = "", int $page = 1, int $limit = null, array $extraOptions = array()) | ||||
|     { | ||||
|         $client = $this->getClient(); | ||||
|         $limit = $limit ?? $this->getItemsPerPage(); | ||||
|  | ||||
|         $repositoryCollection = new ApiItemCollection(); | ||||
|         try { | ||||
|             $response = $this->get("repos/search",[ | ||||
|                 "page" => $page, | ||||
|                 "limit" => $limit | ||||
|             ]); | ||||
|             $statusCode = $response->getStatusCode(); | ||||
|             $body = (string) $response->getBody(); | ||||
|             if ($statusCode == 200) { | ||||
|                 $jsonObj = json_decode($body, true); | ||||
|                 $jsonOk = $jsonObj["ok"]; | ||||
|                 $jsonItemList = $jsonObj["data"]; | ||||
|  | ||||
|                 if ($jsonOk && count($jsonItemList) > 0) { | ||||
|                     foreach ($jsonItemList as $jsonItem) { | ||||
|                         $encodedItem = json_encode($jsonItem); | ||||
|                         $itemObject = Repository::fromJson(json_decode($encodedItem)); | ||||
|                         $repositoryCollection->addItem($itemObject, $itemObject->getId()); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             return $repositoryCollection; | ||||
|  | ||||
|         } catch (ServerException $serverError) { | ||||
|             return $repositoryCollection; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public function getMaxPageCount() { | ||||
|         return $this->maxPageCount; | ||||
|     } | ||||
|  | ||||
|     public function getItemsPerPage() { | ||||
|         return $this->itemsPerPage; | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										147
									
								
								src/Client.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								src/Client.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,147 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Gitea; | ||||
|  | ||||
| use GuzzleHttp\Client as GuzzleClient; | ||||
| use GuzzleHttp\Exception\ServerException; | ||||
|  | ||||
| use Gitea\Models\Repository; | ||||
| use Gitea\Models\Tag; | ||||
| use Gitea\Models\Branch; | ||||
|  | ||||
| use Gitea\Api\Repositories; | ||||
| use Gitea\Api\Organizations; | ||||
|  | ||||
| use \JsonSerializable; | ||||
|  | ||||
| /** Represents a Gitea push event. */ | ||||
| class Client { | ||||
|  | ||||
|     /** | ||||
|      * Stores an instance of Guzzle's Client | ||||
|      * | ||||
|      * @var GuzzleClient | ||||
|      */ | ||||
|     private $guzzleClient; | ||||
|  | ||||
|     /** | ||||
|      * The base URL for Gitea | ||||
|      * | ||||
|      * All API requests will be relative to this URL | ||||
|      * | ||||
|      * @var string | ||||
|      */ | ||||
|     private $giteaURL; | ||||
|  | ||||
|     /** | ||||
|      * The API authentication token for Gitea | ||||
|      * | ||||
|      * @var string | ||||
|      */ | ||||
|     private $authToken; | ||||
|  | ||||
|  | ||||
|     public function __construct($giteaURL, $authToken = null) | ||||
|     { | ||||
|         // Append a slash to any URL that doesn't end in '/' | ||||
|         if (!$this->endsWith($giteaURL, '/')) { | ||||
|             $giteaURL += "/"; | ||||
|         } | ||||
|         $this->giteaURL = $giteaURL; | ||||
|         $this->authToken = $authToken; | ||||
|  | ||||
|         // Create a new Guzzle Client | ||||
|         $this->guzzleClient = new GuzzleClient(['base_uri' => $giteaURL]); | ||||
|     } | ||||
|  | ||||
|     public function getGuzzleClient() | ||||
|     { | ||||
|         return $this->guzzleClient; | ||||
|     } | ||||
|  | ||||
|     public function getAuthToken() { | ||||
|         return $this->authToken; | ||||
|     } | ||||
|  | ||||
|     public function setAuthToken($value) { | ||||
|         $this->authToken = $value; | ||||
|         return $this; | ||||
|     } | ||||
|  | ||||
|     public function getBaseURL() | ||||
|     { | ||||
|         return $this->giteaURL; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Return true if first string ends with the second string. | ||||
|      * Otherwise return false | ||||
|      * | ||||
|      * @author Benjamin Blake (sitelease.ca) | ||||
|      * | ||||
|      * @param string $haystack | ||||
|      * @param string $needle | ||||
|      * @return boolean | ||||
|      */ | ||||
|     function endsWith($haystack, $needle) | ||||
|     { | ||||
|         return substr($haystack, -strlen($needle))===$needle; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Checks to make sure the auth token is in the right format | ||||
|      * | ||||
|      * Will raise errors if the token is in the wrong format | ||||
|      * | ||||
|      * @author Benjamin Blake (sitelease.ca) | ||||
|      * | ||||
|      * @return boolean | ||||
|      */ | ||||
|     public function checkAuthToken($softErrors = false) { | ||||
|         $authToken = $this->authToken; | ||||
|         if (!$authToken) { | ||||
|             if ($softErrors) { | ||||
|                 print("No authentication token was passed in"."\n"); | ||||
|             } else { | ||||
|                 trigger_error("No authentication token was passed in"); | ||||
|             } | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         if (!strlen($authToken) >= 40) { | ||||
|             if ($softErrors) { | ||||
|                 print("The authentication token is too short, it must be at lease 40 characters long"."\n"); | ||||
|             } else { | ||||
|                 trigger_error("The authentication token is too short, it must be at lease 40 characters long"); | ||||
|             } | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Return the Repositories api object | ||||
|      * | ||||
|      * @author Benjamin Blake (sitelease.ca) | ||||
|      * | ||||
|      * @return Repositories | ||||
|      */ | ||||
|     public function repositories() | ||||
|     { | ||||
|         return new Repositories($this, $this->getAuthToken()); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Return the Repositories api object | ||||
|      * | ||||
|      * @author Benjamin Blake (sitelease.ca) | ||||
|      * | ||||
|      * @return Organizations | ||||
|      */ | ||||
|     public function organizations() | ||||
|     { | ||||
|         return new Organizations($this, $this->getAuthToken()); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										86
									
								
								src/Collections/ApiCollectionInterface.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								src/Collections/ApiCollectionInterface.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,86 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Gitea\Collections; | ||||
|  | ||||
| use Gitea\Api\AbstractApi; | ||||
|  | ||||
| interface ApiCollectionInterface | ||||
| { | ||||
|     /** | ||||
|      * Construct the collection | ||||
|      * | ||||
|      * @author Benjamin Blake (sitelease.ca) | ||||
|      * | ||||
|      * @param array $internalArray | ||||
|      */ | ||||
|     public function __construct($internalArray = array()); | ||||
|  | ||||
|     /** | ||||
|      * Add an item to the collection | ||||
|      * | ||||
|      * @author Benjamin Blake (sitelease.ca) | ||||
|      * | ||||
|      * @param AbstractApi $apiObject | ||||
|      * @param string $key | ||||
|      */ | ||||
|     public function addItem($apiObject, $key = null); | ||||
|  | ||||
|     /** | ||||
|      * Remove an existing item from the collection | ||||
|      * | ||||
|      * @author Benjamin Blake (sitelease.ca) | ||||
|      * | ||||
|      * @param string $key | ||||
|      */ | ||||
|     public function deleteItem($key); | ||||
|  | ||||
|     /** | ||||
|      * Get an existing item from the collection | ||||
|      * | ||||
|      * @author Benjamin Blake (sitelease.ca) | ||||
|      * | ||||
|      * @param string $key | ||||
|      */ | ||||
|     public function getItem($key); | ||||
|  | ||||
|     /** | ||||
|      * Get a list of the keys in the collection | ||||
|      * | ||||
|      * @author Benjamin Blake (sitelease.ca) | ||||
|      * | ||||
|      * @param string $key | ||||
|      */ | ||||
|     public function keys(); | ||||
|  | ||||
|     /** | ||||
|      * Return the number of items in the collection | ||||
|      * | ||||
|      * @author Benjamin Blake (sitelease.ca) | ||||
|      */ | ||||
|     public function count(); | ||||
|  | ||||
|     /** | ||||
|      * Return true if a key existing in the collection | ||||
|      * | ||||
|      * @author Benjamin Blake (sitelease.ca) | ||||
|      * | ||||
|      * @param string $key | ||||
|      */ | ||||
|     public function keyExists($key); | ||||
|  | ||||
|     /** | ||||
|      * Convert the collection to an array | ||||
|      * | ||||
|      * @author Benjamin Blake (sitelease.ca) | ||||
|      */ | ||||
|     public function toArray(); | ||||
|  | ||||
|     /** | ||||
|      * Required definition of interface IteratorAggregate | ||||
|      * | ||||
|      * This method makes the collection work with loops | ||||
|      * | ||||
|      * @author Benjamin Blake (sitelease.ca) | ||||
|      */ | ||||
|     public function getIterator(); | ||||
| } | ||||
							
								
								
									
										69
									
								
								src/Collections/ApiItemCollection.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								src/Collections/ApiItemCollection.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,69 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Gitea\Collections; | ||||
|  | ||||
| use Gitea\Collections\ApiCollectionInterface; | ||||
|  | ||||
| use \Countable; | ||||
| use \IteratorAggregate; | ||||
| use \ArrayIterator; | ||||
|  | ||||
| class ApiItemCollection implements ApiCollectionInterface, IteratorAggregate, Countable | ||||
| { | ||||
|     private $items = array(); | ||||
|  | ||||
|     public function __construct($internalArray = array()) { | ||||
|         if ($internalArray && is_array($internalArray)) { | ||||
|             $this->items = $internalArray; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public function addItem($apiObject, $key = null) { | ||||
|         if ($key == null) { | ||||
|             $this->items[] = $apiObject; | ||||
|         } | ||||
|         else { | ||||
|             if (isset($this->items[$key])) { | ||||
|                 return false; | ||||
|             } else { | ||||
|                 $this->items[$key] = $apiObject; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public function deleteItem($key) { | ||||
|         if (isset($this->items[$key])) { | ||||
|             unset($this->items[$key]); | ||||
|         } else { | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public function getItem($key) { | ||||
|         if (isset($this->items[$key])) { | ||||
|             return $this->items[$key]; | ||||
|         } else { | ||||
|           return false; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public function keys() { | ||||
|         return array_keys($this->items); | ||||
|     } | ||||
|  | ||||
|     public function count() { | ||||
|         return count($this->items); | ||||
|     } | ||||
|  | ||||
|     public function keyExists($key) { | ||||
|         return isset($this->items[$key]); | ||||
|     } | ||||
|  | ||||
|     public function toArray() { | ||||
|         return $this->items; | ||||
|     } | ||||
|  | ||||
|     public function getIterator() { | ||||
|         return new ArrayIterator($this->items); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										149
									
								
								src/Model/Organization.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								src/Model/Organization.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,149 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Gitea\Models; | ||||
|  | ||||
| use GuzzleHttp\Psr7\Uri; | ||||
| use Psr\Http\Message\UriInterface; | ||||
|  | ||||
| use \JsonSerializable; | ||||
|  | ||||
| /** Represents a Gitea organization. */ | ||||
| class Organization implements JsonSerializable { | ||||
|  | ||||
|   /** @var UriInterface|null A URL pointing to the organization's avatar. */ | ||||
|   private $avatarURL = ''; | ||||
|  | ||||
|   /** @var string The organization description. */ | ||||
|   private $description = ''; | ||||
|  | ||||
|   /** @var string The organization's full name. */ | ||||
|   private $fullName = ''; | ||||
|  | ||||
|   /** @var int The organization identifier. */ | ||||
|   private $id = -1; | ||||
|  | ||||
|   /** @var string The organization location. */ | ||||
|   private $location; | ||||
|  | ||||
|   /** @var string The username of the organization */ | ||||
|   private $username; | ||||
|  | ||||
|   /** @var string The visibility of the organization */ | ||||
|   private $visibility; | ||||
|  | ||||
|   /** @var UriInterface|null The website URL of the organization */ | ||||
|   private $website = null; | ||||
|  | ||||
|   /** | ||||
|    * Creates a new organization. | ||||
|    * @param string $username The organization name. | ||||
|    * @param string $visibility The organization visibility. | ||||
|    */ | ||||
|   function __construct(string $username, string $visibility = "private") { | ||||
|     $this->setUserName($username); | ||||
|     $this->setVisibility($visibility); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Creates a new organization from the specified JSON map. | ||||
|    * @param object $map A JSON map representing an organization. | ||||
|    * @return static The instance corresponding to the specified JSON map. | ||||
|    */ | ||||
|   static function fromJson(object $map): self { | ||||
|     return (new static(isset($map->username) && is_string($map->username) ? $map->username : '', isset($map->visibility) && is_string($map->visibility) ? $map->visibility : 'private')) | ||||
|       ->setAvatarURL(isset($map->avatar_url) && is_string($map->avatar_url) ? new Uri($map->avatar_url) : null) | ||||
|       ->setDescription(isset($map->description) && is_string($map->description) ? $map->description : '') | ||||
|       ->setFullName(isset($map->full_name) && is_string($map->full_name) ? $map->full_name : '') | ||||
|       ->setLocation(isset($map->location) && is_string($map->location) ? $map->location : '') | ||||
|       ->setWebsite(isset($map->website) && is_string($map->website) ? new Uri($map->website) : null); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Converts this object to a map in JSON format. | ||||
|    * @return \stdClass The map in JSON format corresponding to this object. | ||||
|    */ | ||||
|   function jsonSerialize(): \stdClass { | ||||
|     return (object) [ | ||||
|       'avatar_url' => ($url = $this->getAvatarURL()) ? (string) $url : null, | ||||
|       'description' => $this->getDescription(), | ||||
|       'full_name' => $this->getFullName(), | ||||
|       'id' => $this->getId(), | ||||
|       'location' => $this->getLocation(), | ||||
|       'username' => $this->getUsername(), | ||||
|       'visibility' => $this->getVisibility(), | ||||
|       'website' => ($url = $this->getWebsite()) ? (string) $url : null | ||||
|     ]; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Gets the organization identifier. | ||||
|    * @return int The organization identifier. | ||||
|    */ | ||||
|   function getId(): int { | ||||
|     return $this->id; | ||||
|   } | ||||
|  | ||||
|   public function getAvatarURL(): ?UriInterface { | ||||
|     return $this->avatarURL; | ||||
|   } | ||||
|  | ||||
|   public function setAvatarURL(?UriInterface $value): self { | ||||
|     $this->avatarURL = $value; | ||||
|     return $this; | ||||
|   } | ||||
|  | ||||
|   public function getDescription() { | ||||
|     return $this->description; | ||||
|   } | ||||
|  | ||||
|   public function setDescription(string $value): self { | ||||
|     $this->description = $value; | ||||
|     return $this; | ||||
|   } | ||||
|  | ||||
|   public function getFullName() { | ||||
|     return $this->fullName; | ||||
|   } | ||||
|  | ||||
|   public function setFullName(string $value): self { | ||||
|     $this->fullName = $value; | ||||
|     return $this; | ||||
|   } | ||||
|  | ||||
|   public function getLocation() { | ||||
|     return $this->location; | ||||
|   } | ||||
|  | ||||
|   public function setLocation(string $value): self { | ||||
|     $this->location = $value; | ||||
|     return $this; | ||||
|   } | ||||
|  | ||||
|   public function getUsername() { | ||||
|     return $this->username; | ||||
|   } | ||||
|  | ||||
|   public function setUsername(string $value): self { | ||||
|     $this->username = $value; | ||||
|     return $this; | ||||
|   } | ||||
|  | ||||
|   public function getVisibility() { | ||||
|     return $this->visibility; | ||||
|   } | ||||
|  | ||||
|   public function setVisibility(string $value): self { | ||||
|     $this->visibility = $value; | ||||
|     return $this; | ||||
|   } | ||||
|  | ||||
|   public function getWebsite(): ?UriInterface { | ||||
|     return $this->website; | ||||
|   } | ||||
|  | ||||
|   public function setWebsite(?UriInterface $value): self { | ||||
|     $this->website = $value; | ||||
|     return $this; | ||||
|   } | ||||
|  | ||||
| } | ||||
| @ -81,7 +81,7 @@ class Repository implements \JsonSerializable { | ||||
|    * @param int $id The repository identifier. | ||||
|    * @param string $fullName The full name of the repository. | ||||
|    */ | ||||
|   function __construct(int $id, string $fullName) { | ||||
|   function __construct(int $id, string $fullName, object $giteaClient = null) { | ||||
|     $this->id = $id; | ||||
|     $this->setFullName($fullName); | ||||
|   } | ||||
| @ -552,4 +552,38 @@ class Repository implements \JsonSerializable { | ||||
|     $this->website = $value; | ||||
|     return $this; | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * Undocumented function
 | ||||
|    * | ||||
|    * Call: | ||||
|    * $giteaClient->projects->fetchall | ||||
|    * | ||||
|    * @author Benjamin Blake (sitelease.ca) | ||||
|    * | ||||
|    * @param Type $var | ||||
|    * @return void | ||||
|    */ | ||||
|   public static function getAll(Type $var = null) | ||||
|   { | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|    * Undocumented function
 | ||||
|    * | ||||
|    * Example: | ||||
|    * ``` | ||||
|    * $giteaClient->repositories->fetchall(); | ||||
|    * ``` | ||||
|    * | ||||
|    * @author Benjamin Blake (sitelease.ca) | ||||
|    * | ||||
|    * @param Type $var | ||||
|    * @return void | ||||
|    */ | ||||
|   public function get(Type $var = null) | ||||
|   { | ||||
| 
 | ||||
|   } | ||||
| } | ||||
							
								
								
									
										39
									
								
								src/TestRun.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								src/TestRun.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Gitea; | ||||
|  | ||||
| require 'vendor/autoload.php'; | ||||
|  | ||||
| use Gitea\Client; | ||||
|  | ||||
| print("Starting Script... \n"); | ||||
| print("Creating Guzzle client \n"); | ||||
| $giteaClient = new Client("https://gitea.devserver.localdomain:3000/api/v1/"); | ||||
| $giteaClient->setAuthToken('32e609ad39539c1d0e8544800bd49b1025ac6b49'); | ||||
| // print("Getting Organization via API \n"); | ||||
| // $organization = $giteaClient->organizations()->getByUsername("Sitelease"); | ||||
| // if ($organization) { | ||||
| //     print("Username: ".$organization->getUsername()."\n"); | ||||
| //     print("Full Name: ".$organization->getFullName()."\n"); | ||||
| //     print("Description: ".$organization->getDescription()."\n"); | ||||
| //     print("Website: ".$organization->getWebsite()."\n"); | ||||
| //     print("Location: ".$organization->getLocation()."\n"); | ||||
| //     var_dump(json_encode($organization)); | ||||
| // } else { | ||||
| //     print("No Data could be retrieved"."\n"); | ||||
| // } | ||||
| print("Getting all repos via API \n"); | ||||
| $repositories = $giteaClient->repositories()->all(); | ||||
| if ($repositories && count($repositories) > 0) { | ||||
|     foreach ($repositories as $item) { | ||||
|         print("Name: ".$item->getName()."\n"); | ||||
|         print("Full Name: ".$item->getFullName()."\n"); | ||||
|         print("Description: ".$item->getDescription()."\n"); | ||||
|         print("\n\n"); | ||||
|     } | ||||
|     print("Total Items: ".count($repositories)."\n"); | ||||
| } else { | ||||
|     print("No repos could be retrieved"."\n"); | ||||
| } | ||||
|  | ||||
| print("Exiting script"."\n"); | ||||
		Reference in New Issue
	
	Block a user