From 8d9ba774da4b207328a3b7fe22a3479b3f7e9a32 Mon Sep 17 00:00:00 2001 From: mikael-zakaria Date: Wed, 23 Jul 2025 11:03:46 +0700 Subject: [PATCH] Update Patients API --- app/Config/Routes.php | 1 + app/Controllers/Patient.php | 518 ++++++++++++++++++++++-------------- 2 files changed, 320 insertions(+), 199 deletions(-) diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 6791fe1..68da171 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -16,4 +16,5 @@ $routes->post('/auth/register/', 'Auth::register'); $routes->get('/patient', 'Patient::index'); $routes->post('/patient', 'Patient::create'); +$routes->delete('/patient/(:any)', 'Patient::delete/$1'); $routes->patch('/patient/(:num)', 'Patient::update/$1'); \ No newline at end of file diff --git a/app/Controllers/Patient.php b/app/Controllers/Patient.php index 1fa5299..a701ba3 100644 --- a/app/Controllers/Patient.php +++ b/app/Controllers/Patient.php @@ -12,209 +12,329 @@ class Patient extends Controller { $this->db = \Config\Database::connect(); } + // OK public function index() { - $pat_num = $this->request->getVar('pat_num'); - $pat_altnum = $this->request->getVar('pat_altnum'); - $pat_name = $this->request->getVar('pat_name'); - $pat_dob = $this->request->getVar('pat_dob'); - $start_date = $this->request->getVar('start_date'); - $end_date = $this->request->getVar('end_date'); - $builder = $this->db->table('patients'); - - if ($pat_name !== null) { - $sql = "LOWER(CONCAT_WS(' ', IFNULL(prefix,''), IFNULL(name_first,''), IFNULL(name_middle,''), IFNULL(name_last,''), IFNULL(name_maiden,''), IFNULL(suffix,'')))"; - $rawSql = new RawSql($sql); - $builder->like($rawSql, $pat_name, 'both'); - } - if ($pat_num !== null) { $builder->where('pat_num', $pat_num); } - if ($pat_altnum !== null) { $builder->where('pat_altnum', $pat_altnum); } - if ($pat_dob !== null) { $builder->where('pat_dob', $pat_dob); } - if ($start_date !== null || $end_date !== null) { - $builder->join('requests', 'pat_id=patients.pat_id','left'); - if ($start_date !== null) { $builder->where('requests.req_date >=', $start_date . ' 00:00:00'); } - if ($end_date !== null) { $builder->where('requests.req_date <=', $end_date . ' 23:59:00'); } - } + try { + $pat_num = $this->request->getVar('pat_num'); + $pat_altnum = $this->request->getVar('pat_altnum'); + $pat_name = $this->request->getVar('pat_name'); + $pat_dob = $this->request->getVar('pat_dob'); + $start_date = $this->request->getVar('start_date'); + $end_date = $this->request->getVar('end_date'); - $filteredPatients = $builder->get()->getResultArray(); - - if (empty($filteredPatients)) { - return $this->failNotFound([ - 'status' => 'error', - 'message' => 'No patient records found matching the criteria.' - ]); - } - - return $this->respond([ - 'status' => 'success', - 'data' => $filteredPatients, - ]); - } - - public function show($id = null) { - $builder = $this->db->table('patients'); - $patient = $builder->where('pat_num', $id)->get()->getRowArray(); - - if (empty($patient)) { - return $this->failNotFound([ - 'status' => 'error', - 'message' => 'Patient with ID ' . $id . ' not found.' - ]); - } - - return $this->respond([ - 'status' => 'success', - 'data' => $patient, - ]); - - } - - public function create() { - $data = $this->request->getJSON(true); - - // $datas = [ - // 'name_first' => $data['name_first'], - // 'name_last' => $data['name_last'], - // 'name_middle' => $data['name_middle'] ?? null, - // 'name_maiden' => $data['name_maiden'] ?? null, - // 'pat_num' => $data['pat_num'], - // 'prefix' => $data['prefix'] ?? null, - // 'suffix' => $data['suffix'] ?? null, - // 'birth_date' => $data['pat_dob'] ?? null, - // 'pat_altnum' => $data['pat_altnum'] ?? null, - // 'address_1' => $data['address_1'] ?? null, - // 'address_2' => $data['address_2'] ?? null, - // 'address_3' => $data['address_3'] ?? null, - // 'city' => $data['city'] ?? null, - // 'province' => $data['province'] ?? null, - // 'zip' => $data['zip'] ?? null, - // 'email_1' => $data['email_1'] ?? null, - // 'email_2' => $data['email_2'] ?? null, - // 'phone' => $data['phone'] ?? null, - // 'mobile_phone' => $data['mobile_phone'] ?? null, - // 'mother' => $data['mother'] ?? null, - // 'account_number' => $data['account_number'] ?? null, - // 'marital_status' => $data['marital_status'] ?? null, - // 'country_id' => $data['country_id'] ?? null, - // 'race_id' => $data['race_id'] ?? null, - // 'religion_id' => $data['religion_id'] ?? null, - // 'ethnic_id' => $data['ethnic_id'] ?? null, - // 'citizenship' => $data['citizenship'] ?? null, - // 'death' => $data['death'] ?? null, - // 'death_date' => $data['death_date'] ?? null, - // 'create_date' => date('Y-m-d H:i:s'), - // ]; - - $datas = [ - 'name_first' => $data['firstName'], // Mengambil dari firstName - 'name_last' => $data['lastName'], // Mengambil dari lastName - 'name_middle' => $data['middleName'] ?? null, // Mengambil dari middleName - 'name_maiden' => $data['maindenName'] ?? null, // Mengambil dari maindenName - 'pat_num' => $data['patientID'], // Mengambil dari patientID - 'prefix' => $data['title'] ?? null, // Mengambil dari title - 'suffix' => $data['suffixName'] ?? null, // Mengambil dari suffixName - 'birth_date' => $data['birthdate'] ?? null, // Mengambil dari birthdate - 'pat_altnum' => $data['alternateID'] ?? null, // Mengambil dari alternateID - 'address_1' => $data['street1'] ?? null, // Mengambil dari street1 - 'address_2' => $data['street2'] ?? null, // Mengambil dari street2 - 'address_3' => $data['placeOfBirthdate'] ?? null, // Memetakan placeOfBirthdate ke address_3, jika diperlukan - 'city' => $data['city'] ?? null, // Mengambil dari city - 'province' => $data['province'] ?? null, // Mengambil dari province - 'zip' => null, // Tidak ada padanan langsung di newPatientForm, bisa diisi manual atau dari input lain - 'email_1' => $data['email1'] ?? null, // Mengambil dari email1 - 'email_2' => $data['email2'] ?? null, // Mengambil dari email2 - 'phone' => $data['phone'] ?? null, // Mengambil dari phone - 'mobile_phone' => $data['mobile'] ?? null, // Mengambil dari mobile - 'mother' => $data['motherName'] ?? null, // Mengambil dari motherName - 'account_number' => null, // Tidak ada padanan langsung, bisa diisi manual atau dari input lain - 'marital_status' => $data['maritalStatus'] ?? null, // Mengambil dari maritalStatus - 'country_id' => null, // Tidak ada padanan langsung, perlu penyesuaian jika ada input negara - // 'race_id' => $data['race'] ?? null, // Mengambil dari race - // 'religion_id' => $data['religion'] ?? null, // Mengambil dari religion - // 'ethnic_id' => $data['ethnic'] ?? null, // Mengambil dari ethnic - 'citizenship' => null, // Tidak ada padanan langsung, perlu penyesuaian jika ada input kewarganegaraan - 'death' => $data['death'] ?? null, // Mengambil dari death (asumsi 0/1 atau boolean) - 'death_date' => $data['deathTime'] ?? null, // Mengambil dari deathTime - 'create_date' => date('Y-m-d H:i:s'), // Ini adalah tanggal dan waktu saat ini di server PHP - ]; - - $rules = [ - 'pat_num' => 'required|is_unique[patients.pat_num]|max_length[50]', - 'name_first' => 'required|min_length[3]|max_length[255]', - 'name_middle' => 'permit_empty', - 'name_maiden' => 'permit_empty', - 'name_last' => 'permit_empty', - 'birth_date' => 'permit_empty|valid_date[Y-m-d]', - 'pat_altnum' => 'permit_empty|max_length[50]', - 'address_1' => 'permit_empty', - 'address_2' => 'permit_empty', - 'address_3' => 'permit_empty', - 'city' => 'permit_empty', - ]; - - if (!$this->validateData($datas, $rules)) { - return $this->failValidationErrors($this->validator->getErrors()); - } - - $this->db->table('patients')->insert($datas); - $newPatientId = $this->db->insertID(); - - return $this->respondCreated([ - 'message' => 'Patient created successfully', - 'pat_id' => $newPatientId - ]); - } - - public function update($pat_id = null) { - $data = $this->request->getJSON(true); - - $existingPatient = $this->db->table('patients')->where('pat_id', $pat_id)->get()->getRowArray(); - if (empty($existingPatient)) { - return $this->failNotFound('Patient with ID ' . $pat_id . ' not found.'); - } - - $rules = [ - 'pat_num' => 'required|max_length[50]', - 'name_first' => 'required|min_length[3]|max_length[255]', - 'name_middle' => 'permit_empty', - 'name_maiden' => 'permit_empty', - 'name_last' => 'permit_empty', - 'birth_date' => 'permit_empty|valid_date[Y-m-d]', - 'pat_altnum' => 'permit_empty|max_length[50]', - 'address_1' => 'permit_empty', - 'address_2' => 'permit_empty', - 'address_3' => 'permit_empty', - 'city' => 'permit_empty', - ]; - - // Validate the input data - if (!$this->validate($rules)) { - return $this->failValidationErrors($this->validator->getErrors()); - } - - $allowedUpdateFields = [ - 'name_first', 'name_last', 'name_middle', - 'pat_num', 'pat_altnum', 'birth_date', 'birth_place', - 'address_1', 'address_2', 'address_3', 'city', 'province', 'zip', - 'email_1', 'email_2', 'phone', 'mobile_phone', 'mother', 'account_number' - ]; - - $datas = []; - foreach ($allowedUpdateFields as $field) { - if (isset($data[$field])) { - $datas[$field] = $data[$field]; + $builder = $this->db->table('patients'); + + if ($pat_name !== null) { + $sql = "LOWER(CONCAT_WS(' ', IFNULL(prefix,''), IFNULL(name_first,''), IFNULL(name_middle,''), IFNULL(name_last,''), IFNULL(name_maiden,''), IFNULL(suffix,'')))"; + $rawSql = new RawSql($sql); + $builder->like($rawSql, $pat_name, 'both'); } + if ($pat_num !== null) { $builder->where('pat_num', $pat_num); } + if ($pat_altnum !== null) { $builder->where('pat_altnum', $pat_altnum); } + if ($pat_dob !== null) { $builder->where('pat_dob', $pat_dob); } + if ($start_date !== null || $end_date !== null) { + $builder->join('requests', 'pat_id=patients.pat_id','left'); + if ($start_date !== null) { $builder->where('requests.req_date >=', $start_date . ' 00:00:00'); } + if ($end_date !== null) { $builder->where('requests.req_date <=', $end_date . ' 23:59:00'); } + } + + $filteredPatients = $builder->get()->getResultArray(); + + // Data pasien tidak ada mengembalikan - success 200 + if (empty($filteredPatients)) { + return $this->respond([ + 'status' => 'success', + 'message' => 'No patient records found matching the criteria.', + 'data' => [] + ], 200); + } + + // Data pasien ditemukan dan mengembalikan - success 200 + return $this->respond([ + 'status' => 'success', + 'message'=> "Patients fetched successfully", + 'data' => $filteredPatients, + ], 200); + + } catch (\Exception $e) { + + // Error Server Mengembalikan 500 + return $this->failServerError('Something went wrong'); } - - if (empty($datas)) { - return $this->failValidationError('No data provided for update.'); - } - - $this->db->table('patients')->where('pat_id', $pat_id)->update($datas); - - return $this->respond([ - 'message' => 'Patient updated successfully', - 'pat_id' => $pat_id - ]); } + + // OK + public function show($id = null) { + + try { + + $builder = $this->db->table('patients'); + $patient = $builder->where('pat_num', $id)->get()->getRowArray(); + + // Data pasien tidak ada mengembalikan - success 200 + if (empty($patient)) { + return $this->respond([ + 'status' => 'success', + 'message' => 'Patient with ID ' . $id . ' not found.', + 'data' => [], + ], 200); + } + + // Data pasien ditemukan dan mengembalikan - success 200 + return $this->respond([ + 'status' => 'success', + 'message'=> "Patient Show Successfully", + 'data' => $patient, + ], 200); + + } catch (\Exception $e) { + + // Error Server Mengembalikan 500 + return $this->failServerError('Something went wrong'); + } + + } + + // OK + public function create() { + + try { + $input = $this->request->getJSON(true); + + // $datas = [ + // 'name_first' => $data['name_first'], + // 'name_last' => $data['name_last'], + // 'name_middle' => $data['name_middle'] ?? null, + // 'name_maiden' => $data['name_maiden'] ?? null, + // 'pat_num' => $data['pat_num'], + // 'prefix' => $data['prefix'] ?? null, + // 'suffix' => $data['suffix'] ?? null, + // 'birth_date' => $data['pat_dob'] ?? null, + // 'pat_altnum' => $data['pat_altnum'] ?? null, + // 'address_1' => $data['address_1'] ?? null, + // 'address_2' => $data['address_2'] ?? null, + // 'address_3' => $data['address_3'] ?? null, + // 'city' => $data['city'] ?? null, + // 'province' => $data['province'] ?? null, + // 'zip' => $data['zip'] ?? null, + // 'email_1' => $data['email_1'] ?? null, + // 'email_2' => $data['email_2'] ?? null, + // 'phone' => $data['phone'] ?? null, + // 'mobile_phone' => $data['mobile_phone'] ?? null, + // 'mother' => $data['mother'] ?? null, + // 'account_number' => $data['account_number'] ?? null, + // 'marital_status' => $data['marital_status'] ?? null, + // 'country_id' => $data['country_id'] ?? null, + // 'race_id' => $data['race_id'] ?? null, + // 'religion_id' => $data['religion_id'] ?? null, + // 'ethnic_id' => $data['ethnic_id'] ?? null, + // 'citizenship' => $data['citizenship'] ?? null, + // 'death' => $data['death'] ?? null, + // 'death_date' => $data['death_date'] ?? null, + // 'create_date' => date('Y-m-d H:i:s'), + // ]; + + $data = [ + 'name_first' => $input['firstName'], // Mengambil dari firstName + 'name_last' => $input['lastName'], // Mengambil dari lastName + 'name_middle' => $input['middleName'] ?? null, // Mengambil dari middleName + 'name_maiden' => $input['maindenName'] ?? null, // Mengambil dari maindenName + 'pat_num' => $input['patientID'], // Mengambil dari patientID + 'prefix' => $input['title'] ?? null, // Mengambil dari title + 'suffix' => $input['suffixName'] ?? null, // Mengambil dari suffixName + 'birth_date' => $input['birthdate'] ?? null, // Mengambil dari birthdate + 'pat_altnum' => $input['alternateID'] ?? null, // Mengambil dari alternateID + 'address_1' => $input['street1'] ?? null, // Mengambil dari street1 + 'address_2' => $input['street2'] ?? null, // Mengambil dari street2 + 'address_3' => $input['placeOfBirthdate'] ?? null, // Memetakan placeOfBirthdate ke address_3, jika diperlukan + 'city' => $input['city'] ?? null, // Mengambil dari city + 'province' => $input['province'] ?? null, // Mengambil dari province + 'zip' => null, // Tidak ada padanan langsung di newPatientForm, bisa diisi manual atau dari input lain + 'email_1' => $input['email1'] ?? null, // Mengambil dari email1 + 'email_2' => $input['email2'] ?? null, // Mengambil dari email2 + 'phone' => $input['phone'] ?? null, // Mengambil dari phone + 'mobile_phone' => $input['mobile'] ?? null, // Mengambil dari mobile + 'mother' => $input['motherName'] ?? null, // Mengambil dari motherName + 'account_number' => null, // Tidak ada padanan langsung, bisa diisi manual atau dari input lain + 'marital_status' => $input['maritalStatus'] ?? null, // Mengambil dari maritalStatus + 'country_id' => null, // Tidak ada padanan langsung, perlu penyesuaian jika ada input negara + // 'race_id' => $data['race'] ?? null, // Mengambil dari race + // 'religion_id' => $data['religion'] ?? null, // Mengambil dari religion + // 'ethnic_id' => $data['ethnic'] ?? null, // Mengambil dari ethnic + 'citizenship' => null, // Tidak ada padanan langsung, perlu penyesuaian jika ada input kewarganegaraan + 'death' => $input['death'] ?? null, // Mengambil dari death (asumsi 0/1 atau boolean) + 'death_date' => $input['deathTime'] ?? null, // Mengambil dari deathTime + 'create_date' => date('Y-m-d H:i:s'), // Ini adalah tanggal dan waktu saat ini di server PHP + ]; + + $rules = [ + 'pat_num' => 'required|is_unique[patients.pat_num]|max_length[50]', + 'name_first' => 'required|min_length[3]|max_length[255]', + 'name_middle' => 'permit_empty', + 'name_maiden' => 'permit_empty', + 'name_last' => 'permit_empty', + 'birth_date' => 'permit_empty|valid_date[Y-m-d]', + 'pat_altnum' => 'permit_empty|max_length[50]', + 'address_1' => 'permit_empty', + 'address_2' => 'permit_empty', + 'address_3' => 'permit_empty', + 'city' => 'permit_empty', + ]; + + // Request dari client tidak valid atau tidak bisa diproses oleh server - 400 + if (!$this->validateData($data, $rules)) { + return $this->respond([ + 'status' => 'error', + 'message' => 'Validation failed', + 'errors' => $this->validator->getErrors() + ], 400); + } + + $this->db->table('patients')->insert($data); + $newPatientId = $this->db->insertID(); + + // Sukses & Insert = 201 - Kirim data patient ID + return $this->respondCreated([ + 'status' => 'success', + 'message' => 'Patient created successfully', + 'data' => $newPatientId + ], 201); + + } catch (\Exception $e) { + + // Error Server = 500 + return $this->failServerError('Something went wrong'); + } + } + + // OK + public function update($pat_id = null) { + + try { + $input = $this->request->getJSON(true); + + $data = [ + 'name_first' => $input['name_first'], // Mengambil dari firstName + 'name_last' => $input['name_last'], // Mengambil dari lastName + 'name_middle' => $input['middleName'] ?? null, // Mengambil dari middleName + 'name_maiden' => $input['maindenName'] ?? null, // Mengambil dari maindenName + 'pat_num' => $input['pat_num'], // Mengambil dari patientID + 'prefix' => $input['title'] ?? null, // Mengambil dari title + 'suffix' => $input['suffixName'] ?? null, // Mengambil dari suffixName + 'birth_date' => $input['birthdate'] ?? null, // Mengambil dari birthdate + 'pat_altnum' => $input['alternateID'] ?? null, // Mengambil dari alternateID + 'address_1' => $input['street1'] ?? null, // Mengambil dari street1 + 'address_2' => $input['street2'] ?? null, // Mengambil dari street2 + 'address_3' => $input['placeOfBirthdate'] ?? null, // Memetakan placeOfBirthdate ke address_3, jika diperlukan + 'city' => $input['city'] ?? null, // Mengambil dari city + 'province' => $input['province'] ?? null, // Mengambil dari province + 'zip' => null, // Tidak ada padanan langsung di newPatientForm, bisa diisi manual atau dari input lain + 'email_1' => $input['email1'] ?? null, // Mengambil dari email1 + 'email_2' => $input['email2'] ?? null, // Mengambil dari email2 + 'phone' => $input['phone'] ?? null, // Mengambil dari phone + 'mobile_phone' => $input['mobile'] ?? null, // Mengambil dari mobile + 'mother' => $input['motherName'] ?? null, // Mengambil dari motherName + 'account_number' => null, // Tidak ada padanan langsung, bisa diisi manual atau dari input lain + 'marital_status' => $input['maritalStatus'] ?? null, // Mengambil dari maritalStatus + 'country_id' => null, // Tidak ada padanan langsung, perlu penyesuaian jika ada input negara + 'citizenship' => null, // Tidak ada padanan langsung, perlu penyesuaian jika ada input kewarganegaraan + 'death' => $input['death'] ?? null, // Mengambil dari death (asumsi 0/1 atau boolean) + 'death_date' => $input['deathTime'] ?? null, // Mengambil dari deathTime + 'create_date' => date('Y-m-d H:i:s'), // Ini adalah tanggal dan waktu saat ini di server PHP + ]; + + // Apakah Pasien Ada + $existingPatient = $this->db->table('patients')->where('pat_id', $pat_id)->get()->getRowArray(); + + // Mengembalikan 404 + if (empty($existingPatient)) { + return $this->failNotFound('Patient with ID ' . $pat_id . ' not found.'); + } + + $rules = [ + 'pat_num' => 'required|max_length[50]', + 'name_first' => 'required|min_length[3]|max_length[255]', + 'name_middle' => 'permit_empty', + 'name_maiden' => 'permit_empty', + 'name_last' => 'permit_empty', + 'birth_date' => 'permit_empty|valid_date[Y-m-d]', + 'pat_altnum' => 'permit_empty|max_length[50]', + 'address_1' => 'permit_empty', + 'address_2' => 'permit_empty', + 'address_3' => 'permit_empty', + 'city' => 'permit_empty', + ]; + + // Request dari client tidak valid atau tidak bisa diproses oleh server - 400 + if (!$this->validateData($data, $rules)) { + return $this->failValidationErrors($this->validator->getErrors()); + } + + $allowedUpdateFields = [ + 'name_first', 'name_last', 'name_middle', + 'pat_num', 'pat_altnum', 'birth_date', 'birth_place', + 'address_1', 'address_2', 'address_3', 'city', 'province', 'zip', + 'email_1', 'email_2', 'phone', 'mobile_phone', 'mother', 'account_number' + ]; + + $datas = []; + foreach ($allowedUpdateFields as $field) { + if (isset($data[$field])) { + $datas[$field] = $data[$field]; + } + } + + if (empty($data)) { + return $this->failValidationError('No data provided for update.'); + } + + $this->db->table('patients')->where('pat_id', $pat_id)->update($data); + + // Sukses & Insert = 201 - Kirim data patient ID + return $this->respondCreated([ + 'status' => 'success', + 'message' => 'Patient updated successfully', + 'data' => $data + ], 201); + + } catch (\Exception $e) { + // Error Server = 500 + return $this->failServerError('Something went wrong '.$e); + } + } + + // OK + public function delete($pat_id = null) { + + try { + + if (!$pat_id) { + return $this->failValidationError('Patient ID is required.'); + } + + // Cari data pasien + $patient = $this->db->table('patients') + ->where('pat_id', $pat_id) + ->get() + ->getRow(); + + if (!$patient) { + return $this->failNotFound("Patient ID with {$pat_id} not found."); + } + + // Hapus data pasien berdasarkan pat_num + $this->db->table('patients')->where('pat_id', $pat_id)->delete(); + + // Mengembalikan 200 + return $this->respondDeleted([ + 'status' => 'success', + 'message' => "Patient ID with {$pat_id} deleted successfully." + ]); + + } catch (\Exception $e) { + return $this->failServerError("Internal server error: " . $e->getMessage()); + } + } + } \ No newline at end of file