Follows utopia-php/http#249 migration guide to drop usage of the shims
kept for one-minor-release compat. Affected call sites switch to:
- Handler / hook context: inject 'route' (Route|null from the per-request
DI container) instead of $utopia->getRoute().
- Resource factories (init/resources/request.php): Router::matchRoute()
returning ?RouteMatch instead of $utopia->match($request).
- Error path in app/http.php: $app->getResource('routeMatch')?->route,
guarded with try/catch for the pre-dispatch error case.
- GraphQL resolver inner-request pattern (Resolvers.php): capture
getResource('routeMatch') as the original, Router::matchRoute() for
the inner URL, rebind 'route' / 'routeMatch' on the resolver container
in finally instead of setRoute($original). Http::execute() shim is
retained — the guide explicitly keeps it for this hand-built-route
case.
Redundant re-match in shared/api.php storage-cache branch removed; the
injected $route is already the current one.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pulls the Dispatcher fix that restores inline $request->getParams() at
each hook/action call site. The previous cache-once-before-init pattern
broke Appwrite's request-format migration filters (RequestV16…V22),
which are registered during init hooks and rely on getParams() re-running
the filter chain on each call. Fixes the backward-compat test failures
(testRequestFilters, WebhooksV22BackwardCompat*).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pin utopia-php/http to the refactor/coroutine-safe-dispatch branch, which
extracts per-request state into a Dispatcher + immutable RouteMatch so the
shared Http/Router/Route objects are no longer mutated under concurrent
coroutines.
Appwrite-side adjustments:
- app/controllers/shared/api.php: Route::getMatchedPath() was removed from
the library; use Route::getPath() for the /documentsdb vs /vectorsdb
substring check. Both the registered pattern and the matched path contain
the literal segment, so the behaviour is preserved.
- app/controllers/general.php: drop four $route->label('router', true)
writes. The sole reader in the wildcard 404 handler was deleted in
40beecdddc (Feb 2025); the writes were orphaned and mutated the shared
Route definition, which is now frozen under the new dispatch model.
Deprecated shims for Http::match(), Http::getRoute(), Http::setRoute() are
still honoured by the library; remaining call sites can migrate in a
follow-up pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Cache key never included the project ID, so two projects with the same
bucketId, fileId, and transform params would share a cache key. On a
cache hit, Appwrite re-validates the bucket from the cached resourceType
(another project's bucket), which doesn't exist in the requesting
project's DB, throwing storage_bucket_not_found.
Fix: add 'project' to cache.params on the preview route (covers query
param case) and fall back to the X-Appwrite-Project header in
cacheIdentifier() for authenticated requests.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Cache write hook now checks HTTP status code before writing to prevent
failed AVIF (or any other) conversions from poisoning the cache.
Bumps utopia-php/image to 0.8.5 which fixes AVIF/HEIC output by using
native Imagick instead of the deprecated magick convert shell command.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>