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.
170 lines
7.1 KiB
PHP
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;
|
|
}
|
|
}
|