Skip to content

Commit 18e0416

Browse files
authored
Merge branch 'main' into 3.x
2 parents 8062cfc + ce3986e commit 18e0416

Some content is hidden

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

43 files changed

+2129
-1339
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ A list of the utopia/php concepts and their relevant equivalent using the differ
2626
- **Document** - A simple JSON object that will be stored in one of the utopia/database collections. For SQL-based adapters, this will be equivalent to a row. For a No-SQL adapter, this will equivalent to a native document.
2727
- **Attribute** - A simple document attribute. For SQL-based adapters, this will be equivalent to a column. For a No-SQL adapter, this will equivalent to a native document field.
2828
- **Index** - A simple collection index used to improve the performance of your database queries.
29-
- **Permissions** - Using permissions, you can decide which roles have read, create, update and delete access for a specific document. The special attribute `$permissions` is used to store permission metadata for each document in the collection. A permission role can be any string you want. You can use `Authorization::setRole()` to delegate new roles to your users, once obtained a new role a user would gain read, create, update or delete access to a relevant document.
29+
- **Permissions** - Using permissions, you can decide which roles have read, create, update and delete access for a specific document. The special attribute `$permissions` is used to store permission metadata for each document in the collection. A permission role can be any string you want. You can use `$authorization->addRole()` to delegate new roles to your users, once obtained a new role a user would gain read, create, update or delete access to a relevant document.
3030

3131
### Filters
3232

bin/tasks/load.php

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
use Utopia\Database\Helpers\Permission;
1717
use Utopia\Database\Helpers\Role;
1818
use Utopia\Database\PDO;
19-
use Utopia\Database\Validator\Authorization;
2019
use Utopia\Validator\Boolean;
2120
use Utopia\Validator\Integer;
2221
use Utopia\Validator\Text;
@@ -26,6 +25,7 @@
2625
$genresPool = ['fashion', 'food', 'travel', 'music', 'lifestyle', 'fitness', 'diy', 'sports', 'finance'];
2726
$tagsPool = ['short', 'quick', 'easy', 'medium', 'hard'];
2827

28+
2929
/**
3030
* @Example
3131
* docker compose exec tests bin/load --adapter=mariadb --limit=1000
@@ -38,6 +38,30 @@
3838
->param('name', 'myapp_' . uniqid(), new Text(0), 'Name of created database.', true)
3939
->param('sharedTables', false, new Boolean(true), 'Whether to use shared tables', true)
4040
->action(function (string $adapter, int $limit, string $name, bool $sharedTables) {
41+
42+
43+
$createSchema = function (Database $database): void {
44+
if ($database->exists($database->getDatabase())) {
45+
$database->delete($database->getDatabase());
46+
}
47+
$database->getAuthorization()->addRole(Role::any()->toString());
48+
$database->create();
49+
50+
$database->createCollection('articles', permissions: [
51+
Permission::create(Role::any()),
52+
Permission::read(Role::any()),
53+
]);
54+
55+
$database->createAttribute('articles', 'author', Database::VAR_STRING, 256, true);
56+
$database->createAttribute('articles', 'created', Database::VAR_DATETIME, 0, true, filters: ['datetime']);
57+
$database->createAttribute('articles', 'text', Database::VAR_STRING, 5000, true);
58+
$database->createAttribute('articles', 'genre', Database::VAR_STRING, 256, true);
59+
$database->createAttribute('articles', 'views', Database::VAR_INTEGER, 0, true);
60+
$database->createAttribute('articles', 'tags', Database::VAR_STRING, 0, true, array: true);
61+
$database->createIndex('articles', 'text', Database::INDEX_FULLTEXT, ['text']);
62+
};
63+
64+
4165
$start = null;
4266
$namespace = '_ns';
4367
$cache = new Cache(new NoCache());
@@ -95,7 +119,7 @@
95119
$cfg['attrs']
96120
);
97121

98-
createSchema(
122+
$createSchema(
99123
(new Database(new ($cfg['adapter'])($pdo), $cache))
100124
->setDatabase($name)
101125
->setNamespace($namespace)
@@ -138,27 +162,7 @@
138162
Console::success("Completed in {$time} seconds");
139163
});
140164

141-
function createSchema(Database $database): void
142-
{
143-
if ($database->exists($database->getDatabase())) {
144-
$database->delete($database->getDatabase());
145-
}
146-
$database->create();
147165

148-
Authorization::setRole(Role::any()->toString());
149-
150-
$database->createCollection('articles', permissions: [
151-
Permission::create(Role::any()),
152-
Permission::read(Role::any()),
153-
]);
154-
155-
$database->createAttribute('articles', 'author', Database::VAR_STRING, 256, true);
156-
$database->createAttribute('articles', 'created', Database::VAR_DATETIME, 0, true, filters: ['datetime']);
157-
$database->createAttribute('articles', 'text', Database::VAR_STRING, 5000, true);
158-
$database->createAttribute('articles', 'genre', Database::VAR_STRING, 256, true);
159-
$database->createAttribute('articles', 'views', Database::VAR_INTEGER, 0, true);
160-
$database->createAttribute('articles', 'tags', Database::VAR_STRING, 0, true, array: true);
161-
}
162166

163167
function createDocuments(Database $database): void
164168
{

bin/tasks/query.php

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
* @Example
2525
* docker compose exec tests bin/query --adapter=mariadb --limit=1000 --name=testing
2626
*/
27+
2728
$cli
2829
->task('query')
2930
->desc('Query mock data')
@@ -32,6 +33,14 @@
3233
->param('limit', 25, new Integer(true), 'Limit on queried documents', true)
3334
->param('sharedTables', false, new Boolean(true), 'Whether to use shared tables', true)
3435
->action(function (string $adapter, string $name, int $limit, bool $sharedTables) {
36+
37+
$setRoles = function (Authorization $authorization, $faker, $count): int {
38+
for ($i = 0; $i < $count; $i++) {
39+
$authorization->addRole($faker->numerify('user####'));
40+
}
41+
return \count($authorization->getRoles());
42+
};
43+
3544
$namespace = '_ns';
3645
$cache = new Cache(new NoCache());
3746

@@ -91,35 +100,35 @@
91100

92101
$report = [];
93102

94-
$count = setRoles($faker, 1);
103+
$count = $setRoles($database->getAuthorization(), $faker, 1);
95104
Console::info("\nRunning queries with {$count} authorization roles:");
96105
$report[] = [
97106
'roles' => $count,
98107
'results' => runQueries($database, $limit)
99108
];
100109

101-
$count = setRoles($faker, 100);
110+
$count = $setRoles($database->getAuthorization(), $faker, 100);
102111
Console::info("\nRunning queries with {$count} authorization roles:");
103112
$report[] = [
104113
'roles' => $count,
105114
'results' => runQueries($database, $limit)
106115
];
107116

108-
$count = setRoles($faker, 400);
117+
$count = $setRoles($database->getAuthorization(), $faker, 400);
109118
Console::info("\nRunning queries with {$count} authorization roles:");
110119
$report[] = [
111120
'roles' => $count,
112121
'results' => runQueries($database, $limit)
113122
];
114123

115-
$count = setRoles($faker, 500);
124+
$count = $setRoles($database->getAuthorization(), $faker, 500);
116125
Console::info("\nRunning queries with {$count} authorization roles:");
117126
$report[] = [
118127
'roles' => $count,
119128
'results' => runQueries($database, $limit)
120129
];
121130

122-
$count = setRoles($faker, 1000);
131+
$count = $setRoles($database->getAuthorization(), $faker, 1000);
123132
Console::info("\nRunning queries with {$count} authorization roles:");
124133
$report[] = [
125134
'roles' => $count,
@@ -136,13 +145,6 @@
136145
\fclose($results);
137146
});
138147

139-
function setRoles($faker, $count): int
140-
{
141-
for ($i = 0; $i < $count; $i++) {
142-
Authorization::setRole($faker->numerify('user####'));
143-
}
144-
return \count(Authorization::getRoles());
145-
}
146148

147149
function runQueries(Database $database, int $limit): array
148150
{

bin/tasks/relationships.php

Lines changed: 71 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
use Utopia\Database\Helpers\Role;
2121
use Utopia\Database\PDO;
2222
use Utopia\Database\Query;
23-
use Utopia\Database\Validator\Authorization;
2423
use Utopia\Validator\Boolean;
2524
use Utopia\Validator\Integer;
2625
use Utopia\Validator\Text;
@@ -34,6 +33,7 @@
3433
* @Example
3534
* docker compose exec tests bin/relationships --adapter=mariadb --limit=1000
3635
*/
36+
3737
$cli
3838
->task('relationships')
3939
->desc('Load database with mock relationships for testing')
@@ -49,6 +49,75 @@
4949

5050
Console::info("Filling {$adapter} with {$limit} records: {$name}");
5151

52+
$createRelationshipSchema = function (Database $database): void {
53+
if ($database->exists($database->getDatabase())) {
54+
$database->delete($database->getDatabase());
55+
}
56+
$database->getAuthorization()->addRole(Role::any()->toString());
57+
$database->create();
58+
$database->createCollection('authors', permissions: [
59+
Permission::create(Role::any()),
60+
Permission::read(Role::any()),
61+
Permission::update(Role::any()),
62+
]);
63+
$database->createAttribute('authors', 'name', Database::VAR_STRING, 256, true);
64+
$database->createAttribute('authors', 'created', Database::VAR_DATETIME, 0, true, filters: ['datetime']);
65+
$database->createAttribute('authors', 'bio', Database::VAR_STRING, 5000, true);
66+
$database->createAttribute('authors', 'avatar', Database::VAR_STRING, 256, true);
67+
$database->createAttribute('authors', 'website', Database::VAR_STRING, 256, true);
68+
69+
$database->createCollection('articles', permissions: [
70+
Permission::create(Role::any()),
71+
Permission::read(Role::any()),
72+
Permission::update(Role::any()),
73+
]);
74+
$database->createAttribute('articles', 'title', Database::VAR_STRING, 256, true);
75+
$database->createAttribute('articles', 'text', Database::VAR_STRING, 5000, true);
76+
$database->createAttribute('articles', 'genre', Database::VAR_STRING, 256, true);
77+
$database->createAttribute('articles', 'views', Database::VAR_INTEGER, 0, true);
78+
$database->createAttribute('articles', 'tags', Database::VAR_STRING, 0, true, array: true);
79+
80+
$database->createCollection('users', permissions: [
81+
Permission::create(Role::any()),
82+
Permission::read(Role::any()),
83+
Permission::update(Role::any()),
84+
]);
85+
$database->createAttribute('users', 'username', Database::VAR_STRING, 256, true);
86+
$database->createAttribute('users', 'email', Database::VAR_STRING, 256, true);
87+
$database->createAttribute('users', 'password', Database::VAR_STRING, 256, true);
88+
89+
$database->createCollection('comments', permissions: [
90+
Permission::create(Role::any()),
91+
Permission::read(Role::any()),
92+
Permission::update(Role::any()),
93+
]);
94+
$database->createAttribute('comments', 'content', Database::VAR_STRING, 256, true);
95+
$database->createAttribute('comments', 'likes', Database::VAR_INTEGER, 8, true, signed: false);
96+
97+
$database->createCollection('profiles', permissions: [
98+
Permission::create(Role::any()),
99+
Permission::read(Role::any()),
100+
Permission::update(Role::any()),
101+
]);
102+
$database->createAttribute('profiles', 'bio_extended', Database::VAR_STRING, 10000, true);
103+
$database->createAttribute('profiles', 'social_links', Database::VAR_STRING, 256, true, array: true);
104+
$database->createAttribute('profiles', 'verified', Database::VAR_BOOLEAN, 0, true);
105+
106+
$database->createCollection('categories', permissions: [
107+
Permission::create(Role::any()),
108+
Permission::read(Role::any()),
109+
Permission::update(Role::any()),
110+
]);
111+
$database->createAttribute('categories', 'name', Database::VAR_STRING, 256, true);
112+
$database->createAttribute('categories', 'description', Database::VAR_STRING, 1000, true);
113+
114+
$database->createRelationship('authors', 'articles', Database::RELATION_MANY_TO_MANY, true, onDelete: Database::RELATION_MUTATE_SET_NULL);
115+
$database->createRelationship('articles', 'comments', Database::RELATION_ONE_TO_MANY, true, twoWayKey: 'article', onDelete: Database::RELATION_MUTATE_CASCADE);
116+
$database->createRelationship('users', 'comments', Database::RELATION_ONE_TO_MANY, true, twoWayKey: 'user', onDelete: Database::RELATION_MUTATE_CASCADE);
117+
$database->createRelationship('authors', 'profiles', Database::RELATION_ONE_TO_ONE, true, twoWayKey: 'author', onDelete: Database::RELATION_MUTATE_CASCADE);
118+
$database->createRelationship('articles', 'categories', Database::RELATION_MANY_TO_ONE, true, id: 'category', twoWayKey: 'articles', onDelete: Database::RELATION_MUTATE_SET_NULL);
119+
};
120+
52121
$dbAdapters = [
53122
'mariadb' => [
54123
'host' => 'mariadb',
@@ -98,7 +167,7 @@
98167
->setNamespace($namespace)
99168
->setSharedTables($sharedTables);
100169

101-
createRelationshipSchema($database);
170+
$createRelationshipSchema($database);
102171

103172
// Create categories and users once before parallel batch creation
104173
$globalDocs = createGlobalDocuments($database, $limit);
@@ -165,77 +234,6 @@
165234
displayBenchmarkResults($results, $runs);
166235
});
167236

168-
function createRelationshipSchema(Database $database): void
169-
{
170-
if ($database->exists($database->getDatabase())) {
171-
$database->delete($database->getDatabase());
172-
}
173-
$database->create();
174-
175-
Authorization::setRole(Role::any()->toString());
176-
177-
$database->createCollection('authors', permissions: [
178-
Permission::create(Role::any()),
179-
Permission::read(Role::any()),
180-
Permission::update(Role::any()),
181-
]);
182-
$database->createAttribute('authors', 'name', Database::VAR_STRING, 256, true);
183-
$database->createAttribute('authors', 'created', Database::VAR_DATETIME, 0, true, filters: ['datetime']);
184-
$database->createAttribute('authors', 'bio', Database::VAR_STRING, 5000, true);
185-
$database->createAttribute('authors', 'avatar', Database::VAR_STRING, 256, true);
186-
$database->createAttribute('authors', 'website', Database::VAR_STRING, 256, true);
187-
188-
$database->createCollection('articles', permissions: [
189-
Permission::create(Role::any()),
190-
Permission::read(Role::any()),
191-
Permission::update(Role::any()),
192-
]);
193-
$database->createAttribute('articles', 'title', Database::VAR_STRING, 256, true);
194-
$database->createAttribute('articles', 'text', Database::VAR_STRING, 5000, true);
195-
$database->createAttribute('articles', 'genre', Database::VAR_STRING, 256, true);
196-
$database->createAttribute('articles', 'views', Database::VAR_INTEGER, 0, true);
197-
$database->createAttribute('articles', 'tags', Database::VAR_STRING, 0, true, array: true);
198-
199-
$database->createCollection('users', permissions: [
200-
Permission::create(Role::any()),
201-
Permission::read(Role::any()),
202-
Permission::update(Role::any()),
203-
]);
204-
$database->createAttribute('users', 'username', Database::VAR_STRING, 256, true);
205-
$database->createAttribute('users', 'email', Database::VAR_STRING, 256, true);
206-
$database->createAttribute('users', 'password', Database::VAR_STRING, 256, true);
207-
208-
$database->createCollection('comments', permissions: [
209-
Permission::create(Role::any()),
210-
Permission::read(Role::any()),
211-
Permission::update(Role::any()),
212-
]);
213-
$database->createAttribute('comments', 'content', Database::VAR_STRING, 256, true);
214-
$database->createAttribute('comments', 'likes', Database::VAR_INTEGER, 8, true, signed: false);
215-
216-
$database->createCollection('profiles', permissions: [
217-
Permission::create(Role::any()),
218-
Permission::read(Role::any()),
219-
Permission::update(Role::any()),
220-
]);
221-
$database->createAttribute('profiles', 'bio_extended', Database::VAR_STRING, 10000, true);
222-
$database->createAttribute('profiles', 'social_links', Database::VAR_STRING, 256, true, array: true);
223-
$database->createAttribute('profiles', 'verified', Database::VAR_BOOLEAN, 0, true);
224-
225-
$database->createCollection('categories', permissions: [
226-
Permission::create(Role::any()),
227-
Permission::read(Role::any()),
228-
Permission::update(Role::any()),
229-
]);
230-
$database->createAttribute('categories', 'name', Database::VAR_STRING, 256, true);
231-
$database->createAttribute('categories', 'description', Database::VAR_STRING, 1000, true);
232-
233-
$database->createRelationship('authors', 'articles', Database::RELATION_MANY_TO_MANY, true, onDelete: Database::RELATION_MUTATE_SET_NULL);
234-
$database->createRelationship('articles', 'comments', Database::RELATION_ONE_TO_MANY, true, twoWayKey: 'article', onDelete: Database::RELATION_MUTATE_CASCADE);
235-
$database->createRelationship('users', 'comments', Database::RELATION_ONE_TO_MANY, true, twoWayKey: 'user', onDelete: Database::RELATION_MUTATE_CASCADE);
236-
$database->createRelationship('authors', 'profiles', Database::RELATION_ONE_TO_ONE, true, twoWayKey: 'author', onDelete: Database::RELATION_MUTATE_CASCADE);
237-
$database->createRelationship('articles', 'categories', Database::RELATION_MANY_TO_ONE, true, id: 'category', twoWayKey: 'articles', onDelete: Database::RELATION_MUTATE_SET_NULL);
238-
}
239237

240238
function createGlobalDocuments(Database $database, int $limit): array
241239
{
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"roles":2,"results":{"Querying greater than, equal[1] and limit":0.03397989273071289,"Querying equal[3] and limit":0.07099103927612305,"Querying greaterThan, limit(1000)":0.18834996223449707,"Query search, limit(1000)":0.0020699501037597656,"Querying contains[1], limit(1000)":0.002312898635864258}},{"roles":101,"results":{"Querying greater than, equal[1] and limit":0.026144027709960938,"Querying equal[3] and limit":0.07204604148864746,"Querying greaterThan, limit(1000)":0.18575501441955566,"Query search, limit(1000)":0.0020110607147216797,"Querying contains[1], limit(1000)":0.002538919448852539}},{"roles":489,"results":{"Querying greater than, equal[1] and limit":0.02759695053100586,"Querying equal[3] and limit":0.07203984260559082,"Querying greaterThan, limit(1000)":0.18977999687194824,"Query search, limit(1000)":0.003882884979248047,"Querying contains[1], limit(1000)":0.0029969215393066406}},{"roles":958,"results":{"Querying greater than, equal[1] and limit":0.029262065887451172,"Querying equal[3] and limit":0.0740351676940918,"Querying greaterThan, limit(1000)":0.18916702270507812,"Query search, limit(1000)":0.0023200511932373047,"Querying contains[1], limit(1000)":0.0027260780334472656}},{"roles":1825,"results":{"Querying greater than, equal[1] and limit":0.028146982192993164,"Querying equal[3] and limit":0.07226085662841797,"Querying greaterThan, limit(1000)":0.18572497367858887,"Query search, limit(1000)":0.002095937728881836,"Querying contains[1], limit(1000)":0.0025589466094970703}}]

composer.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)