diff --git a/app/Http/Controllers/Admin/ChallengeController.php b/app/Http/Controllers/Admin/ChallengeController.php
index e69de29..e8504fe 100644
--- a/app/Http/Controllers/Admin/ChallengeController.php
+++ b/app/Http/Controllers/Admin/ChallengeController.php
@@ -0,0 +1,108 @@
+get();
+ $kelass = Kelas::all();
+ return view('admin.challenge.index', compact('challenges', 'kelass'));
+ }
+
+ public function create()
+ {
+ return view('admin.challenge.create');
+ }
+
+ public function store(Request $request)
+{
+ $request->validate([
+ 'judul_challenge' => 'required',
+ 'exp' => 'required|integer|min:1',
+ 'tenggat_waktu' => 'required|date',
+ 'kelas' => 'required|array'
+ ]);
+
+ $challenge = Challenge::create([
+ 'id_admin' => auth('admin')->id(),
+ 'judul_challenge' => $request->judul_challenge,
+ 'deskripsi' => $request->deskripsi,
+ 'exp' => $request->exp,
+ 'tenggat_waktu' => $request->tenggat_waktu,
+ ]);
+
+ // attach kelas
+ $challenge->kelas()->attach($request->kelas);
+
+ return redirect()->route('admin.challenge.soal.create', $challenge->id_challenge);
+ }
+
+ public function createSoal($id)
+ {
+ $challenge = Challenge::findOrFail($id);
+ return view('admin.challenge.soal', compact('challenge'));
+ }
+
+ public function storeSoal(Request $request, $id)
+ {
+ $challenge = Challenge::findOrFail($id);
+
+ $jumlahSoal = count($request->pertanyaan);
+ $expPerSoal = floor($challenge->exp / $jumlahSoal);
+
+ foreach ($request->pertanyaan as $key => $pertanyaan) {
+ SoalChallenge::create([
+ 'id_challenge' => $id,
+ 'pertanyaan' => $pertanyaan,
+ 'opsi_a' => $request->opsi_a[$key],
+ 'opsi_b' => $request->opsi_b[$key],
+ 'opsi_c' => $request->opsi_c[$key],
+ 'opsi_d' => $request->opsi_d[$key],
+ 'jawaban_benar' => $request->jawaban_benar[$key],
+ 'exp_per_soal' => $expPerSoal,
+ ]);
+ }
+
+ return redirect()->route('admin.challenge.index')
+ ->with('success', 'Challenge & soal berhasil dibuat!');
+ }
+
+
+ public function edit($id)
+ {
+ $challenge = Challenge::findOrFail($id);
+ return view('admin.challenge.edit', compact('challenge'));
+ }
+
+ public function update(Request $request, $id)
+ {
+ $challenge = Challenge::findOrFail($id);
+
+ $challenge->update([
+ 'judul_challenge' => $request->judul_challenge,
+ 'deskripsi' => $request->deskripsi,
+ 'exp' => $request->exp,
+ 'tenggat_waktu' => $request->tenggat_waktu,
+ ]);
+
+ return redirect()->route('admin.challenge.index')
+ ->with('success', 'Challenge berhasil diupdate!');
+ }
+
+ public function destroy($id)
+ {
+ $challenge = Challenge::findOrFail($id);
+ $challenge->delete();
+
+ return redirect()->route('admin.challenge.index')
+ ->with('success', 'Challenge berhasil dihapus!');
+ }
+}
diff --git a/app/Http/Controllers/Admin/LeaderboardController.php b/app/Http/Controllers/Admin/LeaderboardController.php
index e69de29..d1e48be 100644
--- a/app/Http/Controllers/Admin/LeaderboardController.php
+++ b/app/Http/Controllers/Admin/LeaderboardController.php
@@ -0,0 +1,18 @@
+orderByDesc('total_exp')
+ ->paginate(10);
+
+ return view('admin.leaderboard.index', compact('leaderboards'));
+ }
+}
diff --git a/app/Http/Controllers/Guru/MapelController.php b/app/Http/Controllers/Guru/MapelController.php
index a0a7eef..1c8056d 100644
--- a/app/Http/Controllers/Guru/MapelController.php
+++ b/app/Http/Controllers/Guru/MapelController.php
@@ -4,12 +4,18 @@
use App\Http\Controllers\Controller;
use App\Models\Mapel;
+use Illuminate\Support\Facades\Auth;
class MapelController extends Controller
{
public function index()
{
- $mapels = Mapel::paginate(10);
+ $guru = Auth::guard('guru')->user();
+
+ // Ambil hanya mapel yang dia ajar
+ $mapels = Mapel::whereHas('mengajars', function ($query) use ($guru) {
+ $query->where('nip', $guru->nip);
+ })->paginate(10);
return view('guru.mapel.index', compact('mapels'));
}
diff --git a/app/Models/Challenge.php b/app/Models/Challenge.php
index 87224f7..d64f508 100644
--- a/app/Models/Challenge.php
+++ b/app/Models/Challenge.php
@@ -21,4 +21,20 @@ class Challenge extends Model
'id_badge',
'tenggat_waktu',
];
+
+ public function kelas()
+{
+ return $this->belongsToMany(
+ Kelas::class,
+ 'challenge_kelas',
+ 'id_challenge',
+ 'id_kelas'
+ );
+}
+
+public function soal()
+{
+ return $this->hasMany(SoalChallenge::class, 'id_challenge');
+}
+
}
\ No newline at end of file
diff --git a/database/migrations/2026_02_18_022351_create_soal_challenge_table.php b/database/migrations/2026_02_18_022351_create_soal_challenge_table.php
new file mode 100644
index 0000000..b69c590
--- /dev/null
+++ b/database/migrations/2026_02_18_022351_create_soal_challenge_table.php
@@ -0,0 +1,41 @@
+id('id_soal');
+ $table->unsignedBigInteger('id_challenge');
+ $table->text('pertanyaan');
+ $table->string('opsi_a');
+ $table->string('opsi_b');
+ $table->string('opsi_c');
+ $table->string('opsi_d');
+ $table->enum('jawaban_benar', ['A','B','C','D']);
+ $table->integer('exp_per_soal')->default(0);
+ $table->timestamps();
+
+ $table->foreign('id_challenge')
+ ->references('id_challenge')
+ ->on('challenges')
+ ->onDelete('cascade');
+});
+
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('soal_challenge');
+ }
+};
diff --git a/database/migrations/2026_02_18_022905_create_challenge_kelas_table.php b/database/migrations/2026_02_18_022905_create_challenge_kelas_table.php
new file mode 100644
index 0000000..c21b261
--- /dev/null
+++ b/database/migrations/2026_02_18_022905_create_challenge_kelas_table.php
@@ -0,0 +1,40 @@
+id();
+ $table->unsignedBigInteger('id_challenge');
+ $table->unsignedBigInteger('id_kelas');
+ $table->timestamps();
+
+ $table->foreign('id_challenge')
+ ->references('id_challenge')
+ ->on('challenges')
+ ->onDelete('cascade');
+
+ $table->foreign('id_kelas')
+ ->references('id_kelas')
+ ->on('kelas')
+ ->onDelete('cascade');
+});
+
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('challenge_kelas');
+ }
+};
diff --git a/resources/views/admin/challenge/create.blade.php b/resources/views/admin/challenge/create.blade.php
new file mode 100644
index 0000000..05b11f4
--- /dev/null
+++ b/resources/views/admin/challenge/create.blade.php
@@ -0,0 +1,23 @@
+@extends('admin.layouts.app')
+
+@section('content')
+
Tambah Challenge
+
+
+@endsection
diff --git a/resources/views/admin/challenge/edit.blade.php b/resources/views/admin/challenge/edit.blade.php
new file mode 100644
index 0000000..6ca60c6
--- /dev/null
+++ b/resources/views/admin/challenge/edit.blade.php
@@ -0,0 +1,26 @@
+@extends('admin.layouts.app')
+
+@section('content')
+Edit Challenge
+
+
+@endsection
diff --git a/resources/views/admin/challenge/index.blade.php b/resources/views/admin/challenge/index.blade.php
index e69de29..9c30fa4 100644
--- a/resources/views/admin/challenge/index.blade.php
+++ b/resources/views/admin/challenge/index.blade.php
@@ -0,0 +1,282 @@
+@extends('admin.layouts.app')
+
+@section('title', 'Daftar Challenge')
+
+@section('content')
+
+
+
+DAFTAR CHALLENGE
+
+
+
+
+
+
+
+
+
+
+
+ {{-- Alert --}}
+ @if(session('success'))
+
+ {{ session('success') }}
+
+
+ @endif
+
+
+
+
+
+ @forelse($challenges as $index => $challenge)
+
+ | {{ $loop->iteration }} |
+ {{ $challenge->judul_challenge }} |
+ {{ $challenge->exp }} |
+ {{ \Carbon\Carbon::parse($challenge->tenggat_waktu)->format('d M Y H:i') }} |
+
+
+
+
+
+ |
+
+ @empty
+
+ | Belum ada challenge |
+
+ @endforelse
+
+
+
+
+
+{{-- MODAL TAMBAH --}}
+
+
+
+
+
+
+
+
+
+
+
+
+{{-- MODAL EDIT --}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/admin/challenge/soal.blade.php b/resources/views/admin/challenge/soal.blade.php
new file mode 100644
index 0000000..fc723cd
--- /dev/null
+++ b/resources/views/admin/challenge/soal.blade.php
@@ -0,0 +1,174 @@
+@extends('admin.layouts.app')
+
+@section('title', 'Tambah Soal Challenge')
+
+@section('content')
+
+
+
+
+ TAMBAH SOAL - {{ $challenge->judul_challenge }}
+
+
+
+
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/guru/mapel/index.blade.php b/resources/views/guru/mapel/index.blade.php
index e69de29..30ebf29 100644
--- a/resources/views/guru/mapel/index.blade.php
+++ b/resources/views/guru/mapel/index.blade.php
@@ -0,0 +1,91 @@
+@extends('guru.layouts.app')
+
+@section('title', 'Daftar Mata Pelajaran')
+
+@section('content')
+
+
+
+MATA PELAJARAN YANG ANDA AJAR
+
+
+
+
+
+
+
+ @forelse($mapels as $index => $mapel)
+
+ | {{ $mapels->firstItem() + $index }} |
+ {{ $mapel->id_mapel }} |
+ {{ $mapel->nama_mapel }} |
+
+
+
+ Upload Materi
+
+
+
+ Buat Tugas
+
+ |
+
+ @empty
+
+ | Anda belum mengajar mata pelajaran apapun. |
+
+ @endforelse
+
+
+
+
+ {{ $mapels->links() }}
+
+
+
+
+@endsection
diff --git a/routes/web.php b/routes/web.php
index e76eb10..51e83b5 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -11,8 +11,10 @@
use App\Http\Controllers\Admin\KelasController as AdminKelasController;
use App\Http\Controllers\Admin\SiswaController as AdminSiswaController;
use App\Http\Controllers\Admin\MapelController as AdminMapelController;
+use App\Http\Controllers\Admin\ChallengeController as AdminChallengeController;
use App\Http\Controllers\Admin\LeaderboardController as AdminLeaderboardController;
+
// GURU CONTROLLERS
use App\Http\Controllers\Guru\LoginController as GuruLoginController;
use App\Http\Controllers\Guru\DashboardController as GuruDashboardController;
@@ -98,7 +100,15 @@
Route::resource('mapel', AdminMapelController::class);
Route::resource('leaderboard', AdminLeaderboardController::class)
->only(['index']);
+ Route::resource('challenge', AdminChallengeController::class);
+ Route::get('challenge/{id}/soal',
+ [AdminChallengeController::class, 'createSoal']
+ )->name('challenge.soal.create');
+
+ Route::post('challenge/{id}/soal',
+ [AdminChallengeController::class, 'storeSoal']
+ )->name('challenge.soal.store');
// LOGOUT ADMIN
Route::post('/logout', [LoginController::class, 'logout'])
@@ -125,9 +135,17 @@
Route::get('/mapel', [GuruMapelController::class, 'index'])
->name('mapel.index');
-Route::get('/leaderboard', [GuruLeaderboardController::class, 'index'])
+ Route::get('/leaderboard', [GuruLeaderboardController::class, 'index'])
->name('leaderboard.index');
+ Route::get('/materi/{id_mapel}/create', function ($id_mapel) {
+ return "Form Upload Materi untuk Mapel: " . $id_mapel;
+ })->name('materi.create');
+
+ Route::get('/tugas/{id_mapel}/create', function ($id_mapel) {
+ return "Form Buat Tugas untuk Mapel: " . $id_mapel;
+ })->name('tugas.create');
+
// Profil (Edit)
Route::get('/profil', [GuruProfilController::class, 'show'])->name('profil.show');