Skip to content

Commit 28a979e

Browse files
updated existing methods and tests
1 parent 1bf9fb8 commit 28a979e

2 files changed

Lines changed: 236 additions & 3 deletions

File tree

src/Database/Database.php

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,28 @@ class Database
230230
'array' => false,
231231
'filters' => ['datetime']
232232
],
233+
[
234+
'$id' => '$createdBy',
235+
'type' => self::VAR_STRING,
236+
'format' => '',
237+
'size' => 0,
238+
'signed' => false,
239+
'required' => false,
240+
'default' => null,
241+
'array' => false,
242+
'filters' => []
243+
],
244+
[
245+
'$id' => '$updatedBy',
246+
'type' => self::VAR_STRING,
247+
'format' => '',
248+
'size' => 0,
249+
'signed' => false,
250+
'required' => false,
251+
'default' => null,
252+
'array' => false,
253+
'filters' => []
254+
],
233255
[
234256
'$id' => '$permissions',
235257
'type' => Database::VAR_STRING,
@@ -246,6 +268,8 @@ class Database
246268
'_uid',
247269
'_createdAt',
248270
'_updatedAt',
271+
'_createdBy',
272+
'_updatedBy',
249273
'_permissions',
250274
];
251275

@@ -254,6 +278,8 @@ class Database
254278
'_uid',
255279
'_createdAt',
256280
'_updatedAt',
281+
'_createdBy',
282+
'_updatedBy',
257283
'_permissions_id',
258284
'_permissions',
259285
];
@@ -3863,12 +3889,16 @@ public function createDocument(string $collection, Document $document): Document
38633889

38643890
$createdAt = $document->getCreatedAt();
38653891
$updatedAt = $document->getUpdatedAt();
3892+
$createdBy = $document->getCreatedBy();
3893+
$updatedBy = $document->getUpdatedBy();
38663894

38673895
$document
38683896
->setAttribute('$id', empty($document->getId()) ? ID::unique() : $document->getId())
38693897
->setAttribute('$collection', $collection->getId())
38703898
->setAttribute('$createdAt', ($createdAt === null || !$this->preserveDates) ? $time : $createdAt)
3871-
->setAttribute('$updatedAt', ($updatedAt === null || !$this->preserveDates) ? $time : $updatedAt);
3899+
->setAttribute('$updatedAt', ($updatedAt === null || !$this->preserveDates) ? $time : $updatedAt)
3900+
->setAttribute('$createdBy', value: $createdBy === null ? Authorization::getUser() : $createdBy)
3901+
->setAttribute('$updatedBy', $updatedBy === null ? Authorization::getUser() : $updatedBy);
38723902

38733903
if (empty($document->getPermissions())) {
38743904
$document->setAttribute('$permissions', []);
@@ -3967,12 +3997,17 @@ public function createDocuments(
39673997
foreach ($documents as $document) {
39683998
$createdAt = $document->getCreatedAt();
39693999
$updatedAt = $document->getUpdatedAt();
4000+
$createdBy = $document->getCreatedBy();
4001+
$updatedBy = $document->getUpdatedBy();
39704002

39714003
$document
39724004
->setAttribute('$id', empty($document->getId()) ? ID::unique() : $document->getId())
39734005
->setAttribute('$collection', $collection->getId())
39744006
->setAttribute('$createdAt', ($createdAt === null || !$this->preserveDates) ? $time : $createdAt)
3975-
->setAttribute('$updatedAt', ($updatedAt === null || !$this->preserveDates) ? $time : $updatedAt);
4007+
->setAttribute('$updatedAt', ($updatedAt === null || !$this->preserveDates) ? $time : $updatedAt)
4008+
->setAttribute('$createdBy', $createdBy === null ? Authorization::getUser() : $createdBy)
4009+
->setAttribute('$updatedBy', $updatedBy === null ? Authorization::getUser() : $updatedBy);
4010+
39764011

39774012
if (empty($document->getPermissions())) {
39784013
$document->setAttribute('$permissions', []);
@@ -4396,10 +4431,12 @@ public function updateDocument(string $collection, string $id, Document $documen
43964431
$skipPermissionsUpdate = ($originalPermissions === $currentPermissions);
43974432
}
43984433
$createdAt = $document->getCreatedAt();
4434+
$createdBy = $document->getCreatedBy();
43994435

44004436
$document = \array_merge($old->getArrayCopy(), $document->getArrayCopy());
44014437
$document['$collection'] = $old->getAttribute('$collection'); // Make sure user doesn't switch collection ID
44024438
$document['$createdAt'] = ($createdAt === null || !$this->preserveDates) ? $old->getCreatedAt() : $createdAt;
4439+
$document['$createdBy'] = $createdBy === null ? $old->getCreatedBy() : $createdBy;
44034440

44044441
if ($this->adapter->getSharedTables()) {
44054442
$document['$tenant'] = $old->getTenant(); // Make sure user doesn't switch tenant
@@ -4524,6 +4561,7 @@ public function updateDocument(string $collection, string $id, Document $documen
45244561

45254562
if ($shouldUpdate) {
45264563
$document->setAttribute('$updatedAt', ($newUpdatedAt === null || !$this->preserveDates) ? $time : $newUpdatedAt);
4564+
$document->setAttribute('$updatedBy', Authorization::getUser());
45274565
}
45284566

45294567
// Check if document was updated after the request timestamp
@@ -4653,12 +4691,20 @@ public function updateDocuments(
46534691
$updates['$createdAt'] = $updates->getCreatedAt();
46544692
}
46554693

4694+
if ($updates->getCreatedBy() == null) {
4695+
unset($updates['$createdBy']);
4696+
} else {
4697+
$updates['$createdBy'] = $updates->getCreatedBy();
4698+
}
4699+
46564700
if ($this->adapter->getSharedTables()) {
46574701
$updates['$tenant'] = $this->adapter->getTenant();
46584702
}
46594703

46604704
$updatedAt = $updates->getUpdatedAt();
4705+
$updatedBy = $updates->getUpdatedBy();
46614706
$updates['$updatedAt'] = ($updatedAt === null || !$this->preserveDates) ? DateTime::now() : $updatedAt;
4707+
$updates['$updatedBy'] = $updatedBy === null ? Authorization::getUser() : $updatedBy;
46624708

46634709
$updates = $this->encode($collection, $updates);
46644710
// Check new document structure
@@ -5289,11 +5335,12 @@ public function createOrUpdateDocumentsWithIncrease(
52895335
}
52905336

52915337
$updatedAt = $document->getUpdatedAt();
5292-
5338+
$updatedBy = $document->getUpdatedBy();
52935339
$document
52945340
->setAttribute('$id', empty($document->getId()) ? ID::unique() : $document->getId())
52955341
->setAttribute('$collection', $collection->getId())
52965342
->setAttribute('$updatedAt', ($updatedAt === null || !$this->preserveDates) ? $time : $updatedAt)
5343+
->setAttribute('$updatedBy', $updatedBy === null ? Authorization::getUser() : $updatedBy)
52975344
->removeAttribute('$sequence');
52985345

52995346
$createdAt = $document->getCreatedAt();
@@ -5303,6 +5350,12 @@ public function createOrUpdateDocumentsWithIncrease(
53035350
$document->setAttribute('$createdAt', $createdAt);
53045351
}
53055352

5353+
$createdBy = $document->getCreatedBy();
5354+
if ($createdBy === null) {
5355+
$document->setAttribute('$createdBy', $old->isEmpty() ? Authorization::getUser() : $old->getCreatedBy());
5356+
} else {
5357+
$document->setAttribute('$createdBy', $createdBy);
5358+
}
53065359
// Force matching optional parameter sets
53075360
// Doesn't use decode as that intentionally skips null defaults to reduce payload size
53085361
foreach ($collectionAttributes as $attr) {
@@ -5497,6 +5550,7 @@ public function increaseDocumentAttribute(
54975550
$time = DateTime::now();
54985551
$updatedAt = $document->getUpdatedAt();
54995552
$updatedAt = (empty($updatedAt) || !$this->preserveDates) ? $time : $updatedAt;
5553+
$updatedBy = $document->getUpdatedBy();
55005554
$max = $max ? $max - $value : null;
55015555

55025556
$this->adapter->increaseDocumentAttribute(
@@ -5505,6 +5559,7 @@ public function increaseDocumentAttribute(
55055559
$attribute,
55065560
$value,
55075561
$updatedAt,
5562+
$updatedBy,
55085563
max: $max
55095564
);
55105565

@@ -5596,6 +5651,7 @@ public function decreaseDocumentAttribute(
55965651
$time = DateTime::now();
55975652
$updatedAt = $document->getUpdatedAt();
55985653
$updatedAt = (empty($updatedAt) || !$this->preserveDates) ? $time : $updatedAt;
5654+
$updatedBy = $document->getUpdatedBy() == null ? Authorization::getUser() : $document->getUpdatedBy();
55995655
$min = $min ? $min + $value : null;
56005656

56015657
$this->adapter->increaseDocumentAttribute(
@@ -5604,6 +5660,7 @@ public function decreaseDocumentAttribute(
56045660
$attribute,
56055661
$value * -1,
56065662
$updatedAt,
5663+
$updatedBy,
56075664
min: $min
56085665
);
56095666

tests/e2e/Adapter/Scopes/DocumentTests.php

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5995,4 +5995,180 @@ public function testCreateUpdateDocumentsMismatch(): void
59955995
}
59965996
$database->deleteCollection($colName);
59975997
}
5998+
5999+
public function testCreatedByUpdatedBy(): void
6000+
{
6001+
$collection = 'test_created_updated_by';
6002+
$database = static::getDatabase();
6003+
6004+
6005+
$database->createCollection($collection);
6006+
$database->createAttribute($collection, 'string', Database::VAR_STRING, 128, false);
6007+
$database->createAttribute($collection, 'number', Database::VAR_INTEGER, 0, false);
6008+
6009+
6010+
Authorization::setRole('user:test_user_1');
6011+
$doc1 = $database->createDocument($collection, new Document([
6012+
'$id' => 'test1',
6013+
'string' => 'test1',
6014+
'number' => 100,
6015+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()), Permission::update(Role::any())]
6016+
]));
6017+
6018+
6019+
$this->assertEquals('test_user_1', $doc1->getCreatedBy());
6020+
$this->assertEquals('test_user_1', $doc1->getUpdatedBy());
6021+
6022+
6023+
$retrievedDoc1 = $database->getDocument($collection, 'test1');
6024+
$this->assertEquals('test_user_1', $retrievedDoc1->getCreatedBy());
6025+
$this->assertEquals('test_user_1', $retrievedDoc1->getUpdatedBy());
6026+
6027+
6028+
$doc2 = $database->createDocument($collection, new Document([
6029+
'$id' => 'test2',
6030+
'string' => 'test2',
6031+
'number' => 200,
6032+
'$createdBy' => 'explicit_creator',
6033+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()), Permission::update(Role::any())]
6034+
]));
6035+
6036+
6037+
$this->assertEquals('explicit_creator', $doc2->getCreatedBy());
6038+
$this->assertEquals('test_user_1', $doc2->getUpdatedBy());
6039+
6040+
6041+
$retrievedDoc2 = $database->getDocument($collection, 'test2');
6042+
$this->assertEquals('explicit_creator', $retrievedDoc2->getCreatedBy());
6043+
$this->assertEquals('test_user_1', $retrievedDoc2->getUpdatedBy());
6044+
6045+
6046+
$doc3 = $database->createDocument($collection, new Document([
6047+
'$id' => 'test3',
6048+
'string' => 'test3',
6049+
'number' => 300,
6050+
'$updatedBy' => 'explicit_updater',
6051+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()), Permission::update(Role::any())]
6052+
]));
6053+
6054+
6055+
$this->assertEquals('test_user_1', $doc3->getCreatedBy());
6056+
$this->assertEquals('explicit_updater', $doc3->getUpdatedBy());
6057+
6058+
6059+
$retrievedDoc3 = $database->getDocument($collection, 'test3');
6060+
$this->assertEquals('test_user_1', $retrievedDoc3->getCreatedBy());
6061+
$this->assertEquals('explicit_updater', $retrievedDoc3->getUpdatedBy());
6062+
6063+
6064+
$doc4 = $database->createDocument($collection, new Document([
6065+
'$id' => 'test4',
6066+
'string' => 'test4',
6067+
'number' => 400,
6068+
'$createdBy' => 'explicit_creator_2',
6069+
'$updatedBy' => 'explicit_updater_2',
6070+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()), Permission::update(Role::any())]
6071+
]));
6072+
6073+
6074+
$this->assertEquals('explicit_creator_2', $doc4->getCreatedBy());
6075+
$this->assertEquals('explicit_updater_2', $doc4->getUpdatedBy());
6076+
6077+
6078+
$retrievedDoc4 = $database->getDocument($collection, 'test4');
6079+
$this->assertEquals('explicit_creator_2', $retrievedDoc4->getCreatedBy());
6080+
$this->assertEquals('explicit_updater_2', $retrievedDoc4->getUpdatedBy());
6081+
6082+
6083+
$allDocs = $database->find($collection);
6084+
$this->assertCount(4, $allDocs);
6085+
6086+
6087+
Authorization::setRole('user:test_user_2');
6088+
$updateDoc = new Document([
6089+
'string' => 'updated_test1',
6090+
'number' => 150
6091+
]);
6092+
$updatedDoc = $database->updateDocument($collection, 'test1', $updateDoc);
6093+
6094+
// Verify createdBy is preserved, updatedBy changes to current user
6095+
$this->assertEquals('test_user_1', $updatedDoc->getCreatedBy()); // Should preserve original creator
6096+
$this->assertEquals('test_user_2', $updatedDoc->getUpdatedBy()); // Should update to current user
6097+
6098+
$retrievedUpdatedDoc = $database->getDocument($collection, 'test1');
6099+
$this->assertEquals('test_user_1', $retrievedUpdatedDoc->getCreatedBy());
6100+
$this->assertEquals('test_user_2', $retrievedUpdatedDoc->getUpdatedBy());
6101+
6102+
$upsertDoc = new Document([
6103+
'$id' => 'test2',
6104+
'string' => 'upserted_test2',
6105+
'number' => 250
6106+
]);
6107+
$upsertCount = $database->createOrUpdateDocuments($collection, [$upsertDoc]);
6108+
$this->assertEquals(1, $upsertCount);
6109+
6110+
$upsertedDoc = $database->getDocument($collection, 'test2');
6111+
$this->assertEquals('explicit_creator', $upsertedDoc->getCreatedBy()); // Should preserve original creator
6112+
$this->assertEquals('test_user_2', $upsertedDoc->getUpdatedBy()); // Should update to current user
6113+
6114+
$upsertNewDoc = new Document([
6115+
'$id' => 'test5',
6116+
'string' => 'new_test5',
6117+
'number' => 500,
6118+
'$createdBy' => 'new_creator',
6119+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()), Permission::update(Role::any())]
6120+
]);
6121+
$upsertNewCount = $database->createOrUpdateDocuments($collection, [$upsertNewDoc]);
6122+
$this->assertEquals(1, $upsertNewCount);
6123+
6124+
$newUpsertedDoc = $database->getDocument($collection, 'test5');
6125+
$this->assertEquals('new_creator', $newUpsertedDoc->getCreatedBy()); // Should use explicit creator
6126+
$this->assertEquals('test_user_2', $newUpsertedDoc->getUpdatedBy()); // Should use current user
6127+
6128+
6129+
$bulkDocs = [
6130+
new Document([
6131+
'$id' => 'bulk1',
6132+
'string' => 'bulk1',
6133+
'number' => 600,
6134+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()), Permission::update(Role::any())]
6135+
]),
6136+
new Document([
6137+
'$id' => 'bulk2',
6138+
'string' => 'bulk2',
6139+
'number' => 700,
6140+
'$createdBy' => 'bulk_creator',
6141+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()), Permission::update(Role::any())]
6142+
]),
6143+
new Document([
6144+
'$id' => 'bulk3',
6145+
'string' => 'bulk3',
6146+
'number' => 800,
6147+
'$updatedBy' => 'bulk_updater',
6148+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()), Permission::update(Role::any())]
6149+
])
6150+
];
6151+
$bulkCount = $database->createDocuments($collection, $bulkDocs);
6152+
$this->assertEquals(3, $bulkCount);
6153+
6154+
$bulkDoc1 = $database->getDocument($collection, 'bulk1');
6155+
$bulkDoc2 = $database->getDocument($collection, 'bulk2');
6156+
$bulkDoc3 = $database->getDocument($collection, 'bulk3');
6157+
6158+
$this->assertEquals('test_user_2', $bulkDoc1->getCreatedBy());
6159+
$this->assertEquals('test_user_2', $bulkDoc1->getUpdatedBy());
6160+
6161+
$this->assertEquals('bulk_creator', $bulkDoc2->getCreatedBy());
6162+
$this->assertEquals('test_user_2', $bulkDoc2->getUpdatedBy());
6163+
6164+
$this->assertEquals('test_user_2', $bulkDoc3->getCreatedBy());
6165+
$this->assertEquals('bulk_updater', $bulkDoc3->getUpdatedBy());
6166+
6167+
$finalAllDocs = $database->find($collection);
6168+
$this->assertCount(8, $finalAllDocs);
6169+
6170+
$database->deleteCollection($collection);
6171+
}
6172+
6173+
59986174
}

0 commit comments

Comments
 (0)