/** * {@inheritdoc} */ public function save(array $data, $locale, $userId, $id = null) { $user = $this->userRepository->findUserById($userId); // TODO SECURITY: Only the user which is referenced by the filter should be allowed to // to change the filter - or the administrator if ($id) { $filter = $this->filterRepository->findByIdAndLocale($id, $locale); if (!$filter) { throw new FilterNotFoundException($id); } $filter = new Filter($filter, $locale); } else { $this->checkData($data, true); $filter = new Filter(new FilterEntity(), $locale); $filter->setCreated(new \DateTime()); $filter->setCreator($user); $this->em->persist($filter->getEntity()); } // set direct properties and translation $filter->setChanged(new \DateTime()); $filter->setChanger($user); $filter->setName($this->getProperty($data, 'name', $filter->getName())); if (array_key_exists('context', $data)) { if ($this->hasContext($data['context'])) { $filter->setContext($data['context']); } else { throw new UnknownContextException($data['context']); } } if (array_key_exists('private', $data) && $data['private'] === true) { $filter->setPrivate($data['private']); $filter->setUser($user); } else { $filter->setPrivate(false); $filter->setUser(null); } $filter->setConjunction($this->getProperty($data, 'conjunction', $filter->getConjunction())); $filter->setChanger($user); $filter->setChanged(new \DateTime()); // update condition groups and conditions if (isset($data['conditionGroups'])) { $get = function (ConditionGroupEntity $conditionGroup) { return $conditionGroup->getId(); }; $add = function ($conditionGroupData) use($filter) { return $this->addConditionGroup($filter, $conditionGroupData); }; $delete = function (ConditionGroupEntity $conditionGroup) use($filter) { $this->em->remove($conditionGroup); return true; }; $update = function (ConditionGroupEntity $conditionGroup, $matchedEntry) { return $this->updateConditionGroup($conditionGroup, $matchedEntry); }; $this->processSubEntities($filter->getEntity()->getConditionGroups(), $data['conditionGroups'], $get, $add, $update, $delete); } $this->em->flush(); return $filter; }