GiteaUsername) { return ['username' => $utilisateur->GiteaUsername, 'motDePasseInitial' => null]; } $client = $this->client(); if ($client === null) { return null; } // Un compte existe peut-être déjà avec cet email (créé hors du site) : on le réutilise. if ($existant = $this->chercherParEmail($client, $utilisateur->Email)) { $utilisateur->GiteaUsername = $existant; $utilisateur->save(); return ['username' => $existant, 'motDePasseInitial' => null]; } $username = $this->genererUsername($utilisateur); $motDePasse = Str::password(16); try { $response = $client->post('/api/v1/admin/users', [ 'username' => $username, 'email' => $utilisateur->Email, 'password' => $motDePasse, 'full_name' => $utilisateur->Pseudo ?? $username, 'must_change_password' => true, 'send_notify' => false, ]); } catch (\Throwable $e) { Log::error('Appel API Gitea (création utilisateur) impossible : '.$e->getMessage()); return null; } if ($response->failed()) { Log::warning('Création du compte Gitea échouée (token admin requis ?)', [ 'status' => $response->status(), 'body' => $response->body(), ]); return null; } $utilisateur->GiteaUsername = $username; $utilisateur->save(); return ['username' => $username, 'motDePasseInitial' => $motDePasse]; } private function client(): ?PendingRequest { $url = rtrim((string) config('services.gitea.url'), '/'); $token = (string) (config('services.gitea.admin_token') ?: config('services.gitea.token')); if ($url === '' || $token === '') { Log::warning('Gitea non configuré (URL / token manquant) : compte utilisateur non créé.'); return null; } return Http::baseUrl($url) ->withToken($token, 'token') ->acceptJson() ->timeout(10); } private function chercherParEmail(PendingRequest $client, string $email): ?string { try { $response = $client->get('/api/v1/admin/emails/search', ['q' => $email]); } catch (\Throwable) { return null; } if ($response->failed()) { return null; } foreach ($response->json() ?? [] as $entree) { if (strcasecmp($entree['email'] ?? '', $email) === 0) { return $entree['username'] ?? null; } } return null; } /** * Username déterministe et unique : pseudo en slug, suffixé de l'ID interne. */ private function genererUsername(Utilisateur $utilisateur): string { $base = Str::slug((string) ($utilisateur->Pseudo ?? '')); if ($base === '') { $base = 'utilisateur'; } return Str::limit($base, 30, '').'-'.$utilisateur->ID_Utilisateur; } }