Files

77 lines
2.8 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;
use Illuminate\View\View;
class UpdateController extends Controller
{
public function index(): View
{
$currentVersion = config('version.current');
$giteaUrl = rtrim(config('version.gitea_url'), '/');
$giteaRepo = config('version.gitea_repo');
$latestVersion = null;
$updateAvailable = false;
$releaseNotes = null;
$error = null;
$checkedAt = Cache::get('app_update_checked_at');
if (empty($giteaUrl)) {
$error = 'GITEA_URL ist nicht in der .env konfiguriert. Bitte eintragen und Container neu starten.';
} else {
// Frisch prüfen (Cache überschreiben bei manuellem Aufruf)
try {
$response = Http::timeout(8)
->get("{$giteaUrl}/api/v1/repos/{$giteaRepo}/releases/latest");
if ($response->successful()) {
$latestVersion = $response->json('tag_name', '');
$releaseNotes = $response->json('body', '');
$updateAvailable = !empty($latestVersion) && version_compare(
ltrim($latestVersion, 'v'),
ltrim($currentVersion, 'v'),
'>'
);
Cache::put('app_update_available', $updateAvailable ? $latestVersion : false, now()->addHours(6));
Cache::put('app_update_checked_at', now()->toDateTimeString(), now()->addHours(6));
$checkedAt = now()->toDateTimeString();
} else {
$error = "Gitea nicht erreichbar (HTTP {$response->status()}).";
}
} catch (\Exception $e) {
$error = 'Verbindungsfehler: ' . $e->getMessage();
}
}
return view('admin.update', compact(
'currentVersion', 'latestVersion', 'updateAvailable',
'releaseNotes', 'error', 'checkedAt', 'giteaUrl', 'giteaRepo'
));
}
public function install(Request $request): RedirectResponse
{
$tag = $request->input('tag');
// Update-Command synchron ausführen und Ausgabe erfassen
Artisan::call('app:install-update', array_filter(['--tag' => $tag]));
$log = Artisan::output();
$success = !str_contains($log, 'fehlgeschlagen') && !str_contains($log, 'FAILURE');
return redirect()->route('admin.update.index')->with([
'update_result' => $success ? 'success' : 'error',
'update_log' => $log,
]);
}
}