BaseApiController_v2.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <?php
  2. namespace App\Controllers\Api;
  3. use CodeIgniter\RESTful\ResourceController;
  4. use CodeIgniter\HTTP\ResponseInterface;
  5. class BaseApiController extends ResourceController
  6. {
  7. protected $format = 'json';
  8. protected $db;
  9. // DB lazy loading
  10. protected function getDB()
  11. {
  12. if (!$this->db) {
  13. $this->db = \Config\Database::connect();
  14. }
  15. return $this->db;
  16. }
  17. /**
  18. * Success response
  19. */
  20. protected function respondSuccess($data = null, $message = 'Success', $code = ResponseInterface::HTTP_OK)
  21. {
  22. return $this->respond([
  23. 'success' => true,
  24. 'message' => $message,
  25. 'data' => $data
  26. ], $code);
  27. }
  28. /**
  29. * Error response
  30. */
  31. protected function respondError($message = 'Error occurred', $code = ResponseInterface::HTTP_BAD_REQUEST, $errors = null)
  32. {
  33. return $this->respond([
  34. 'success' => false,
  35. 'message' => $message,
  36. 'errors' => $errors
  37. ], $code);
  38. }
  39. /**
  40. * Validate token
  41. */
  42. protected function validateToken()
  43. {
  44. $authHeader = $this->request->getHeaderLine('Authorization');
  45. if (empty($authHeader)) {
  46. return false;
  47. }
  48. $token = str_replace('Bearer ', '', $authHeader);
  49. if (empty($token)) {
  50. return false;
  51. }
  52. // Check token in database
  53. $builder = $this->getDB()->table('admin_tokens');
  54. $tokenData = $builder->where('token', $token)
  55. ->where('expires_at >', date('Y-m-d H:i:s'))
  56. ->get()
  57. ->getRow();
  58. if (!$tokenData) {
  59. return false;
  60. }
  61. return $tokenData;
  62. }
  63. /**
  64. * Require authentication
  65. */
  66. protected function requireAuth()
  67. {
  68. $tokenData = $this->validateToken();
  69. if (!$tokenData) {
  70. return $this->respondError('Unauthorized', ResponseInterface::HTTP_UNAUTHORIZED);
  71. }
  72. return $tokenData;
  73. }
  74. /**
  75. * Get pagination params
  76. */
  77. protected function getPaginationParams()
  78. {
  79. $page = $this->request->getGet('page') ?? 1;
  80. $perPage = $this->request->getGet('per_page') ?? 10;
  81. $offset = ($page - 1) * $perPage;
  82. return [
  83. 'page' => (int)$page,
  84. 'per_page' => (int)$perPage,
  85. 'offset' => (int)$offset
  86. ];
  87. }
  88. /**
  89. * Build paginated response
  90. */
  91. protected function paginatedResponse($builder, $params)
  92. {
  93. $total = $builder->countAllResults(false);
  94. $items = $builder->limit($params['per_page'], $params['offset'])->get()->getResult();
  95. return [
  96. 'items' => $items,
  97. 'total' => $total,
  98. 'page' => $params['page'],
  99. 'per_page' => $params['per_page'],
  100. 'total_pages' => ceil($total / $params['per_page'])
  101. ];
  102. }
  103. }