Files
api/services/nginx/app/classes/response.php
T
Jepp9350 61de9cdb45 Add email configuration module and enable invoice PDF retrieval
Introduce an email configuration module to manage SMTP settings, including encryption, host, username, and more. Implement functionality for retrieving invoice PDFs, storing them, and providing secure download links. Added relevant endpoint, routes, and helper methods to support these features.
2025-02-10 18:07:51 +01:00

190 lines
5.4 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)) {
$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): string|null
{
// 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;
}
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');
}
}