/**
  * Gets a list of email addresses which have an owner
  * Email addresses are sorted by modification date; newest at the top
  *
  * @return EmailAddress[]
  */
 protected function getKnownEmailAddresses()
 {
     $this->log->notice('Loading known email addresses ...');
     $repo = $this->emailAddressManager->getEmailAddressRepository($this->em);
     $query = $repo->createQueryBuilder('a')->select('partial a.{id, email, updated}')->where('a.hasOwner = ?1')->orderBy('a.updated', 'DESC')->setParameter(1, true)->getQuery();
     $emailAddresses = $query->getResult();
     $this->log->notice(sprintf('Loaded %d email address(es).', count($emailAddresses)));
     return $emailAddresses;
 }
 /**
  * @param string      $emailAddress
  * @param string|null $ownerClass
  * @param mixed|null  $ownerId
  * @param bool        $excludeCurrentUser
  */
 public function preciseFullEmailAddress(&$emailAddress, $ownerClass = null, $ownerId = null, $excludeCurrentUser = false)
 {
     if (!$this->emailAddressHelper->isFullEmailAddress($emailAddress)) {
         if (!empty($ownerClass) && !empty($ownerId)) {
             $owner = $this->entityRoutingHelper->getEntity($ownerClass, $ownerId);
             if ($owner) {
                 if ($this->doExcludeCurrentUser($excludeCurrentUser, $emailAddress, $owner)) {
                     return;
                 }
                 $ownerName = $this->entityNameResolver->getName($owner);
                 if (!empty($ownerName)) {
                     $emailAddress = $this->emailAddressHelper->buildFullEmailAddress($emailAddress, $ownerName);
                     return;
                 }
             }
         }
         $repo = $this->emailAddressManager->getEmailAddressRepository($this->entityManager);
         $emailAddressObj = $repo->findOneBy(array('email' => $emailAddress));
         if ($emailAddressObj) {
             $owner = $emailAddressObj->getOwner();
             if ($owner) {
                 if ($this->doExcludeCurrentUser($excludeCurrentUser, $emailAddress, $owner)) {
                     return;
                 }
                 $ownerName = $this->entityNameResolver->getName($owner);
                 if (!empty($ownerName)) {
                     $emailAddress = $this->emailAddressHelper->buildFullEmailAddress($emailAddress, $ownerName);
                 }
             }
         }
     }
 }
 /**
  * @param string[] $emailsToLoad
  *
  * @return array
  *  key   = email address
  *  value = array
  *      known => true/false
  *          false if the address belongs to user only
  *          true if the address belongs to not excluded owners
  *      user  => user id
  */
 protected function getKnownEmailAddresses(array $emailsToLoad)
 {
     $repo = $this->emailAddressManager->getEmailAddressRepository($this->em);
     $qb = $repo->createQueryBuilder('a')->where('a.hasOwner = :hasOwner AND a.email IN (:emails)')->setParameter('hasOwner', true)->setParameter('emails', $emailsToLoad);
     $select = 'a.email';
     $userIdField = null;
     $mailboxIdField = null;
     $ownerIdFields = [];
     foreach ($this->emailOwnerProviderStorage->getProviders() as $provider) {
         $ownerClass = $provider->getEmailOwnerClass();
         $isUser = $ownerClass === 'Oro\\Bundle\\UserBundle\\Entity\\User';
         $isMailbox = $ownerClass === 'Oro\\Bundle\\EmailBundle\\Entity\\Mailbox';
         $field = $this->emailOwnerProviderStorage->getEmailOwnerFieldName($provider);
         if ($isUser) {
             $userIdField = $field;
         }
         if ($isMailbox) {
             $mailboxIdField = $field;
         }
         if (isset($this->exclusions[$ownerClass])) {
             if ($isUser) {
                 $select .= sprintf(',IDENTITY(a.%1$s) AS %1$s', $field);
             } else {
                 $qb->andWhere(sprintf('a.%s IS NULL', $field));
             }
         } else {
             $select .= sprintf(',IDENTITY(a.%1$s) AS %1$s', $field);
             $ownerIdFields[] = $field;
         }
     }
     $qb->select($select);
     $data = $qb->getQuery()->getArrayResult();
     $result = $this->prepareKnownEmailAddressesData($data, $ownerIdFields, $userIdField, $mailboxIdField);
     return $result;
 }
 /**
  * @param array         $bindings
  * @param EntityManager $em
  */
 protected function persistBindings(array &$bindings, EntityManager $em)
 {
     $repository = $this->emailAddressManager->getEmailAddressRepository($em);
     foreach ($bindings['changes'] as $item) {
         $email = $item['email'];
         $owner = false === $item['owner'] ? null : $item['owner'];
         $emailAddress = $repository->findOneBy(['email' => $email]);
         if ($emailAddress === null) {
             $emailAddress = $this->emailAddressManager->newEmailAddress()->setEmail($email)->setOwner($owner);
             $em->persist($emailAddress);
             $this->computeEntityChangeSet($em, $emailAddress);
         } elseif ($emailAddress->getOwner() !== $owner) {
             $emailAddress->setOwner($owner);
             $this->computeEntityChangeSet($em, $emailAddress);
         }
     }
     foreach ($bindings['deletions'] as $owner) {
         foreach ($this->emailOwnerClasses as $fieldName => $ownerClass) {
             if (is_a($owner, $ownerClass)) {
                 $condition = array($fieldName => $owner);
                 /** @var EmailAddress[] $emailAddresses */
                 $emailAddresses = $repository->findBy($condition);
                 foreach ($emailAddresses as $emailAddress) {
                     $emailAddress->setOwner(null);
                     $this->computeEntityChangeSet($em, $emailAddress);
                 }
             }
         }
     }
 }
Beispiel #5
0
 /**
  * @param string      $emailAddress
  * @param string|null $ownerClass
  * @param mixed|null  $ownerId
  */
 protected function preciseFullEmailAddress(&$emailAddress, $ownerClass = null, $ownerId = null)
 {
     if (!$this->emailAddressHelper->isFullEmailAddress($emailAddress)) {
         if (!empty($ownerClass) && !empty($ownerId)) {
             $owner = $this->entityRoutingHelper->getEntity($ownerClass, $ownerId);
             if ($owner) {
                 $ownerName = $this->nameFormatter->format($owner);
                 if (!empty($ownerName)) {
                     $emailAddress = $this->emailAddressHelper->buildFullEmailAddress($emailAddress, $ownerName);
                     return;
                 }
             }
         }
         $repo = $this->emailAddressManager->getEmailAddressRepository($this->em);
         $emailAddressObj = $repo->findOneBy(array('email' => $emailAddress));
         if ($emailAddressObj) {
             $owner = $emailAddressObj->getOwner();
             if ($owner) {
                 $ownerName = $this->nameFormatter->format($owner);
                 if (!empty($ownerName)) {
                     $emailAddress = $this->emailAddressHelper->buildFullEmailAddress($emailAddress, $ownerName);
                 }
             }
         }
     }
 }
Beispiel #6
0
 /**
  * @param EntityManager $em
  *
  * @return EntityRepository
  */
 protected function getEmailAddressRepository(EntityManager $em)
 {
     if (null === $this->emailAddressRepository) {
         $this->emailAddressRepository = $this->emailAddressManager->getEmailAddressRepository($em);
     }
     return $this->emailAddressRepository;
 }
 /**
  * @param array $emailOwnerChanges
  *
  * @return EmailAddress[]
  */
 protected function updateEmailAddresses(array $emailOwnerChanges, array $emailOwnerDeletions)
 {
     $updatedEmailAddresses = [];
     foreach ($emailOwnerChanges as $item) {
         $email = $item['email'];
         $newOwner = false === $item['owner'] ? null : $item['owner'];
         $emailAddress = $this->emailAddressManager->getEmailAddressRepository()->findOneBy(['email' => $email]);
         if ($emailAddress === null) {
             $emailAddress = $this->emailAddressManager->newEmailAddress()->setEmail($email)->setOwner($newOwner);
             $this->emailAddressManager->getEntityManager()->persist($emailAddress);
             $updatedEmailAddresses[] = $emailAddress;
         } elseif ($emailAddress->getOwner() !== $newOwner) {
             $emailAddress->setOwner($newOwner);
             $updatedEmailAddresses[] = $emailAddress;
         }
     }
     foreach ($emailOwnerDeletions as $owner) {
         foreach ($this->emailOwnerClasses as $fieldName => $ownerClass) {
             if (is_a($owner, $ownerClass)) {
                 $condition = array($fieldName => $owner);
                 /* @var $emailAddresses EmailAddress[] */
                 $emailAddresses = $this->emailAddressManager->getEmailAddressRepository()->findBy($condition);
                 foreach ($emailAddresses as $emailAddress) {
                     $emailAddress->setOwner(null);
                     $updatedEmailAddresses[] = $emailAddress;
                 }
             }
         }
     }
     return $updatedEmailAddresses;
 }
 public function testGetEmailAddressRepository()
 {
     $manager = new EmailAddressManager('Oro\\Bundle\\EmailBundle\\Tests\\Unit\\Entity\\TestFixtures', 'Test%sProxy');
     $repo = $this->getMockBuilder('Doctrine\\ORM\\EntityRepository')->disableOriginalConstructor()->getMock();
     $em = $this->getMockBuilder('Doctrine\\ORM\\EntityManager')->disableOriginalConstructor()->getMock();
     $em->expects($this->once())->method('getRepository')->with($this->equalTo('Oro\\Bundle\\EmailBundle\\Tests\\Unit\\Entity\\TestFixtures\\TestEmailAddressProxy'))->will($this->returnValue($repo));
     $this->assertTrue($repo === $manager->getEmailAddressRepository($em));
 }
 /**
  * @param string $emailAddress
  * @return string
  */
 protected function preciseFullEmailAddress(&$emailAddress)
 {
     if (!EmailUtil::isFullEmailAddress($emailAddress)) {
         $repo = $this->emailAddressManager->getEmailAddressRepository($this->em);
         $emailAddressObj = $repo->findOneBy(array('email' => $emailAddress));
         if ($emailAddressObj) {
             $owner = $emailAddressObj->getOwner();
             if ($owner) {
                 $emailAddress = EmailUtil::buildFullEmailAddress($emailAddress, $this->nameFormatter->format($owner));
             }
         }
     }
 }
 /**
  * @param string[] $emailsToLoad
  *
  * @return array
  *  key   = email address
  *  value = array
  *      known => true/false
  *          false if the address belongs to user only
  *          true if the address belongs to not excluded owners
  *      user  => user id
  */
 protected function getKnownEmailAddresses(array $emailsToLoad)
 {
     $repo = $this->emailAddressManager->getEmailAddressRepository($this->em);
     $qb = $repo->createQueryBuilder('a')->where('a.hasOwner = :hasOwner AND a.email IN (:emails)')->setParameter('hasOwner', true)->setParameter('emails', $emailsToLoad);
     $select = 'a.email';
     $userIdField = null;
     $mailboxIdField = null;
     $ownerIdFields = [];
     foreach ($this->emailOwnerProviderStorage->getProviders() as $provider) {
         $ownerClass = $provider->getEmailOwnerClass();
         $isUser = $ownerClass === 'Oro\\Bundle\\UserBundle\\Entity\\User';
         $isMailbox = $ownerClass === 'Oro\\Bundle\\EmailBundle\\Entity\\Mailbox';
         $field = $this->emailOwnerProviderStorage->getEmailOwnerFieldName($provider);
         if ($isUser) {
             $userIdField = $field;
         }
         if ($isMailbox) {
             $mailboxIdField = $field;
         }
         if (isset($this->exclusions[$ownerClass])) {
             if ($isUser) {
                 $select .= sprintf(',IDENTITY(a.%1$s) AS %1$s', $field);
             } else {
                 $qb->andWhere(sprintf('a.%s IS NULL', $field));
             }
         } else {
             $select .= sprintf(',IDENTITY(a.%1$s) AS %1$s', $field);
             $ownerIdFields[] = $field;
         }
     }
     $qb->select($select);
     $result = [];
     $data = $qb->getQuery()->getArrayResult();
     foreach ($data as $item) {
         $known = false;
         foreach ($ownerIdFields as $field) {
             if ($item[$field] !== null) {
                 $known = true;
                 break;
             }
         }
         $email = strtolower($item['email']);
         $userId = $item[$userIdField];
         $mailboxId = $item[$mailboxIdField];
         $result[$email] = $userId === null ? ['known' => $known] : ['known' => $known, 'user' => (int) $userId];
         if ($mailboxId !== null) {
             $result[$email]['mailbox'] = $mailboxId;
         }
     }
     return $result;
 }
 /**
  * Tell the given EntityManager to manage EmailAddress objects in this batch
  *
  * @param EntityManager $em
  */
 protected function persistAddresses(EntityManager $em)
 {
     $repository = $this->emailAddressManager->getEmailAddressRepository($em);
     foreach ($this->addresses as $key => $obj) {
         /** @var EmailAddress $dbObj */
         $dbObj = $repository->findOneBy(['email' => $obj->getEmail()]);
         if ($dbObj === null) {
             $obj->setOwner($this->emailOwnerProvider->findEmailOwner($em, $obj->getEmail()));
             $em->persist($obj);
         } else {
             $this->updateAddressReferences($obj, $dbObj);
             $this->addresses[$key] = $dbObj;
         }
     }
 }
 /**
  * Unbind EmailAddress entity from the given owner
  *
  * @param EntityManager $em
  * @param EmailOwnerInterface $owner
  * @param EmailInterface $email
  */
 protected function unbindEmailAddress(EntityManager $em, EmailOwnerInterface $owner, EmailInterface $email = null)
 {
     $repository = $this->emailAddressManager->getEmailAddressRepository($em);
     foreach ($this->emailOwnerClasses as $fieldName => $emailOwnerClass) {
         $condition = array($fieldName => $owner);
         if ($email !== null) {
             $condition['email'] = $email->getEmail();
         }
         /** @var EmailAddress $emailAddress */
         foreach ($repository->findBy($condition) as $emailAddress) {
             $emailAddress->setOwner(null);
             $this->computeEntityChangeSet($em, $emailAddress);
         }
     }
 }
 /**
  * Loads the given emails into $this->knownEmailAddresses
  *
  * @param string[] $emailsToLoad
  */
 protected function loadKnownEmailAddresses(array $emailsToLoad)
 {
     $this->log->notice(sprintf('Loading email address(es) "%s" ...', implode(',', $emailsToLoad)));
     $repo = $this->emailAddressManager->getEmailAddressRepository($this->em);
     $query = $repo->createQueryBuilder('a')->select('a.email')->where('a.hasOwner = ?1 AND a.email IN (?2)')->setParameter(1, true)->setParameter(2, $emailsToLoad)->getQuery();
     $query->setHydrationMode(Query::HYDRATE_ARRAY);
     $emails = $query->getResult();
     $loadedEmailCount = count($emails);
     foreach ($emails as $item) {
         $email = strtolower($item['email']);
         $this->knownEmailAddresses[$email] = 1;
         // known
         unset($emailsToLoad[$email]);
     }
     foreach ($emailsToLoad as $email) {
         $this->knownEmailAddresses[$email] = -1;
         // unknown
     }
     $this->log->notice(sprintf('Loaded %d email address(es).', $loadedEmailCount));
 }