142 lines
3.5 KiB
PHP
142 lines
3.5 KiB
PHP
<?php
|
|
namespace App\Components\Api\Http\Controllers;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Support\Str;
|
|
|
|
class BaseApiController extends Controller
|
|
{
|
|
/**
|
|
* Default success status code
|
|
*/
|
|
protected int $statusCode = 200;
|
|
|
|
/**
|
|
* API Version
|
|
*/
|
|
protected string $apiVersion;
|
|
|
|
/**
|
|
* Request ID
|
|
*/
|
|
protected string $requestId;
|
|
|
|
public function __construct()
|
|
{
|
|
// Generate a unique request ID if not already set
|
|
$this->requestId = request()->header('X-Request-ID') ?? (string) Str::uuid();
|
|
|
|
// Get API version from route parameter or default to 'v1'
|
|
$this->apiVersion = request()->route('version') ?? 'v1';
|
|
}
|
|
|
|
/**
|
|
* Get response metadata.
|
|
*
|
|
* @param array $additionalMeta
|
|
* @return array
|
|
*/
|
|
protected function getMetadata(array $additionalMeta = []): array
|
|
{
|
|
return array_merge([
|
|
'timestamp' => now()->toIso8601String(),
|
|
'request_id' => $this->requestId,
|
|
'api_version' => $this->apiVersion,
|
|
], $additionalMeta);
|
|
}
|
|
|
|
/**
|
|
* Send a success response.
|
|
*
|
|
* @param mixed $data
|
|
* @param string|null $message
|
|
* @param array $meta
|
|
* @return JsonResponse
|
|
*/
|
|
protected function respondSuccess(mixed $data = null, ?string $message = null, array $meta = []): JsonResponse
|
|
{
|
|
$response = [
|
|
'success' => true,
|
|
'data' => $data,
|
|
'meta' => $this->getMetadata($meta)
|
|
];
|
|
|
|
if ($message) {
|
|
$response['message'] = $message;
|
|
}
|
|
|
|
return response()->json($response, $this->statusCode)
|
|
->header('X-Request-ID', $this->requestId);
|
|
}
|
|
|
|
/**
|
|
* Send an error response.
|
|
*
|
|
* @param string $message
|
|
* @param mixed $errors
|
|
* @param int $statusCode
|
|
* @return JsonResponse
|
|
*/
|
|
protected function respondError(string $message, mixed $errors = null, int $statusCode = 400): JsonResponse
|
|
{
|
|
$response = [
|
|
'success' => false,
|
|
'message' => $message,
|
|
'meta' => $this->getMetadata()
|
|
];
|
|
|
|
if ($errors !== null) {
|
|
$response['errors'] = $errors;
|
|
}
|
|
|
|
return response()->json($response, $statusCode)
|
|
->header('X-Request-ID', $this->requestId);
|
|
}
|
|
|
|
/**
|
|
* Send a not found response.
|
|
*
|
|
* @param string $message
|
|
* @return JsonResponse
|
|
*/
|
|
protected function respondNotFound(string $message = 'Resource not found'): JsonResponse
|
|
{
|
|
return $this->respondError($message, null, 404);
|
|
}
|
|
|
|
/**
|
|
* Send an unauthorized response.
|
|
*
|
|
* @param string $message
|
|
* @return JsonResponse
|
|
*/
|
|
protected function respondUnauthorized(string $message = 'Unauthorized'): JsonResponse
|
|
{
|
|
return $this->respondError($message, null, 401);
|
|
}
|
|
|
|
/**
|
|
* Send a forbidden response.
|
|
*
|
|
* @param string $message
|
|
* @return JsonResponse
|
|
*/
|
|
protected function respondForbidden(string $message = 'Forbidden'): JsonResponse
|
|
{
|
|
return $this->respondError($message, null, 403);
|
|
}
|
|
|
|
/**
|
|
* Send a validation error response.
|
|
*
|
|
* @param mixed $errors
|
|
* @param string $message
|
|
* @return JsonResponse
|
|
*/
|
|
protected function respondValidationError(mixed $errors, string $message = 'Validation failed'): JsonResponse
|
|
{
|
|
return $this->respondError($message, $errors, 422);
|
|
}
|
|
}
|