Add database readiness check and setup redirect

This commit is contained in:
Arya Dwi Putra
2025-12-02 17:24:33 +07:00
parent d38c8d84b2
commit abb9b0297b
6 changed files with 108 additions and 4 deletions

View File

@@ -22,8 +22,21 @@ use Spatie\Permission\Models\Role;
class SetupWizardController extends Controller
{
private function dbReady(): bool
{
try {
\DB::connection()->getPdo();
return true;
} catch (\Throwable $e) {
return false;
}
}
public function index(Request $request): View|RedirectResponse
{
if (!$this->dbReady()) {
return view('setup.database');
}
$step = (int) $request->get('step', 1);
return view('setup.wizard', [
@@ -37,6 +50,9 @@ class SetupWizardController extends Controller
public function store(Request $request): RedirectResponse
{
if (!$this->dbReady()) {
return redirect()->route('setup.index')->withErrors(['db' => 'Database belum siap. Periksa konfigurasi DB & migrasi.']);
}
$step = (int) $request->input('step', 1);
if ($step === 1) {

View File

@@ -0,0 +1,27 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Symfony\Component\HttpFoundation\Response;
class EnsureDatabaseReady
{
public function handle(Request $request, Closure $next): Response
{
if ($request->is('setup*')) {
return $next($request);
}
try {
DB::connection()->getPdo();
} catch (\Throwable $e) {
return redirect()->route('setup.index')
->withErrors(['db' => 'Database belum dikonfigurasi. Silakan lengkapi pengaturan DB & migrate sebelum melanjutkan.']);
}
return $next($request);
}
}

View File

@@ -3,6 +3,7 @@
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\DB;
class AppServiceProvider extends ServiceProvider
{
@@ -19,6 +20,14 @@ class AppServiceProvider extends ServiceProvider
*/
public function boot(): void
{
//
try {
DB::connection()->getPdo();
app()->instance('db.ready', true);
} catch (\Throwable $e) {
// Fallback agar aplikasi tetap jalan ke halaman setup
config(['session.driver' => 'file']);
config(['cache.default' => 'file']);
app()->instance('db.ready', false);
}
}
}

View File

@@ -9,6 +9,7 @@ use Spatie\Permission\Middleware\RoleOrPermissionMiddleware;
use App\Http\Middleware\MaintenanceReadOnly;
use App\Http\Middleware\SessionTimeout;
use App\Http\Middleware\AuditRequest;
use App\Http\Middleware\EnsureDatabaseReady;
use Illuminate\Console\Scheduling\Schedule;
return Application::configure(basePath: dirname(__DIR__))
@@ -25,6 +26,7 @@ return Application::configure(basePath: dirname(__DIR__))
'maintenance.readonly' => MaintenanceReadOnly::class,
'session.timeout' => SessionTimeout::class,
'audit.request' => AuditRequest::class,
'db.ready' => EnsureDatabaseReady::class,
]);
})
->withSchedule(function (Schedule $schedule) {

View File

@@ -0,0 +1,37 @@
@extends('layouts.custom-master')
@php
$bodyClass = 'bg-white';
@endphp
@section('content')
<div class="container py-5">
<div class="row justify-content-center">
<div class="col-lg-7">
<div class="card custom-card shadow-sm">
<div class="card-body">
<h3 class="fw-semibold mb-2">Konfigurasi Database Diperlukan</h3>
<p class="text-muted">Kami tidak dapat terhubung ke database. Pastikan langkah berikut:</p>
<ol class="text-muted mb-3">
<li>Buat database (mis. <code>asset_management_system</code>).</li>
<li>Isi kredensial di file <code>.env</code> (DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD).</li>
<li>Jalankan migrasi dan seeder: <code>php artisan migrate --seed</code>.</li>
<li>Setelah itu, jalankan wizard di <a href="{{ route('setup.index') }}">/setup</a> bila diperlukan.</li>
</ol>
@if($errors->any())
<div class="alert alert-danger">
@foreach($errors->all() as $error)
<div>{{ $error }}</div>
@endforeach
</div>
@endif
<div class="d-flex justify-content-between">
<a href="{{ url()->previous() }}" class="btn btn-outline-secondary">Kembali</a>
<a href="{{ route('setup.index') }}" class="btn btn-primary">Buka Setup</a>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -31,9 +31,22 @@ use App\Http\Controllers\ProfileController;
Route::view('/', 'pages.landing.index')->name('landing');
Route::view('/landing', 'pages.landing.index');
Route::get('asset-view/{asset}', [PublicAssetController::class, 'show'])->name('assets.public.show');
Route::view('help', 'pages.landing.help')->name('landing.help');
Route::view('changelog', 'pages.landing.changelog')->name('landing.changelog');
Route::middleware('db.ready')->group(function () {
Route::get('asset-view/{asset}', [PublicAssetController::class, 'show'])->name('assets.public.show');
Route::view('help', 'pages.landing.help')->name('landing.help');
Route::view('changelog', 'pages.landing.changelog')->name('landing.changelog');
// Transaksi dari halaman landing (user harus login)
Route::middleware(['auth','audit.request'])->group(function () {
Route::post('asset-view/{asset}/movement', [AssetTransactionController::class, 'storeMovement'])->name('assets.public.movements.store')
->middleware('permission:movements.manage');
Route::post('asset-view/{asset}/disposal', [AssetTransactionController::class, 'storeDisposal'])->name('assets.public.disposals.store')
->middleware('permission:disposals.manage');
Route::post('asset-view/{asset}/maintenance', [AssetMaintenanceController::class, 'store'])->name('assets.public.maintenances.store')
->middleware('permission:maintenance.manage');
});
});
Route::get('setup', [\App\Http\Controllers\SetupWizardController::class, 'index'])->name('setup.index');
Route::post('setup', [\App\Http\Controllers\SetupWizardController::class, 'store'])->name('setup.store');