Files
api/services/nginx/app/routes/customerDefaultDriverTemplateRoute.php
T
bugfix-subagent 5802aad3e4 feat(TRU-89): customer default driver template endpoint
Adds the new /customer/default-driver-template CRUD endpoint so the
kundeportal 'tilladelser' tab can store and read the customer's
preferred default driver access template. The endpoint reuses the
existing subuser_permission_templates_service for validation and
falls back to the caller's own customer number when the customer_number
parameter is omitted.
2026-08-17 18:01:53 +00:00

170 lines
7.1 KiB
PHP

<?php
namespace routes;
use classes\authentication;
use classes\subuser_permission_templates_service;
use objects\customer_default_driver_template_o;
use objects\logs_o;
use objects\users_o;
use traits\route_t;
class customerDefaultDriverTemplateRoute
{
use route_t;
public function run(): void
{
$this->get('/customer/default-driver-template', function () {
global $response;
$this->requirePermission('get_customer_default_driver_template');
$user = (new authentication())->get_user();
$subuser = (new authentication())->get_subuser();
$customer_number = $this->resolveCustomerNumberForRead($user, $subuser);
$templateKey = (new customer_default_driver_template_o())->getDefaultTemplate((int)$customer_number);
if ($templateKey === null) {
$response->success([
'customer_number' => (int)$customer_number,
'template_key' => null,
]);
return;
}
$response->success([
'customer_number' => (int)$customer_number,
'template_key' => $templateKey,
]);
}, [
'get_customer_default_driver_template' => 'Get the default driver access template for a customer (own or, with extended permission, other customers).',
]);
$this->put('/customer/default-driver-template', function () {
global $response;
$this->requirePermission('edit_customer_default_driver_template');
$user = (new authentication())->get_user();
$subuser = (new authentication())->get_subuser();
$customer_number = $this->resolveCustomerNumberForWrite($user, $subuser);
self::requireParameters(['template_key']);
$templateKey = (string)self::getParameter('template_key');
self::requireType($templateKey, self::type_string());
self::requireMinLength('template_key', 1);
self::requireMaxLength('template_key', 64);
$service = new subuser_permission_templates_service();
$normalized = $service->normalizeTemplateKey($templateKey);
if ($normalized === null || $normalized === subuser_permission_templates_service::TEMPLATE_CUSTOM) {
$response->error('Unknown driver access template.', 400);
}
$customer = (new users_o())->getUserByCustomerNumber((int)$customer_number);
if (!$customer->exists()) {
$response->error('Customer not found', 400);
}
$templateObject = new customer_default_driver_template_o();
$templateObject->update((int)$customer_number, $normalized);
$actor_id = $user !== false ? (int)$user->id : ($subuser !== false ? (int)$subuser->id : 0);
(new logs_o())->add('customer_default_driver_template', 'global', 1, $actor_id, 'UPDATE_CUSTOMER_DEFAULT_DRIVER_TEMPLATE', 'Default driver template set to ' . $normalized);
$response->success($templateObject->asArray());
}, [
'edit_customer_default_driver_template' => 'Edit the default driver access template for a customer (own or, with extended permission, other customers).',
]);
$this->delete('/customer/default-driver-template', function () {
global $response;
$this->requirePermission('delete_customer_default_driver_template');
$user = (new authentication())->get_user();
$subuser = (new authentication())->get_subuser();
$customer_number = $this->resolveCustomerNumberForWrite($user, $subuser);
$templateObject = new customer_default_driver_template_o();
if (!$templateObject->doesUserHaveDefaultTemplate((int)$customer_number)) {
$response->error('This customer does not have a default driver template', 400);
}
$templateObject->selectByCustomerNumber((int)$customer_number);
$templateObject->delete();
$actor_id = $user !== false ? (int)$user->id : ($subuser !== false ? (int)$subuser->id : 0);
(new logs_o())->add('customer_default_driver_template', 'global', 1, $actor_id, 'DELETE_CUSTOMER_DEFAULT_DRIVER_TEMPLATE', 'Default driver template removed');
$response->success('Default driver template deleted');
}, [
'delete_customer_default_driver_template' => 'Delete the default driver access template for a customer (own or, with extended permission, other customers).',
]);
}
/**
* @param users_o|false $user
* @param \objects\subusers_o|false $subuser
*/
private function resolveCustomerNumberForRead($user, $subuser): int
{
global $response;
$customer_number = $this->customerNumberFromRequest();
if ($subuser !== false) {
$subuserCustomer = (int)$subuser->customer_number_target->value();
if ($subuserCustomer <= 0 || $subuserCustomer !== $customer_number) {
$response->error('Unauthorized', 401);
}
return $customer_number;
}
if ($user === false) {
$response->error('Invalid session', 400);
}
if ((int)$user->customer_number->value() !== $customer_number) {
$this->requirePermission('get_customer_default_driver_template_other');
}
return $customer_number;
}
/**
* @param users_o|false $user
* @param \objects\subusers_o|false $subuser
*/
private function resolveCustomerNumberForWrite($user, $subuser): int
{
global $response;
$customer_number = $this->customerNumberFromRequest();
if ($subuser !== false) {
$subuserCustomer = (int)$subuser->customer_number_target->value();
if ($subuserCustomer <= 0 || $subuserCustomer !== $customer_number) {
$response->error('Unauthorized', 401);
}
return $customer_number;
}
if ($user === false) {
$response->error('Invalid session', 400);
}
if ((int)$user->customer_number->value() !== $customer_number) {
$this->requirePermission('edit_customer_default_driver_template_other');
}
return $customer_number;
}
private function customerNumberFromRequest(): int
{
global $response;
if (self::isParametersSet(['customer_number'])) {
self::requireParameters(['customer_number']);
$customer_number = (int)self::getParameter('customer_number');
} else {
$auth = new authentication();
$user = $auth->get_user();
$subuser = $auth->get_subuser();
if ($user !== false) {
$customer_number = (int)$user->customer_number->value();
} elseif ($subuser !== false) {
$customer_number = (int)$subuser->customer_number_target->value();
} else {
$response->error('Invalid session', 400);
}
}
if ($customer_number <= 0) {
$response->error('Invalid customer number', 400);
}
return $customer_number;
}
}