Files
Ressources-relationnel/app/Services/GiteaIssueService.php
T
Azmog 85572bd258
CI - Intégration continue / quality-and-tests (push) Successful in 3m10s
CD - Déploiement continu / deploy (push) Successful in 3m5s
feat: ajout du provisionnement des comptes Gitea pour les utilisateurs lors de la soumission de suggestions
2026-07-07 23:43:50 +02:00

83 lines
2.5 KiB
PHP

<?php
namespace App\Services;
use Illuminate\Http\Client\Response;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class GiteaIssueService
{
/**
* Crée un ticket (issue) dans le dépôt Gitea configuré.
*
* Si $sudo est fourni (username Gitea de l'utilisateur), le ticket est
* créé en son nom via l'en-tête "Sudo" (nécessite un token admin). En cas
* de refus, on retombe sur une création avec le compte de service.
*
* @return bool true si le ticket a bien été créé, false sinon.
*/
public function createIssue(string $title, string $body, ?string $sudo = null): bool
{
$url = rtrim((string) config('services.gitea.url'), '/');
$repo = trim((string) config('services.gitea.repo'), '/');
$token = (string) config('services.gitea.token');
if ($url === '' || $repo === '' || $token === '') {
Log::warning('Gitea non configuré (URL / token / dépôt manquant) : ticket non créé.');
return false;
}
try {
$response = $this->postIssue($url, $repo, $token, $title, $body, $sudo);
if ($sudo !== null && $response->failed()) {
Log::warning('Création du ticket au nom de l\'utilisateur refusée, repli sur le compte de service.', [
'sudo' => $sudo,
'status' => $response->status(),
]);
$response = $this->postIssue($url, $repo, $token, $title, $body, null);
}
} catch (\Throwable $e) {
Log::error('Appel API Gitea impossible : '.$e->getMessage());
return false;
}
if ($response->failed()) {
Log::error('Création du ticket Gitea échouée', [
'status' => $response->status(),
'body' => $response->body(),
]);
return false;
}
return true;
}
private function postIssue(
string $url,
string $repo,
string $token,
string $title,
string $body,
?string $sudo,
): Response {
// Gitea attend l'en-tête "Authorization: token <TOKEN>".
$request = Http::withToken($token, 'token')
->acceptJson()
->timeout(10);
if ($sudo !== null) {
$request = $request->withHeaders(['Sudo' => $sudo]);
}
return $request->post("{$url}/api/v1/repos/{$repo}/issues", [
'title' => $title,
'body' => $body,
]);
}
}