Files
api/services/nginx/app/classes/response.php
T
Jepp9350 8702b41777 Add MotorAPI integration and Economic products support
Implemented MotorAPI lookup functionality with proper validation and logging. Added Economic products endpoint for fetching product details. Enhanced route parameter validation with length constraints and improved response handling for objects.
2025-02-18 12:34:26 +01:00

209 lines
6.3 KiB
PHP

<?php
namespace classes;
use interfaces\response_i;
use JetBrains\PhpStorm\NoReturn;
class response implements response_i
{
private bool $matching_route_found = false;
private array $data = [];
private array $meta = [];
private array $includes = [];
#[NoReturn] public function success(mixed $data, int $status = null): void
{
$this->response(true, $data, $status);
}
#[NoReturn] public function response(bool $success, mixed $data, int $status = null): void
{
global $DEBUG;
header('Content-Type: application/json');
if ($status) {
http_response_code($status);
} else {
http_response_code($success ? 200 : 400);
}
// If the data isn't an array, convert it to an array
if (!is_array($data) && !is_object($data)) {
$data = ['message' => $data];
}
// If the debug mode is enabled, add the debug data to the response
if ($DEBUG) {
$this->add_include('debug', [
'memory' => memory_get_usage(),
'time' => microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'],
'data' => $this->get_data()
]);
}
echo json_encode([
'success' => $success,
'data' => $data,
'meta' => $this->meta,
'includes' => $this->includes
]);
exit;
}
public function add_include(string $string, array $dataArray): void
{
$this->add_included($string, $dataArray);
}
public function add_included(string $key, mixed $value): void
{
$this->includes[$key] = $value;
}
public function get_data(): array
{
return $this->data;
}
#[NoReturn] public function not_found(): void
{
$this->error('Not found', 404);
}
#[NoReturn] public function error(mixed $data, int $status = null): void
{
$this->response(false, $data, $status);
}
#[NoReturn] public function rate_limit_exceeded(): void
{
$this->error('Rate limit exceeded', 429);
}
public function matching_route_found(): void
{
$this->matching_route_found = true;
}
#[NoReturn] public function method_not_allowed(): void
{
$this->error('Method not allowed', 405);
}
#[NoReturn] public function internal_server_error($error): void
{
$this->error('Internal server error' . ($error ? ': ' . $error : ''), 500);
}
public function paginate(int $page, int $per_page, int $total, string $search = null, array $filters = null, array $order = null): void
{
// If the total is 0, return 1 page, 0 total
if ($total === 0) {
$total = 1;
}
$this->add_meta('pagination', [
'page' => $page,
'per_page' => $per_page,
'total' => $total,
'search' => $search,
'filters' => $filters,
'order' => $order
]);
}
public function add_meta(string $key, mixed $value): void
{
$this->meta[$key] = $value;
}
public function is_matching_route_found(): bool
{
return $this->matching_route_found;
}
public function add_debug(mixed $data): void
{
$this->add_data('debug', $data);
}
public function add_data(string $key, mixed $value): void
{
$this->data[$key] = $value;
}
public function getRequestParameter(string $key): mixed
{
// Get the request data if the method is POST, PUT or PATCH
if ($_SERVER['REQUEST_METHOD'] === 'POST' || $_SERVER['REQUEST_METHOD'] === 'PUT' || $_SERVER['REQUEST_METHOD'] === 'PATCH') {
$data = json_decode(file_get_contents('php://input'), true);
}
// Get the request data if the method is GET, DELETE or OPTIONS
if ($_SERVER['REQUEST_METHOD'] === 'GET' || $_SERVER['REQUEST_METHOD'] === 'DELETE' || $_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
$data = $_GET;
}
// Return the data
return $data[$key] ?? null;
}
/**
* This function checks if a request parameter is set.
* This is different from getRequestParameter because this function allows for empty & null values.
* @param string $key
* @return bool
*/
public function isRequestParameterSet(string $key): bool
{
// Get the request data if the method is POST, PUT or PATCH
if ($_SERVER['REQUEST_METHOD'] === 'POST' || $_SERVER['REQUEST_METHOD'] === 'PUT' || $_SERVER['REQUEST_METHOD'] === 'PATCH') {
$data = json_decode(file_get_contents('php://input'), true);
}
// Get the request data if the method is GET, DELETE or OPTIONS
if ($_SERVER['REQUEST_METHOD'] === 'GET' || $_SERVER['REQUEST_METHOD'] === 'DELETE' || $_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
$data = $_GET;
}
return array_key_exists($key, $data);
}
public function parseFilters(?string $filters): array|null
{
if ($filters) {
$filters = explode(',', $filters);
$temp = [];
foreach ( $filters as $filter ) {
$filter = explode(':', $filter);
$temp[$filter[0]] = $filter[1];
}
$filters = $temp;
}
if ($filters) {
return $filters;
}
return null;
}
public function add_debug_list(string $list_name, int $key, $value): void
{
$this->add_data($list_name, [$key => $value]);
}
#[NoReturn] public function displayPDF($raw_pdf): void
{
self::disableAll();
$virtual_file = fopen('php://temp', 'r+');
fwrite($virtual_file, $raw_pdf);
fseek($virtual_file, 0);
file_put_contents('/tmp/debug_output.pdf', stream_get_contents($virtual_file));
// Return the PDF /tmp/debug_output.pdf
header('Content-Type: application/pdf');
header('Content-Disposition: inline; filename="debug_output.pdf"');
header('Content-Length: ' . filesize('/tmp/debug_output.pdf'));
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
readfile('/tmp/debug_output.pdf');
exit;
}
private static function disableAll(): void
{
error_reporting(0);
ini_set('display_errors', '0');
}
}