Files
api/services/nginx/app/routes/BrandingRoute.php
T
Jeppe Bundgaard 22fcb5cd0e - Refactor machine_1 drawing logic: optimize highlighted button rendering and deferred processing.
- Add branding management feature: API routes, payload handling, and OpenAPI schema updates.
- Implement department branding logic: CRUD operations, validation, and permissions.
- Add order deletion confirmation support with conflict handling and OpenAPI schema updates.
- Enhance tests and API methods for improved order handling and branding workflows.
2026-05-07 10:44:00 +02:00

225 lines
8.2 KiB
PHP

<?php
namespace routes;
use classes\authentication;
use objects\branding_o;
use objects\logs_o;
use traits\route_t;
class BrandingRoute
{
use route_t;
private const BRANDING_FIELDS = [
'name' => 'string',
'description' => 'string',
'cvr' => 'int',
'address' => 'string',
'phone_country_code' => 'int',
'phone' => 'int',
'email' => 'string',
'website' => 'string',
'banner' => 'string',
'logo' => 'string',
'favicon' => 'string',
'signature' => 'string',
];
private function readBrandingPayload(array $requiredFields = []): array
{
global $response;
$payload = [];
foreach (self::BRANDING_FIELDS as $field => $type) {
if (!self::isParametersSet([$field])) {
continue;
}
$value = self::getParameter($field);
if ($value === '') {
$value = null;
}
if ($value === null) {
if (in_array($field, $requiredFields, true)) {
$response->error($field . ' is required', 400);
}
$payload[$field] = null;
continue;
}
if ($type === 'int') {
if (is_int($value)) {
$payload[$field] = $value;
continue;
}
if (is_string($value) && preg_match('/^-?\d+$/', $value) === 1) {
$payload[$field] = (int)$value;
continue;
}
$response->error($field . ' must be an integer', 400);
}
if (!is_string($value)) {
$response->error($field . ' must be a string', 400);
}
$payload[$field] = $value;
}
foreach ($requiredFields as $requiredField) {
if (!array_key_exists($requiredField, $payload)) {
$response->error($requiredField . ' is required', 400);
}
}
return $payload;
}
private function applyBrandingPayload(branding_o $branding, array $payload): void
{
foreach ($payload as $field => $value) {
if (!array_key_exists($field, self::BRANDING_FIELDS) || !property_exists($branding, $field)) {
continue;
}
$branding->{$field}->set($value);
}
$branding->objectChanged();
}
public function run(): void
{
$this->get('/branding', function () {
// Require the user to be logged in
global $response;
$this->requirePermission('list_branding_options');
// Get the user object
$user = (new authentication())->get_user();
// Check if the request was successful
if ($user) {
// Log the incident
(new logs_o())->add('branding', 'global', 1, $user->id, 'LIST_BRANDING_OPTIONS', 'User listed branding options');
// Check the user has specified the branding id
if (self::isParametersSet(['id'])) {
// Check if the parameters are of the correct type
self::requireType((int)self::getParameter('id'), self::TYPE_INT());
self::requireMinValue((int)self::getParameter('id'), 1);
// Select the object
$branding = (new branding_o())->select(self::getParameter('id'));
// Check if the object exists
if ($branding->exists()) {
// Return the object as an array
$response->success(
$branding->asArray()
);
} else {
// Log the incident
(new logs_o())->add('branding', 'global', 1, $user->id, 'LIST_BRANDING_OPTIONS', 'User tried to list branding options with an invalid id');
// Return an error
$response->error('Invalid id', 400);
}
}
// Return the list of departments
$response->success(
(new branding_o())
->listObjectsWithPaginationIfSet(
function ($branding) use ($user) {
// Return the object as an array
$tmp_branding = (new branding_o())->select($branding['id']);
return $tmp_branding->asArray();
}
)
);
} else {
// Log the incident
(new logs_o())->add('branding', 'global', 1, 0, 'LIST_BRANDING_OPTIONS', 'User tried to list branding options without being logged in');
// Return an error
$response->error('Invalid session', 400);
}
},
[
'list_branding_options' => 'List all product options'
]
);
$this->post('/branding', function () {
// Require the user to be logged in
global $response;
$this->requirePermission('add_branding_option');
// Get the user object
$user = (new authentication())->get_user();
// Check if the request was successful
if ($user) {
// Check if the required parameters are set
self::requireParameters(['name', 'description', 'cvr']);
// Create the object
$branding = new branding_o();
// Add the object
$branding->add($this->readBrandingPayload(['name', 'description', 'cvr']));
// Log the incident
(new logs_o())->add('branding', 'global', 1, $user->id, 'ADD_BRANDING_OPTION', 'User added a branding option');
// Return the object
$response->success(
$branding->asArray()
);
} else {
// Log the incident
(new logs_o())->add('branding', 'global', 1, 0, 'ADD_BRANDING_OPTION', 'User tried to add a branding option without being logged in');
// Return an error
$response->error('Invalid session', 400);
}
},
[
'add_branding_option' => 'Add a branding option'
]
);
$this->put('/branding', function () {
// Require the user to be logged in
global $response;
$this->requirePermission('edit_branding_option');
// Get the user object
$user = (new authentication())->get_user();
// Check if the request was successful
if ($user) {
// Check if the required parameters are set
self::requireParameters(['id']);
// Check if the parameters are of the correct type
self::requireType(self::getParameter('id'), self::TYPE_INT());
// Create the object
$branding = new branding_o();
// Select the object
$branding->select(self::getParameter('id'));
if (!$branding->exists()) {
$response->error('Invalid id', 400);
}
$payload = $this->readBrandingPayload();
$this->applyBrandingPayload($branding, $payload);
// Log the incident
(new logs_o())->add('branding', 'global', 1, $user->id, 'EDIT_BRANDING_OPTION', 'User edited a branding option');
// Return the object
$response->success(
$branding->asArray()
);
} else {
// Log the incident
(new logs_o())->add('branding', 'global', 1, 0, 'EDIT_BRANDING_OPTION', 'User tried to edit a branding option without being logged in');
// Return an error
$response->error('Invalid session', 400);
}
},
[
'edit_branding_option' => 'Edit a branding option'
]
);
}
}