feat: Implement custom ResponseTrait with automatic empty string to null conversion

- Create App\Traits\ResponseTrait that wraps CodeIgniter\API\ResponseTrait
- Add json_helper with convert_empty_strings_to_null() and prepare_json_response() functions
- Replace all imports of CodeIgniter\API\ResponseTrait with App\Traits\ResponseTrait across all controllers
- Add 'json' helper to BaseController helpers array
- Ensure consistent API response formatting across the application
This commit is contained in:
mahdahar 2026-02-18 10:15:47 +07:00
parent 498afcc08c
commit 425595f5c0
36 changed files with 113 additions and 35 deletions

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Controllers; namespace App\Controllers;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Models\AreaGeoModel; use App\Models\AreaGeoModel;

View File

@ -2,7 +2,7 @@
namespace App\Controllers; namespace App\Controllers;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use CodeIgniter\Controller; use CodeIgniter\Controller;
use Firebase\JWT\JWT; use Firebase\JWT\JWT;

View File

@ -2,7 +2,7 @@
namespace App\Controllers; namespace App\Controllers;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use CodeIgniter\Controller; use CodeIgniter\Controller;
use Firebase\JWT\JWT; use Firebase\JWT\JWT;

View File

@ -30,12 +30,12 @@ abstract class BaseController extends Controller
/** /**
* An array of helpers to be loaded automatically upon * An array of helpers to be loaded automatically upon
* class instantiation. These helpers will be available * class instantiation. These will be available
* to all other controllers that extend BaseController. * to all other controllers that extend BaseController.
* *
* @var list<string> * @var list<string>
*/ */
protected $helpers = []; protected $helpers = ['json'];
/** /**
* Be sure to declare properties for any property fetch you initialized. * Be sure to declare properties for any property fetch you initialized.

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Controllers\Contact; namespace App\Controllers\Contact;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Libraries\ValueSet; use App\Libraries\ValueSet;
use App\Models\Contact\ContactModel; use App\Models\Contact\ContactModel;

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Controllers\Contact; namespace App\Controllers\Contact;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Models\Contact\MedicalSpecialtyModel; use App\Models\Contact\MedicalSpecialtyModel;

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Controllers\Contact; namespace App\Controllers\Contact;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Models\Contact\OccupationModel; use App\Models\Contact\OccupationModel;

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Controllers; namespace App\Controllers;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Models\CounterModel; use App\Models\CounterModel;

View File

@ -2,7 +2,7 @@
namespace App\Controllers; namespace App\Controllers;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use CodeIgniter\Controller; use CodeIgniter\Controller;
use Firebase\JWT\JWT; use Firebase\JWT\JWT;

View File

@ -2,7 +2,7 @@
namespace App\Controllers; namespace App\Controllers;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use CodeIgniter\Controller; use CodeIgniter\Controller;
class EdgeController extends Controller class EdgeController extends Controller

View File

@ -2,7 +2,7 @@
namespace App\Controllers; namespace App\Controllers;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use CodeIgniter\Controller; use CodeIgniter\Controller;
use Firebase\JWT\JWT; use Firebase\JWT\JWT;

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Controllers; namespace App\Controllers;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Models\Location\LocationModel; use App\Models\Location\LocationModel;

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Controllers; namespace App\Controllers;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use CodeIgniter\Controller; use CodeIgniter\Controller;
use App\Libraries\ValueSet; use App\Libraries\ValueSet;
use App\Models\OrderTestModel; use App\Models\OrderTestModel;

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Controllers\Organization; namespace App\Controllers\Organization;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Models\Organization\AccountModel; use App\Models\Organization\AccountModel;

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Controllers\Organization; namespace App\Controllers\Organization;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Models\Organization\DepartmentModel; use App\Models\Organization\DepartmentModel;

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Controllers\Organization; namespace App\Controllers\Organization;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Models\Organization\DisciplineModel; use App\Models\Organization\DisciplineModel;

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Controllers\Organization; namespace App\Controllers\Organization;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Models\Organization\SiteModel; use App\Models\Organization\SiteModel;

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Controllers\Organization; namespace App\Controllers\Organization;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Models\Organization\WorkstationModel; use App\Models\Organization\WorkstationModel;

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Controllers; namespace App\Controllers;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Models\PatVisit\PatVisitModel; use App\Models\PatVisit\PatVisitModel;
use App\Models\PatVisit\PatVisitADTModel; use App\Models\PatVisit\PatVisitADTModel;

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Controllers\Patient; namespace App\Controllers\Patient;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use CodeIgniter\Controller; use CodeIgniter\Controller;
use App\Libraries\ValueSet; use App\Libraries\ValueSet;
use App\Models\Patient\PatientModel; use App\Models\Patient\PatientModel;

View File

@ -3,7 +3,7 @@
namespace App\Controllers\Result; namespace App\Controllers\Result;
use App\Models\ValueSet\ValueSetModel; use App\Models\ValueSet\ValueSetModel;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
class ResultValueSetController extends \CodeIgniter\Controller class ResultValueSetController extends \CodeIgniter\Controller
{ {

View File

@ -2,7 +2,7 @@
namespace App\Controllers; namespace App\Controllers;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use CodeIgniter\Controller; use CodeIgniter\Controller;
use Firebase\JWT\JWT; use Firebase\JWT\JWT;

View File

@ -2,7 +2,7 @@
namespace App\Controllers; namespace App\Controllers;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use CodeIgniter\Controller; use CodeIgniter\Controller;
use Firebase\JWT\JWT; use Firebase\JWT\JWT;

View File

@ -2,7 +2,7 @@
namespace App\Controllers\Specimen; namespace App\Controllers\Specimen;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Libraries\ValueSet; use App\Libraries\ValueSet;
use App\Models\Specimen\ContainerDefModel; use App\Models\Specimen\ContainerDefModel;

View File

@ -2,7 +2,7 @@
namespace App\Controllers\Specimen; namespace App\Controllers\Specimen;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Libraries\ValueSet; use App\Libraries\ValueSet;
use App\Models\Specimen\SpecimenCollectionModel; use App\Models\Specimen\SpecimenCollectionModel;

View File

@ -2,7 +2,7 @@
namespace App\Controllers\Specimen; namespace App\Controllers\Specimen;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Libraries\ValueSet; use App\Libraries\ValueSet;
use App\Models\Specimen\SpecimenModel; use App\Models\Specimen\SpecimenModel;

View File

@ -2,7 +2,7 @@
namespace App\Controllers\Specimen; namespace App\Controllers\Specimen;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Models\Specimen\SpecimenPrepModel; use App\Models\Specimen\SpecimenPrepModel;

View File

@ -2,7 +2,7 @@
namespace App\Controllers\Specimen; namespace App\Controllers\Specimen;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Libraries\ValueSet; use App\Libraries\ValueSet;
use App\Models\Specimen\SpecimenStatusModel; use App\Models\Specimen\SpecimenStatusModel;

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Controllers\Test; namespace App\Controllers\Test;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use CodeIgniter\Controller; use CodeIgniter\Controller;
use App\Libraries\ValueSet; use App\Libraries\ValueSet;
use App\Models\Patient\PatientModel; use App\Models\Patient\PatientModel;

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Controllers\Test; namespace App\Controllers\Test;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Libraries\ValueSet; use App\Libraries\ValueSet;
use App\Models\Test\TestMapModel; use App\Models\Test\TestMapModel;

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Controllers; namespace App\Controllers;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Libraries\ValueSet; use App\Libraries\ValueSet;

View File

@ -4,7 +4,7 @@ namespace App\Controllers;
use App\Libraries\ValueSet; use App\Libraries\ValueSet;
use App\Models\ValueSet\ValueSetModel; use App\Models\ValueSet\ValueSetModel;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
class ValueSetController extends \CodeIgniter\Controller class ValueSetController extends \CodeIgniter\Controller
{ {

View File

@ -3,7 +3,7 @@
namespace App\Controllers; namespace App\Controllers;
use App\Models\ValueSet\ValueSetDefModel; use App\Models\ValueSet\ValueSetDefModel;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
class ValueSetDefController extends \CodeIgniter\Controller class ValueSetDefController extends \CodeIgniter\Controller
{ {

View File

@ -2,7 +2,7 @@
/* /*
namespace App\Controllers; namespace App\Controllers;
use CodeIgniter\API\ResponseTrait; use App\Traits\ResponseTrait;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Models\SyncCRM\ZonesModel; use App\Models\SyncCRM\ZonesModel;

View File

@ -0,0 +1,47 @@
<?php
if (!function_exists('convert_empty_strings_to_null')) {
/**
* Recursively convert empty strings to null in arrays or objects
*
* @param mixed $data The data to process (array, object, or scalar)
* @return mixed The processed data with empty strings converted to null
*/
function convert_empty_strings_to_null($data) {
if (is_array($data)) {
foreach ($data as $key => $value) {
if (is_array($value)) {
$data[$key] = convert_empty_strings_to_null($value);
} elseif (is_object($value)) {
$data[$key] = convert_empty_strings_to_null($value);
} elseif ($value === '') {
$data[$key] = null;
}
}
} elseif (is_object($data)) {
foreach ($data as $key => $value) {
if (is_array($value)) {
$data->$key = convert_empty_strings_to_null($value);
} elseif (is_object($value)) {
$data->$key = convert_empty_strings_to_null($value);
} elseif ($value === '') {
$data->$key = null;
}
}
}
return $data;
}
}
if (!function_exists('prepare_json_response')) {
/**
* Prepare data for JSON response by converting empty strings to null
* This is a convenience wrapper around convert_empty_strings_to_null
*
* @param mixed $data The data to prepare for JSON response
* @return mixed The processed data ready for JSON encoding
*/
function prepare_json_response($data) {
return convert_empty_strings_to_null($data);
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace App\Traits;
use CodeIgniter\API\ResponseTrait as BaseResponseTrait;
use CodeIgniter\HTTP\ResponseInterface;
trait ResponseTrait
{
use BaseResponseTrait {
respond as baseRespond;
}
/**
* Send a response with automatic conversion of empty strings to null
*
* @param mixed $data
* @param int $status
* @param string $message
* @return ResponseInterface
*/
public function respond($data = null, int $status = 200, string $message = '')
{
// Convert empty strings to null in the data
if ($data !== null && (is_array($data) || is_object($data))) {
$data = convert_empty_strings_to_null($data);
}
return $this->baseRespond($data, $status, $message);
}
}