subscriptionChangeRepository = $subscriptionChangeRepository; $this->subscriptionChangeWriter = $subscriptionChangeWriter; $this->subscriptionChangeRequestParser = $subscriptionChangeRequestParser; } public function saveSubscriptionChanges(array $urlsSubscribed, array $urlsUnsubscribed, string $userId): void { $subscriptionChanges = $this->subscriptionChangeRequestParser->createSubscriptionChangeList($urlsSubscribed, $urlsUnsubscribed); foreach ($subscriptionChanges as $urlChangedSubscriptionStatus) { $subscriptionChangeEntity = new SubscriptionChangeEntity(); $subscriptionChangeEntity->setUrl($urlChangedSubscriptionStatus->getUrl()); $subscriptionChangeEntity->setSubscribed($urlChangedSubscriptionStatus->isSubscribed()); $subscriptionChangeEntity->setUpdated((new \DateTime())->format("Y-m-d\TH:i:s")); $subscriptionChangeEntity->setUserId($userId); try { $this->subscriptionChangeWriter->create($subscriptionChangeEntity); } catch (UniqueConstraintViolationException $uniqueConstraintViolationException) { $this->updateSubscription($subscriptionChangeEntity, $userId); } catch (Exception $exception) { if ($exception->getReason() === Exception::REASON_UNIQUE_CONSTRAINT_VIOLATION) { $this->updateSubscription($subscriptionChangeEntity, $userId); } } } } /** * @param SubscriptionChangeEntity $subscriptionChangeEntity * @param string $userId * * @return void */ private function updateSubscription(SubscriptionChangeEntity $subscriptionChangeEntity, string $userId): void { $idEpisodeActionEntityToUpdate = $this->subscriptionChangeRepository->findByUrl($subscriptionChangeEntity->getUrl(), $userId)->getId(); $subscriptionChangeEntity->setId($idEpisodeActionEntityToUpdate); $this->subscriptionChangeWriter->update($subscriptionChangeEntity); } }