From 0252aa5300d8544344d5bfc7df8e086b660f93da Mon Sep 17 00:00:00 2001 From: ghozahimma65 Date: Wed, 11 Feb 2026 16:45:34 +0700 Subject: [PATCH] integrasi api --- app/Http/Controllers/Api/AuthController.php | 35 ++++++++ app/Http/Controllers/Api/GuruController.php | 86 +++++++++++++++++++ .../Controllers/Api/LaporanController.php | 73 ++++++++++++++++ .../Controllers/Api/PengumumanController.php | 20 +++++ app/Http/Controllers/Api/SiswaController.php | 21 +++++ routes/api.php | 75 ++++++++-------- 6 files changed, 276 insertions(+), 34 deletions(-) create mode 100644 app/Http/Controllers/Api/AuthController.php create mode 100644 app/Http/Controllers/Api/GuruController.php create mode 100644 app/Http/Controllers/Api/LaporanController.php create mode 100644 app/Http/Controllers/Api/PengumumanController.php create mode 100644 app/Http/Controllers/Api/SiswaController.php diff --git a/app/Http/Controllers/Api/AuthController.php b/app/Http/Controllers/Api/AuthController.php new file mode 100644 index 0000000..4ce26d5 --- /dev/null +++ b/app/Http/Controllers/Api/AuthController.php @@ -0,0 +1,35 @@ +only('email', 'password'); + + if (Auth::attempt($credentials)) { + $user = Auth::user(); + return response()->json([ + 'success' => true, + 'message' => 'Login Berhasil', + 'user' => $user + ], 200); + } + + return response()->json([ + 'success' => false, + 'message' => 'Email atau Password salah' + ], 401); + } + + public function logout() + { + Auth::logout(); + return response()->json(['message' => 'Berhasil Logout']); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Api/GuruController.php b/app/Http/Controllers/Api/GuruController.php new file mode 100644 index 0000000..91be65d --- /dev/null +++ b/app/Http/Controllers/Api/GuruController.php @@ -0,0 +1,86 @@ +validate([ + 'siswa_id' => 'required', + 'tanggal' => 'required|date', + 'kejadian_teramati' => 'required', + 'analisis_capaian' => 'required', + ]); + + // Otomatis isi guru_id dari user yang login + $data = $request->all(); + $data['guru_id'] = $request->user()->id; + + Anekdot::create($data); + + return response()->json(['success' => true, 'message' => 'Anekdot berhasil disimpan']); + } + + // 2. Input Hasil Karya (Upload Foto) + public function storeKarya(Request $request) + { + $request->validate([ + 'siswa_id' => 'required', + 'tanggal' => 'required|date', + 'foto' => 'required|image|max:5120', // Max 5MB + 'analisis_capaian' => 'required', + ]); + + // Upload Foto + $path = null; + if ($request->hasFile('foto')) { + $path = $request->file('foto')->store('karya', 'public'); + } + + HasilKarya::create([ + 'siswa_id' => $request->siswa_id, + 'guru_id' => $request->user()->id, + 'tanggal' => $request->tanggal, + 'foto' => $path, + 'deskripsi_foto' => $request->deskripsi_foto, + 'analisis_capaian' => $request->analisis_capaian, + ]); + + return response()->json(['success' => true, 'message' => 'Karya berhasil disimpan']); + } + + // 3. Input Penjemputan (Scan QR) + public function storePenjemputan(Request $request) + { + $request->validate([ + 'siswa_id' => 'required', + 'nama_penjemput' => 'required', + 'status_hubungan' => 'required', + 'foto' => 'nullable|image', + ]); + + $pathFoto = null; + if ($request->hasFile('foto')) { + $pathFoto = $request->file('foto')->store('penjemputan', 'public'); + } + + Penjemputan::create([ + 'siswa_id' => $request->siswa_id, + 'nama_penjemput' => $request->nama_penjemput, + 'status_hubungan' => $request->status_hubungan, + 'foto_bukti' => $pathFoto, + 'waktu_jemput' => now(), + ]); + + return response()->json(['success' => true, 'message' => 'Data penjemputan tercatat']); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Api/LaporanController.php b/app/Http/Controllers/Api/LaporanController.php new file mode 100644 index 0000000..9ad70c6 --- /dev/null +++ b/app/Http/Controllers/Api/LaporanController.php @@ -0,0 +1,73 @@ +waliMurid; + if (!$wali) return false; + + // Cek apakah siswa ini benar anak dari wali tersebut + $isAnakSendiri = Siswa::where('id', $siswaId)->where('wali_id', $wali->id)->exists(); + return $isAnakSendiri; + } + + public function getAnekdot(Request $request) + { + $request->validate(['siswa_id' => 'required']); + + if (!$this->cekAksesAnak($request->user(), $request->siswa_id)) { + return response()->json(['message' => 'Akses ditolak. Ini bukan data anak Anda.'], 403); + } + + $data = Anekdot::where('siswa_id', $request->siswa_id)->latest()->get(); + return response()->json(['success' => true, 'data' => $data]); + } + + public function getKarya(Request $request) + { + $request->validate(['siswa_id' => 'required']); + + if (!$this->cekAksesAnak($request->user(), $request->siswa_id)) { + return response()->json(['message' => 'Akses ditolak.'], 403); + } + + $data = HasilKarya::where('siswa_id', $request->siswa_id)->latest()->get(); + + // Tambahkan URL lengkap foto biar bisa muncul di HP + $data->transform(function ($item) { + $item->foto_url = $item->foto ? asset('storage/' . $item->foto) : null; + return $item; + }); + + return response()->json(['success' => true, 'data' => $data]); + } + + public function getPenjemputan(Request $request) + { + $request->validate(['siswa_id' => 'required']); + + if (!$this->cekAksesAnak($request->user(), $request->siswa_id)) { + return response()->json(['message' => 'Akses ditolak.'], 403); + } + + $data = Penjemputan::where('siswa_id', $request->siswa_id)->latest()->take(10)->get(); + + $data->transform(function ($item) { + $item->foto_url = $item->foto_bukti ? asset('storage/' . $item->foto_bukti) : null; + return $item; + }); + + return response()->json(['success' => true, 'data' => $data]); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Api/PengumumanController.php b/app/Http/Controllers/Api/PengumumanController.php new file mode 100644 index 0000000..09da4a0 --- /dev/null +++ b/app/Http/Controllers/Api/PengumumanController.php @@ -0,0 +1,20 @@ +json([ + 'success' => true, + 'data' => [ + ['judul' => 'Libur Nasional', 'isi' => 'Besok sekolah libur ya bunda.'], + ] + ]); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Api/SiswaController.php b/app/Http/Controllers/Api/SiswaController.php new file mode 100644 index 0000000..8d60aba --- /dev/null +++ b/app/Http/Controllers/Api/SiswaController.php @@ -0,0 +1,21 @@ +get(); + + return response()->json([ + 'success' => true, + 'data' => $siswa + ]); + } +} \ No newline at end of file diff --git a/routes/api.php b/routes/api.php index 156223e..ea3339f 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,45 +1,52 @@ group(function () { + + // --- UMUM --- Route::post('/logout', [AuthController::class, 'logout']); - - Route::get('/test', function () { - return response()->json(['message' => 'API works!']); + Route::get('/user', function (Request $request) { + return $request->user(); // Cek siapa yang login }); - // pilih salah satu (saya sarankan pakai apiResource biar singkat) - Route::apiResource('kelas', KelasController::class); - Route::apiResource('guru', GuruController::class)->names([ - 'index' => 'api.guru.index', - 'show' => 'api.guru.show', - 'store' => 'api.guru.store', - 'update' => 'api.guru.update', - 'destroy' => 'api.guru.destroy', - ]); - Route::apiResource('wali', WaliMuridController::class)->names([ - 'index' => 'api.wali-murid.index', - 'show' => 'api.wali.show', - 'store' => 'api.wali.store', - 'update' => 'api.wali.update', - 'destroy' => 'api.wali.destroy', - ]); - Route::apiResource('siswa', SiswaController::class)->names([ - 'index' => 'api.siswa.index', - 'show' => 'api.siswa.show', - 'store' => 'api.siswa.store', - 'update' => 'api.siswa.update', - 'destroy' => 'api.siswa.destroy', - ]); + + // Wali melihat laporan (Wajib kirim ?siswa_id=1 di URL) + Route::get('/anekdot', [LaporanController::class, 'getAnekdot']); + Route::get('/karya', [LaporanController::class, 'getKarya']); + Route::get('/penjemputan', [LaporanController::class, 'getPenjemputan']); + + + // --- KHUSUS GURU (Input Data) --- + // Nanti kalau Guru login di HP untuk input data: + Route::post('/guru/anekdot', [GuruController::class, 'storeAnekdot']); + Route::post('/guru/karya', [GuruController::class, 'storeKarya']); + Route::post('/guru/penjemputan', [GuruController::class, 'storePenjemputan']); }); \ No newline at end of file