Skip to content

Commit 016118e

Browse files
updated existing methods and tests
1 parent 05f15db commit 016118e

File tree

2 files changed

+236
-3
lines changed

2 files changed

+236
-3
lines changed

src/Database/Database.php

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,28 @@ class Database
226226
'array' => false,
227227
'filters' => ['datetime']
228228
],
229+
[
230+
'$id' => '$createdBy',
231+
'type' => self::VAR_STRING,
232+
'format' => '',
233+
'size' => 0,
234+
'signed' => false,
235+
'required' => false,
236+
'default' => null,
237+
'array' => false,
238+
'filters' => []
239+
],
240+
[
241+
'$id' => '$updatedBy',
242+
'type' => self::VAR_STRING,
243+
'format' => '',
244+
'size' => 0,
245+
'signed' => false,
246+
'required' => false,
247+
'default' => null,
248+
'array' => false,
249+
'filters' => []
250+
],
229251
[
230252
'$id' => '$permissions',
231253
'type' => Database::VAR_STRING,
@@ -242,6 +264,8 @@ class Database
242264
'_uid',
243265
'_createdAt',
244266
'_updatedAt',
267+
'_createdBy',
268+
'_updatedBy',
245269
'_permissions',
246270
];
247271

@@ -250,6 +274,8 @@ class Database
250274
'_uid',
251275
'_createdAt',
252276
'_updatedAt',
277+
'_createdBy',
278+
'_updatedBy',
253279
'_permissions_id',
254280
'_permissions',
255281
];
@@ -3755,12 +3781,16 @@ public function createDocument(string $collection, Document $document): Document
37553781

37563782
$createdAt = $document->getCreatedAt();
37573783
$updatedAt = $document->getUpdatedAt();
3784+
$createdBy = $document->getCreatedBy();
3785+
$updatedBy = $document->getUpdatedBy();
37583786

37593787
$document
37603788
->setAttribute('$id', empty($document->getId()) ? ID::unique() : $document->getId())
37613789
->setAttribute('$collection', $collection->getId())
37623790
->setAttribute('$createdAt', ($createdAt === null || !$this->preserveDates) ? $time : $createdAt)
3763-
->setAttribute('$updatedAt', ($updatedAt === null || !$this->preserveDates) ? $time : $updatedAt);
3791+
->setAttribute('$updatedAt', ($updatedAt === null || !$this->preserveDates) ? $time : $updatedAt)
3792+
->setAttribute('$createdBy', value: $createdBy === null ? Authorization::getUser() : $createdBy)
3793+
->setAttribute('$updatedBy', $updatedBy === null ? Authorization::getUser() : $updatedBy);
37643794

37653795
if (empty($document->getPermissions())) {
37663796
$document->setAttribute('$permissions', []);
@@ -3859,12 +3889,17 @@ public function createDocuments(
38593889
foreach ($documents as $document) {
38603890
$createdAt = $document->getCreatedAt();
38613891
$updatedAt = $document->getUpdatedAt();
3892+
$createdBy = $document->getCreatedBy();
3893+
$updatedBy = $document->getUpdatedBy();
38623894

38633895
$document
38643896
->setAttribute('$id', empty($document->getId()) ? ID::unique() : $document->getId())
38653897
->setAttribute('$collection', $collection->getId())
38663898
->setAttribute('$createdAt', ($createdAt === null || !$this->preserveDates) ? $time : $createdAt)
3867-
->setAttribute('$updatedAt', ($updatedAt === null || !$this->preserveDates) ? $time : $updatedAt);
3899+
->setAttribute('$updatedAt', ($updatedAt === null || !$this->preserveDates) ? $time : $updatedAt)
3900+
->setAttribute('$createdBy', $createdBy === null ? Authorization::getUser() : $createdBy)
3901+
->setAttribute('$updatedBy', $updatedBy === null ? Authorization::getUser() : $updatedBy);
3902+
38683903

38693904
if (empty($document->getPermissions())) {
38703905
$document->setAttribute('$permissions', []);
@@ -4285,10 +4320,12 @@ public function updateDocument(string $collection, string $id, Document $documen
42854320
$skipPermissionsUpdate = ($originalPermissions === $currentPermissions);
42864321
}
42874322
$createdAt = $document->getCreatedAt();
4323+
$createdBy = $document->getCreatedBy();
42884324

42894325
$document = \array_merge($old->getArrayCopy(), $document->getArrayCopy());
42904326
$document['$collection'] = $old->getAttribute('$collection'); // Make sure user doesn't switch collection ID
42914327
$document['$createdAt'] = ($createdAt === null || !$this->preserveDates) ? $old->getCreatedAt() : $createdAt;
4328+
$document['$createdBy'] = $createdBy === null ? $old->getCreatedBy() : $createdBy;
42924329

42934330
if ($this->adapter->getSharedTables()) {
42944331
$document['$tenant'] = $old->getTenant(); // Make sure user doesn't switch tenant
@@ -4417,6 +4454,7 @@ public function updateDocument(string $collection, string $id, Document $documen
44174454

44184455
if ($shouldUpdate) {
44194456
$document->setAttribute('$updatedAt', ($newUpdatedAt === null || !$this->preserveDates) ? $time : $newUpdatedAt);
4457+
$document->setAttribute('$updatedBy', Authorization::getUser());
44204458
}
44214459

44224460
// Check if document was updated after the request timestamp
@@ -4542,12 +4580,20 @@ public function updateDocuments(
45424580
$updates['$createdAt'] = $updates->getCreatedAt();
45434581
}
45444582

4583+
if ($updates->getCreatedBy() == null) {
4584+
unset($updates['$createdBy']);
4585+
} else {
4586+
$updates['$createdBy'] = $updates->getCreatedBy();
4587+
}
4588+
45454589
if ($this->adapter->getSharedTables()) {
45464590
$updates['$tenant'] = $this->adapter->getTenant();
45474591
}
45484592

45494593
$updatedAt = $updates->getUpdatedAt();
4594+
$updatedBy = $updates->getUpdatedBy();
45504595
$updates['$updatedAt'] = ($updatedAt === null || !$this->preserveDates) ? DateTime::now() : $updatedAt;
4596+
$updates['$updatedBy'] = $updatedBy === null ? Authorization::getUser() : $updatedBy;
45514597

45524598
$updates = $this->encode($collection, $updates);
45534599
// Check new document structure
@@ -5179,11 +5225,12 @@ public function createOrUpdateDocumentsWithIncrease(
51795225
}
51805226

51815227
$updatedAt = $document->getUpdatedAt();
5182-
5228+
$updatedBy = $document->getUpdatedBy();
51835229
$document
51845230
->setAttribute('$id', empty($document->getId()) ? ID::unique() : $document->getId())
51855231
->setAttribute('$collection', $collection->getId())
51865232
->setAttribute('$updatedAt', ($updatedAt === null || !$this->preserveDates) ? $time : $updatedAt)
5233+
->setAttribute('$updatedBy', $updatedBy === null ? Authorization::getUser() : $updatedBy)
51875234
->removeAttribute('$sequence');
51885235

51895236
$createdAt = $document->getCreatedAt();
@@ -5193,6 +5240,12 @@ public function createOrUpdateDocumentsWithIncrease(
51935240
$document->setAttribute('$createdAt', $createdAt);
51945241
}
51955242

5243+
$createdBy = $document->getCreatedBy();
5244+
if ($createdBy === null) {
5245+
$document->setAttribute('$createdBy', $old->isEmpty() ? Authorization::getUser() : $old->getCreatedBy());
5246+
} else {
5247+
$document->setAttribute('$createdBy', $createdBy);
5248+
}
51965249
// Force matching optional parameter sets
51975250
// Doesn't use decode as that intentionally skips null defaults to reduce payload size
51985251
foreach ($collectionAttributes as $attr) {
@@ -5387,6 +5440,7 @@ public function increaseDocumentAttribute(
53875440
$time = DateTime::now();
53885441
$updatedAt = $document->getUpdatedAt();
53895442
$updatedAt = (empty($updatedAt) || !$this->preserveDates) ? $time : $updatedAt;
5443+
$updatedBy = $document->getUpdatedBy();
53905444
$max = $max ? $max - $value : null;
53915445

53925446
$this->adapter->increaseDocumentAttribute(
@@ -5395,6 +5449,7 @@ public function increaseDocumentAttribute(
53955449
$attribute,
53965450
$value,
53975451
$updatedAt,
5452+
$updatedBy,
53985453
max: $max
53995454
);
54005455

@@ -5486,6 +5541,7 @@ public function decreaseDocumentAttribute(
54865541
$time = DateTime::now();
54875542
$updatedAt = $document->getUpdatedAt();
54885543
$updatedAt = (empty($updatedAt) || !$this->preserveDates) ? $time : $updatedAt;
5544+
$updatedBy = $document->getUpdatedBy() == null ? Authorization::getUser() : $document->getUpdatedBy();
54895545
$min = $min ? $min + $value : null;
54905546

54915547
$this->adapter->increaseDocumentAttribute(
@@ -5494,6 +5550,7 @@ public function decreaseDocumentAttribute(
54945550
$attribute,
54955551
$value * -1,
54965552
$updatedAt,
5553+
$updatedBy,
54975554
min: $min
54985555
);
54995556

tests/e2e/Adapter/Scopes/DocumentTests.php

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5903,4 +5903,180 @@ public function testCreateUpdateDocumentsMismatch(): void
59035903
}
59045904
$database->deleteCollection($colName);
59055905
}
5906+
5907+
public function testCreatedByUpdatedBy(): void
5908+
{
5909+
$collection = 'test_created_updated_by';
5910+
$database = static::getDatabase();
5911+
5912+
5913+
$database->createCollection($collection);
5914+
$database->createAttribute($collection, 'string', Database::VAR_STRING, 128, false);
5915+
$database->createAttribute($collection, 'number', Database::VAR_INTEGER, 0, false);
5916+
5917+
5918+
Authorization::setRole('user:test_user_1');
5919+
$doc1 = $database->createDocument($collection, new Document([
5920+
'$id' => 'test1',
5921+
'string' => 'test1',
5922+
'number' => 100,
5923+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()), Permission::update(Role::any())]
5924+
]));
5925+
5926+
5927+
$this->assertEquals('test_user_1', $doc1->getCreatedBy());
5928+
$this->assertEquals('test_user_1', $doc1->getUpdatedBy());
5929+
5930+
5931+
$retrievedDoc1 = $database->getDocument($collection, 'test1');
5932+
$this->assertEquals('test_user_1', $retrievedDoc1->getCreatedBy());
5933+
$this->assertEquals('test_user_1', $retrievedDoc1->getUpdatedBy());
5934+
5935+
5936+
$doc2 = $database->createDocument($collection, new Document([
5937+
'$id' => 'test2',
5938+
'string' => 'test2',
5939+
'number' => 200,
5940+
'$createdBy' => 'explicit_creator',
5941+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()), Permission::update(Role::any())]
5942+
]));
5943+
5944+
5945+
$this->assertEquals('explicit_creator', $doc2->getCreatedBy());
5946+
$this->assertEquals('test_user_1', $doc2->getUpdatedBy());
5947+
5948+
5949+
$retrievedDoc2 = $database->getDocument($collection, 'test2');
5950+
$this->assertEquals('explicit_creator', $retrievedDoc2->getCreatedBy());
5951+
$this->assertEquals('test_user_1', $retrievedDoc2->getUpdatedBy());
5952+
5953+
5954+
$doc3 = $database->createDocument($collection, new Document([
5955+
'$id' => 'test3',
5956+
'string' => 'test3',
5957+
'number' => 300,
5958+
'$updatedBy' => 'explicit_updater',
5959+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()), Permission::update(Role::any())]
5960+
]));
5961+
5962+
5963+
$this->assertEquals('test_user_1', $doc3->getCreatedBy());
5964+
$this->assertEquals('explicit_updater', $doc3->getUpdatedBy());
5965+
5966+
5967+
$retrievedDoc3 = $database->getDocument($collection, 'test3');
5968+
$this->assertEquals('test_user_1', $retrievedDoc3->getCreatedBy());
5969+
$this->assertEquals('explicit_updater', $retrievedDoc3->getUpdatedBy());
5970+
5971+
5972+
$doc4 = $database->createDocument($collection, new Document([
5973+
'$id' => 'test4',
5974+
'string' => 'test4',
5975+
'number' => 400,
5976+
'$createdBy' => 'explicit_creator_2',
5977+
'$updatedBy' => 'explicit_updater_2',
5978+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()), Permission::update(Role::any())]
5979+
]));
5980+
5981+
5982+
$this->assertEquals('explicit_creator_2', $doc4->getCreatedBy());
5983+
$this->assertEquals('explicit_updater_2', $doc4->getUpdatedBy());
5984+
5985+
5986+
$retrievedDoc4 = $database->getDocument($collection, 'test4');
5987+
$this->assertEquals('explicit_creator_2', $retrievedDoc4->getCreatedBy());
5988+
$this->assertEquals('explicit_updater_2', $retrievedDoc4->getUpdatedBy());
5989+
5990+
5991+
$allDocs = $database->find($collection);
5992+
$this->assertCount(4, $allDocs);
5993+
5994+
5995+
Authorization::setRole('user:test_user_2');
5996+
$updateDoc = new Document([
5997+
'string' => 'updated_test1',
5998+
'number' => 150
5999+
]);
6000+
$updatedDoc = $database->updateDocument($collection, 'test1', $updateDoc);
6001+
6002+
// Verify createdBy is preserved, updatedBy changes to current user
6003+
$this->assertEquals('test_user_1', $updatedDoc->getCreatedBy()); // Should preserve original creator
6004+
$this->assertEquals('test_user_2', $updatedDoc->getUpdatedBy()); // Should update to current user
6005+
6006+
$retrievedUpdatedDoc = $database->getDocument($collection, 'test1');
6007+
$this->assertEquals('test_user_1', $retrievedUpdatedDoc->getCreatedBy());
6008+
$this->assertEquals('test_user_2', $retrievedUpdatedDoc->getUpdatedBy());
6009+
6010+
$upsertDoc = new Document([
6011+
'$id' => 'test2',
6012+
'string' => 'upserted_test2',
6013+
'number' => 250
6014+
]);
6015+
$upsertCount = $database->createOrUpdateDocuments($collection, [$upsertDoc]);
6016+
$this->assertEquals(1, $upsertCount);
6017+
6018+
$upsertedDoc = $database->getDocument($collection, 'test2');
6019+
$this->assertEquals('explicit_creator', $upsertedDoc->getCreatedBy()); // Should preserve original creator
6020+
$this->assertEquals('test_user_2', $upsertedDoc->getUpdatedBy()); // Should update to current user
6021+
6022+
$upsertNewDoc = new Document([
6023+
'$id' => 'test5',
6024+
'string' => 'new_test5',
6025+
'number' => 500,
6026+
'$createdBy' => 'new_creator',
6027+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()), Permission::update(Role::any())]
6028+
]);
6029+
$upsertNewCount = $database->createOrUpdateDocuments($collection, [$upsertNewDoc]);
6030+
$this->assertEquals(1, $upsertNewCount);
6031+
6032+
$newUpsertedDoc = $database->getDocument($collection, 'test5');
6033+
$this->assertEquals('new_creator', $newUpsertedDoc->getCreatedBy()); // Should use explicit creator
6034+
$this->assertEquals('test_user_2', $newUpsertedDoc->getUpdatedBy()); // Should use current user
6035+
6036+
6037+
$bulkDocs = [
6038+
new Document([
6039+
'$id' => 'bulk1',
6040+
'string' => 'bulk1',
6041+
'number' => 600,
6042+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()), Permission::update(Role::any())]
6043+
]),
6044+
new Document([
6045+
'$id' => 'bulk2',
6046+
'string' => 'bulk2',
6047+
'number' => 700,
6048+
'$createdBy' => 'bulk_creator',
6049+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()), Permission::update(Role::any())]
6050+
]),
6051+
new Document([
6052+
'$id' => 'bulk3',
6053+
'string' => 'bulk3',
6054+
'number' => 800,
6055+
'$updatedBy' => 'bulk_updater',
6056+
'$permissions' => [Permission::read(Role::any()), Permission::write(Role::any()), Permission::update(Role::any())]
6057+
])
6058+
];
6059+
$bulkCount = $database->createDocuments($collection, $bulkDocs);
6060+
$this->assertEquals(3, $bulkCount);
6061+
6062+
$bulkDoc1 = $database->getDocument($collection, 'bulk1');
6063+
$bulkDoc2 = $database->getDocument($collection, 'bulk2');
6064+
$bulkDoc3 = $database->getDocument($collection, 'bulk3');
6065+
6066+
$this->assertEquals('test_user_2', $bulkDoc1->getCreatedBy());
6067+
$this->assertEquals('test_user_2', $bulkDoc1->getUpdatedBy());
6068+
6069+
$this->assertEquals('bulk_creator', $bulkDoc2->getCreatedBy());
6070+
$this->assertEquals('test_user_2', $bulkDoc2->getUpdatedBy());
6071+
6072+
$this->assertEquals('test_user_2', $bulkDoc3->getCreatedBy());
6073+
$this->assertEquals('bulk_updater', $bulkDoc3->getUpdatedBy());
6074+
6075+
$finalAllDocs = $database->find($collection);
6076+
$this->assertCount(8, $finalAllDocs);
6077+
6078+
$database->deleteCollection($collection);
6079+
}
6080+
6081+
59066082
}

0 commit comments

Comments
 (0)