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; } }