Merge remote-tracking branch 'origin/1.8.x' into feat-txn

# Conflicts:
#	composer.lock
This commit is contained in:
Jake Barnby 2025-09-05 21:40:21 +12:00
commit f4bf1756c9
No known key found for this signature in database
GPG key ID: C437A8CC85B96E9C
36 changed files with 370 additions and 254 deletions

View file

@ -226,7 +226,7 @@ return [
[
'key' => 'cli',
'name' => 'Command Line',
'version' => '9.0.2',
'version' => '9.1.0',
'url' => 'https://github.com/appwrite/sdk-for-cli',
'package' => 'https://www.npmjs.com/package/appwrite-cli',
'enabled' => true,

View file

@ -1891,7 +1891,7 @@
"prefs": {
"type": "object",
"description": "Prefs key-value JSON object.",
"x-example": "{}"
"x-example": "{\"language\":\"en\",\"timezone\":\"UTC\",\"darkTheme\":true}"
}
},
"required": [
@ -5020,7 +5020,7 @@
"data": {
"type": "object",
"description": "Document data as JSON object.",
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",
@ -7675,7 +7675,7 @@
"data": {
"type": "object",
"description": "Row data as JSON object.",
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",

View file

@ -1911,7 +1911,7 @@
"prefs": {
"type": "object",
"description": "Prefs key-value JSON object.",
"x-example": "{}"
"x-example": "{\"language\":\"en\",\"timezone\":\"UTC\",\"darkTheme\":true}"
}
},
"required": [
@ -9575,7 +9575,7 @@
"data": {
"type": "object",
"description": "Document data as JSON object.",
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",
@ -15150,7 +15150,7 @@
},
"\/health\/queue\/stats-resources": {
"get": {
"summary": "Get stats resources queue",
"summary": "Get stats resources queue",
"operationId": "healthGetQueueStatsResources",
"tags": [
"health"
@ -37474,7 +37474,7 @@
"data": {
"type": "object",
"description": "Row data as JSON object.",
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",

View file

@ -1926,7 +1926,7 @@
"prefs": {
"type": "object",
"description": "Prefs key-value JSON object.",
"x-example": "{}"
"x-example": "{\"language\":\"en\",\"timezone\":\"UTC\",\"darkTheme\":true}"
}
},
"required": [
@ -9057,7 +9057,7 @@
"data": {
"type": "object",
"description": "Document data as JSON object.",
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",
@ -13887,7 +13887,7 @@
},
"\/health\/queue\/stats-resources": {
"get": {
"summary": "Get stats resources queue",
"summary": "Get stats resources queue",
"operationId": "healthGetQueueStatsResources",
"tags": [
"health"
@ -27845,7 +27845,7 @@
"data": {
"type": "object",
"description": "Row data as JSON object.",
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",

View file

@ -1891,7 +1891,7 @@
"prefs": {
"type": "object",
"description": "Prefs key-value JSON object.",
"x-example": "{}"
"x-example": "{\"language\":\"en\",\"timezone\":\"UTC\",\"darkTheme\":true}"
}
},
"required": [
@ -5020,7 +5020,7 @@
"data": {
"type": "object",
"description": "Document data as JSON object.",
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",
@ -7675,7 +7675,7 @@
"data": {
"type": "object",
"description": "Row data as JSON object.",
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",

View file

@ -1911,7 +1911,7 @@
"prefs": {
"type": "object",
"description": "Prefs key-value JSON object.",
"x-example": "{}"
"x-example": "{\"language\":\"en\",\"timezone\":\"UTC\",\"darkTheme\":true}"
}
},
"required": [
@ -9575,7 +9575,7 @@
"data": {
"type": "object",
"description": "Document data as JSON object.",
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",
@ -15150,7 +15150,7 @@
},
"\/health\/queue\/stats-resources": {
"get": {
"summary": "Get stats resources queue",
"summary": "Get stats resources queue",
"operationId": "healthGetQueueStatsResources",
"tags": [
"health"
@ -37474,7 +37474,7 @@
"data": {
"type": "object",
"description": "Row data as JSON object.",
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",

View file

@ -1926,7 +1926,7 @@
"prefs": {
"type": "object",
"description": "Prefs key-value JSON object.",
"x-example": "{}"
"x-example": "{\"language\":\"en\",\"timezone\":\"UTC\",\"darkTheme\":true}"
}
},
"required": [
@ -9057,7 +9057,7 @@
"data": {
"type": "object",
"description": "Document data as JSON object.",
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",
@ -13887,7 +13887,7 @@
},
"\/health\/queue\/stats-resources": {
"get": {
"summary": "Get stats resources queue",
"summary": "Get stats resources queue",
"operationId": "healthGetQueueStatsResources",
"tags": [
"health"
@ -27845,7 +27845,7 @@
"data": {
"type": "object",
"description": "Row data as JSON object.",
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",

View file

@ -1979,7 +1979,7 @@
"type": "object",
"description": "Prefs key-value JSON object.",
"default": {},
"x-example": "{}"
"x-example": "{\"language\":\"en\",\"timezone\":\"UTC\",\"darkTheme\":true}"
}
},
"required": [
@ -5154,7 +5154,7 @@
"type": "object",
"description": "Document data as JSON object.",
"default": [],
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",
@ -7749,7 +7749,7 @@
"type": "object",
"description": "Row data as JSON object.",
"default": [],
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",

View file

@ -2009,7 +2009,7 @@
"type": "object",
"description": "Prefs key-value JSON object.",
"default": {},
"x-example": "{}"
"x-example": "{\"language\":\"en\",\"timezone\":\"UTC\",\"darkTheme\":true}"
}
},
"required": [
@ -9680,7 +9680,7 @@
"type": "object",
"description": "Document data as JSON object.",
"default": [],
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",
@ -15186,7 +15186,7 @@
},
"\/health\/queue\/stats-resources": {
"get": {
"summary": "Get stats resources queue",
"summary": "Get stats resources queue",
"operationId": "healthGetQueueStatsResources",
"consumes": [],
"produces": [
@ -37572,7 +37572,7 @@
"type": "object",
"description": "Row data as JSON object.",
"default": [],
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",

View file

@ -2023,7 +2023,7 @@
"type": "object",
"description": "Prefs key-value JSON object.",
"default": {},
"x-example": "{}"
"x-example": "{\"language\":\"en\",\"timezone\":\"UTC\",\"darkTheme\":true}"
}
},
"required": [
@ -9152,7 +9152,7 @@
"type": "object",
"description": "Document data as JSON object.",
"default": [],
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",
@ -13952,7 +13952,7 @@
},
"\/health\/queue\/stats-resources": {
"get": {
"summary": "Get stats resources queue",
"summary": "Get stats resources queue",
"operationId": "healthGetQueueStatsResources",
"consumes": [],
"produces": [
@ -28003,7 +28003,7 @@
"type": "object",
"description": "Row data as JSON object.",
"default": [],
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",

View file

@ -1979,7 +1979,7 @@
"type": "object",
"description": "Prefs key-value JSON object.",
"default": {},
"x-example": "{}"
"x-example": "{\"language\":\"en\",\"timezone\":\"UTC\",\"darkTheme\":true}"
}
},
"required": [
@ -5154,7 +5154,7 @@
"type": "object",
"description": "Document data as JSON object.",
"default": [],
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",
@ -7749,7 +7749,7 @@
"type": "object",
"description": "Row data as JSON object.",
"default": [],
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",

View file

@ -2009,7 +2009,7 @@
"type": "object",
"description": "Prefs key-value JSON object.",
"default": {},
"x-example": "{}"
"x-example": "{\"language\":\"en\",\"timezone\":\"UTC\",\"darkTheme\":true}"
}
},
"required": [
@ -9680,7 +9680,7 @@
"type": "object",
"description": "Document data as JSON object.",
"default": [],
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",
@ -15186,7 +15186,7 @@
},
"\/health\/queue\/stats-resources": {
"get": {
"summary": "Get stats resources queue",
"summary": "Get stats resources queue",
"operationId": "healthGetQueueStatsResources",
"consumes": [],
"produces": [
@ -37572,7 +37572,7 @@
"type": "object",
"description": "Row data as JSON object.",
"default": [],
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",

View file

@ -2023,7 +2023,7 @@
"type": "object",
"description": "Prefs key-value JSON object.",
"default": {},
"x-example": "{}"
"x-example": "{\"language\":\"en\",\"timezone\":\"UTC\",\"darkTheme\":true}"
}
},
"required": [
@ -9152,7 +9152,7 @@
"type": "object",
"description": "Document data as JSON object.",
"default": [],
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",
@ -13952,7 +13952,7 @@
},
"\/health\/queue\/stats-resources": {
"get": {
"summary": "Get stats resources queue",
"summary": "Get stats resources queue",
"operationId": "healthGetQueueStatsResources",
"consumes": [],
"produces": [
@ -28003,7 +28003,7 @@
"type": "object",
"description": "Row data as JSON object.",
"default": [],
"x-example": "{}"
"x-example": "{\"username\":\"walter.obrien\",\"email\":\"walter.obrien@example.com\",\"fullName\":\"Walter O'Brien\",\"age\":30,\"isAdmin\":false}"
},
"permissions": {
"type": "array",

View file

@ -3168,7 +3168,7 @@ App::patch('/v1/account/prefs')
],
contentType: ContentType::JSON
))
->param('prefs', [], new Assoc(), 'Prefs key-value JSON object.')
->param('prefs', [], new Assoc(), 'Prefs key-value JSON object.', example: '{"language":"en","timezone":"UTC","darkTheme":true}')
->inject('requestTimestamp')
->inject('response')
->inject('user')

View file

@ -30,14 +30,11 @@ use Utopia\Database\Database;
use Utopia\Database\DateTime;
use Utopia\Database\Document;
use Utopia\Database\Exception\Duplicate;
use Utopia\Database\Exception\Order as OrderException;
use Utopia\Database\Exception\Query as QueryException;
use Utopia\Database\Helpers\ID;
use Utopia\Database\Helpers\Permission;
use Utopia\Database\Helpers\Role;
use Utopia\Database\Query;
use Utopia\Database\Validator\Datetime as DatetimeValidator;
use Utopia\Database\Validator\Query\Cursor;
use Utopia\Database\Validator\UID;
use Utopia\Domains\Validator\PublicDomain;
use Utopia\DSN\DSN;
@ -304,77 +301,6 @@ App::post('/v1/projects')
->dynamic($project, Response::MODEL_PROJECT);
});
App::get('/v1/projects')
->desc('List projects')
->groups(['api', 'projects'])
->label('scope', 'projects.read')
->label('sdk', new Method(
namespace: 'projects',
group: 'projects',
name: 'list',
description: '/docs/references/projects/list.md',
auth: [AuthType::ADMIN],
responses: [
new SDKResponse(
code: Response::STATUS_CODE_OK,
model: Response::MODEL_PROJECT_LIST,
)
]
))
->param('queries', [], new Projects(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Projects::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->inject('response')
->inject('dbForPlatform')
->action(function (array $queries, string $search, Response $response, Database $dbForPlatform) {
try {
$queries = Query::parseQueries($queries);
} catch (QueryException $e) {
throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage());
}
if (!empty($search)) {
$queries[] = Query::search('search', $search);
}
/**
* Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries
*/
$cursor = \array_filter($queries, function ($query) {
return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]);
});
$cursor = reset($cursor);
if ($cursor) {
/** @var Query $cursor */
$validator = new Cursor();
if (!$validator->isValid($cursor)) {
throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription());
}
$projectId = $cursor->getValue();
$cursorDocument = $dbForPlatform->getDocument('projects', $projectId);
if ($cursorDocument->isEmpty()) {
throw new Exception(Exception::GENERAL_CURSOR_NOT_FOUND, "Project '{$projectId}' for the 'cursor' value not found.");
}
$cursor->setValue($cursorDocument);
}
$filterQueries = Query::groupByType($queries)['filters'];
try {
$projects = $dbForPlatform->find('projects', $queries);
$total = $dbForPlatform->count('projects', $filterQueries, APP_LIMIT_COUNT);
} catch (OrderException $e) {
throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null.");
}
$response->dynamic(new Document([
'projects' => $projects,
'total' => $total,
]), Response::MODEL_PROJECT_LIST);
});
App::get('/v1/projects/:projectId')
->desc('Get project')
->groups(['api', 'projects'])

View file

@ -68,7 +68,7 @@
"utopia-php/platform": "0.7.*",
"utopia-php/pools": "0.8.*",
"utopia-php/preloader": "0.2.*",
"utopia-php/queue": "0.11.0",
"utopia-php/queue": "0.12.0",
"utopia-php/registry": "0.5.*",
"utopia-php/storage": "0.18.*",
"utopia-php/swoole": "0.8.*",

268
composer.lock generated
View file

@ -67,6 +67,99 @@
],
"time": "2025-02-18T01:00:50+00:00"
},
{
"name": "appwrite-labs/php-amqplib",
"version": "0.1.2",
"source": {
"type": "git",
"url": "https://github.com/appwrite-labs/php-amqplib.git",
"reference": "c8e043045388ddad5ddab5f48df2b9046ca6873f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/appwrite-labs/php-amqplib/zipball/c8e043045388ddad5ddab5f48df2b9046ca6873f",
"reference": "c8e043045388ddad5ddab5f48df2b9046ca6873f",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"ext-sockets": "*",
"php": "^7.2||^8.0",
"phpseclib/phpseclib": "^2.0|^3.0"
},
"conflict": {
"php": "7.4.0 - 7.4.1"
},
"replace": {
"php-amqplib/php-amqplib": "self.version",
"videlalvaro/php-amqplib": "self.version"
},
"require-dev": {
"ext-curl": "*",
"nategood/httpful": "^0.2.20",
"phpunit/phpunit": "^7.5|^9.5",
"squizlabs/php_codesniffer": "^3.6",
"swoole/ide-helper": "^5.0"
},
"suggest": {
"ext-swoole": "For Swoole coroutine support"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"psr-4": {
"PhpAmqpLib\\": "PhpAmqpLib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-2.1-or-later"
],
"authors": [
{
"name": "Appwrite Labs",
"email": "team@appwrite.io",
"role": "Fork Maintainer"
},
{
"name": "Alvaro Videla",
"role": "Original Maintainer"
},
{
"name": "Raúl Araya",
"email": "nubeiro@gmail.com",
"role": "Maintainer"
},
{
"name": "Luke Bakken",
"email": "luke@bakken.io",
"role": "Maintainer"
},
{
"name": "Ramūnas Dronga",
"email": "github@ramuno.lt",
"role": "Maintainer"
}
],
"description": "Fork of php-amqplib with Swoole coroutine support. A pure PHP implementation of the AMQP protocol tested against RabbitMQ.",
"homepage": "https://github.com/appwrite-labs/php-amqplib/",
"keywords": [
"async",
"coroutine",
"message",
"queue",
"rabbitmq",
"swoole"
],
"support": {
"source": "https://github.com/appwrite-labs/php-amqplib/tree/0.1.2"
},
"time": "2025-07-04T20:54:22+00:00"
},
{
"name": "appwrite/appwrite",
"version": "15.1.0",
@ -283,25 +376,25 @@
},
{
"name": "brick/math",
"version": "0.13.1",
"version": "0.14.0",
"source": {
"type": "git",
"url": "https://github.com/brick/math.git",
"reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04"
"reference": "113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/brick/math/zipball/fc7ed316430118cc7836bf45faff18d5dfc8de04",
"reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04",
"url": "https://api.github.com/repos/brick/math/zipball/113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2",
"reference": "113a8ee2656b882d4c3164fa31aa6e12cbb7aaa2",
"shasum": ""
},
"require": {
"php": "^8.1"
"php": "^8.2"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.2",
"phpunit/phpunit": "^10.1",
"vimeo/psalm": "6.8.8"
"phpstan/phpstan": "2.1.22",
"phpunit/phpunit": "^11.5"
},
"type": "library",
"autoload": {
@ -331,7 +424,7 @@
],
"support": {
"issues": "https://github.com/brick/math/issues",
"source": "https://github.com/brick/math/tree/0.13.1"
"source": "https://github.com/brick/math/tree/0.14.0"
},
"funding": [
{
@ -339,7 +432,7 @@
"type": "github"
}
],
"time": "2025-03-29T13:50:30+00:00"
"time": "2025-08-29T12:40:03+00:00"
},
{
"name": "chillerlan/php-qrcode",
@ -1162,16 +1255,16 @@
},
{
"name": "open-telemetry/api",
"version": "1.4.0",
"version": "1.5.0",
"source": {
"type": "git",
"url": "https://github.com/opentelemetry-php/api.git",
"reference": "b3a9286f9c1c8247c83493c5b1fa475cd0cec7f7"
"reference": "7692075f486c14d8cfd37fba98a08a5667f089e5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/opentelemetry-php/api/zipball/b3a9286f9c1c8247c83493c5b1fa475cd0cec7f7",
"reference": "b3a9286f9c1c8247c83493c5b1fa475cd0cec7f7",
"url": "https://api.github.com/repos/opentelemetry-php/api/zipball/7692075f486c14d8cfd37fba98a08a5667f089e5",
"reference": "7692075f486c14d8cfd37fba98a08a5667f089e5",
"shasum": ""
},
"require": {
@ -1228,7 +1321,7 @@
"issues": "https://github.com/open-telemetry/opentelemetry-php/issues",
"source": "https://github.com/open-telemetry/opentelemetry-php"
},
"time": "2025-06-19T23:36:51+00:00"
"time": "2025-08-07T23:07:38+00:00"
},
{
"name": "open-telemetry/context",
@ -1418,22 +1511,22 @@
},
{
"name": "open-telemetry/sdk",
"version": "1.7.0",
"version": "1.7.1",
"source": {
"type": "git",
"url": "https://github.com/opentelemetry-php/sdk.git",
"reference": "86287cf30fd6549444d7b8f7d8758d92e24086ac"
"reference": "52690d4b37ae4f091af773eef3c238ed2bc0aa06"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/opentelemetry-php/sdk/zipball/86287cf30fd6549444d7b8f7d8758d92e24086ac",
"reference": "86287cf30fd6549444d7b8f7d8758d92e24086ac",
"url": "https://api.github.com/repos/opentelemetry-php/sdk/zipball/52690d4b37ae4f091af773eef3c238ed2bc0aa06",
"reference": "52690d4b37ae4f091af773eef3c238ed2bc0aa06",
"shasum": ""
},
"require": {
"ext-json": "*",
"nyholm/psr7-server": "^1.1",
"open-telemetry/api": "~1.4.0",
"open-telemetry/api": "^1.4",
"open-telemetry/context": "^1.0",
"open-telemetry/sem-conv": "^1.0",
"php": "^8.1",
@ -1511,7 +1604,7 @@
"issues": "https://github.com/open-telemetry/opentelemetry-php/issues",
"source": "https://github.com/open-telemetry/opentelemetry-php"
},
"time": "2025-08-06T03:07:06+00:00"
"time": "2025-09-05T07:17:06+00:00"
},
{
"name": "open-telemetry/sem-conv",
@ -1687,87 +1780,6 @@
},
"time": "2020-10-15T08:29:30+00:00"
},
{
"name": "php-amqplib/php-amqplib",
"version": "v3.7.3",
"source": {
"type": "git",
"url": "https://github.com/php-amqplib/php-amqplib.git",
"reference": "9f50fe69a9f1a19e2cb25596a354d705de36fe59"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/9f50fe69a9f1a19e2cb25596a354d705de36fe59",
"reference": "9f50fe69a9f1a19e2cb25596a354d705de36fe59",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"ext-sockets": "*",
"php": "^7.2||^8.0",
"phpseclib/phpseclib": "^2.0|^3.0"
},
"conflict": {
"php": "7.4.0 - 7.4.1"
},
"replace": {
"videlalvaro/php-amqplib": "self.version"
},
"require-dev": {
"ext-curl": "*",
"nategood/httpful": "^0.2.20",
"phpunit/phpunit": "^7.5|^9.5",
"squizlabs/php_codesniffer": "^3.6"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"psr-4": {
"PhpAmqpLib\\": "PhpAmqpLib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL-2.1-or-later"
],
"authors": [
{
"name": "Alvaro Videla",
"role": "Original Maintainer"
},
{
"name": "Raúl Araya",
"email": "nubeiro@gmail.com",
"role": "Maintainer"
},
{
"name": "Luke Bakken",
"email": "luke@bakken.io",
"role": "Maintainer"
},
{
"name": "Ramūnas Dronga",
"email": "github@ramuno.lt",
"role": "Maintainer"
}
],
"description": "Formerly videlalvaro/php-amqplib. This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.",
"homepage": "https://github.com/php-amqplib/php-amqplib/",
"keywords": [
"message",
"queue",
"rabbitmq"
],
"support": {
"issues": "https://github.com/php-amqplib/php-amqplib/issues",
"source": "https://github.com/php-amqplib/php-amqplib/tree/v3.7.3"
},
"time": "2025-02-18T20:11:13+00:00"
},
{
"name": "php-http/discovery",
"version": "1.20.0",
@ -2379,20 +2391,20 @@
},
{
"name": "ramsey/uuid",
"version": "4.9.0",
"version": "4.9.1",
"source": {
"type": "git",
"url": "https://github.com/ramsey/uuid.git",
"reference": "4e0e23cc785f0724a0e838279a9eb03f28b092a0"
"reference": "81f941f6f729b1e3ceea61d9d014f8b6c6800440"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ramsey/uuid/zipball/4e0e23cc785f0724a0e838279a9eb03f28b092a0",
"reference": "4e0e23cc785f0724a0e838279a9eb03f28b092a0",
"url": "https://api.github.com/repos/ramsey/uuid/zipball/81f941f6f729b1e3ceea61d9d014f8b6c6800440",
"reference": "81f941f6f729b1e3ceea61d9d014f8b6c6800440",
"shasum": ""
},
"require": {
"brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13",
"brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14",
"php": "^8.0",
"ramsey/collection": "^1.2 || ^2.0"
},
@ -2451,9 +2463,9 @@
],
"support": {
"issues": "https://github.com/ramsey/uuid/issues",
"source": "https://github.com/ramsey/uuid/tree/4.9.0"
"source": "https://github.com/ramsey/uuid/tree/4.9.1"
},
"time": "2025-06-25T14:20:11+00:00"
"time": "2025-09-04T20:59:21+00:00"
},
{
"name": "spomky-labs/otphp",
@ -4296,16 +4308,16 @@
},
{
"name": "utopia-php/platform",
"version": "0.7.8",
"version": "0.7.11",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/platform.git",
"reference": "e3a4536c46f10988b1a446ec6b8dd8a9914be854"
"reference": "f3341d1ef82e0b0f9d5f2c61829c947d86f8c850"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/platform/zipball/e3a4536c46f10988b1a446ec6b8dd8a9914be854",
"reference": "e3a4536c46f10988b1a446ec6b8dd8a9914be854",
"url": "https://api.github.com/repos/utopia-php/platform/zipball/f3341d1ef82e0b0f9d5f2c61829c947d86f8c850",
"reference": "f3341d1ef82e0b0f9d5f2c61829c947d86f8c850",
"shasum": ""
},
"require": {
@ -4314,7 +4326,7 @@
"php": ">=8.0",
"utopia-php/cli": "0.15.*",
"utopia-php/framework": "0.33.*",
"utopia-php/queue": "0.11.*"
"utopia-php/queue": "^0.12.0"
},
"require-dev": {
"laravel/pint": "1.*",
@ -4340,9 +4352,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/platform/issues",
"source": "https://github.com/utopia-php/platform/tree/0.7.8"
"source": "https://github.com/utopia-php/platform/tree/0.7.11"
},
"time": "2025-05-30T10:05:43+00:00"
"time": "2025-09-04T04:38:38+00:00"
},
{
"name": "utopia-php/pools",
@ -4451,21 +4463,21 @@
},
{
"name": "utopia-php/queue",
"version": "0.11.0",
"version": "0.12.0",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/queue.git",
"reference": "06b5ced0eaed2ecc6aab6d8e1b4d96bff37a1ce5"
"reference": "3a7603ee712c592bfc54af4a76f0426c428b5574"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/queue/zipball/06b5ced0eaed2ecc6aab6d8e1b4d96bff37a1ce5",
"reference": "06b5ced0eaed2ecc6aab6d8e1b4d96bff37a1ce5",
"url": "https://api.github.com/repos/utopia-php/queue/zipball/3a7603ee712c592bfc54af4a76f0426c428b5574",
"reference": "3a7603ee712c592bfc54af4a76f0426c428b5574",
"shasum": ""
},
"require": {
"appwrite-labs/php-amqplib": "^0.1",
"php": ">=8.3",
"php-amqplib/php-amqplib": "^3.7",
"utopia-php/cli": "0.15.*",
"utopia-php/fetch": "0.4.*",
"utopia-php/framework": "0.33.*",
@ -4511,9 +4523,9 @@
],
"support": {
"issues": "https://github.com/utopia-php/queue/issues",
"source": "https://github.com/utopia-php/queue/tree/0.11.0"
"source": "https://github.com/utopia-php/queue/tree/0.12.0"
},
"time": "2025-05-30T09:52:38+00:00"
"time": "2025-06-24T18:58:38+00:00"
},
{
"name": "utopia-php/registry",
@ -5007,16 +5019,16 @@
"packages-dev": [
{
"name": "appwrite/sdk-generator",
"version": "1.1.16",
"version": "1.2.2",
"source": {
"type": "git",
"url": "https://github.com/appwrite/sdk-generator.git",
"reference": "f8fbc4b1ba0e918825338f50cbdea4d887389c41"
"reference": "db229faf442a64094ebdea7d4b66f48184a7106f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/f8fbc4b1ba0e918825338f50cbdea4d887389c41",
"reference": "f8fbc4b1ba0e918825338f50cbdea4d887389c41",
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/db229faf442a64094ebdea7d4b66f48184a7106f",
"reference": "db229faf442a64094ebdea7d4b66f48184a7106f",
"shasum": ""
},
"require": {
@ -5052,9 +5064,9 @@
"description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms",
"support": {
"issues": "https://github.com/appwrite/sdk-generator/issues",
"source": "https://github.com/appwrite/sdk-generator/tree/1.1.16"
"source": "https://github.com/appwrite/sdk-generator/tree/1.2.2"
},
"time": "2025-09-03T06:50:04+00:00"
"time": "2025-09-05T08:28:53+00:00"
},
{
"name": "doctrine/annotations",

View file

@ -0,0 +1,5 @@
appwrite databases create-line-attribute \
--database-id <DATABASE_ID> \
--collection-id <COLLECTION_ID> \
--key '' \
--required false

View file

@ -0,0 +1,5 @@
appwrite databases create-point-attribute \
--database-id <DATABASE_ID> \
--collection-id <COLLECTION_ID> \
--key '' \
--required false

View file

@ -0,0 +1,5 @@
appwrite databases create-polygon-attribute \
--database-id <DATABASE_ID> \
--collection-id <COLLECTION_ID> \
--key '' \
--required false

View file

@ -0,0 +1,5 @@
appwrite databases update-line-attribute \
--database-id <DATABASE_ID> \
--collection-id <COLLECTION_ID> \
--key '' \
--required false

View file

@ -0,0 +1,5 @@
appwrite databases update-point-attribute \
--database-id <DATABASE_ID> \
--collection-id <COLLECTION_ID> \
--key '' \
--required false

View file

@ -0,0 +1,5 @@
appwrite databases update-polygon-attribute \
--database-id <DATABASE_ID> \
--collection-id <COLLECTION_ID> \
--key '' \
--required false

View file

@ -0,0 +1,5 @@
appwrite tables-db create-line-column \
--database-id <DATABASE_ID> \
--table-id <TABLE_ID> \
--key '' \
--required false

View file

@ -0,0 +1,5 @@
appwrite tables-db create-point-column \
--database-id <DATABASE_ID> \
--table-id <TABLE_ID> \
--key '' \
--required false

View file

@ -0,0 +1,5 @@
appwrite tables-db create-polygon-column \
--database-id <DATABASE_ID> \
--table-id <TABLE_ID> \
--key '' \
--required false

View file

@ -0,0 +1,5 @@
appwrite tables-db update-line-column \
--database-id <DATABASE_ID> \
--table-id <TABLE_ID> \
--key '' \
--required false

View file

@ -0,0 +1,5 @@
appwrite tables-db update-point-column \
--database-id <DATABASE_ID> \
--table-id <TABLE_ID> \
--key '' \
--required false

View file

@ -0,0 +1,5 @@
appwrite tables-db update-polygon-column \
--database-id <DATABASE_ID> \
--table-id <TABLE_ID> \
--key '' \
--required false

View file

@ -1 +0,0 @@
Get a list of all projects. You can use the query params to filter your results.

View file

@ -118,7 +118,7 @@ class Create extends Action
->param('databaseId', '', new UID(), 'Database ID.')
->param('documentId', '', new CustomId(), 'Document ID. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.', true)
->param('collectionId', '', new UID(), 'Collection ID. You can create a new collection using the Database service [server integration](https://appwrite.io/docs/server/databases#databasesCreateCollection). Make sure to define attributes before creating documents.')
->param('data', [], new JSON(), 'Document data as JSON object.', true)
->param('data', [], new JSON(), 'Document data as JSON object.', true, example: '{"username":"walter.obrien","email":"walter.obrien@example.com","fullName":"Walter O\'Brien","age":30,"isAdmin":false}')
->param('permissions', null, new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE, [Database::PERMISSION_READ, Database::PERMISSION_UPDATE, Database::PERMISSION_DELETE, Database::PERMISSION_WRITE]), 'An array of permissions strings. By default, only the current user is granted all permissions. [Learn more about permissions](https://appwrite.io/docs/permissions).', true)
->param('documents', [], fn (array $plan) => new ArrayList(new JSON(), $plan['databasesBatchSize'] ?? APP_LIMIT_DATABASE_BATCH), 'Array of documents data as JSON objects.', true, ['plan'])
->param('transactionId', null, new UID(), 'Transaction ID for staging the operation.', true)

View file

@ -97,7 +97,7 @@ class Create extends DocumentCreate
->param('databaseId', '', new UID(), 'Database ID.')
->param('rowId', '', new CustomId(), 'Row ID. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.', true)
->param('tableId', '', new UID(), 'Table ID. You can create a new table using the Database service [server integration](https://appwrite.io/docs/server/tablesdb#tablesDBCreate). Make sure to define columns before creating rows.')
->param('data', [], new JSON(), 'Row data as JSON object.', true)
->param('data', [], new JSON(), 'Row data as JSON object.', true, example: '{"username":"walter.obrien","email":"walter.obrien@example.com","fullName":"Walter O\'Brien","age":30,"isAdmin":false}')
->param('permissions', null, new Permissions(APP_LIMIT_ARRAY_PARAMS_SIZE, [Database::PERMISSION_READ, Database::PERMISSION_UPDATE, Database::PERMISSION_DELETE, Database::PERMISSION_WRITE]), 'An array of permissions strings. By default, only the current user is granted all permissions. [Learn more about permissions](https://appwrite.io/docs/permissions).', true)
->param('rows', [], fn (array $plan) => new ArrayList(new JSON(), $plan['databasesBatchSize'] ?? APP_LIMIT_DATABASE_BATCH), 'Array of rows data as JSON objects.', true, ['plan'])
->param('transactionId', null, new UID(), 'Transaction ID for staging the operation.', true)

View file

@ -0,0 +1,116 @@
<?php
namespace Appwrite\Platform\Modules\Projects\Http\Projects;
use Appwrite\Extend\Exception;
use Appwrite\SDK\AuthType;
use Appwrite\SDK\ContentType;
use Appwrite\SDK\Method;
use Appwrite\SDK\Response as SDKResponse;
use Appwrite\Utopia\Database\Validator\Queries\Projects;
use Appwrite\Utopia\Response;
use Utopia\Database\Database;
use Utopia\Database\Document;
use Utopia\Database\Exception\Order;
use Utopia\Database\Exception\Query as QueryException;
use Utopia\Database\Query;
use Utopia\Database\Validator\Query\Cursor;
use Utopia\Platform\Action;
use Utopia\Platform\Scope\HTTP;
use Utopia\Validator;
use Utopia\Validator\Text;
class XList extends Action
{
use HTTP;
public static function getName()
{
return 'listProjects';
}
protected function getQueriesValidator(): Validator
{
return new Projects();
}
public function __construct()
{
$this
->setHttpMethod(Action::HTTP_REQUEST_METHOD_GET)
->setHttpPath('/v1/projects')
->desc('List projects')
->groups(['api', 'projects'])
->label('scope', 'projects.read')
->label('sdk', new Method(
namespace: 'projects',
group: 'projects',
name: 'list',
description: <<<EOT
Get a list of all projects. You can use the query params to filter your results.
EOT,
auth: [AuthType::ADMIN],
responses: [
new SDKResponse(
code: Response::STATUS_CODE_OK,
model: Response::MODEL_PROJECT_LIST
)
],
contentType: ContentType::JSON
))
->param('queries', [], $this->getQueriesValidator(), 'Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of ' . APP_LIMIT_ARRAY_PARAMS_SIZE . ' queries are allowed, each ' . APP_LIMIT_ARRAY_ELEMENT_SIZE . ' characters long. You may filter on the following attributes: ' . implode(', ', Projects::ALLOWED_ATTRIBUTES), true)
->param('search', '', new Text(256), 'Search term to filter your list results. Max length: 256 chars.', true)
->inject('response')
->inject('dbForPlatform')
->callback($this->action(...));
}
public function action(array $queries, string $search, Response $response, Database $dbForPlatform)
{
try {
$queries = Query::parseQueries($queries);
} catch (QueryException $e) {
throw new Exception(Exception::GENERAL_QUERY_INVALID, $e->getMessage());
}
if (!empty($search)) {
$queries[] = Query::search('search', $search);
}
/**
* Get cursor document if there was a cursor query, we use array_filter and reset for reference $cursor to $queries
*/
$cursor = \array_filter($queries, function ($query) {
return \in_array($query->getMethod(), [Query::TYPE_CURSOR_AFTER, Query::TYPE_CURSOR_BEFORE]);
});
$cursor = reset($cursor);
if ($cursor) {
/** @var Query $cursor */
$validator = new Cursor();
if (!$validator->isValid($cursor)) {
throw new Exception(Exception::GENERAL_QUERY_INVALID, $validator->getDescription());
}
$projectId = $cursor->getValue();
$cursorDocument = $dbForPlatform->getDocument('projects', $projectId);
if ($cursorDocument->isEmpty()) {
throw new Exception(Exception::GENERAL_CURSOR_NOT_FOUND, "Project '{$projectId}' for the 'cursor' value not found.");
}
$cursor->setValue($cursorDocument);
}
$filterQueries = Query::groupByType($queries)['filters'];
try {
$projects = $dbForPlatform->find('projects', $queries);
$total = $dbForPlatform->count('projects', $filterQueries, APP_LIMIT_COUNT);
} catch (Order $e) {
throw new Exception(Exception::DATABASE_QUERY_ORDER_NULL, "The order attribute '{$e->getAttribute()}' had a null value. Cursor pagination requires all documents order attribute values are non-null.");
}
$response->dynamic(new Document([
'projects' => $projects,
'total' => $total,
]), Response::MODEL_PROJECT_LIST);
}
}

View file

@ -7,6 +7,7 @@ use Appwrite\Platform\Modules\Projects\Http\DevKeys\Delete as DeleteDevKey;
use Appwrite\Platform\Modules\Projects\Http\DevKeys\Get as GetDevKey;
use Appwrite\Platform\Modules\Projects\Http\DevKeys\Update as UpdateDevKey;
use Appwrite\Platform\Modules\Projects\Http\DevKeys\XList as ListDevKeys;
use Appwrite\Platform\Modules\Projects\Http\Projects\XList as ListProjects;
use Utopia\Platform\Service;
class Http extends Service
@ -19,5 +20,7 @@ class Http extends Service
$this->addAction(GetDevKey::getName(), new GetDevKey());
$this->addAction(ListDevKeys::getName(), new ListDevKeys());
$this->addAction(DeleteDevKey::getName(), new DeleteDevKey());
$this->addAction(ListProjects::getName(), new ListProjects());
}
}

View file

@ -433,7 +433,7 @@ class OpenAPI3 extends Format
case 'Utopia\Validator\Assoc':
$param['default'] = (empty($param['default'])) ? new \stdClass() : $param['default'];
$node['schema']['type'] = 'object';
$node['schema']['x-example'] = '{}';
$node['schema']['x-example'] = ($param['example'] ?? '') ?: '{}';
break;
case 'Utopia\Storage\Validator\File':
$consumes = ['multipart/form-data'];

View file

@ -467,7 +467,7 @@ class Swagger2 extends Format
case 'Utopia\Validator\Assoc':
$node['type'] = 'object';
$node['default'] = (empty($param['default'])) ? new \stdClass() : $param['default'];
$node['x-example'] = '{}';
$node['x-example'] = ($param['example'] ?? '') ?: '{}';
break;
case 'Utopia\Storage\Validator\File':
$consumes = ['multipart/form-data'];