Skip to content

Commit 3f9c6b7

Browse files
authored
Merge pull request #429 from systopia/permissions-cache-clearing
Fix permissions cache clearing
2 parents 89b75b5 + b48f804 commit 3f9c6b7

File tree

2 files changed

+33
-5
lines changed

2 files changed

+33
-5
lines changed

Civi/Funding/EventSubscriber/FundingCase/FundingCasePermissionsCacheClearSubscriber.php

+6-2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
use Civi\Funding\Database\ChangeSetFactory;
2525
use Civi\Funding\Entity\FundingCaseContactRelationEntity;
2626
use Civi\Funding\FundingCase\FundingCasePermissionsCacheManager;
27+
use Civi\Funding\Permission\ContactRelation\Types\ContactTypeAndGroup;
2728
use Civi\Funding\Permission\ContactRelation\Types\Relationship;
2829
use Civi\RemoteTools\Api4\Api4Interface;
2930
use Civi\RemoteTools\Api4\Query\Comparison;
@@ -35,6 +36,8 @@
3536
*/
3637
final class FundingCasePermissionsCacheClearSubscriber implements EventSubscriberInterface {
3738

39+
private const RELATION_TYPES_WITH_GROUP_IDS = [Relationship::NAME, ContactTypeAndGroup::NAME];
40+
3841
private Api4Interface $api4;
3942

4043
private ChangeSetFactory $changeSetFactory;
@@ -231,11 +234,12 @@ public function onPreFundingCaseContactRelation(PreEvent $event): void {
231234
private function getRelationshipRelationsByGroupId(int $groupId): iterable {
232235
$relations = FundingCaseContactRelationEntity::allFromApiResult($this->api4->getEntities(
233236
FundingCaseContactRelation::getEntityName(),
234-
Comparison::new('type', '=', Relationship::NAME)
237+
Comparison::new('type', 'IN', self::RELATION_TYPES_WITH_GROUP_IDS)
235238
));
236239

237240
foreach ($relations as $relation) {
238-
if (in_array($groupId, $relation->getProperty('groupIds', []), TRUE)) {
241+
$relationGroupIds = $relation->getProperty('groupIds', []);
242+
if ([] === $relationGroupIds || in_array($groupId, $relationGroupIds, TRUE)) {
239243
yield $relation;
240244
}
241245
}

tests/phpunit/Civi/Funding/EventSubscriber/FundingCase/FundingCasePermissionsCacheClearSubscriberTest.php

+27-3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
use Civi\Funding\Fixtures\FundingProgramFixture;
3636
use Civi\Funding\Fixtures\GroupContactFixture;
3737
use Civi\Funding\Fixtures\GroupFixture;
38+
use Civi\Funding\Permission\ContactRelation\Types\ContactTypeAndGroup;
39+
use Civi\Funding\Permission\ContactRelation\Types\Relationship as RelationshipType;
3840

3941
/**
4042
* @covers \Civi\Funding\EventSubscriber\FundingCase\FundingCasePermissionsCacheClearSubscriber
@@ -107,14 +109,15 @@ public function testOnPreGroup(): void {
107109

108110
$group1 = GroupFixture::addFixture();
109111
$group2 = GroupFixture::addFixture();
112+
$group3 = GroupFixture::addFixture();
110113

111114
$fundingCase = FundingCaseFixture::addFixture(
112115
$fundingProgram->getId(),
113116
$fundingCaseType->getId(),
114117
$contact['id'],
115118
$contact['id']
116119
);
117-
FundingCaseContactRelationFixture::addFixture($fundingCase->getId(), Relationship::getEntityName(), [
120+
FundingCaseContactRelationFixture::addFixture($fundingCase->getId(), RelationshipType::NAME, [
118121
'relationshipTypeIds' => [],
119122
'contactTypeIds' => [],
120123
'groupIds' => [$group1['id']],
@@ -146,6 +149,16 @@ public function testOnPreGroup(): void {
146149
// Deleting group should affect cache.
147150
Group::delete(FALSE)->addWhere('id', '=', $group1['id'])->execute();
148151
static::assertNull(FundingCasePermissionsCache::get(FALSE)->execute()->single()['permissions']);
152+
153+
// Deleting group should affect cache when there is no group restriction.
154+
FundingCaseContactRelationFixture::addFixture($fundingCase->getId(), ContactTypeAndGroup::NAME, [
155+
'contactTypeIds' => [],
156+
'groupIds' => [],
157+
], ['permission']);
158+
FundingCasePermissionsCache::delete(FALSE)->addWhere('id', 'IS NOT NULL')->execute();
159+
FundingCasePermissionsCacheFixture::add($fundingCase->getId(), $contact['id'], FALSE, ['test']);
160+
Group::delete(FALSE)->addWhere('id', '=', $group3['id'])->execute();
161+
static::assertNull(FundingCasePermissionsCache::get(FALSE)->execute()->single()['permissions']);
149162
}
150163

151164
public function testOnPreGroupContact(): void {
@@ -156,6 +169,7 @@ public function testOnPreGroupContact(): void {
156169

157170
$group1 = GroupFixture::addFixture();
158171
$group2 = GroupFixture::addFixture();
172+
$group3 = GroupFixture::addFixture();
159173

160174
$fundingCase1 = FundingCaseFixture::addFixture(
161175
$fundingProgram->getId(),
@@ -169,12 +183,12 @@ public function testOnPreGroupContact(): void {
169183
$contact1['id'],
170184
$contact1['id']
171185
);
172-
FundingCaseContactRelationFixture::addFixture($fundingCase1->getId(), Relationship::getEntityName(), [
186+
FundingCaseContactRelationFixture::addFixture($fundingCase1->getId(), RelationshipType::NAME, [
173187
'relationshipTypeIds' => [],
174188
'contactTypeIds' => [],
175189
'groupIds' => [$group1['id']],
176190
], ['permission']);
177-
FundingCaseContactRelationFixture::addFixture($fundingCase2->getId(), Relationship::getEntityName(), [
191+
FundingCaseContactRelationFixture::addFixture($fundingCase2->getId(), RelationshipType::NAME, [
178192
'relationshipTypeIds' => [],
179193
'contactTypeIds' => [],
180194
'groupIds' => [$group2['id']],
@@ -207,6 +221,16 @@ public function testOnPreGroupContact(): void {
207221
GroupContact::update(FALSE)->setValues($groupContact)->execute();
208222

209223
static::assertSame([NULL, NULL], FundingCasePermissionsCache::get(FALSE)->execute()->column('permissions'));
224+
225+
// Adding GroupContact should affect cache when there is no group restriction.
226+
FundingCaseContactRelationFixture::addFixture($fundingCase1->getId(), ContactTypeAndGroup::NAME, [
227+
'contactTypeIds' => [],
228+
'groupIds' => [],
229+
], ['permission']);
230+
FundingCasePermissionsCache::delete(FALSE)->addWhere('id', 'IS NOT NULL')->execute();
231+
FundingCasePermissionsCacheFixture::add($fundingCase1->getId(), $contact1['id'], FALSE, ['test']);
232+
GroupContactFixture::addFixtureWithGroupId($group1['id'], $contact1['id']);
233+
static::assertNull(FundingCasePermissionsCache::get(FALSE)->execute()->single()['permissions']);
210234
}
211235

212236
public function testOnPreFundingCaseContactRelation(): void {

0 commit comments

Comments
 (0)