Add database readiness check and setup redirect
This commit is contained in:
@@ -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) {
|
||||
|
||||
27
app/Http/Middleware/EnsureDatabaseReady.php
Normal file
27
app/Http/Middleware/EnsureDatabaseReady.php
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
37
resources/views/setup/database.blade.php
Normal file
37
resources/views/setup/database.blade.php
Normal 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
|
||||
@@ -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');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user