Refactor some function in Project

This commit is contained in:
Alex Cabal 2025-01-28 10:29:08 -06:00
parent 6378d687d8
commit 0b461d7ede

View file

@ -56,6 +56,9 @@ final class Project{
protected ?string $_VcsUrlDomain; protected ?string $_VcsUrlDomain;
protected ?string $_DiscussionUrlDomain; protected ?string $_DiscussionUrlDomain;
/** Have we already checked that the `$VcsUrl` is current? */
private bool $IsVcsUrlUpdated = false;
// ******* // *******
// GETTERS // GETTERS
@ -512,7 +515,7 @@ final class Project{
} }
/** /**
* Update this object's `Status` to `reviewed` if there is a GitHub issue containing the word `review`. * Update this `Project`'s `$Status` to `reviewed` if there is a GitHub issue containing the word `review`.
* *
* @throws Exceptions\AppException If the operation failed. * @throws Exceptions\AppException If the operation failed.
*/ */
@ -525,21 +528,13 @@ final class Project{
return; return;
} }
$headers = [ $this->UpdateVcsUrl();
'Accept: application/vnd.github+json',
'X-GitHub-Api-Version: 2022-11-28',
'User-Agent: Standard Ebooks' // Required by GitHub.
];
if($apiKey !== null){
$headers[] = 'Authorization: Bearer ' . $apiKey;
}
$url = preg_replace('|^https://github.com/|iu', 'https://api.github.com/repos/', $this->VcsUrl . '/issues'); $url = preg_replace('|^https://github.com/|iu', 'https://api.github.com/repos/', $this->VcsUrl . '/issues');
$curl = curl_init($url); $curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_HTTPHEADER, $this->GenerateGitHubApiRequestHeaders($apiKey));
try{ try{
$response = curl_exec($curl); $response = curl_exec($curl);
@ -570,15 +565,11 @@ final class Project{
} }
/** /**
* Update this object's `LastCommitTimestamp` with data from its GitHub repo. * Generate an array of HTTP headers to use for authenticating to the GitHub API.
* *
* @throws Exceptions\AppException If the operation failed. * @return array<string>
*/ */
public function FetchLastCommitTimestamp(?string $apiKey = null): void{ private function GenerateGitHubApiRequestHeaders(?string $apiKey): array{
if(!preg_match('|^https://github\.com/|iu', $this->VcsUrl ?? '')){
return;
}
$headers = [ $headers = [
'Accept: application/vnd.github+json', 'Accept: application/vnd.github+json',
'X-GitHub-Api-Version: 2022-11-28', 'X-GitHub-Api-Version: 2022-11-28',
@ -589,7 +580,21 @@ final class Project{
$headers[] = 'Authorization: Bearer ' . $apiKey; $headers[] = 'Authorization: Bearer ' . $apiKey;
} }
// First, we check if the repo has been renamed. If so, update the repo now. return $headers;
}
/**
* Check if the `$VcsUrl` has been renamed since we stored it, and if it has, update it.
*/
private function UpdateVcsUrl(): void{
if(!preg_match('|^https://github\.com/|iu', $this->VcsUrl ?? '')){
return;
}
if($this->IsVcsUrlUpdated){
return;
}
$curl = curl_init($this->VcsUrl); $curl = curl_init($this->VcsUrl);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, Enums\HttpMethod::Head->value); // Only perform HTTP HEAD. curl_setopt($curl, CURLOPT_CUSTOMREQUEST, Enums\HttpMethod::Head->value); // Only perform HTTP HEAD.
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
@ -597,17 +602,32 @@ final class Project{
/** @var string $finalUrl */ /** @var string $finalUrl */
$finalUrl = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL); $finalUrl = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL);
// Were we redirected? // Were we redirected?
if($finalUrl != $this->VcsUrl){ if($finalUrl != $this->VcsUrl){
$this->VcsUrl = $finalUrl; $this->VcsUrl = $finalUrl;
} }
// Now check the actual commits. $this->IsVcsUrlUpdated = true;
}
/**
* Update this object's `$LastCommitTimestamp` with data from its GitHub repo.
*
* @throws Exceptions\AppException If the operation failed.
*/
public function FetchLastCommitTimestamp(?string $apiKey = null): void{
if(!preg_match('|^https://github\.com/|iu', $this->VcsUrl ?? '')){
return;
}
$this->UpdateVcsUrl();
$url = preg_replace('|^https://github.com/|iu', 'https://api.github.com/repos/', $this->VcsUrl . '/commits'); $url = preg_replace('|^https://github.com/|iu', 'https://api.github.com/repos/', $this->VcsUrl . '/commits');
$curl = curl_init($url); $curl = curl_init($url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_HTTPHEADER, $this->GenerateGitHubApiRequestHeaders($apiKey));
try{ try{
$response = curl_exec($curl); $response = curl_exec($curl);
@ -635,7 +655,7 @@ final class Project{
} }
/** /**
* Update this object's `LastDiscussionTimestamp` with data from its discussion page. * Update this object's `$LastDiscussionTimestamp` with data from its discussion page.
* *
* @throws Exceptions\AppException If the operation failed. * @throws Exceptions\AppException If the operation failed.
*/ */