user(); $query = Challenge::with(['kelas', 'soal']) ->withCount('soal') ->where('id_guru', $guru->id_guru); if ($request->filled('search')) { $query->where('judul_challenge', 'like', '%' . $request->search . '%'); } $challenges = $query->orderBy('created_at', 'desc') ->paginate(10) ->appends($request->all()); $kelas = Kelas::orderBy('tingkat')->orderBy('nama_kelas')->get(); $badges = Badge::all(); return view('guru.challenge.index', compact('challenges', 'kelas', 'badges')); } public function store(Request $request) { $request->validate([ 'judul_challenge' => 'required|string|max:200', 'deskripsi' => 'nullable|string', 'tenggat_waktu' => 'required|date|after:now', 'durasi_pengerjaan' => 'required|integer|min:1|max:360', 'id_kelas' => 'required|array|min:1', 'id_kelas.*' => 'exists:kelas,id_kelas', 'pertanyaan' => 'required|array|min:1', 'pertanyaan.*' => 'required|string', 'opsi_a.*' => 'required|string', 'opsi_b.*' => 'required|string', 'opsi_c.*' => 'required|string', 'opsi_d.*' => 'required|string', 'jawaban_benar.*' => 'required|in:A,B,C,D', ], [ 'tenggat_waktu.after' => 'Tenggat waktu harus lebih dari sekarang.', 'pertanyaan.required' => 'Minimal harus ada 1 soal.', 'id_kelas.required' => 'Pilih minimal 1 kelas.', ]); DB::transaction(function () use ($request) { $guru = Auth::guard('guru')->user(); $challenge = Challenge::create([ 'id_guru' => $guru->id_guru, 'judul_challenge' => $request->judul_challenge, 'deskripsi' => $request->deskripsi, 'id_badge' => $request->id_badge, 'tenggat_waktu' => $request->tenggat_waktu, 'durasi_pengerjaan' => $request->durasi_pengerjaan, ]); $challenge->kelas()->sync($request->id_kelas); foreach ($request->pertanyaan as $i => $pertanyaan) { SoalChallenge::create([ 'id_challenge' => $challenge->id_challenge, 'pertanyaan' => $pertanyaan, 'opsi_a' => $request->opsi_a[$i], 'opsi_b' => $request->opsi_b[$i], 'opsi_c' => $request->opsi_c[$i], 'opsi_d' => $request->opsi_d[$i], 'jawaban_benar' => $request->jawaban_benar[$i], ]); } }); return redirect()->route('guru.challenge.index') ->with('success', 'Challenge berhasil dibuat!'); } public function show($id) { $guru = Auth::guard('guru')->user(); $challenge = Challenge::with(['kelas', 'soal']) ->where('id_guru', $guru->id_guru) ->findOrFail($id); return view('guru.challenge.show', compact('challenge')); } public function edit($id) { $guru = Auth::guard('guru')->user(); $challenge = Challenge::with(['kelas', 'soal']) ->where('id_guru', $guru->id_guru) ->findOrFail($id); $kelas = Kelas::orderBy('tingkat')->orderBy('nama_kelas')->get(); $badges = Badge::all(); return view('guru.challenge.edit', compact('challenge', 'kelas', 'badges')); } public function update(Request $request, $id) { $guru = Auth::guard('guru')->user(); $challenge = Challenge::where('id_guru', $guru->id_guru)->findOrFail($id); $request->validate([ 'judul_challenge' => 'required|string|max:200', 'deskripsi' => 'nullable|string', 'tenggat_waktu' => 'required|date', 'durasi_pengerjaan' => 'required|integer|min:1|max:360', 'id_kelas' => 'required|array|min:1', 'id_kelas.*' => 'exists:kelas,id_kelas', 'pertanyaan' => 'required|array|min:1', 'pertanyaan.*' => 'required|string', 'opsi_a.*' => 'required|string', 'opsi_b.*' => 'required|string', 'opsi_c.*' => 'required|string', 'opsi_d.*' => 'required|string', 'jawaban_benar.*' => 'required|in:A,B,C,D', ]); DB::transaction(function () use ($request, $challenge) { $challenge->update([ 'judul_challenge' => $request->judul_challenge, 'deskripsi' => $request->deskripsi, 'id_badge' => $request->id_badge, 'tenggat_waktu' => $request->tenggat_waktu, 'durasi_pengerjaan' => $request->durasi_pengerjaan, ]); $challenge->kelas()->sync($request->id_kelas); SoalChallenge::where('id_challenge', $challenge->id_challenge)->delete(); foreach ($request->pertanyaan as $i => $pertanyaan) { SoalChallenge::create([ 'id_challenge' => $challenge->id_challenge, 'pertanyaan' => $pertanyaan, 'opsi_a' => $request->opsi_a[$i], 'opsi_b' => $request->opsi_b[$i], 'opsi_c' => $request->opsi_c[$i], 'opsi_d' => $request->opsi_d[$i], 'jawaban_benar' => $request->jawaban_benar[$i], ]); } }); return redirect()->route('guru.challenge.index') ->with('success', 'Challenge berhasil diupdate!'); } public function destroy($id) { $guru = Auth::guard('guru')->user(); Challenge::where('id_guru', $guru->id_guru)->findOrFail($id)->delete(); return redirect()->route('guru.challenge.index') ->with('success', 'Challenge berhasil dihapus.'); } public function editData($id) { $guru = Auth::guard('guru')->user(); $challenge = Challenge::with(['kelas', 'soal']) ->where('id_guru', $guru->id_guru) ->findOrFail($id); return response()->json([ 'judul_challenge' => $challenge->judul_challenge, 'deskripsi' => $challenge->deskripsi, 'tenggat_waktu' => $challenge->tenggat_waktu, 'durasi_pengerjaan' => $challenge->durasi_pengerjaan, 'kelas' => $challenge->kelas->pluck('id_kelas'), 'soal' => $challenge->soal, ]); } }