model = new PatResultModel(); } /** * List results with optional filters * GET /api/result */ public function index() { try { $orderID = $this->request->getGet('order_id'); $patientID = $this->request->getGet('patient_id'); if ($orderID) { $results = $this->model->getByOrder((int)$orderID); } elseif ($patientID) { $results = $this->model->getByPatient((int)$patientID); } else { // Get all results with pagination $page = (int)($this->request->getGet('page') ?? 1); $perPage = (int)($this->request->getGet('per_page') ?? 20); $results = $this->model ->where('DelDate', null) ->orderBy('ResultID', 'DESC') ->paginate($perPage, 'default', $page); } $results = is_array($results) ? array_map([$this, 'hydrateResultPayload'], $results) : $results; return $this->respond([ 'status' => 'success', 'message' => 'Results retrieved successfully', 'data' => $results ], 200); } catch (\Exception $e) { log_message('error', 'ResultController::index error: ' . $e->getMessage()); return $this->respond([ 'status' => 'failed', 'message' => 'Failed to retrieve results', 'data' => [] ], 500); } } /** * Get single result * GET /api/result/{id} */ public function show($id) { try { $result = $this->model->getWithRelations((int)$id); if (!$result) { return $this->respond([ 'status' => 'failed', 'message' => 'Result not found', 'data' => [] ], 404); } $result = $this->hydrateResultPayload($result); return $this->respond([ 'status' => 'success', 'message' => 'Result retrieved successfully', 'data' => $result ], 200); } catch (\Exception $e) { log_message('error', 'ResultController::show error: ' . $e->getMessage()); return $this->respond([ 'status' => 'failed', 'message' => 'Failed to retrieve result', 'data' => [] ], 500); } } /** * Create a new result entry * POST /api/result */ public function create() { $payload = $this->request->getJSON(true); if (!is_array($payload) || empty($payload)) { return $this->respond([ 'status' => 'failed', 'message' => 'No data provided', 'data' => [] ], 400); } if (isset($payload['ResultValue'])) { $payload['Result'] = $payload['ResultValue']; } try { $resultId = $this->model->insert($payload, true); if (!$resultId) { return $this->respond([ 'status' => 'failed', 'message' => 'Failed to create result', 'data' => [] ], 500); } return $this->respondCreated([ 'status' => 'success', 'message' => 'Result created successfully', 'data' => [ 'ResultID' => $resultId, 'ResultValue' => $payload['ResultValue'] ?? ($payload['Result'] ?? null), 'ResultCode' => $payload['ResultCode'] ?? null, ] ], 201); } catch (\Exception $e) { log_message('error', 'ResultController::create error: ' . $e->getMessage()); return $this->respond([ 'status' => 'failed', 'message' => 'Failed to create result', 'data' => [] ], 500); } } /** * Update result with validation * PATCH /api/result/{id} */ public function update($id) { try { $data = $this->requirePatchPayload($this->request->getJSON(true)); if ($data === null) { return; } $validatedId = $this->requirePatchId($id, 'ResultID'); if ($validatedId === null) { return; } $existing = $this->model->find($validatedId); if (!$existing) { return $this->respond([ 'status' => 'failed', 'message' => 'Result not found', 'data' => [] ], 404); } $result = $this->model->updateWithValidation($validatedId, $data); if (!$result['success']) { return $this->respond([ 'status' => 'failed', 'message' => $result['message'], 'data' => [] ], 400); } // Get updated result with relations $updatedResult = $this->model->getWithRelations($validatedId); return $this->respond([ 'status' => 'success', 'message' => $result['message'], 'data' => [ 'result' => $updatedResult ? $this->hydrateResultPayload($updatedResult) : [], 'flag' => $result['flag'] ] ], 200); } catch (\Exception $e) { log_message('error', 'ResultController::update error: ' . $e->getMessage()); return $this->respond([ 'status' => 'failed', 'message' => 'Failed to update result', 'data' => [] ], 500); } } /** * Soft delete result * DELETE /api/result/{id} */ public function delete($id) { try { $result = $this->model->find((int)$id); if (!$result) { return $this->respond([ 'status' => 'failed', 'message' => 'Result not found', 'data' => [] ], 404); } $deleted = $this->model->softDelete((int)$id); if (!$deleted) { return $this->respond([ 'status' => 'failed', 'message' => 'Failed to delete result', 'data' => [] ], 500); } return $this->respond([ 'status' => 'success', 'message' => 'Result deleted successfully', 'data' => [] ], 200); } catch (\Exception $e) { log_message('error', 'ResultController::delete error: ' . $e->getMessage()); return $this->respond([ 'status' => 'failed', 'message' => 'Failed to delete result', 'data' => [] ], 500); } } private function hydrateResultPayload(array $payload): array { if (!array_key_exists('ResultValue', $payload) && array_key_exists('Result', $payload)) { $payload['ResultValue'] = $payload['Result']; } return $payload; } }