/** * @Remote * * @param array $params */ public function listWithFiltersAction(array $params) { try { $filterId = null; $filterValue = null; if (isset($params['filter'])) { foreach ($params['filter'] as $filter) { if ('__filter__' == $filter['property']) { $parts = explode('-', $filter['value'], 2); $filterId = $parts[0]; if (isset($parts[1])) { $filterValue = $parts[1]; } break; } } if ($filterValue) { $params['filter'] = [[array('property' => 'tokenName', 'value' => 'like:%' . $filterValue . '%'), array('property' => 'languageTranslationTokens.translation', 'value' => 'like:%' . $filterValue . '%')]]; } else { $params['filter'] = null; } } if (!$filterId) { $e = new BadRequestException('"/filter" request parameter is not provided'); $e->setPath('/'); $e->setParams($params); throw $e; } /* @var FiltersProvider $filtersProvider */ $filtersProvider = $this->get('modera_backend_translations_tool.filters_provider'); $filter = null; $filters = $filtersProvider->getItems(); foreach ($filters['translation_token'] as $iteratedFilter) { /* @var FilterInterface $iteratedFilter */ if ($iteratedFilter->getId() == $filterId && $iteratedFilter->isAllowed()) { $filter = $iteratedFilter; break; } } if (!$filter) { throw new \RuntimeException(sprintf('Filter with given parameter "%s" not found', $filterId)); } $result = $filter->getResult($params); $hydratedItems = []; foreach ($result['items'] as $entity) { $hydratedItems[] = $this->hydrate($entity, $params); } $result['items'] = $hydratedItems; return $result; } catch (\Exception $e) { return $this->createExceptionResponse($e, ExceptionHandlerInterface::OPERATION_LIST); } }
/** * @Remote */ public function batchUpdateAction(array $params) { $config = $this->getPreparedConfig(); try { $persistenceHandler = $config['batch_update_entities_handler']; $dataMapper = $config['map_data_on_update']; $validator = $config['updated_entity_validator']; $this->interceptAction('batchUpdate', $params); if (isset($params['queries']) && is_array($params['queries']) && isset($params['record']) && is_array($params['record'])) { if (!isset($params['record'])) { $e = new BadRequestException("'/record' hasn't been provided"); $e->setParams($params); $e->setPath('/record'); throw $e; } $entities = array(); foreach ($params['queries'] as $query) { $entities = array_merge($entities, $this->getPersistenceHandler()->query($config['entity'], $query)); } $errors = array(); $operationResult = null; foreach ($entities as $entity) { $dataMapper($params['record'], $entity, $this->getDataMapper(), $this->container); if ($validator) { /* @var ValidationResult $validationResult */ $validationResult = $validator($params, $entity, $this->getEntityValidator(), $config, $this->container); if ($validationResult->hasErrors()) { $pkFields = $this->getPersistenceHandler()->resolveEntityPrimaryKeyFields($config['entity']); $ids = array(); foreach ($pkFields as $fieldName) { $ids[$fieldName] = Toolkit::getPropertyValue($entity, $fieldName); } $errors[] = array('id' => $ids, 'errors' => $validationResult->toArray()); } } } if (count($errors) == 0) { $operationResult = $persistenceHandler($entities, $params, $this->getPersistenceHandler(), $this->container); return array_merge($operationResult->toArray($this->getModelManager()), array('success' => true)); } else { return array('success' => false, 'errors' => $errors); } } elseif (isset($params['records']) && is_array($params['records'])) { $entities = array(); $errors = array(); foreach ($params['records'] as $recordParams) { $missingPkFields = array(); $query = array(); foreach ($this->getPersistenceHandler()->resolveEntityPrimaryKeyFields($config['entity']) as $fieldName) { if (isset($recordParams[$fieldName])) { $query[] = array('property' => $fieldName, 'value' => 'eq:' . $recordParams[$fieldName]); } else { $missingPkFields[] = $fieldName; } } if (count($missingPkFields) == 0) { $entity = $this->getPersistenceHandler()->query($config['entity'], array('filter' => $query)); $this->validateResultHasExactlyOneEntity($entity, $params); $entity = $entity[0]; $entities[] = $entity; $dataMapper($recordParams, $entity, $this->getDataMapper(), $this->container); if ($validator) { /* @var ValidationResult $validationResult */ $validationResult = $validator($params, $entity, $this->getEntityValidator(), $config, $this->container); if ($validationResult->hasErrors()) { $pkFields = $this->getPersistenceHandler()->resolveEntityPrimaryKeyFields($config['entity']); $ids = array(); foreach ($pkFields as $fieldName) { $ids[$fieldName] = Toolkit::getPropertyValue($entity, $fieldName); } $errors[] = array('id' => $ids, 'errors' => $validationResult->toArray()); } } } } if (count($errors) == 0) { $operationResult = $persistenceHandler($entities, $params, $this->getPersistenceHandler(), $this->container); return array_merge($operationResult->toArray($this->getModelManager()), array('success' => true)); } else { return array('success' => false, 'errors' => $errors); } } else { $e = new BadRequestException("Invalid request structure. Valid request would either contain 'queries' and 'record' or 'records' keys."); $e->setPath($params); $e->setPath('/'); throw $e; } } catch (\Exception $e) { return $this->createExceptionResponse($e, ExceptionHandlerInterface::OPERATION_UPDATE); } }