validate([ 'nik' => 'required', 'password' => 'required' ]); $user = User::where('nik', $request->nik)->first(); if ($user && Hash::check($request->password, $user->password)) { $user->tokens()->delete(); $token = $user->createToken('auth_token')->plainTextToken; $jkDisplay = ""; if ($user->jenis_kelamin == 'L') { $jkDisplay = 'Laki-laki'; } elseif ($user->jenis_kelamin == 'P') { $jkDisplay = 'Perempuan'; } $isComplete = !empty($user->nama_lengkap) && !empty($user->email) && !empty($user->no_telp) && !empty($user->alamat) && !empty($user->jenis_kelamin) && !empty($user->nama_fasyankes); return response()->json([ 'success' => true, 'token' => $token, 'is_profile_complete' => $isComplete, 'user' => [ 'id_user' => $user->id_user, 'nik' => $user->nik, 'role' => $user->role, 'nama_lengkap' => $user->nama_lengkap ?? "", 'email' => $user->email ?? "", 'no_telp' => $user->no_telp ?? "", 'alamat' => $user->alamat ?? "", 'tgl_lahir' => $user->tgl_lahir ?? "", 'jenis_kelamin' => $jkDisplay, 'nama_fasyankes' => $user->nama_fasyankes ?? "", ] ], 200); } return response()->json([ 'success' => false, 'message' => 'NIK atau Password salah!' ], 401); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'Error Server: ' . $e->getMessage() ], 500); } } public function switchAccount(Request $request) { $request->validate(['nik' => 'required']); $user = User::where('nik', $request->nik)->first(); if (!$user) { return response()->json([ 'success' => false, 'message' => 'Akun tidak ditemukan' ], 404); } $jkDisplay = ""; if ($user->jenis_kelamin == 'L') { $jkDisplay = 'Laki-laki'; } elseif ($user->jenis_kelamin == 'P') { $jkDisplay = 'Perempuan'; } return response()->json([ 'success' => true, 'message' => 'Akun valid', 'user' => [ 'id_user' => $user->id_user, 'nik' => $user->nik, 'role' => $user->role, 'nama_lengkap' => $user->nama_lengkap ?? "", 'email' => $user->email ?? "", 'no_telp' => $user->no_telp ?? "", 'alamat' => $user->alamat ?? "", 'tgl_lahir' => $user->tgl_lahir ?? "", 'jenis_kelamin' => $jkDisplay, 'nama_fasyankes' => $user->nama_fasyankes ?? "", ] ], 200); } public function register(Request $request) { $request->validate([ 'nik' => 'required|unique:users,nik|digits:16', 'email' => 'required|email', 'password' => 'required|min:8' ]); try { $isPasienMedis = DB::table('pasien_medis') ->join('users', 'pasien_medis.id_user', '=', 'users.id_user') ->where('users.nik', $request->nik) ->exists(); $assignedRole = $isPasienMedis ? 'pasien' : 'umum'; $user = User::create([ 'nik' => $request->nik, 'password' => Hash::make($request->password), 'role' => $assignedRole, 'nama_lengkap' => "", 'email' => $request->email, 'no_telp' => "", 'alamat' => "", 'tgl_lahir' => '2000-01-01', ]); return response()->json([ 'success' => true, 'message' => 'Registrasi berhasil sebagai ' . $assignedRole . '! Silakan login.', ], 201); } catch (\Exception $e) { return response()->json([ 'success' => false, 'message' => 'Gagal registrasi: ' . $e->getMessage() ], 500); } } public function updateProfile(Request $request) { $request->validate([ 'nik' => 'required', 'nama_lengkap' => 'required|string', 'email' => 'nullable|email', 'no_telp' => 'required', 'alamat' => 'required|string', 'tgl_lahir' => 'required', 'jenis_kelamin' => 'nullable', 'nama_fasyankes' => 'nullable', 'current_password' => 'nullable', 'password' => 'nullable|min:8', ]); $user = User::where('nik', $request->nik)->first(); if ($user) { $user->nama_lengkap = $request->nama_lengkap; if ($request->filled('email')) { $user->email = $request->email; } $user->no_telp = $request->no_telp; $user->alamat = $request->alamat; $user->tgl_lahir = $request->tgl_lahir; // OTOMATIS KONVERSI SAAT SIMPAN: Laki-laki -> L, Perempuan -> P if ($request->jenis_kelamin == 'Laki-laki') { $user->jenis_kelamin = 'L'; } elseif ($request->jenis_kelamin == 'Perempuan') { $user->jenis_kelamin = 'P'; } else { $user->jenis_kelamin = $request->jenis_kelamin; } $user->nama_fasyankes = $request->nama_fasyankes; if ($request->filled('password')) { // VALIDASI PASSWORD SAAT INI if (!$request->filled('current_password')) { return response()->json([ 'success' => false, 'message' => 'Password saat ini wajib diisi' ], 400); } // CEK PASSWORD LAMA if (!Hash::check($request->current_password, $user->password)) { return response()->json([ 'success' => false, 'message' => 'Password saat ini salah' ], 400); } // SIMPAN PASSWORD BARU $user->password = Hash::make($request->password); } $user->save(); $user->save(); $isComplete = !empty($user->nama_lengkap) && !empty($user->email) && !empty($user->no_telp) && !empty($user->alamat) && !empty($user->jenis_kelamin) && !empty($user->nama_fasyankes); return response()->json([ 'success' => true, 'message' => 'Profil berhasil diperbarui', 'user' => $user, 'is_profile_complete' => $isComplete ], 200); } return response()->json([ 'success' => false, 'message' => 'User tidak ditemukan' ], 404); } public function getProfile(Request $request) { $nik = $request->query('nik'); $user = User::where('nik', $nik)->first(); if ($user) { // Konversi L/P database ke teks lengkap untuk Flutter $jkDisplay = ""; if ($user->jenis_kelamin == 'L') { $jkDisplay = 'Laki-laki'; } elseif ($user->jenis_kelamin == 'P') { $jkDisplay = 'Perempuan'; } return response()->json([ 'success' => true, 'user' => [ 'id_user' => $user->id_user, // WAJIB ADA INI 'nik' => $user->nik, 'nama_lengkap' => $user->nama_lengkap ?? "", 'email' => $user->email ?? "", 'no_telp' => $user->no_telp ?? "", 'alamat' => $user->alamat ?? "", 'tgl_lahir' => $user->tgl_lahir ?? "", 'jenis_kelamin' => $jkDisplay, 'nama_fasyankes' => $user->nama_fasyankes ?? "", 'role' => $user->role ?? "" ] ], 200); } return response()->json([ 'success' => false, 'message' => 'User tidak ditemukan' ], 404); } public function completeProfile(Request $request) { return $this->updateProfile($request); } public function forgotPassword(Request $request) { $request->validate([ 'nik' => 'required', // DIUBAH: no_telp menjadi email 'email' => 'required|email', 'tgl_lahir' => 'required', 'password' => 'required|min:8' ]); $user = User::where('nik', $request->nik) // DIUBAH: pencocokan berdasarkan email ->where('email', $request->email) ->where('tgl_lahir', $request->tgl_lahir) ->first(); if (!$user) { return response()->json([ 'success' => false, 'message' => 'Data tidak cocok.' ], 404); } $user->password = Hash::make($request->password); $user->save(); return response()->json([ 'success' => true, 'message' => 'Password berhasil diperbarui. Silakan login.' ], 200); } }