/** * @param StaticSegment $staticSegment * @param string $segmentStateFilter * @param string $method * @param string $itemState * @param bool $deleteMember * @return array */ public function handleMembersUpdate(StaticSegment $staticSegment, $segmentStateFilter, $method, $itemState, $deleteMember = false) { $itemsToWrite = []; $items = $staticSegment->getSegmentMembers()->filter(function (StaticSegmentMember $segmentMember) use($segmentStateFilter) { return $segmentMember->getState() === $segmentStateFilter; })->toArray(); if (empty($items)) { return []; } $emails = array_map(function (StaticSegmentMember $segmentMember) { return $segmentMember->getMember()->getEmail(); }, $items); $response = $this->transport->{$method}(['id' => $staticSegment->getSubscribersList()->getOriginId(), 'seg_id' => (int) $staticSegment->getOriginId(), 'batch' => array_map(function ($email) { return ['email' => $email]; }, $emails), 'delete_member' => $deleteMember]); $this->handleResponse($response, function ($response, LoggerInterface $logger) use($staticSegment) { $logger->info(sprintf('Segment #%s [origin_id=%s] Members: [%s] add, [%s] error', $staticSegment->getId(), $staticSegment->getOriginId(), $response['success_count'], $response['error_count'])); }); $emailsWithErrors = $this->getArrayData($response, 'errors'); /** @var StaticSegmentMember[]|ArrayCollection $items */ $items = new ArrayCollection($items); $items->filter(function (StaticSegmentMember $segmentMember) use($emailsWithErrors) { return !in_array($segmentMember->getMember()->getEmail(), $emailsWithErrors, true); }); foreach ($items as $item) { $item->setState($itemState); $this->logger->debug(sprintf('Member with id "%s" and email "%s" got "%s" state', $item->getMember()->getOriginId(), $item->getMember()->getEmail(), $itemState)); $itemsToWrite[] = $item; } return $itemsToWrite; }
/** * @param StaticSegment $value * @param UniqueStaticSegmentNameConstraint|Constraint $constraint */ public function validate($value, Constraint $constraint) { if ($value instanceof StaticSegment && !$value->getOriginId()) { $this->transport->init($value->getChannel()->getTransport()); $segments = $this->transport->getListStaticSegments($value->getSubscribersList()); foreach ($segments as $segment) { if ($segment['name'] == $value->getName()) { $this->context->addViolationAt('name', $constraint->message); break; } } } }