From 4bdcdb6f9672d6d8da4a32990045d01d237cd5e6 Mon Sep 17 00:00:00 2001 From: loks0n <22452787+loks0n@users.noreply.github.com> Date: Tue, 5 May 2026 15:20:47 +0100 Subject: [PATCH] Migrate to utopia-php/http resources/context API Adopts the new split DI containers in utopia-php/http: `resources()` for boot-time wiring (shared across requests) and `context()` for per-request state. Replaces the removed `getResource()`/`setResource()`/`getContainer()` helpers throughout the HTTP entry point, controllers, GraphQL layer, and installer. Bumps the dependency chain accordingly: utopia-php/http to the dev branch (aliased to 0.34.25 to satisfy platform's exact pin), servers 0.4.*, queue 0.18.*, and pulled-along cli/platform/database upgrades. Also tightens app/init/resources/request.php by collapsing single-return factories to arrow functions. Co-Authored-By: Claude Opus 4.7 (1M context) --- app/controllers/general.php | 6 +- app/http.php | 44 +++-- app/init/resources/request.php | 184 +++++++++------------ composer.json | 4 +- src/Appwrite/GraphQL/Resolvers.php | 40 ++--- src/Appwrite/GraphQL/Schema.php | 2 +- src/Appwrite/GraphQL/Types/Mapper.php | 2 +- src/Appwrite/Platform/Installer/Server.php | 2 +- 8 files changed, 122 insertions(+), 162 deletions(-) diff --git a/app/controllers/general.php b/app/controllers/general.php index bc63d200d7..b2177074df 100644 --- a/app/controllers/general.php +++ b/app/controllers/general.php @@ -1274,7 +1274,7 @@ Http::error() if (!$publish && $project->getId() !== 'console') { $errorUser = new DBUser(); try { - $resolvedUser = $utopia->getResource('user'); + $resolvedUser = $utopia->context()->get('user'); if ($resolvedUser instanceof DBUser) { $errorUser = $resolvedUser; } @@ -1293,7 +1293,7 @@ Http::error() if ($logger && $publish) { try { /** @var Utopia\Database\Document $user */ - $user = $utopia->getResource('user'); + $user = $utopia->context()->get('user'); } catch (\Throwable) { // All good, user is optional information for logger } @@ -1494,7 +1494,7 @@ Http::error() // the cors resource (which depends on rule -> DB) would cascade. // Uses override:true to avoid duplicate headers if init() already set them. try { - $cors = $utopia->getResource('cors'); + $cors = $utopia->context()->get('cors'); foreach ($cors->headers($request->getOrigin()) as $name => $value) { $response ->removeHeader($name) diff --git a/app/http.php b/app/http.php index b72f3b7f34..686baa39ab 100644 --- a/app/http.php +++ b/app/http.php @@ -3,7 +3,7 @@ require_once __DIR__ . '/init.php'; require_once __DIR__ . '/init/span.php'; -$registerRequestResources = require __DIR__ . '/init/resources/request.php'; +$setRequestContext = require __DIR__ . '/init/resources/request.php'; use Appwrite\Utopia\Request; use Appwrite\Utopia\Response; @@ -69,7 +69,7 @@ $swooleAdapter = new Server( Constant::OPTION_OUTPUT_BUFFER_SIZE => $payloadSize, Constant::OPTION_TASK_WORKER_NUM => 1, // required for the task to fetch domains background ], - container: $container, + resources: $container, ); $http = $swooleAdapter->getServer(); @@ -190,9 +190,7 @@ $http->on(Constant::EVENT_AFTER_RELOAD, function ($server) { Console::success('Reload completed...'); }); -$container->set('bus', function ($register) use ($swooleAdapter) { - return $register->get('bus')->setResolver(fn (string $name) => $swooleAdapter->getContainer()->get($name)); -}, ['register']); +$container->set('bus', fn ($register) => $register->get('bus')->setResolver($swooleAdapter->context()->get(...)), ['register']); include __DIR__ . '/controllers/general.php'; @@ -205,7 +203,7 @@ function createDatabase(Http $app, string $resourceKey, string $dbName, array $c while (true) { try { $attempts++; - $resource = $app->getResource($resourceKey); + $resource = $app->context()->get($resourceKey); /* @var $database Database */ $database = is_callable($resource) ? $resource() : $resource; break; // exit loop on success @@ -292,7 +290,7 @@ $http->on(Constant::EVENT_START, function ($http) use ($payloadSize, $totalWorke $app = new Http($swooleAdapter, 'UTC'); /** @var \Utopia\Pools\Group $pools */ - $pools = $app->getResource('pools'); + $pools = $app->context()->get('pools'); go(function () use ($app, $pools) { @@ -304,7 +302,7 @@ $http->on(Constant::EVENT_START, function ($http) use ($payloadSize, $totalWorke // create appwrite database, `dbForPlatform` is a direct access call. createDatabase($app, 'dbForPlatform', 'appwrite', $collections['console'], $pools, function (Database $dbForPlatform) use ($collections, $app) { - $authorization = $app->getResource('authorization'); + $authorization = $app->context()->get('authorization'); if ($dbForPlatform->getCollection(AuditAdapterSQL::COLLECTION)->isEmpty()) { $adapter = new AdapterDatabase($dbForPlatform); @@ -416,7 +414,7 @@ $http->on(Constant::EVENT_START, function ($http) use ($payloadSize, $totalWorke $documentsSharedTables = \explode(',', System::getEnv('_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES', '')); $vectorSharedTables = \explode(',', System::getEnv('_APP_DATABASE_VECTORSDB_SHARED_TABLES', '')); - $cache = $app->getResource('cache'); + $cache = $app->context()->get('cache'); // All shared tables pools that need project metadata collections $allSharedTables = \array_values(\array_unique(\array_filter([ @@ -502,7 +500,7 @@ $http->on(Constant::EVENT_START, function ($http) use ($payloadSize, $totalWorke }); }); -$swooleAdapter->onRequest(function ($utopiaRequest, $utopiaResponse) use ($files, $swooleAdapter, $registerRequestResources) { +$swooleAdapter->onRequest(function ($utopiaRequest, $utopiaResponse) use ($files, $swooleAdapter, $setRequestContext) { Span::init('http.request'); $request = new Request($utopiaRequest->getSwooleRequest()); @@ -522,21 +520,19 @@ $swooleAdapter->onRequest(function ($utopiaRequest, $utopiaResponse) use ($files return; } - $requestContainer = $swooleAdapter->getContainer(); - $requestContainer->set('container', fn () => $requestContainer); - $requestContainer->set('request', fn () => $request); - $requestContainer->set('response', fn () => $response); - $app = new Http($swooleAdapter, 'UTC'); - $requestContainer->set('utopia', fn () => $app); + $app->context()->set('container', fn () => $app->context()); + $app->context()->set('request', fn () => $request); + $app->context()->set('response', fn () => $response); + $app->context()->set('utopia', fn () => $app); - $registerRequestResources($requestContainer); + $setRequestContext($app->context()); $app->setCompression(System::getEnv('_APP_COMPRESSION_ENABLED', 'enabled') === 'enabled'); $app->setCompressionMinSize(intval(System::getEnv('_APP_COMPRESSION_MIN_SIZE_BYTES', '1024'))); // 1KB try { - $authorization = $app->getResource('authorization'); + $authorization = $app->context()->get('authorization'); $request->setAuthorization($authorization); $response->setAuthorization($authorization); @@ -552,18 +548,18 @@ $swooleAdapter->onRequest(function ($utopiaRequest, $utopiaResponse) use ($files $version = System::getEnv('_APP_VERSION', 'UNKNOWN'); - $logger = $app->getResource("logger"); + $logger = $app->context()->get("logger"); if ($logger) { try { /** @var Utopia\Database\Document $user */ - $user = $app->getResource('user'); + $user = $app->context()->get('user'); } catch (\Throwable $_th) { // All good, user is optional information for logger } $route = $app->getRoute(); - $log = $app->getResource("log"); + $log = $app->context()->get("log"); if (isset($user) && !$user->isEmpty()) { $log->setUser(new User($user->getId())); @@ -648,10 +644,10 @@ $http->on(Constant::EVENT_TASK, function () use ($swooleAdapter) { $app = new Http($swooleAdapter, 'UTC'); /** @var Utopia\Database\Database $dbForPlatform */ - $dbForPlatform = $app->getResource('dbForPlatform'); + $dbForPlatform = $app->context()->get('dbForPlatform'); /** @var \Swoole\Table $riskyDomains */ - $riskyDomains = $app->getResource('riskyDomains'); + $riskyDomains = $app->context()->get('riskyDomains'); Timer::tick(DOMAIN_SYNC_TIMER * 1000, function () use ($dbForPlatform, $riskyDomains, &$lastSyncUpdate, $app) { try { @@ -670,7 +666,7 @@ $http->on(Constant::EVENT_TASK, function () use ($swooleAdapter) { } $results = []; try { - $authorization = $app->getResource('authorization'); + $authorization = $app->context()->get('authorization'); $results = $authorization->skip(fn () => $dbForPlatform->find('rules', $queries)); } catch (Throwable $th) { Console::error('rules ' . $th->getMessage()); diff --git a/app/init/resources/request.php b/app/init/resources/request.php index 6ed377d9ae..2649216453 100644 --- a/app/init/resources/request.php +++ b/app/init/resources/request.php @@ -59,26 +59,18 @@ use Utopia\Validator\WhiteList; * These resources depend (directly or transitively) on request/response * and must be fresh for each HTTP request. */ -return function (Container $container): void { - $container->set('utopia:graphql', function ($utopia) { - return $utopia; - }, ['utopia']); +return function (Container $context): void { + $context->set('utopia:graphql', fn ($utopia) => $utopia, ['utopia']); - $container->set('log', fn () => new Log(), []); + $context->set('log', fn () => new Log(), []); - $container->set('logger', function ($register) { - return $register->get('logger'); - }, ['register']); + $context->set('logger', fn ($register) => $register->get('logger'), ['register']); - $container->set('authorization', function () { - return new Authorization(); - }, []); + $context->set('authorization', fn () => new Authorization(), []); - $container->set('store', function (): Store { - return new Store(); - }, []); + $context->set('store', fn (): Store => new Store(), []); - $container->set('proofForPassword', function (): Password { + $context->set('proofForPassword', function (): Password { $hash = new Argon2(); $hash ->setMemoryCost(7168) @@ -92,21 +84,21 @@ return function (Container $container): void { return $password; }); - $container->set('proofForToken', function (): Token { + $context->set('proofForToken', function (): Token { $token = new Token(); $token->setHash(new Sha()); return $token; }); - $container->set('proofForCode', function (): Code { + $context->set('proofForCode', function (): Code { $code = new Code(); $code->setHash(new Sha()); return $code; }); - $container->set('locale', function () { + $context->set('locale', function () { $locale = new Locale(System::getEnv('_APP_LOCALE', 'en')); $locale->setFallback(System::getEnv('_APP_LOCALE', 'en')); @@ -114,32 +106,16 @@ return function (Container $container): void { }); // Per-request queue resources (stateful, accumulate event data during request) - $container->set('queueForDatabase', function (Publisher $publisher) { - return new EventDatabase($publisher); - }, ['publisher']); - $container->set('queueForDeletes', function (Publisher $publisher) { - return new Delete($publisher); - }, ['publisher']); - $container->set('queueForEvents', function (Publisher $publisher) { - return new Event($publisher); - }, ['publisher']); - $container->set('queueForWebhooks', function (Publisher $publisher) { - return new Webhook($publisher); - }, ['publisher']); - $container->set('queueForRealtime', function () { - return new Realtime(); - }, []); - $container->set('usage', function () { - return new UsageContext(); - }, []); - $container->set('auditContext', fn () => new AuditContext(), []); - $container->set('queueForFunctions', function (Publisher $publisher) { - return new Func($publisher); - }, ['publisher']); - $container->set('eventProcessor', function () { - return new EventProcessor(); - }, []); - $container->set('dbForPlatform', function (Group $pools, Cache $cache, Authorization $authorization) { + $context->set('queueForDatabase', fn (Publisher $publisher) => new EventDatabase($publisher), ['publisher']); + $context->set('queueForDeletes', fn (Publisher $publisher) => new Delete($publisher), ['publisher']); + $context->set('queueForEvents', fn (Publisher $publisher) => new Event($publisher), ['publisher']); + $context->set('queueForWebhooks', fn (Publisher $publisher) => new Webhook($publisher), ['publisher']); + $context->set('queueForRealtime', fn () => new Realtime(), []); + $context->set('usage', fn () => new UsageContext(), []); + $context->set('auditContext', fn () => new AuditContext(), []); + $context->set('queueForFunctions', fn (Publisher $publisher) => new Func($publisher), ['publisher']); + $context->set('eventProcessor', fn () => new EventProcessor(), []); + $context->set('dbForPlatform', function (Group $pools, Cache $cache, Authorization $authorization) { $adapter = new DatabasePool($pools->get('console')); $database = new Database($adapter, $cache); @@ -157,7 +133,7 @@ return function (Container $container): void { return $database; }, ['pools', 'cache', 'authorization']); - $container->set('getProjectDB', function (Group $pools, Database $dbForPlatform, Cache $cache, Authorization $authorization) { + $context->set('getProjectDB', function (Group $pools, Database $dbForPlatform, Cache $cache, Authorization $authorization) { $adapters = []; return function (Document $project) use ($pools, $dbForPlatform, $cache, $authorization, &$adapters) { @@ -214,7 +190,7 @@ return function (Container $container): void { }; }, ['pools', 'dbForPlatform', 'cache', 'authorization']); - $container->set('getLogsDB', function (Group $pools, Cache $cache, Authorization $authorization) { + $context->set('getLogsDB', function (Group $pools, Cache $cache, Authorization $authorization) { $adapter = null; return function (?Document $project = null) use ($pools, $cache, $authorization, &$adapter) { @@ -246,7 +222,7 @@ return function (Container $container): void { /** * List of allowed request hostnames for the request. */ - $container->set('allowedHostnames', function (array $platform, Document $project, Document $rule, Document $devKey, Request $request) { + $context->set('allowedHostnames', function (array $platform, Document $project, Document $rule, Document $devKey, Request $request) { $allowed = [...($platform['hostnames'] ?? [])]; /* Add platform configured hostnames */ @@ -290,7 +266,7 @@ return function (Container $container): void { /** * List of allowed request schemes for the request. */ - $container->set('allowedSchemes', function (array $platform, Document $project) { + $context->set('allowedSchemes', function (array $platform, Document $project) { $allowed = [...($platform['schemas'] ?? [])]; if (! $project->isEmpty() && $project->getId() !== 'console') { @@ -310,7 +286,7 @@ return function (Container $container): void { /** * Whether the request origin is verified against the request hostname. */ - $container->set('domainVerification', function (Request $request) { + $context->set('domainVerification', function (Request $request) { $origin = \parse_url($request->getOrigin($request->getReferer('')), PHP_URL_HOST); $selfDomain = new Domain($request->getHostname()); $endDomain = new Domain((string) $origin); @@ -322,7 +298,7 @@ return function (Container $container): void { /** * Cookie domain for the current request. */ - $container->set('cookieDomain', function (Request $request, Document $project) { + $context->set('cookieDomain', function (Request $request, Document $project) { $localHosts = ['localhost', 'localhost:' . $request->getPort()]; $migrationHost = System::getEnv('_APP_MIGRATION_HOST'); @@ -356,7 +332,7 @@ return function (Container $container): void { /** * Rule associated with a request origin. */ - $container->set('rule', function (Request $request, Database $dbForPlatform, Document $project, Authorization $authorization) { + $context->set('rule', function (Request $request, Database $dbForPlatform, Document $project, Authorization $authorization) { $domain = \parse_url($request->getOrigin(), PHP_URL_HOST); if (empty($domain)) { @@ -406,7 +382,7 @@ return function (Container $container): void { /** * CORS service */ - $container->set('cors', function (array $allowedHostnames) { + $context->set('cors', function (array $allowedHostnames) { $corsConfig = Config::getParam('cors'); return new Cors( @@ -418,23 +394,23 @@ return function (Container $container): void { ); }, ['allowedHostnames']); - $container->set('originValidator', function (Document $devKey, array $allowedHostnames, array $allowedSchemes) { - if (! $devKey->isEmpty()) { - return new URL(); - } + $context->set( + 'originValidator', + fn (Document $devKey, array $allowedHostnames, array $allowedSchemes) => $devKey->isEmpty() + ? new Origin($allowedHostnames, $allowedSchemes) + : new URL(), + ['devKey', 'allowedHostnames', 'allowedSchemes'] + ); - return new Origin($allowedHostnames, $allowedSchemes); - }, ['devKey', 'allowedHostnames', 'allowedSchemes']); + $context->set( + 'redirectValidator', + fn (Document $devKey, array $allowedHostnames, array $allowedSchemes) => $devKey->isEmpty() + ? new Redirect($allowedHostnames, $allowedSchemes) + : new URL(), + ['devKey', 'allowedHostnames', 'allowedSchemes'] + ); - $container->set('redirectValidator', function (Document $devKey, array $allowedHostnames, array $allowedSchemes) { - if (! $devKey->isEmpty()) { - return new URL(); - } - - return new Redirect($allowedHostnames, $allowedSchemes); - }, ['devKey', 'allowedHostnames', 'allowedSchemes']); - - $container->set('user', function (string $mode, Document $project, Document $console, Request $request, Response $response, Database $dbForProject, Database $dbForPlatform, Store $store, Token $proofForToken, $authorization) { + $context->set('user', function (string $mode, Document $project, Document $console, Request $request, Response $response, Database $dbForProject, Database $dbForPlatform, Store $store, Token $proofForToken, $authorization) { /** * Handles user authentication and session validation. * @@ -605,7 +581,7 @@ return function (Container $container): void { return $user; }, ['mode', 'project', 'console', 'request', 'response', 'dbForProject', 'dbForPlatform', 'store', 'proofForToken', 'authorization']); - $container->set('project', function ($dbForPlatform, $request, $console, $authorization, Http $utopia) { + $context->set('project', function ($dbForPlatform, $request, $console, $authorization, Http $utopia) { /** @var Appwrite\Utopia\Request $request */ /** @var Utopia\Database\Database $dbForPlatform */ /** @var Utopia\Database\Document $console */ @@ -638,7 +614,7 @@ return function (Container $container): void { return $project; }, ['dbForPlatform', 'request', 'console', 'authorization', 'utopia']); - $container->set('session', function (User $user, Store $store, Token $proofForToken) { + $context->set('session', function (User $user, Store $store, Token $proofForToken) { if ($user->isEmpty()) { return; } @@ -659,7 +635,7 @@ return function (Container $container): void { return; }, ['user', 'store', 'proofForToken']); - $container->set('dbForProject', function (Group $pools, Database $dbForPlatform, Cache $cache, Document $project, Response $response, Publisher $publisher, Publisher $publisherFunctions, Publisher $publisherWebhooks, Event $queueForEvents, Func $queueForFunctions, Webhook $queueForWebhooks, Realtime $queueForRealtime, UsageContext $usage, Authorization $authorization, Request $request) { + $context->set('dbForProject', function (Group $pools, Database $dbForPlatform, Cache $cache, Document $project, Response $response, Publisher $publisher, Publisher $publisherFunctions, Publisher $publisherWebhooks, Event $queueForEvents, Func $queueForFunctions, Webhook $queueForWebhooks, Realtime $queueForRealtime, UsageContext $usage, Authorization $authorization, Request $request) { if ($project->isEmpty() || $project->getId() === 'console') { return $dbForPlatform; } @@ -935,7 +911,7 @@ return function (Container $container): void { return $database; }, ['pools', 'dbForPlatform', 'cache', 'project', 'response', 'publisher', 'publisherFunctions', 'publisherWebhooks', 'queueForEvents', 'queueForFunctions', 'queueForWebhooks', 'queueForRealtime', 'usage', 'authorization', 'request']); - $container->set('schema', function ($utopia, $dbForProject, $authorization) { + $context->set('schema', function ($utopia, $dbForProject, $authorization) { $complexity = function (int $complexity, array $args) { $queries = Query::parseQueries($args['queries'] ?? []); @@ -1022,13 +998,9 @@ return function (Container $container): void { ); }, ['utopia', 'dbForProject', 'authorization']); - $container->set('audit', function ($dbForProject) { - $adapter = new AdapterDatabase($dbForProject); + $context->set('audit', fn ($dbForProject) => new Audit(new AdapterDatabase($dbForProject)), ['dbForProject']); - return new Audit($adapter); - }, ['dbForProject']); - - $container->set('mode', function ($request, Document $project) { + $context->set('mode', function ($request, Document $project) { /** @var Appwrite\Utopia\Request $request */ /** @@ -1046,7 +1018,7 @@ return function (Container $container): void { return $mode; }, ['request', 'project']); - $container->set('requestTimestamp', function ($request) { + $context->set('requestTimestamp', function ($request) { // TODO: Move this to the Request class itself $timestampHeader = $request->getHeader('x-appwrite-timestamp'); $requestTimestamp = null; @@ -1061,7 +1033,7 @@ return function (Container $container): void { return $requestTimestamp; }, ['request']); - $container->set('devKey', function (Request $request, Document $project, array $servers, Database $dbForPlatform, Authorization $authorization) { + $context->set('devKey', function (Request $request, Document $project, array $servers, Database $dbForPlatform, Authorization $authorization) { $devKey = $request->getHeader('x-appwrite-dev-key', $request->getParam('devKey', '')); // Check if given key match project's development keys @@ -1110,7 +1082,7 @@ return function (Container $container): void { return $key; }, ['request', 'project', 'servers', 'dbForPlatform', 'authorization']); - $container->set('team', function (Document $project, Database $dbForPlatform, Http $utopia, Request $request, Authorization $authorization) { + $context->set('team', function (Document $project, Database $dbForPlatform, Http $utopia, Request $request, Authorization $authorization) { $teamInternalId = ''; if ($project->getId() !== 'console') { $teamInternalId = $project->getAttribute('teamInternalId', ''); @@ -1153,7 +1125,7 @@ return function (Container $container): void { return $team; }, ['project', 'dbForPlatform', 'utopia', 'request', 'authorization']); - $container->set('previewHostname', function (Request $request, ?Key $apiKey) { + $context->set('previewHostname', function (Request $request, ?Key $apiKey) { $allowed = false; if (Http::isDevelopment()) { @@ -1172,7 +1144,7 @@ return function (Container $container): void { return ''; }, ['request', 'apiKey']); - $container->set('apiKey', function (Request $request, Document $project, Document $team, Document $user): ?Key { + $context->set('apiKey', function (Request $request, Document $project, Document $team, Document $user): ?Key { $key = $request->getHeader('x-appwrite-key'); if (empty($key)) { @@ -1206,7 +1178,7 @@ return function (Container $container): void { return $key; }, ['request', 'project', 'team', 'user']); - $container->set('resourceToken', function ($project, $dbForProject, $request, Authorization $authorization) { + $context->set('resourceToken', function ($project, $dbForProject, $request, Authorization $authorization) { $tokenJWT = $request->getParam('token'); if (! empty($tokenJWT) && ! $project->isEmpty()) { // JWT authentication @@ -1273,7 +1245,7 @@ return function (Container $container): void { return new Document([]); }, ['project', 'dbForProject', 'request', 'authorization']); - $container->set('getDatabasesDB', function (Group $pools, Cache $cache, Document $project, Request $request, UsageContext $usage, Authorization $authorization) { + $context->set('getDatabasesDB', function (Group $pools, Cache $cache, Document $project, Request $request, UsageContext $usage, Authorization $authorization) { return function (Document $database) use ($pools, $cache, $project, $request, $usage, $authorization): Database { $databaseDSN = $database->getAttribute('database', $project->getAttribute('database', '')); @@ -1435,35 +1407,27 @@ return function (Container $container): void { }, ['pools', 'cache', 'project', 'request', 'usage', 'authorization']); - $container->set('transactionState', function (Database $dbForProject, Authorization $authorization, callable $getDatabasesDB) { - return new TransactionState($dbForProject, $authorization, $getDatabasesDB); - }, ['dbForProject', 'authorization', 'getDatabasesDB']); + $context->set( + 'transactionState', + fn (Database $dbForProject, Authorization $authorization, callable $getDatabasesDB) => new TransactionState($dbForProject, $authorization, $getDatabasesDB), + ['dbForProject', 'authorization', 'getDatabasesDB'] + ); - $container->set('executionsRetentionCount', function (Document $project, array $plan) { - if ($project->getId() === 'console' || empty($plan)) { - return 0; - } + $context->set( + 'executionsRetentionCount', + fn (Document $project, array $plan) => ($project->getId() === 'console' || empty($plan)) + ? 0 + : (int) ($plan['executionsRetentionCount'] ?? 100), + ['project', 'plan'] + ); - return (int) ($plan['executionsRetentionCount'] ?? 100); - }, ['project', 'plan']); + $context->set('deviceForFiles', fn ($project, Telemetry $telemetry) => new Device\Telemetry($telemetry, getDevice(APP_STORAGE_UPLOADS . '/app-' . $project->getId())), ['project', 'telemetry']); + $context->set('deviceForSites', fn ($project, Telemetry $telemetry) => new Device\Telemetry($telemetry, getDevice(APP_STORAGE_SITES . '/app-' . $project->getId())), ['project', 'telemetry']); + $context->set('deviceForMigrations', fn ($project, Telemetry $telemetry) => new Device\Telemetry($telemetry, getDevice(APP_STORAGE_IMPORTS . '/app-' . $project->getId())), ['project', 'telemetry']); + $context->set('deviceForFunctions', fn ($project, Telemetry $telemetry) => new Device\Telemetry($telemetry, getDevice(APP_STORAGE_FUNCTIONS . '/app-' . $project->getId())), ['project', 'telemetry']); + $context->set('deviceForBuilds', fn ($project, Telemetry $telemetry) => new Device\Telemetry($telemetry, getDevice(APP_STORAGE_BUILDS . '/app-' . $project->getId())), ['project', 'telemetry']); - $container->set('deviceForFiles', function ($project, Telemetry $telemetry) { - return new Device\Telemetry($telemetry, getDevice(APP_STORAGE_UPLOADS . '/app-' . $project->getId())); - }, ['project', 'telemetry']); - $container->set('deviceForSites', function ($project, Telemetry $telemetry) { - return new Device\Telemetry($telemetry, getDevice(APP_STORAGE_SITES . '/app-' . $project->getId())); - }, ['project', 'telemetry']); - $container->set('deviceForMigrations', function ($project, Telemetry $telemetry) { - return new Device\Telemetry($telemetry, getDevice(APP_STORAGE_IMPORTS . '/app-' . $project->getId())); - }, ['project', 'telemetry']); - $container->set('deviceForFunctions', function ($project, Telemetry $telemetry) { - return new Device\Telemetry($telemetry, getDevice(APP_STORAGE_FUNCTIONS . '/app-' . $project->getId())); - }, ['project', 'telemetry']); - $container->set('deviceForBuilds', function ($project, Telemetry $telemetry) { - return new Device\Telemetry($telemetry, getDevice(APP_STORAGE_BUILDS . '/app-' . $project->getId())); - }, ['project', 'telemetry']); - - $container->set('embeddingAgent', function ($register) { + $context->set('embeddingAgent', function ($register) { $adapter = new Ollama(); $adapter->setEndpoint(System::getEnv('_APP_EMBEDDING_ENDPOINT', 'http://ollama:11434/api/embed')); $adapter->setTimeout((int) System::getEnv('_APP_EMBEDDING_TIMEOUT', '30000')); diff --git a/composer.json b/composer.json index 7d68a838f8..1696a57d05 100644 --- a/composer.json +++ b/composer.json @@ -67,7 +67,7 @@ "utopia-php/emails": "0.6.*", "utopia-php/dns": "1.6.*", "utopia-php/dsn": "0.2.1", - "utopia-php/http": "0.34.*", + "utopia-php/http": "^2.0@RC", "utopia-php/fetch": "^1.1", "utopia-php/validators": "0.2.*", "utopia-php/image": "0.8.*", @@ -75,7 +75,7 @@ "utopia-php/logger": "0.8.*", "utopia-php/messaging": "0.22.*", "utopia-php/migration": "1.*", - "utopia-php/platform": "0.13.*", + "utopia-php/platform": "^1.0@RC", "utopia-php/pools": "1.*", "utopia-php/span": "1.1.*", "utopia-php/preloader": "0.2.*", diff --git a/src/Appwrite/GraphQL/Resolvers.php b/src/Appwrite/GraphQL/Resolvers.php index cabb357607..41e808b13c 100644 --- a/src/Appwrite/GraphQL/Resolvers.php +++ b/src/Appwrite/GraphQL/Resolvers.php @@ -58,7 +58,7 @@ class Resolvers */ private static function getResolverContainer(Http $utopia): Container { - $container = $utopia->getResource('container'); + $container = $utopia->context()->get('container'); if ($container instanceof Container || (\is_object($container) && \method_exists($container, 'get') && \method_exists($container, 'set'))) { /** @var Container $container */ @@ -95,9 +95,9 @@ class Resolvers ?Route $route, ): callable { return static fn ($type, $args, $context, $info) => new Swoole(function (callable $resolve, callable $reject) use ($utopia, $route, $args) { - $utopia = $utopia->getResource('utopia:graphql'); - $request = $utopia->getResource('request'); - $response = $utopia->getResource('response'); + $utopia = $utopia->context()->get('utopia:graphql'); + $request = $utopia->context()->get('request'); + $response = $utopia->context()->get('response'); self::resolve( $utopia, @@ -167,9 +167,9 @@ class Resolvers callable $url, ): callable { return static fn ($type, $args, $context, $info) => new Swoole(function (callable $resolve, callable $reject) use ($utopia, $databaseId, $collectionId, $url, $args) { - $utopia = $utopia->getResource('utopia:graphql'); - $request = $utopia->getResource('request'); - $response = $utopia->getResource('response'); + $utopia = $utopia->context()->get('utopia:graphql'); + $request = $utopia->context()->get('request'); + $response = $utopia->context()->get('response'); self::resolve( $utopia, @@ -203,9 +203,9 @@ class Resolvers callable $params, ): callable { return static fn ($type, $args, $context, $info) => new Swoole(function (callable $resolve, callable $reject) use ($utopia, $databaseId, $collectionId, $url, $params, $args) { - $utopia = $utopia->getResource('utopia:graphql'); - $request = $utopia->getResource('request'); - $response = $utopia->getResource('response'); + $utopia = $utopia->context()->get('utopia:graphql'); + $request = $utopia->context()->get('request'); + $response = $utopia->context()->get('response'); $beforeResolve = function ($payload) { return $payload['documents']; @@ -245,9 +245,9 @@ class Resolvers callable $params, ): callable { return static fn ($type, $args, $context, $info) => new Swoole(function (callable $resolve, callable $reject) use ($utopia, $databaseId, $collectionId, $url, $params, $args) { - $utopia = $utopia->getResource('utopia:graphql'); - $request = $utopia->getResource('request'); - $response = $utopia->getResource('response'); + $utopia = $utopia->context()->get('utopia:graphql'); + $request = $utopia->context()->get('request'); + $response = $utopia->context()->get('response'); self::resolve( $utopia, @@ -282,9 +282,9 @@ class Resolvers callable $params, ): callable { return static fn ($type, $args, $context, $info) => new Swoole(function (callable $resolve, callable $reject) use ($utopia, $databaseId, $collectionId, $url, $params, $args) { - $utopia = $utopia->getResource('utopia:graphql'); - $request = $utopia->getResource('request'); - $response = $utopia->getResource('response'); + $utopia = $utopia->context()->get('utopia:graphql'); + $request = $utopia->context()->get('request'); + $response = $utopia->context()->get('response'); self::resolve( $utopia, @@ -317,9 +317,9 @@ class Resolvers callable $url, ): callable { return static fn ($type, $args, $context, $info) => new Swoole(function (callable $resolve, callable $reject) use ($utopia, $databaseId, $collectionId, $url, $args) { - $utopia = $utopia->getResource('utopia:graphql'); - $request = $utopia->getResource('request'); - $response = $utopia->getResource('response'); + $utopia = $utopia->context()->get('utopia:graphql'); + $request = $utopia->context()->get('request'); + $response = $utopia->context()->get('response'); self::resolve( $utopia, @@ -373,7 +373,7 @@ class Resolvers } /** @var Response $resolverResponse */ - $resolverResponse = clone $utopia->getResource('response'); + $resolverResponse = clone $utopia->context()->get('response'); $container = self::getResolverContainer($utopia); $container->set('request', static fn () => $request); $container->set('response', static fn () => $resolverResponse); diff --git a/src/Appwrite/GraphQL/Schema.php b/src/Appwrite/GraphQL/Schema.php index 4ff96fb635..a689655e31 100644 --- a/src/Appwrite/GraphQL/Schema.php +++ b/src/Appwrite/GraphQL/Schema.php @@ -84,7 +84,7 @@ class Schema protected static function api(Http $utopia, callable $complexity): array { Mapper::init($utopia - ->getResource('response') + ->context()->get('response') ->getModels()); $queries = []; diff --git a/src/Appwrite/GraphQL/Types/Mapper.php b/src/Appwrite/GraphQL/Types/Mapper.php index 55810fd74e..92c7753ad2 100644 --- a/src/Appwrite/GraphQL/Types/Mapper.php +++ b/src/Appwrite/GraphQL/Types/Mapper.php @@ -254,7 +254,7 @@ class Mapper array $injections ): Type { $validator = \is_callable($validator) - ? \call_user_func_array($validator, $utopia->getResources($injections)) + ? \call_user_func_array($validator, \array_map($utopia->context()->get(...), $injections)) : $validator; $isNullable = $validator instanceof Nullable; diff --git a/src/Appwrite/Platform/Installer/Server.php b/src/Appwrite/Platform/Installer/Server.php index 38d61b7d24..26d82adf24 100644 --- a/src/Appwrite/Platform/Installer/Server.php +++ b/src/Appwrite/Platform/Installer/Server.php @@ -154,7 +154,7 @@ class Server $nativeServer = $adapter->getNativeServer(); - $container = $adapter->getContainer(); + $container = $adapter->resources(); $container->set('installerState', fn () => $state); $container->set('installerConfig', fn () => $config); $container->set('installerPaths', fn () => $paths);