/** * @dataProvider emailProvider */ public function testGetRecipientsShouldReturnRecipients(EmailRecipientsProviderArgs $args, array $senderEmails, array $resultEmails, array $expectedResult) { $user = new User(); $this->securityFacade->expects($this->once())->method('getLoggedUser')->will($this->returnValue($user)); $this->relatedEmailsProvider->expects($this->once())->method('getEmails')->with($user)->will($this->returnValue($senderEmails)); $qb = $this->getMockBuilder('Doctrine\\ORM\\QueryBuilder')->disableOriginalConstructor()->getMock(); $qb->expects($this->once())->method('setMaxResults')->with($args->getLimit())->will($this->returnSelf()); $emailRecipientRepository = $this->getMockBuilder('Oro\\Bundle\\EmailBundle\\Entity\\Repository\\EmailRecipientRepository')->disableOriginalConstructor()->getMock(); $emailRecipientRepository->expects($this->once())->method('getEmailsUsedInLast30DaysQb')->with(array_keys($senderEmails), [], $args->getQuery())->will($this->returnValue($qb)); $query = $this->getMockBuilder('Doctrine\\ORM\\AbstractQuery')->disableOriginalConstructor()->setMethods(['getResult'])->getMockForAbstractClass(); $query->expects($this->once())->method('getResult')->will($this->returnValue($resultEmails)); $this->aclHelper->expects($this->once())->method('apply')->with($qb)->will($this->returnValue($query)); $this->registry->expects($this->once())->method('getRepository')->with('OroEmailBundle:EmailRecipient')->will($this->returnValue($emailRecipientRepository)); $this->emailRecipientsHelper->expects($this->any())->method('isObjectAllowed')->will($this->returnValue(true)); $this->assertEquals($expectedResult, $this->emailRecipientsProvider->getRecipients($args)); }
/** * {@inheritdoc} */ public function getRecipients(EmailRecipientsProviderArgs $args) { if (null === ($user = $this->securityFacade->getLoggedUser())) { return []; } $userEmailAddresses = array_keys($this->relatedEmailsProvider->getEmails($user, 1, true)); $recipientsQb = $this->getEmailRecipientRepository()->getEmailsUsedInLast30DaysQb($userEmailAddresses, [], $args->getQuery())->setMaxResults($args->getLimit()); $emails = $this->emailsFromResult($this->aclHelper->apply($recipientsQb)->getResult()); $result = []; foreach ($emails as $email => $name) { $owner = $this->emailOwnerProvider->findEmailOwner($this->registry->getManager(), $email); if (!$this->emailRecipientsHelper->isObjectAllowed($args, $owner)) { continue; } $result[] = new Recipient($email, $name, $this->createRecipientEntity($owner)); } return $result; }
/** * {@inheritdoc} */ public function getRecipients(EmailRecipientsProviderArgs $args) { if (!$args->getRelatedEntity()) { return []; } $relatedEntity = $args->getRelatedEntity(); $relatedEntityClass = ClassUtils::getClass($relatedEntity); $em = $this->registry->getManagerForClass($relatedEntityClass); $metadata = $em->getClassMetadata($relatedEntityClass); $idNames = $metadata->getIdentifierFieldNames(); if (count($idNames) !== 1) { return []; } $propertyAccessor = PropertyAccess::createPropertyAccessor(); $relatedEntityId = $propertyAccessor->getValue($relatedEntity, $idNames[0]); $recipients = []; $activities = $this->activityManager->getActivities($relatedEntityClass); $activityListQb = $this->createActivityListQb($relatedEntityClass, $relatedEntityId); $activityListDql = $activityListQb->getQuery()->getDQL(); $limit = $args->getLimit(); $activityKeys = array_keys($activities); foreach ($activityKeys as $class) { $qb = $this->getRepository($class)->createQueryBuilder('e'); $qb->andWhere($qb->expr()->exists($activityListDql))->setParameter('related_activity_class', $class); foreach ($activityListQb->getParameters() as $param) { $qb->setParameter($param->getName(), $param->getValue(), $param->getType()); } $iterator = new BufferedQueryResultIterator($qb); $iterator->setBufferSize($limit); foreach ($iterator as $entity) { $recipients = array_merge($recipients, EmailRecipientsHelper::filterRecipients($args, $this->relatedEmailsProvider->getRecipients($entity, 2, false, $args->getOrganization()))); $limit -= count($recipients); if ($limit <= 0) { break 2; } } } return $recipients; }
/** * @param EmailRecipientsProviderArgs $args * @param EmailAwareRepository $repository * @param string $alias * @param string $entityClass * * @return Recipient[] */ public function getRecipients(EmailRecipientsProviderArgs $args, EmailAwareRepository $repository, $alias, $entityClass) { $fullNameQueryPart = $this->dqlNameFormatter->getFormattedNameDQL($alias, $entityClass); $excludedEmailNames = $args->getExcludedEmailNamesForEntity($entityClass); $primaryEmailsQb = $repository->getPrimaryEmailsQb($fullNameQueryPart, $excludedEmailNames, $args->getQuery())->setMaxResults($args->getLimit()); $primaryEmailsResult = $this->getRestrictedResult($primaryEmailsQb, $args); $recipients = $this->recipientsFromResult($primaryEmailsResult, $entityClass); $limit = $args->getLimit() - count($recipients); if ($limit > 0) { $excludedEmailNames = array_merge($excludedEmailNames, array_map(function (Recipient $recipient) { return $recipient->getBasicNameWithOrganization(); }, $recipients)); $secondaryEmailsQb = $repository->getSecondaryEmailsQb($fullNameQueryPart, $excludedEmailNames, $args->getQuery())->setMaxResults($limit); $secondaryEmailsResult = $this->getRestrictedResult($secondaryEmailsQb, $args); $recipients = array_merge($recipients, $this->recipientsFromResult($secondaryEmailsResult, $entityClass)); } return $recipients; }