Skip to content

Commit 212bef6

Browse files
committed
Load lead companies and tags if needed in ContactFilterMatcher
1 parent 8d6882c commit 212bef6

File tree

5 files changed

+66
-79
lines changed

5 files changed

+66
-79
lines changed

Config/config.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -838,7 +838,6 @@
838838
'arguments' => [
839839
'custom_object.query.filter.factory',
840840
'custom_object.config.provider',
841-
'mautic.lead.repository.company',
842841
'custom_object.helper.contact_filter_matcher',
843842
],
844843
],
@@ -1183,6 +1182,8 @@
11831182
'mautic.custom.model.object',
11841183
'mautic.custom.model.item',
11851184
'mautic.lead.repository.lead_list',
1185+
'mautic.lead.repository.company',
1186+
'doctrine.dbal.default_connection',
11861187
'%mautic.custom_item_fetch_limit_per_lead%',
11871188
],
11881189
],

EventListener/DynamicContentSubscriber.php

Lines changed: 4 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@
66

77
use Mautic\DynamicContentBundle\DynamicContentEvents;
88
use Mautic\DynamicContentBundle\Event\ContactFiltersEvaluateEvent;
9-
use Mautic\LeadBundle\Entity\CompanyRepository;
10-
use Mautic\LeadBundle\Entity\Lead;
11-
use Mautic\LeadBundle\Entity\Tag;
129
use MauticPlugin\CustomObjectsBundle\Exception\InvalidSegmentFilterException;
1310
use MauticPlugin\CustomObjectsBundle\Helper\ContactFilterMatcher;
1411
use MauticPlugin\CustomObjectsBundle\Provider\ConfigProvider;
@@ -19,18 +16,15 @@ class DynamicContentSubscriber implements EventSubscriberInterface
1916
{
2017
private QueryFilterFactory $queryFilterFactory;
2118
private ConfigProvider $configProvider;
22-
private CompanyRepository $companyRepository;
2319
private ContactFilterMatcher $contactFilterMatcher;
2420

2521
public function __construct(
2622
QueryFilterFactory $queryFilterFactory,
2723
ConfigProvider $configProvider,
28-
CompanyRepository $companyRepository,
2924
ContactFilterMatcher $contactFilterMatcher
3025
) {
3126
$this->queryFilterFactory = $queryFilterFactory;
3227
$this->configProvider = $configProvider;
33-
$this->companyRepository = $companyRepository;
3428
$this->contactFilterMatcher = $contactFilterMatcher;
3529
}
3630

@@ -55,7 +49,10 @@ public function evaluateFilters(ContactFiltersEvaluateEvent $event): void
5549

5650
$event->setIsEvaluated(true);
5751
$event->stopPropagation();
58-
$event->setIsMatched($this->doFiltersMatch($event->getFilters(), $event->getContact()));
52+
$event->setIsMatched($this->contactFilterMatcher->match(
53+
$event->getFilters(),
54+
$event->getContact()->getProfileFields()
55+
));
5956
}
6057

6158
/**
@@ -74,67 +71,4 @@ private function hasCustomObjectFilters(array $filters): bool
7471

7572
return false;
7673
}
77-
78-
/**
79-
* @param mixed[] $filters
80-
*/
81-
private function doFiltersMatch(array $filters, Lead $contact): bool
82-
{
83-
$lead = $contact->getProfileFields();
84-
85-
if ($this->doFiltersContainCompanyFilter($filters)) {
86-
$lead['companies'] = $this->companyRepository->getCompaniesByLeadId($contact->getId());
87-
}
88-
89-
if ($this->doFiltersContainTagsFilter($filters)) {
90-
$lead = $this->mergeInTags($contact, $lead);
91-
}
92-
93-
return $this->contactFilterMatcher->match($filters, $lead);
94-
}
95-
96-
/**
97-
* @param mixed[] $lead
98-
*
99-
* @return mixed[]
100-
*/
101-
private function mergeInTags(Lead $contact, array $lead): array
102-
{
103-
return array_merge($lead, [
104-
'tags' => array_map(
105-
function (Tag $v) {
106-
return $v->getId();
107-
},
108-
$contact->getTags()->toArray()
109-
),
110-
]);
111-
}
112-
113-
/**
114-
* @param mixed[] $filters
115-
*/
116-
private function doFiltersContainCompanyFilter(array $filters): bool
117-
{
118-
foreach ($filters as $filter) {
119-
if ((0 === strpos($filter['field'], 'company') && 'company' !== $filter['field'])) {
120-
return true;
121-
}
122-
}
123-
124-
return false;
125-
}
126-
127-
/**
128-
* @param mixed[] $filters
129-
*/
130-
private function doFiltersContainTagsFilter(array $filters): bool
131-
{
132-
foreach ($filters as $filter) {
133-
if ('tags' === ($filter['type'] ?? null)) {
134-
return true;
135-
}
136-
}
137-
138-
return false;
139-
}
14074
}

Helper/ContactFilterMatcher.php

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
namespace MauticPlugin\CustomObjectsBundle\Helper;
66

7+
use Doctrine\DBAL\Connection;
78
use Mautic\EmailBundle\EventListener\MatchFilterForLeadTrait;
9+
use Mautic\LeadBundle\Entity\CompanyRepository;
810
use Mautic\LeadBundle\Entity\LeadListRepository;
911
use MauticPlugin\CustomObjectsBundle\DTO\TableConfig;
1012
use MauticPlugin\CustomObjectsBundle\Entity\CustomItem;
@@ -31,19 +33,25 @@ class ContactFilterMatcher
3133
private CustomFieldModel $customFieldModel;
3234
private CustomObjectModel $customObjectModel;
3335
private CustomItemModel $customItemModel;
36+
private CompanyRepository $companyRepository;
37+
private Connection $connection;
3438
private int $leadCustomItemFetchLimit;
3539

3640
public function __construct(
3741
CustomFieldModel $customFieldModel,
3842
CustomObjectModel $customObjectModel,
3943
CustomItemModel $customItemModel,
4044
LeadListRepository $segmentRepository,
45+
CompanyRepository $companyRepository,
46+
Connection $connection,
4147
int $leadCustomItemFetchLimit
4248
) {
4349
$this->customFieldModel = $customFieldModel;
4450
$this->customObjectModel = $customObjectModel;
4551
$this->customItemModel = $customItemModel;
4652
$this->segmentRepository = $segmentRepository;
53+
$this->companyRepository = $companyRepository;
54+
$this->connection = $connection;
4755
$this->leadCustomItemFetchLimit = $leadCustomItemFetchLimit;
4856
}
4957

@@ -53,7 +61,8 @@ public function __construct(
5361
*/
5462
public function match(array $filters, array $lead, bool &$hasCustomFields = false): bool
5563
{
56-
$customFieldValues = $this->getCustomFieldDataForLead($filters, (string) $lead['id']);
64+
$leadId = (string) $lead['id'];
65+
$customFieldValues = $this->getCustomFieldDataForLead($filters, $leadId);
5766

5867
if (!$customFieldValues) {
5968
return false;
@@ -62,6 +71,14 @@ public function match(array $filters, array $lead, bool &$hasCustomFields = fals
6271
$hasCustomFields = true;
6372
$lead = array_merge($lead, $customFieldValues);
6473

74+
if (!isset($lead['companies']) && $this->doFiltersContainCompanyFilter($filters)) {
75+
$lead['companies'] = $this->companyRepository->getCompaniesByLeadId($leadId);
76+
}
77+
78+
if (!isset($lead['tags']) && $this->doFiltersContainTagsFilter($filters)) {
79+
$lead['tags'] = $this->getTagIdsByLeadId($leadId);
80+
}
81+
6582
return $this->matchFilterForLead($filters, $lead);
6683
}
6784

@@ -186,4 +203,18 @@ private function transformFilterDataForLead(array $data, array $lead): ?array
186203

187204
return $this->transformFilterDataForLeadAlias($data, $lead);
188205
}
206+
207+
/**
208+
* @return string[]
209+
*/
210+
public function getTagIdsByLeadId(string $leadId): array
211+
{
212+
return $this->connection->createQueryBuilder()
213+
->select('tag_id')
214+
->from(MAUTIC_TABLE_PREFIX.'lead_tags_xref', 'x')
215+
->where('x.lead_id = :leadId')
216+
->setParameter('leadId', $leadId)
217+
->execute()
218+
->fetchFirstColumn();
219+
}
189220
}

Polyfill/EventListener/MatchFilterForLeadTrait.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,4 +195,32 @@ private function transformFilterDataForLead(array $data, array $lead): ?array
195195
{
196196
return null;
197197
}
198+
199+
/**
200+
* @param mixed[] $filters
201+
*/
202+
private function doFiltersContainCompanyFilter(array $filters): bool
203+
{
204+
foreach ($filters as $filter) {
205+
if ((0 === strpos($filter['field'], 'company') && 'company' !== $filter['field'])) {
206+
return true;
207+
}
208+
}
209+
210+
return false;
211+
}
212+
213+
/**
214+
* @param mixed[] $filters
215+
*/
216+
private function doFiltersContainTagsFilter(array $filters): bool
217+
{
218+
foreach ($filters as $filter) {
219+
if ('tags' === ($filter['type'] ?? null)) {
220+
return true;
221+
}
222+
}
223+
224+
return false;
225+
}
198226
}

Tests/Unit/EventListener/DynamicContentSubscriberTest.php

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
namespace MauticPlugin\CustomObjectsBundle\Tests\Unit\EventListener;
66

77
use Mautic\DynamicContentBundle\Event\ContactFiltersEvaluateEvent;
8-
use Mautic\LeadBundle\Entity\CompanyRepository;
98
use Mautic\LeadBundle\Entity\Lead;
109
use Mautic\LeadBundle\Segment\Query\QueryBuilder;
1110
use MauticPlugin\CustomObjectsBundle\EventListener\DynamicContentSubscriber;
@@ -23,9 +22,6 @@ class DynamicContentSubscriberTest extends TestCase
2322
/** @var ConfigProvider&MockObject */
2423
private $configProviderMock;
2524

26-
/** @var CompanyRepository&MockObject */
27-
private $companyRepository;
28-
2925
/** @var QueryFilterFactory&MockObject */
3026
private $queryFilterFactory;
3127

@@ -43,14 +39,12 @@ protected function setUp(): void
4339

4440
$this->configProviderMock = $this->createMock(ConfigProvider::class);
4541
$this->queryFilterFactory = $this->createMock(QueryFilterFactory::class);
46-
$this->companyRepository = $this->createMock(CompanyRepository::class);
4742
$this->queryBuilderMock = $this->createMock(QueryBuilder::class);
4843
$this->contactFilterMatcher = $this->createMock(ContactFilterMatcher::class);
4944

5045
$this->dynamicContentSubscriber = new DynamicContentSubscriber(
5146
$this->queryFilterFactory,
5247
$this->configProviderMock,
53-
$this->companyRepository,
5448
$this->contactFilterMatcher
5549
);
5650
}
@@ -83,7 +77,6 @@ public function testFiltersInsertedIntoEvent(): void
8377
defined('MAUTIC_TABLE_PREFIX') || define('MAUTIC_TABLE_PREFIX', '');
8478

8579
$this->configProviderMock->expects($this->once())->method('pluginIsEnabled')->willReturn(true);
86-
$this->companyRepository->method('getCompaniesByLeadId')->willReturn([]);
8780

8881
$this->queryFilterFactory->expects($this->exactly(2))
8982
->method('configureQueryBuilderFromSegmentFilter')

0 commit comments

Comments
 (0)