NIM_E31222534/app/Http/Controllers/Api/AnakController.php

496 lines
16 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Anak;
use App\Models\Pengguna;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Auth;
class AnakController extends Controller
{
/**
* Mendapatkan daftar anak
*/
public function index(Request $request)
{
$user = Auth::user();
// Log untuk debugging
\Log::info("=== Get anak data ===");
\Log::info("Headers: " . json_encode($request->headers->all()));
\Log::info("User: " . ($user ? "ID: {$user->id}, NIK: {$user->nik}, Role: {$user->role}" : "Not authenticated"));
// Jika tidak ada user, return error
if (!$user) {
return response()->json([
'status' => 'error',
'message' => 'Tidak dapat mengidentifikasi pengguna'
], 401);
}
// Default query
$query = Anak::with('pengguna');
if ($user->role === 'parent') {
// Jika user adalah parent, hanya tampilkan anak miliknya
$query->where('pengguna_id', $user->id);
\Log::info("Filtering: only showing children for parent ID {$user->id}");
} else if ($request->has('pengguna_id') && $user->role === 'admin') {
// Admin bisa filter berdasarkan pengguna_id
$query->where('pengguna_id', $request->pengguna_id);
\Log::info("Admin filtering: showing children for parent ID {$request->pengguna_id}");
}
$anakList = $query->get();
\Log::info("Found {$anakList->count()} children records");
return response()->json([
'status' => 'success',
'data' => $anakList
]);
}
/**
* Menyimpan data anak baru
*/
public function store(Request $request)
{
$user = Auth::user();
// Debug headers dan user
\Log::info("=== Store anak data ===");
\Log::info("Headers: " . json_encode($request->headers->all()));
\Log::info("User: " . ($user ? "ID: {$user->id}, NIK: {$user->nik}, Role: {$user->role}" : "Not authenticated"));
\Log::info("Request data:", $request->all());
// Jika masih tidak ada user setelah melewati middleware, return error
if (!$user) {
return response()->json([
'status' => 'error',
'message' => 'Tidak dapat mengidentifikasi pengguna'
], 401);
}
// Validasi input
$validator = Validator::make($request->all(), [
'pengguna_id' => 'sometimes|exists:pengguna,id',
'nama_anak' => 'required|string|max:100',
'tempat_lahir' => 'required|string|max:100',
'tanggal_lahir' => 'required|date',
'jenis_kelamin' => 'required|in:Laki-laki,Perempuan',
'usia' => 'nullable|string|max:20',
]);
if ($validator->fails()) {
return response()->json([
'status' => 'error',
'message' => 'Validasi gagal',
'errors' => $validator->errors()
], 422);
}
try {
// Tentukan pengguna_id
$pengguna_id = null;
if ($user->role === 'parent') {
$pengguna_id = $user->id;
} else if ($user->role === 'admin' && $request->has('pengguna_id')) {
$pengguna_id = $request->pengguna_id;
} else if ($request->has('pengguna_id')) {
// Fallback: gunakan dari request
$pengguna_id = $request->pengguna_id;
}
$anak = new Anak();
$anak->pengguna_id = $pengguna_id;
$anak->nama_anak = $request->nama_anak;
$anak->tempat_lahir = $request->tempat_lahir;
$anak->tanggal_lahir = $request->tanggal_lahir;
$anak->jenis_kelamin = $request->jenis_kelamin;
$anak->usia = $request->usia;
$anak->save();
// Load data pengguna
$anak->load('pengguna');
return response()->json([
'status' => 'success',
'message' => 'Data anak berhasil disimpan',
'data' => $anak
], 201);
} catch (\Exception $e) {
\Log::error("Error: {$e->getMessage()}");
return response()->json([
'status' => 'error',
'message' => 'Gagal menyimpan data',
'error' => $e->getMessage()
], 500);
}
}
/**
* Mendapatkan detail anak
*/
public function show($id)
{
$user = Auth::user();
// Log untuk debugging
\Log::info("=== Show anak data ===");
\Log::info("User: " . ($user ? "ID: {$user->id}, NIK: {$user->nik}, Role: {$user->role}" : "Not authenticated"));
\Log::info("Anak ID: {$id}");
// Jika tidak ada user, return error
if (!$user) {
return response()->json([
'status' => 'error',
'message' => 'Tidak dapat mengidentifikasi pengguna'
], 401);
}
$anak = Anak::with('pengguna')->find($id);
if (!$anak) {
return response()->json([
'status' => 'error',
'message' => 'Data anak tidak ditemukan'
], 404);
}
// Verifikasi akses
if ($user->role !== 'admin' && $anak->pengguna_id !== $user->id) {
return response()->json([
'status' => 'error',
'message' => 'Anda tidak memiliki akses ke data ini'
], 403);
}
return response()->json([
'status' => 'success',
'data' => $anak
]);
}
/**
* Mengupdate data anak
*/
public function update(Request $request, $id)
{
$user = Auth::user();
// Log untuk debugging
\Log::info("=== Update anak data ===");
\Log::info("Headers: " . json_encode($request->headers->all()));
\Log::info("User: " . ($user ? "ID: {$user->id}, NIK: {$user->nik}, Role: {$user->role}" : "Not authenticated"));
\Log::info("Child ID: {$id}");
\Log::info("Request data:", $request->all());
// Jika tidak ada user, return error
if (!$user) {
return response()->json([
'status' => 'error',
'message' => 'Tidak dapat mengidentifikasi pengguna'
], 401);
}
$anak = Anak::find($id);
if (!$anak) {
return response()->json([
'status' => 'error',
'message' => 'Data anak tidak ditemukan'
], 404);
}
// Verifikasi akses
if ($user->role !== 'admin' && $anak->pengguna_id !== $user->id) {
return response()->json([
'status' => 'error',
'message' => 'Anda tidak memiliki akses untuk mengubah data ini'
], 403);
}
$validator = Validator::make($request->all(), [
'nama_anak' => 'required|string|max:100',
'tempat_lahir' => 'required|string|max:100',
'tanggal_lahir' => 'required|date',
'jenis_kelamin' => 'required|in:Laki-laki,Perempuan',
'usia' => 'nullable|string|max:20',
]);
if ($validator->fails()) {
return response()->json([
'status' => 'error',
'message' => 'Validasi gagal',
'errors' => $validator->errors()
], 422);
}
try {
// Admin bisa mengubah pengguna_id
if ($user->role === 'admin' && $request->has('pengguna_id')) {
$anak->pengguna_id = $request->pengguna_id;
}
$anak->nama_anak = $request->nama_anak;
$anak->tempat_lahir = $request->tempat_lahir;
$anak->tanggal_lahir = $request->tanggal_lahir;
$anak->jenis_kelamin = $request->jenis_kelamin;
$anak->usia = $request->usia;
$anak->save();
// Load data pengguna
$anak->load('pengguna');
return response()->json([
'status' => 'success',
'message' => 'Data anak berhasil diperbarui',
'data' => $anak
]);
} catch (\Exception $e) {
\Log::error("Error: {$e->getMessage()}");
return response()->json([
'status' => 'error',
'message' => 'Gagal memperbarui data',
'error' => $e->getMessage()
], 500);
}
}
/**
* Menghapus data anak
*/
public function destroy($id)
{
$user = Auth::user();
// Log untuk debugging
\Log::info("=== Delete anak data ===");
\Log::info("User: " . ($user ? "ID: {$user->id}, NIK: {$user->nik}, Role: {$user->role}" : "Not authenticated"));
\Log::info("Anak ID: {$id}");
// Jika tidak ada user, return error
if (!$user) {
return response()->json([
'status' => 'error',
'message' => 'Tidak dapat mengidentifikasi pengguna'
], 401);
}
$anak = Anak::find($id);
if (!$anak) {
return response()->json([
'status' => 'error',
'message' => 'Data anak tidak ditemukan'
], 404);
}
// Verifikasi akses
if ($user->role !== 'admin' && $anak->pengguna_id !== $user->id) {
return response()->json([
'status' => 'error',
'message' => 'Anda tidak memiliki akses untuk menghapus data ini'
], 403);
}
try {
$anak->delete();
return response()->json([
'status' => 'success',
'message' => 'Data anak berhasil dihapus'
]);
} catch (\Exception $e) {
\Log::error("Error: {$e->getMessage()}");
return response()->json([
'status' => 'error',
'message' => 'Gagal menghapus data',
'error' => $e->getMessage()
], 500);
}
}
/**
* Mencari anak berdasarkan NIK orang tua
*/
public function findByPenggunaNik($nik)
{
$user = Auth::user();
// Log untuk debugging
\Log::info("=== Find anak by NIK ===");
\Log::info("User: " . ($user ? "ID: {$user->id}, NIK: {$user->nik}, Role: {$user->role}" : "Not authenticated"));
\Log::info("Requested NIK: {$nik}");
// Jika tidak ada user, return error
if (!$user) {
return response()->json([
'status' => 'error',
'message' => 'Tidak dapat mengidentifikasi pengguna'
], 401);
}
// Verifikasi akses - hanya admin atau pemilik NIK yang boleh mengakses
if ($user->role !== 'admin' && $user->nik !== $nik) {
return response()->json([
'status' => 'error',
'message' => 'Anda tidak memiliki akses ke data ini'
], 403);
}
try {
$pengguna = Pengguna::where('nik', $nik)->first();
if (!$pengguna) {
return response()->json([
'status' => 'error',
'message' => 'Pengguna dengan NIK tersebut tidak ditemukan'
], 404);
}
$anakList = Anak::where('pengguna_id', $pengguna->id)->get();
return response()->json([
'status' => 'success',
'data' => $anakList
]);
} catch (\Exception $e) {
\Log::error("Error: {$e->getMessage()}");
return response()->json([
'status' => 'error',
'message' => 'Terjadi kesalahan',
'error' => $e->getMessage()
], 500);
}
}
/**
* Menghubungkan anak dengan orang tua
*/
public function linkToParent(Request $request)
{
$user = Auth::user();
// Log untuk debugging
\Log::info("=== Link anak to parent ===");
\Log::info("Headers: " . json_encode($request->headers->all()));
\Log::info("User: " . ($user ? "ID: {$user->id}, NIK: {$user->nik}, Role: {$user->role}" : "Not authenticated"));
\Log::info("Request data:", $request->all());
// Jika tidak ada user, return error
if (!$user) {
return response()->json([
'status' => 'error',
'message' => 'Tidak dapat mengidentifikasi pengguna'
], 401);
}
$validator = Validator::make($request->all(), [
'anak_id' => 'required|exists:anak,id',
'nik' => 'required|exists:pengguna,nik',
]);
if ($validator->fails()) {
return response()->json([
'status' => 'error',
'message' => 'Validasi gagal',
'errors' => $validator->errors()
], 422);
}
try {
$pengguna = Pengguna::where('nik', $request->nik)->first();
$anak = Anak::find($request->anak_id);
// Verifikasi akses
if ($user->role !== 'admin') {
return response()->json([
'status' => 'error',
'message' => 'Hanya admin yang dapat menautkan data anak'
], 403);
}
// Verifikasi pengguna adalah parent
if ($pengguna->role !== 'parent') {
return response()->json([
'status' => 'error',
'message' => 'NIK yang diberikan bukan milik orang tua'
], 400);
}
$anak->pengguna_id = $pengguna->id;
$anak->save();
return response()->json([
'status' => 'success',
'message' => 'Data anak berhasil dikaitkan dengan orang tua',
'data' => [
'anak' => $anak,
'pengguna' => [
'id' => $pengguna->id,
'nik' => $pengguna->nik,
'nama' => $pengguna->nama
]
]
]);
} catch (\Exception $e) {
\Log::error("Error: {$e->getMessage()}");
return response()->json([
'status' => 'error',
'message' => 'Gagal mengaitkan data',
'error' => $e->getMessage()
], 500);
}
}
/**
* Mendapatkan anak berdasarkan ID pengguna
*/
public function getAnakByPenggunaId($pengguna_id)
{
$user = Auth::user();
// Log untuk debugging
\Log::info("=== Get anak by pengguna ID ===");
\Log::info("User: " . ($user ? "ID: {$user->id}, NIK: {$user->nik}, Role: {$user->role}" : "Not authenticated"));
\Log::info("Requested pengguna_id: {$pengguna_id}");
// Jika tidak ada user, return error
if (!$user) {
return response()->json([
'status' => 'error',
'message' => 'Tidak dapat mengidentifikasi pengguna'
], 401);
}
// Verifikasi akses
if ($user->role !== 'admin' && $user->id != $pengguna_id) {
return response()->json([
'status' => 'error',
'message' => 'Anda tidak memiliki akses ke data ini'
], 403);
}
try {
$anakList = Anak::where('pengguna_id', $pengguna_id)->get();
\Log::info("Found {$anakList->count()} children");
return response()->json([
'status' => 'success',
'data' => $anakList
]);
} catch (\Exception $e) {
\Log::error("Error: {$e->getMessage()}");
return response()->json([
'status' => 'error',
'message' => 'Terjadi kesalahan',
'error' => $e->getMessage()
], 500);
}
}
}