/** * Get email entities from owner entity * * @param object $entity * @return array */ public function getEmailsByOwnerEntity($entity) { $ownerColumnName = null; foreach ($this->emailOwnerStorage->getProviders() as $provider) { if ($this->activityListChainProvider->isSupportedTargetEntity($entity) && $provider->getEmailOwnerClass() === ClassUtils::getClass($entity)) { $ownerColumnName = $this->emailOwnerStorage->getEmailOwnerFieldName($provider); break; } } if ($ownerColumnName === null) { return []; } return $this->registry->getRepository('OroEmailBundle:Email')->getEmailsByOwnerEntity($entity, $ownerColumnName); }
/** * @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; }
/** * Constructor. * * @param EmailOwnerProviderStorage $emailOwnerProviderStorage * @param EmailAddressManager $emailAddressManager */ public function __construct(EmailOwnerProviderStorage $emailOwnerProviderStorage, EmailAddressManager $emailAddressManager) { foreach ($emailOwnerProviderStorage->getProviders() as $provider) { $fieldName = $emailOwnerProviderStorage->getEmailOwnerFieldName($provider); $this->emailOwnerClasses[$fieldName] = $provider->getEmailOwnerClass(); } $this->emailAddressManager = $emailAddressManager; }
/** * @param string $emailFromTableAlias EmailAddress table alias of joined Email#fromEmailAddress association * * @return string */ protected function getFromEmailExpression($emailFromTableAlias) { $providers = $this->emailOwnerProviderStorage->getProviders(); if (empty($providers)) { return sprintf('%s.email', $emailFromTableAlias); } $expressionsByOwner = []; foreach ($providers as $provider) { $relationAlias = $this->emailOwnerProviderStorage->getEmailOwnerFieldName($provider); $expressionsByOwner[$relationAlias] = $this->entityNameResolver->getNameDQL($provider->getEmailOwnerClass(), $relationAlias); } $expression = ''; foreach ($expressionsByOwner as $alias => $expressionPart) { $expression .= sprintf('WHEN %s.%s IS NOT NULL THEN %s ', $emailFromTableAlias, $alias, $expressionPart); } $expression = sprintf('CASE %sELSE \'\' END', $expression); // if has owner then use expression to expose formatted name, use email otherwise return sprintf('CONCAT(\'\', CASE WHEN %1$s.hasOwner = true THEN (%2$s) ELSE %1$s.email END) as fromEmailExpression', $emailFromTableAlias, $expression); }
/** * @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; }
/** * Create a proxy class for EmailAddress entity and save it in cache * * @param Filesystem $fs * @param \Twig_Environment $twig */ protected function processEmailAddressTemplate(Filesystem $fs, \Twig_Environment $twig) { // Ensure the cache directory exists if (!$fs->exists($this->entityCacheDir)) { $fs->mkdir($this->entityCacheDir, 0777); } $args = array(); $providers = $this->emailOwnerProviderStorage->getProviders(); foreach ($providers as $provider) { $args[] = array('targetEntity' => $provider->getEmailOwnerClass(), 'columnName' => $this->emailOwnerProviderStorage->getEmailOwnerColumnName($provider), 'fieldName' => $this->emailOwnerProviderStorage->getEmailOwnerFieldName($provider)); } $className = sprintf($this->entityProxyNameTemplate, 'EmailAddress'); $twigParams = array('namespace' => $this->entityCacheNamespace, 'className' => $className, 'owners' => $args); // generate a proxy class $content = $twig->render('EmailAddress.php.twig', $twigParams); $this->writeCacheFile(sprintf('%s%s%s.php', $this->entityCacheDir, DIRECTORY_SEPARATOR, $className), $content); // generate ORM mappings for a proxy class $content = $twig->render('EmailAddress.orm.yml.twig', $twigParams); $this->writeCacheFile(sprintf('%s%s%s.orm.yml', $this->entityCacheDir, DIRECTORY_SEPARATOR, $className), $content); }
/** * @return string */ protected function getUserOwnerFieldName() { return $this->emailOwnerProviderStorage->getEmailOwnerFieldName(ArrayUtil::find(function (EmailOwnerProviderInterface $provider) { return $provider->getEmailOwnerClass() === 'Oro\\Bundle\\UserBundle\\Entity\\User'; }, $this->emailOwnerProviderStorage->getProviders())); }