diff --git a/app/Http/Controllers/SetupWizardController.php b/app/Http/Controllers/SetupWizardController.php index 6a28a0a..bced169 100644 --- a/app/Http/Controllers/SetupWizardController.php +++ b/app/Http/Controllers/SetupWizardController.php @@ -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) { diff --git a/app/Http/Middleware/EnsureDatabaseReady.php b/app/Http/Middleware/EnsureDatabaseReady.php new file mode 100644 index 0000000..71f6c68 --- /dev/null +++ b/app/Http/Middleware/EnsureDatabaseReady.php @@ -0,0 +1,27 @@ +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); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 452e6b6..0368f08 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -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); + } } } diff --git a/bootstrap/app.php b/bootstrap/app.php index c1067f7..06f58c6 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -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) { diff --git a/resources/views/setup/database.blade.php b/resources/views/setup/database.blade.php new file mode 100644 index 0000000..d5226de --- /dev/null +++ b/resources/views/setup/database.blade.php @@ -0,0 +1,37 @@ +@extends('layouts.custom-master') + +@php +$bodyClass = 'bg-white'; +@endphp + +@section('content') +
+
+
+
+
+

Konfigurasi Database Diperlukan

+

Kami tidak dapat terhubung ke database. Pastikan langkah berikut:

+
    +
  1. Buat database (mis. asset_management_system).
  2. +
  3. Isi kredensial di file .env (DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD).
  4. +
  5. Jalankan migrasi dan seeder: php artisan migrate --seed.
  6. +
  7. Setelah itu, jalankan wizard di /setup bila diperlukan.
  8. +
+ @if($errors->any()) +
+ @foreach($errors->all() as $error) +
{{ $error }}
+ @endforeach +
+ @endif + +
+
+
+
+
+@endsection diff --git a/routes/web.php b/routes/web.php index 8ccfa33..6af7d24 100644 --- a/routes/web.php +++ b/routes/web.php @@ -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');