Skip to content

Commit 5d47ee4

Browse files
committed
Fix tenant scoping
1 parent 1a0267c commit 5d47ee4

2 files changed

Lines changed: 56 additions & 44 deletions

File tree

src/Database/Database.php

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4191,9 +4191,13 @@ public function updateDocuments(string $collection, Document $updates, array $qu
41914191
});
41924192

41934193
foreach ($documents as $document) {
4194-
$this->withTenant($document->getTenant(), function() use ($collection, $document) {
4194+
if ($this->getSharedTables() && $this->getTenantPerDocument()) {
4195+
$this->withTenant($document->getTenant(), function () use ($collection, $document) {
4196+
$this->purgeCachedDocument($collection->getId(), $document->getId());
4197+
});
4198+
} else {
41954199
$this->purgeCachedDocument($collection->getId(), $document->getId());
4196-
});
4200+
}
41974201
}
41984202

41994203
if (count($affectedDocuments) < $batchSize) {
@@ -4665,14 +4669,21 @@ public function createOrUpdateDocumentsWithIncrease(
46654669
}
46664670

46674671
foreach ($documents as $key => $document) {
4668-
$old = $this->withTenant($document->getTenant(), function() use ($collection, $document, $selects) {
4669-
return Authorization::skip(fn () => $this->silent(fn () => $this->getDocument(
4672+
if ($this->getSharedTables() && $this->getTenantPerDocument()) {
4673+
$old = Authorization::skip(fn () => $this->withTenant($document->getTenant(), fn () => $this->silent(fn () => $this->getDocument(
4674+
$collection->getId(),
4675+
$document->getId(),
4676+
[Query::select($selects)],
4677+
forUpdate: true
4678+
))));
4679+
} else {
4680+
$old = Authorization::skip(fn () => $this->silent(fn () => $this->getDocument(
46704681
$collection->getId(),
46714682
$document->getId(),
46724683
[Query::select($selects)],
46734684
forUpdate: true
46744685
)));
4675-
});
4686+
}
46764687

46774688
// If old is empty, check if user has create permission on the collection
46784689
// If old is not empty, check if user has update permission on the collection
@@ -4760,9 +4771,13 @@ public function createOrUpdateDocumentsWithIncrease(
47604771

47614772
$documents[$key] = $this->decode($collection, $document);
47624773

4763-
$this->withTenant($document->getTenant(), function() use ($collection, $document) {
4774+
if ($this->getSharedTables() && $this->getTenantPerDocument()) {
4775+
$this->withTenant($document->getTenant(), function () use ($collection, $document) {
4776+
$this->purgeCachedDocument($collection->getId(), $document->getId());
4777+
});
4778+
} else {
47644779
$this->purgeCachedDocument($collection->getId(), $document->getId());
4765-
});
4780+
}
47664781
}
47674782

47684783
$this->trigger(self::EVENT_DOCUMENTS_UPSERT, new Document([
@@ -5535,10 +5550,14 @@ public function deleteDocuments(string $collection, array $queries = [], int $ba
55355550
$skipAuth ? $authorization->skip($getResults) : $getResults();
55365551
});
55375552

5538-
foreach ($affectedDocuments as $affectedDocument) {
5539-
$this->withTenant($affectedDocument->getTenant(), function () use ($collection, $affectedDocument) {
5540-
$this->purgeCachedDocument($collection->getId(), $affectedDocument->getId());
5541-
});
5553+
foreach ($affectedDocuments as $document) {
5554+
if ($this->getSharedTables() && $this->getTenantPerDocument()) {
5555+
$this->withTenant($document->getTenant(), function () use ($collection, $document) {
5556+
$this->purgeCachedDocument($collection->getId(), $document->getId());
5557+
});
5558+
} else {
5559+
$this->purgeCachedDocument($collection->getId(), $document->getId());
5560+
}
55425561
}
55435562

55445563
if (count($affectedDocuments) < $batchSize) {

tests/e2e/Adapter/Base.php

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2306,13 +2306,10 @@ public function testCreateOrUpdateDocuments(): void
23062306
return;
23072307
}
23082308

2309-
$collection = 'testCreateOrUpdateDocuments';
2310-
2311-
static::getDatabase()->createCollection($collection);
2312-
2313-
static::getDatabase()->createAttribute($collection, 'string', Database::VAR_STRING, 128, true);
2314-
static::getDatabase()->createAttribute($collection, 'integer', Database::VAR_INTEGER, 0, true);
2315-
static::getDatabase()->createAttribute($collection, 'bigint', Database::VAR_INTEGER, 8, true);
2309+
static::getDatabase()->createCollection(__FUNCTION__);
2310+
static::getDatabase()->createAttribute(__FUNCTION__, 'string', Database::VAR_STRING, 128, true);
2311+
static::getDatabase()->createAttribute(__FUNCTION__, 'integer', Database::VAR_INTEGER, 0, true);
2312+
static::getDatabase()->createAttribute(__FUNCTION__, 'bigint', Database::VAR_INTEGER, 8, true);
23162313

23172314
$documents = [
23182315
new Document([
@@ -2341,7 +2338,7 @@ public function testCreateOrUpdateDocuments(): void
23412338
]),
23422339
];
23432340

2344-
$documents = static::getDatabase()->createOrUpdateDocuments($collection, $documents);
2341+
$documents = static::getDatabase()->createOrUpdateDocuments(__FUNCTION__, $documents);
23452342

23462343
$this->assertEquals(2, count($documents));
23472344

@@ -2355,7 +2352,7 @@ public function testCreateOrUpdateDocuments(): void
23552352
$this->assertEquals(Database::BIG_INT_MAX, $document->getAttribute('bigint'));
23562353
}
23572354

2358-
$documents = static::getDatabase()->find($collection);
2355+
$documents = static::getDatabase()->find(__FUNCTION__);
23592356

23602357
$this->assertEquals(2, count($documents));
23612358

@@ -2374,7 +2371,7 @@ public function testCreateOrUpdateDocuments(): void
23742371
$documents[1]->setAttribute('string', 'new text📝');
23752372
$documents[1]->setAttribute('integer', 10);
23762373

2377-
$documents = static::getDatabase()->createOrUpdateDocuments($collection, $documents);
2374+
$documents = static::getDatabase()->createOrUpdateDocuments(__FUNCTION__, $documents);
23782375

23792376
$this->assertEquals(2, count($documents));
23802377

@@ -2388,7 +2385,7 @@ public function testCreateOrUpdateDocuments(): void
23882385
$this->assertEquals(Database::BIG_INT_MAX, $document->getAttribute('bigint'));
23892386
}
23902387

2391-
$documents = static::getDatabase()->find($collection);
2388+
$documents = static::getDatabase()->find(__FUNCTION__);
23922389

23932390
$this->assertEquals(2, count($documents));
23942391

@@ -2403,18 +2400,16 @@ public function testCreateOrUpdateDocuments(): void
24032400
}
24042401
}
24052402

2406-
public function testCreateOrUpdateDocumentsWithIncrease(): void
2403+
public function testCreateOrUpdateDocumentsInc(): void
24072404
{
24082405
if (!static::getDatabase()->getAdapter()->getSupportForUpserts()) {
24092406
$this->expectNotToPerformAssertions();
24102407
return;
24112408
}
24122409

2413-
$collection = 'testCreateOrUpdateInplace';
2414-
2415-
static::getDatabase()->createCollection($collection);
2416-
static::getDatabase()->createAttribute($collection, 'string', Database::VAR_STRING, 128, false);
2417-
static::getDatabase()->createAttribute($collection, 'integer', Database::VAR_INTEGER, 0, false);
2410+
static::getDatabase()->createCollection(__FUNCTION__);
2411+
static::getDatabase()->createAttribute(__FUNCTION__, 'string', Database::VAR_STRING, 128, false);
2412+
static::getDatabase()->createAttribute(__FUNCTION__, 'integer', Database::VAR_INTEGER, 0, false);
24182413

24192414
$documents = [
24202415
new Document([
@@ -2441,18 +2436,18 @@ public function testCreateOrUpdateDocumentsWithIncrease(): void
24412436
]),
24422437
];
24432438

2444-
static::getDatabase()->createDocuments($collection, $documents);
2439+
static::getDatabase()->createDocuments(__FUNCTION__, $documents);
24452440

24462441
$documents[0]->setAttribute('integer', 1);
24472442
$documents[1]->setAttribute('integer', 1);
24482443

24492444
static::getDatabase()->createOrUpdateDocumentsWithIncrease(
2450-
collection: $collection,
2445+
collection: __FUNCTION__,
24512446
attribute:'integer',
24522447
documents: $documents
24532448
);
24542449

2455-
$documents = static::getDatabase()->find($collection);
2450+
$documents = static::getDatabase()->find(__FUNCTION__);
24562451

24572452
foreach ($documents as $document) {
24582453
$this->assertEquals(6, $document->getAttribute('integer'));
@@ -2462,12 +2457,12 @@ public function testCreateOrUpdateDocumentsWithIncrease(): void
24622457
$documents[1]->setAttribute('integer', -1);
24632458

24642459
static::getDatabase()->createOrUpdateDocumentsWithIncrease(
2465-
collection: $collection,
2460+
collection: __FUNCTION__,
24662461
attribute:'integer',
24672462
documents: $documents
24682463
);
24692464

2470-
$documents = static::getDatabase()->find($collection);
2465+
$documents = static::getDatabase()->find(__FUNCTION__);
24712466

24722467
foreach ($documents as $document) {
24732468
$this->assertEquals(5, $document->getAttribute('integer'));
@@ -2481,10 +2476,8 @@ public function testCreateOrUpdateDocumentsPermissions(): void
24812476
return;
24822477
}
24832478

2484-
$collection = 'testCreateOrUpdateDocumentPermissions';
2485-
2486-
static::getDatabase()->createCollection($collection);
2487-
static::getDatabase()->createAttribute($collection, 'string', Database::VAR_STRING, 128, true);
2479+
static::getDatabase()->createCollection(__FUNCTION__);
2480+
static::getDatabase()->createAttribute(__FUNCTION__, 'string', Database::VAR_STRING, 128, true);
24882481

24892482
$document = new Document([
24902483
'$id' => 'first',
@@ -2495,10 +2488,10 @@ public function testCreateOrUpdateDocumentsPermissions(): void
24952488
],
24962489
]);
24972490

2498-
static::getDatabase()->createOrUpdateDocuments($collection, [$document]);
2491+
static::getDatabase()->createOrUpdateDocuments(__FUNCTION__, [$document]);
24992492

25002493
try {
2501-
static::getDatabase()->createOrUpdateDocuments($collection, [$document->setAttribute('string', 'updated')]);
2494+
static::getDatabase()->createOrUpdateDocuments(__FUNCTION__, [$document->setAttribute('string', 'updated')]);
25022495
$this->fail('Failed to throw exception');
25032496
} catch (Exception $e) {
25042497
$this->assertInstanceOf(AuthorizationException::class, $e);
@@ -2513,10 +2506,10 @@ public function testCreateOrUpdateDocumentsPermissions(): void
25132506
],
25142507
]);
25152508

2516-
static::getDatabase()->createOrUpdateDocuments($collection, [$document]);
2509+
static::getDatabase()->createOrUpdateDocuments(__FUNCTION__, [$document]);
25172510

25182511
$documents = static::getDatabase()->createOrUpdateDocuments(
2519-
$collection,
2512+
__FUNCTION__,
25202513
[$document->setAttribute('string', 'updated')]
25212514
);
25222515

@@ -2533,7 +2526,7 @@ public function testCreateOrUpdateDocumentsPermissions(): void
25332526
],
25342527
]);
25352528

2536-
static::getDatabase()->createOrUpdateDocuments($collection, [$document]);
2529+
static::getDatabase()->createOrUpdateDocuments(__FUNCTION__, [$document]);
25372530

25382531
$newPermissions = [
25392532
Permission::read(Role::any()),
@@ -2542,14 +2535,14 @@ public function testCreateOrUpdateDocumentsPermissions(): void
25422535
];
25432536

25442537
$documents = static::getDatabase()->createOrUpdateDocuments(
2545-
$collection,
2538+
__FUNCTION__,
25462539
[$document->setAttribute('$permissions', $newPermissions)]
25472540
);
25482541

25492542
$this->assertEquals(1, count($documents));
25502543
$this->assertEquals($newPermissions, $documents[0]->getPermissions());
25512544

2552-
$document = static::getDatabase()->getDocument($collection, 'third');
2545+
$document = static::getDatabase()->getDocument(__FUNCTION__, 'third');
25532546

25542547
$this->assertEquals($newPermissions, $document->getPermissions());
25552548
}

0 commit comments

Comments
 (0)