77 lines
2.8 KiB
PHP
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,
|
|
]);
|
|
}
|
|
}
|