Skip to content

Commit 808f90b

Browse files
committed
(feat): require Collection in createCollection
The public Database API now takes a Collection value object only. Adapter createCollection(string, attributes, indexes) is unchanged.
1 parent b9fcc57 commit 808f90b

45 files changed

Lines changed: 1219 additions & 1265 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎README.md‎

Lines changed: 15 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -355,58 +355,23 @@ $database->getKeywords();
355355
### Collection Methods
356356

357357
```php
358-
// Creates two new collection named '$namespace_$collectionName' with attribute names '_id', '_uid', '_createdAt', '_updatedAt', '_permissions'
358+
// Creates two new collection named '$namespace_$collectionName' with attribute names '_id', '_uid', '_createdAt', '_updatedAt', '_permissions'
359359
// The second collection is named '$namespace_$collectionName_perms' with attribute names '_id', '_type', '_permission', '_document'
360-
$database->createCollection(
361-
id: 'users'
362-
);
363-
364-
// Create collection with attributes and indexes
365-
$attributes = [
366-
new Document([
367-
'$id' => ID::unique(),
368-
'$permissions' => [
369-
Permission::read(Role::any()),
370-
Permission::update(Role::any()),
371-
Permission::delete(Role::any())
372-
],
373-
'name' => 'Jhon',
374-
'age' => 20
375-
]),
376-
new Document([
377-
'$id' => ID::unique(),
378-
'$permissions' => [
379-
Permission::read(Role::any()),
380-
Permission::update(Role::any()),
381-
Permission::delete(Role::any())
382-
],
383-
'name' => 'Doe',
384-
'age' => 34
385-
]),
386-
]
387-
388-
$indexes = [
389-
new Document([
390-
'$id' => ID::unique(),
391-
'type' => Database::INDEX_KEY,
392-
'attributes' => ['name'],
393-
'lengths' => [256],
394-
'orders' => ['ASC'],
395-
]),
396-
new Document([
397-
'$id' => ID::unique(),
398-
'type' => Database::INDEX_KEY,
399-
'attributes' => ['name', 'age'],
400-
'lengths' => [128, 128],
401-
'orders' => ['ASC'],
402-
])
403-
];
360+
$database->createCollection(new Collection(
361+
id: 'users',
362+
));
404363

405-
$database->createCollection(
406-
id: 'users',
407-
attributes: $attributes,
408-
indexes: $indexes
409-
);
364+
$database->createCollection(new Collection(
365+
id: 'users',
366+
attributes: [
367+
Attribute::string(key: 'name', size: 256),
368+
Attribute::integer(key: 'age'),
369+
],
370+
indexes: [
371+
Index::key(key: 'idx_name', attributes: ['name'], lengths: [256], orders: ['ASC']),
372+
Index::key(key: 'idx_name_age', attributes: ['name', 'age'], lengths: [128, 128], orders: ['ASC']),
373+
],
374+
));
410375

411376
// Update Collection Permissions
412377
$database->updateCollection(

‎bin/tasks/load.php‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Utopia\Database\Adapter\MariaDB;
1111
use Utopia\Database\Adapter\MySQL;
1212
use Utopia\Database\Adapter\Postgres;
13+
use Utopia\Database\Collection;
1314
use Utopia\Database\Database;
1415
use Utopia\Database\DateTime;
1516
use Utopia\Database\Document;
@@ -45,10 +46,10 @@
4546
$database->getAuthorization()->addRole(Role::any()->toString());
4647
$database->create();
4748

48-
$database->createCollection('articles', permissions: [
49+
$database->createCollection(new Collection(id: 'articles', permissions: [
4950
Permission::create(Role::any()),
5051
Permission::read(Role::any()),
51-
]);
52+
]));
5253

5354
$database->createAttribute('articles', 'author', Database::VAR_STRING, 256, true);
5455
$database->createAttribute('articles', 'created', Database::VAR_DATETIME, 0, true, filters: ['datetime']);

‎bin/tasks/operators.php‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
use Utopia\Database\Adapter\MySQL;
2525
use Utopia\Database\Adapter\Postgres;
2626
use Utopia\Database\Adapter\SQLite;
27+
use Utopia\Database\Collection;
2728
use Utopia\Database\Database;
2829
use Utopia\Database\DateTime;
2930
use Utopia\Database\Document;
@@ -152,12 +153,12 @@ function setupTestEnvironment(Database $database, string $name, int $seed): void
152153
$database->getAuthorization()->addRole(Role::any()->toString());
153154

154155
// Create test collection
155-
$database->createCollection('operators_test', permissions: [
156+
$database->createCollection(new Collection(id: 'operators_test', permissions: [
156157
Permission::create(Role::any()),
157158
Permission::read(Role::any()),
158159
Permission::update(Role::any()),
159160
Permission::delete(Role::any()),
160-
]);
161+
]));
161162

162163
// Create attributes for all operator types
163164
// Numeric attributes

‎bin/tasks/relationships.php‎

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Utopia\Database\Adapter\MariaDB;
1414
use Utopia\Database\Adapter\MySQL;
1515
use Utopia\Database\Adapter\Postgres;
16+
use Utopia\Database\Collection;
1617
use Utopia\Database\Database;
1718
use Utopia\Database\DateTime;
1819
use Utopia\Database\Document;
@@ -55,59 +56,59 @@
5556
}
5657
$database->getAuthorization()->addRole(Role::any()->toString());
5758
$database->create();
58-
$database->createCollection('authors', permissions: [
59+
$database->createCollection(new Collection(id: 'authors', permissions: [
5960
Permission::create(Role::any()),
6061
Permission::read(Role::any()),
6162
Permission::update(Role::any()),
62-
]);
63+
]));
6364
$database->createAttribute('authors', 'name', Database::VAR_STRING, 256, true);
6465
$database->createAttribute('authors', 'created', Database::VAR_DATETIME, 0, true, filters: ['datetime']);
6566
$database->createAttribute('authors', 'bio', Database::VAR_STRING, 5000, true);
6667
$database->createAttribute('authors', 'avatar', Database::VAR_STRING, 256, true);
6768
$database->createAttribute('authors', 'website', Database::VAR_STRING, 256, true);
6869

69-
$database->createCollection('articles', permissions: [
70+
$database->createCollection(new Collection(id: 'articles', permissions: [
7071
Permission::create(Role::any()),
7172
Permission::read(Role::any()),
7273
Permission::update(Role::any()),
73-
]);
74+
]));
7475
$database->createAttribute('articles', 'title', Database::VAR_STRING, 256, true);
7576
$database->createAttribute('articles', 'text', Database::VAR_STRING, 5000, true);
7677
$database->createAttribute('articles', 'genre', Database::VAR_STRING, 256, true);
7778
$database->createAttribute('articles', 'views', Database::VAR_INTEGER, 0, true);
7879
$database->createAttribute('articles', 'tags', Database::VAR_STRING, 0, true, array: true);
7980

80-
$database->createCollection('users', permissions: [
81+
$database->createCollection(new Collection(id: 'users', permissions: [
8182
Permission::create(Role::any()),
8283
Permission::read(Role::any()),
8384
Permission::update(Role::any()),
84-
]);
85+
]));
8586
$database->createAttribute('users', 'username', Database::VAR_STRING, 256, true);
8687
$database->createAttribute('users', 'email', Database::VAR_STRING, 256, true);
8788
$database->createAttribute('users', 'password', Database::VAR_STRING, 256, true);
8889

89-
$database->createCollection('comments', permissions: [
90+
$database->createCollection(new Collection(id: 'comments', permissions: [
9091
Permission::create(Role::any()),
9192
Permission::read(Role::any()),
9293
Permission::update(Role::any()),
93-
]);
94+
]));
9495
$database->createAttribute('comments', 'content', Database::VAR_STRING, 256, true);
9596
$database->createAttribute('comments', 'likes', Database::VAR_INTEGER, 8, true, signed: false);
9697

97-
$database->createCollection('profiles', permissions: [
98+
$database->createCollection(new Collection(id: 'profiles', permissions: [
9899
Permission::create(Role::any()),
99100
Permission::read(Role::any()),
100101
Permission::update(Role::any()),
101-
]);
102+
]));
102103
$database->createAttribute('profiles', 'bio_extended', Database::VAR_STRING, 10000, true);
103104
$database->createAttribute('profiles', 'social_links', Database::VAR_STRING, 256, true, array: true);
104105
$database->createAttribute('profiles', 'verified', Database::VAR_BOOLEAN, 0, true);
105106

106-
$database->createCollection('categories', permissions: [
107+
$database->createCollection(new Collection(id: 'categories', permissions: [
107108
Permission::create(Role::any()),
108109
Permission::read(Role::any()),
109110
Permission::update(Role::any()),
110-
]);
111+
]));
111112
$database->createAttribute('categories', 'name', Database::VAR_STRING, 256, true);
112113
$database->createAttribute('categories', 'description', Database::VAR_STRING, 1000, true);
113114

‎src/Database/Collection.php‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class Collection
1313
* @param array<Attribute> $attributes
1414
* @param array<Index> $indexes
1515
* @param array<string> $permissions
16+
* @param array<string, mixed> $metadata
1617
*/
1718
public function __construct(
1819
public string $id = '',
@@ -21,6 +22,7 @@ public function __construct(
2122
public array $indexes = [],
2223
public array $permissions = [],
2324
public bool $documentSecurity = true,
25+
public array $metadata = [],
2426
) {
2527
}
2628

‎src/Database/Migration/Tracker.php‎

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Utopia\Database\Migration;
44

55
use Utopia\Database\Attribute;
6+
use Utopia\Database\Collection;
67
use Utopia\Database\Database;
78
use Utopia\Database\Document;
89
use Utopia\Database\Helpers\ID;
@@ -33,15 +34,12 @@ public function setup(): void
3334
return;
3435
}
3536

36-
$this->db->createCollection(
37-
id: self::COLLECTION,
38-
attributes: [
39-
Attribute::string(key: 'version', required: true),
40-
Attribute::string(key: 'name', required: true),
41-
Attribute::integer(key: 'batch', required: true),
42-
Attribute::datetime(key: 'appliedAt', filters: ['datetime']),
43-
],
44-
);
37+
$this->db->createCollection(new Collection(id: self::COLLECTION, attributes: [
38+
Attribute::string(key: 'version', required: true),
39+
Attribute::string(key: 'name', required: true),
40+
Attribute::integer(key: 'batch', required: true),
41+
Attribute::datetime(key: 'appliedAt', filters: ['datetime']),
42+
]));
4543

4644
$this->initialized = true;
4745
}

‎src/Database/Mirror.php‎

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -340,18 +340,11 @@ public function listCollections(int $limit = 25, int $offset = 0): array
340340
/**
341341
* {@inheritdoc}
342342
*/
343-
public function createCollection(string|Collection $id, array $attributes = [], array $indexes = [], ?array $permissions = null, bool $documentSecurity = true, array $metadata = []): Document
343+
public function createCollection(Collection $collection): Document
344344
{
345-
$collectionId = $id instanceof Collection ? $id->id : $id;
345+
$collectionId = $collection->id;
346346

347-
$result = $this->source->createCollection(
348-
$id,
349-
$attributes,
350-
$indexes,
351-
$permissions,
352-
$documentSecurity,
353-
$metadata
354-
);
347+
$result = $this->source->createCollection($collection);
355348

356349
if ($this->destination === null) {
357350
return $result;
@@ -370,14 +363,7 @@ public function createCollection(string|Collection $id, array $attributes = [],
370363
}
371364
}
372365

373-
$this->destination->createCollection(
374-
$id,
375-
$attributes,
376-
$indexes,
377-
$permissions,
378-
$documentSecurity,
379-
$metadata
380-
);
366+
$this->destination->createCollection($collection);
381367

382368
$this->silent(function () use ($collectionId) {
383369
$this->createUpgrades();
@@ -1298,17 +1284,13 @@ public function createUpgrades(): void
12981284
return;
12991285
}
13001286

1301-
$this->source->createCollection(
1302-
id: 'upgrades',
1303-
attributes: [
1304-
Attribute::string(key: 'collectionId', required: true),
1305-
Attribute::string(key: 'status'),
1306-
],
1307-
indexes: [
1308-
Index::unique(key: '_unique_collection', attributes: ['collectionId'], lengths: [Database::LENGTH_KEY]),
1309-
Index::key(key: '_status_index', attributes: ['status'], lengths: [Database::LENGTH_KEY], orders: [OrderDirection::Asc->value]),
1310-
],
1311-
);
1287+
$this->source->createCollection(new Collection(id: 'upgrades', attributes: [
1288+
Attribute::string(key: 'collectionId', required: true),
1289+
Attribute::string(key: 'status'),
1290+
], indexes: [
1291+
Index::unique(key: '_unique_collection', attributes: ['collectionId'], lengths: [Database::LENGTH_KEY]),
1292+
Index::key(key: '_status_index', attributes: ['status'], lengths: [Database::LENGTH_KEY], orders: [OrderDirection::Asc->value]),
1293+
]));
13121294
}
13131295

13141296
/**

‎src/Database/Traits/Collections.php‎

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -36,30 +36,24 @@ trait Collections
3636
/**
3737
* Create Collection
3838
*
39-
* @param string|Collection $id The collection identifier, or a Collection whose fields take precedence
40-
* @param array<Attribute|Document> $attributes Initial attributes for the collection
41-
* @param array<Index|Document> $indexes Initial indexes for the collection
42-
* @param array<string>|null $permissions Permission strings, defaults to allow any create
43-
* @param bool $documentSecurity Whether to enable document-level security
44-
* @param array<string, mixed> $metadata Additional metadata attributes to merge into the collection document
39+
* @param Collection $collection Collection to create
4540
* @return Document The created collection metadata document
4641
*
4742
* @throws DatabaseException
4843
* @throws DuplicateException
4944
* @throws LimitException
5045
*/
51-
public function createCollection(string|Collection $id, array $attributes = [], array $indexes = [], ?array $permissions = null, bool $documentSecurity = true, array $metadata = []): Document
46+
public function createCollection(Collection $collection): Document
5247
{
53-
if ($id instanceof Collection) {
54-
$name = $id->name !== '' ? $id->name : $id->id;
55-
$attributes = $id->attributes;
56-
$indexes = $id->indexes;
57-
$permissions = $id->permissions !== [] ? $id->permissions : $permissions;
58-
$documentSecurity = $id->documentSecurity;
59-
$id = $id->id;
60-
} else {
61-
$name = $id;
62-
}
48+
$id = $collection->id;
49+
$name = $collection->name !== '' ? $collection->name : $collection->id;
50+
$attributes = $collection->attributes;
51+
$indexes = $collection->indexes;
52+
$permissions = $collection->permissions !== []
53+
? $collection->permissions
54+
: [Permission::create(Role::any())];
55+
$documentSecurity = $collection->documentSecurity;
56+
$metadata = $collection->metadata;
6357

6458
$attributes = array_map(fn ($attr): Attribute => $attr instanceof Attribute ? $attr : Attribute::fromDocument($attr), $attributes);
6559
$indexes = array_map(fn ($idx): Index => $idx instanceof Index ? $idx : Index::fromDocument($idx), $indexes);
@@ -73,10 +67,6 @@ public function createCollection(string|Collection $id, array $attributes = [],
7367
}
7468
}
7569

76-
$permissions ??= [
77-
Permission::create(Role::any()),
78-
];
79-
8070
if ($this->validate) {
8171
$validator = new Permissions();
8272
if (! $validator->isValid($permissions)) {

‎src/Database/Traits/Databases.php‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Utopia\Database\Traits;
44

55
use Utopia\Database\Attribute;
6+
use Utopia\Database\Collection;
67
use Utopia\Database\Document;
78
use Utopia\Database\Event;
89
use Utopia\Database\Exception as DatabaseException;
@@ -31,7 +32,10 @@ public function create(?string $database = null): bool
3132
$attributes[] = Attribute::fromDocument($attribute);
3233
}
3334

34-
$this->silent(fn () => $this->createCollection(self::METADATA, $attributes));
35+
$this->silent(fn () => $this->createCollection(new Collection(
36+
id: self::METADATA,
37+
attributes: $attributes,
38+
)));
3539

3640
$this->trigger(Event::DatabaseCreate, $database);
3741

‎src/Database/Traits/Relationships.php‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Utopia\Console;
77
use Utopia\Database\Adapter\Feature;
88
use Utopia\Database\Attribute;
9+
use Utopia\Database\Collection;
910
use Utopia\Database\Database;
1011
use Utopia\Database\Document;
1112
use Utopia\Database\Event;
@@ -231,7 +232,7 @@ public function createRelationship(
231232
Index::key(key: '_index_'.$twoWayKey, attributes: [$twoWayKey]),
232233
];
233234
try {
234-
$this->silent(fn () => $this->createCollection($junctionCollection, $junctionAttributes, $junctionIndexes));
235+
$this->silent(fn () => $this->createCollection(new Collection(id: $junctionCollection, attributes: $junctionAttributes, indexes: $junctionIndexes)));
235236
} catch (DuplicateException) {
236237
// Junction metadata already exists from a prior partial failure.
237238
// Ensure the physical schema also exists.

0 commit comments

Comments
 (0)