diff --git a/app/Http/Requests/Auth/LoginRequest.php b/app/Http/Requests/Auth/LoginRequest.php index 7c84280..a0d42b7 100644 --- a/app/Http/Requests/Auth/LoginRequest.php +++ b/app/Http/Requests/Auth/LoginRequest.php @@ -32,15 +32,27 @@ public function authenticate(): void $password = $this->input('password'); $errorField = $this->filled('nisn') ? 'nisn' : 'nip'; + $labelField = $this->filled('nisn') ? 'NISN' : 'NIP/NIK'; - if (!Auth::attempt(['nomor_induk' => $loginIdentifier, 'password' => $password], $this->boolean('remember'))) { + // 1. Cek keberadaan user berdasarkan nomor_induk + $user = \App\Models\User::where('nomor_induk', $loginIdentifier)->first(); + + if (!$user) { RateLimiter::hit($this->throttleKey()); - throw ValidationException::withMessages([ - $errorField => trans('auth.failed'), + $errorField => "Nomor Induk ({$labelField}) tidak ditemukan.", ]); } + // 2. Cek password (Auth::attempt) + if (!Auth::attempt(['nomor_induk' => $loginIdentifier, 'password' => $password], $this->boolean('remember'))) { + RateLimiter::hit($this->throttleKey()); + throw ValidationException::withMessages([ + 'password' => 'Kata sandi yang Anda masukkan salah.', + ]); + } + + // Ambil user yang sudah terautentikasi $user = Auth::user(); // Cek jika role sesuai diff --git a/app/Models/Announcement.php b/app/Models/Announcement.php index d4615e6..2a37f4c 100644 --- a/app/Models/Announcement.php +++ b/app/Models/Announcement.php @@ -6,5 +6,10 @@ class Announcement extends Model { - protected $fillable = ['type', 'icon', 'title', 'content']; + protected $fillable = ['user_id', 'type', 'icon', 'title', 'content']; + + public function user() + { + return $this->belongsTo(User::class); + } } diff --git a/app/Models/MasterInduk.php b/app/Models/MasterInduk.php index ec40017..e47591b 100644 --- a/app/Models/MasterInduk.php +++ b/app/Models/MasterInduk.php @@ -10,4 +10,9 @@ class MasterInduk extends Model use HasFactory; protected $guarded = ['id']; + + public function user() + { + return $this->belongsTo(User::class); + } } diff --git a/app/Models/Recommendation.php b/app/Models/Recommendation.php index 9f76dae..6b834a7 100644 --- a/app/Models/Recommendation.php +++ b/app/Models/Recommendation.php @@ -6,5 +6,10 @@ class Recommendation extends Model { - protected $fillable = ['judul', 'kategori', 'youtube_link', 'deskripsi']; + protected $fillable = ['user_id', 'judul', 'kategori', 'youtube_link', 'deskripsi']; + + public function user() + { + return $this->belongsTo(User::class); + } } diff --git a/app/Models/User.php b/app/Models/User.php index f1fc766..0293f22 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -63,4 +63,19 @@ public function loans() { return $this->hasMany(Loan::class); } + + public function announcements() + { + return $this->hasMany(Announcement::class); + } + + public function recommendations() + { + return $this->hasMany(Recommendation::class); + } + + public function masterInduks() + { + return $this->hasMany(MasterInduk::class); + } } diff --git a/database/migrations/2026_02_04_191128_create_announcements_table.php b/database/migrations/2026_02_04_191128_create_announcements_table.php index b208f90..aa5e287 100644 --- a/database/migrations/2026_02_04_191128_create_announcements_table.php +++ b/database/migrations/2026_02_04_191128_create_announcements_table.php @@ -13,6 +13,7 @@ public function up(): void { Schema::create('announcements', function (Blueprint $table) { $table->id(); + $table->foreignId('user_id')->constrained()->onDelete('cascade'); $table->string('type'); // warning, info, success, etc. $table->string('icon'); $table->string('title'); diff --git a/database/migrations/2026_02_04_191128_create_recommendations_table.php b/database/migrations/2026_02_04_191128_create_recommendations_table.php index 4bfa79b..7ae66df 100644 --- a/database/migrations/2026_02_04_191128_create_recommendations_table.php +++ b/database/migrations/2026_02_04_191128_create_recommendations_table.php @@ -13,6 +13,7 @@ public function up(): void { Schema::create('recommendations', function (Blueprint $table) { $table->id(); + $table->foreignId('user_id')->constrained()->onDelete('cascade'); $table->string('judul'); $table->string('kategori'); $table->string('youtube_link'); diff --git a/database/migrations/2026_02_05_064036_create_master_induks_table.php b/database/migrations/2026_02_05_064036_create_master_induks_table.php index bd1f62a..746c4d1 100644 --- a/database/migrations/2026_02_05_064036_create_master_induks_table.php +++ b/database/migrations/2026_02_05_064036_create_master_induks_table.php @@ -12,6 +12,7 @@ public function up() { Schema::create('master_induks', function (Blueprint $table) { $table->id(); + $table->foreignId('user_id')->constrained()->onDelete('cascade'); $table->string('nomor_induk')->unique(); $table->enum('role', ['siswa', 'guru']); $table->string('nama_pemilik')->nullable(); diff --git a/database/seeders/AnnouncementSeeder.php b/database/seeders/AnnouncementSeeder.php index b634bbd..a188c7b 100644 --- a/database/seeders/AnnouncementSeeder.php +++ b/database/seeders/AnnouncementSeeder.php @@ -16,9 +16,12 @@ public function run(): void $announcements = DummyDataService::getPengumuman(); foreach ($announcements as $data) { + $adminId = \App\Models\User::where('role', 'penjaga perpus')->first()?->id ?? 2; + Announcement::updateOrCreate( ['id' => $data['id']], [ + 'user_id' => $adminId, 'type' => $data['type'], 'icon' => $data['icon'], 'title' => $data['title'], diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 5404757..3924ac9 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -18,6 +18,16 @@ public function run() MasterInduk::truncate(); DB::statement('SET FOREIGN_KEY_CHECKS=1;'); + // ID 2: Budi (Admin/Penjaga) + $admin = User::create([ + 'id' => 2, + 'name' => 'Budi Santoso', + 'email' => 'budi.santoso@smkn1perpus.sch.id', + 'password' => Hash::make('password'), + 'role' => 'penjaga perpus', + 'nomor_induk' => '197812312005011', + ]); + $whitelist = [ ['nomor_induk' => '1234567890', 'role' => 'siswa', 'nama_pemilik' => 'Silvi Rahmawati'], ['nomor_induk' => '9988776655', 'role' => 'siswa', 'nama_pemilik' => 'Siti Nurhaliza'], @@ -26,7 +36,7 @@ public function run() ]; foreach ($whitelist as $w) { - MasterInduk::create($w); + MasterInduk::create(array_merge($w, ['user_id' => $admin->id])); } // ISI USER ASLI @@ -44,16 +54,6 @@ public function run() 'golongan' => 'A', ]); - // ID 2: Budi (Admin/Penjaga) - User::create([ - 'id' => 2, - 'name' => 'Budi Santoso', - 'email' => 'budi.santoso@smkn1perpus.sch.id', - 'password' => Hash::make('password'), - 'role' => 'penjaga perpus', - 'nomor_induk' => '197812312005011', - ]); - // ID 3: Siti (Siswa) User::create([ 'id' => 3, diff --git a/database/seeders/RecommendationSeeder.php b/database/seeders/RecommendationSeeder.php index 7f2d733..c5e5f3f 100644 --- a/database/seeders/RecommendationSeeder.php +++ b/database/seeders/RecommendationSeeder.php @@ -16,9 +16,12 @@ public function run(): void $recommendations = DummyDataService::getRekomendasiPembelajaran(); foreach ($recommendations as $data) { + $adminId = \App\Models\User::where('role', 'penjaga perpus')->first()?->id ?? 2; + Recommendation::updateOrCreate( ['id' => $data['id']], [ + 'user_id' => $adminId, 'judul' => $data['judul'], 'kategori' => $data['kategori'], 'youtube_link' => $data['youtube_link'], diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php index 464b042..ea99232 100644 --- a/database/seeders/UserSeeder.php +++ b/database/seeders/UserSeeder.php @@ -56,7 +56,10 @@ public function run(): void $nomorInduk = fake()->unique()->numerify('##########'); $name = fake()->name(); + $adminId = User::where('role', 'penjaga perpus')->first()?->id ?? 2; + \App\Models\MasterInduk::create([ + 'user_id' => $adminId, 'nomor_induk' => $nomorInduk, 'role' => 'siswa', 'nama_pemilik' => $name, diff --git a/resources/views/auth/admin-login.blade.php b/resources/views/auth/admin-login.blade.php index 9947ac2..a9041f2 100644 --- a/resources/views/auth/admin-login.blade.php +++ b/resources/views/auth/admin-login.blade.php @@ -33,6 +33,7 @@ +