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); } }