getEntityType(); $id = $params->getId(); if (!$this->acl->checkScope($entityType, Acl\Table::ACTION_EDIT)) { throw new Forbidden(); } $this->checkFieldAccess($entityType); $baseCurrency = $this->configDataProvider->getBaseCurrency(); $targetCurrency = $data->get('targetCurrency'); if (!$targetCurrency) { throw new BadRequest("No target currency."); } $rates = $this->getRatesFromData($data) ?? $this->configDataProvider->getCurrencyRates(); if ($targetCurrency !== $baseCurrency && !$rates->hasRate($targetCurrency)) { throw new BadRequest("Target currency rate is not specified."); } $entity = $this->entityManager->getEntityById($entityType, $id); if (!$entity) { throw new NotFound(); } if (!$this->acl->checkEntityEdit($entity)) { throw new Forbidden("No 'edit' access."); } if (!$entity instanceof CoreEntity) { throw new RuntimeException("Only Core-Entity allowed."); } $converter = $this->converterFactory->create($entityType); $converter->convert($entity, $targetCurrency, $rates); $this->entityManager->saveEntity($entity, [SaveOption::MODIFIED_BY_ID => $this->user->getId()]); } private function getRatesFromData(Data $data): ?CurrencyRates { if ($data->get('rates') === null) { return null; } $baseCurrency = $this->configDataProvider->getBaseCurrency(); $ratesArray = get_object_vars($data->get('rates')); $ratesArray[$baseCurrency] = 1.0; return CurrencyRates::fromAssoc($ratesArray, $baseCurrency); } /** * @throws Forbidden */ private function checkFieldAccess(string $entityType): void { /** @var string[] $requiredFieldList */ $requiredFieldList = $this->metadata->get(['scopes', $entityType, 'currencyConversionAccessRequiredFieldList']); if ($requiredFieldList === null) { return; } foreach ($requiredFieldList as $field) { if (!$this->acl->checkField($entityType, $field, Table::ACTION_EDIT)) { throw new Forbidden("No edit access to field `$field`."); } } } }