WIP fix individual param resolution
This commit is contained in:
parent
5010317d8b
commit
601576a9e3
2 changed files with 34 additions and 31 deletions
|
@ -5,6 +5,7 @@ use Appwrite\Utopia\Response;
|
||||||
use GraphQL\Error\DebugFlag;
|
use GraphQL\Error\DebugFlag;
|
||||||
use GraphQL\GraphQL;
|
use GraphQL\GraphQL;
|
||||||
use GraphQL\Type;
|
use GraphQL\Type;
|
||||||
|
use GraphQL\Validator\Rules\DisableIntrospection;
|
||||||
use GraphQL\Validator\Rules\QueryComplexity;
|
use GraphQL\Validator\Rules\QueryComplexity;
|
||||||
use GraphQL\Validator\Rules\QueryDepth;
|
use GraphQL\Validator\Rules\QueryDepth;
|
||||||
use Swoole\Coroutine\WaitGroup;
|
use Swoole\Coroutine\WaitGroup;
|
||||||
|
@ -83,9 +84,8 @@ function graphqlRequest(
|
||||||
/** @var Utopia\Registry\Registry $register */
|
/** @var Utopia\Registry\Registry $register */
|
||||||
/** @var \Utopia\Database\Database $dbForProject */
|
/** @var \Utopia\Database\Database $dbForProject */
|
||||||
|
|
||||||
// Should allow accepting entire body as query if content-type is application/graphql:
|
|
||||||
// https://graphql.org/learn/serving-over-http/#post-request
|
|
||||||
if ($request->getHeader('content-type') === 'application/graphql') {
|
if ($request->getHeader('content-type') === 'application/graphql') {
|
||||||
|
// TODO: Add getRawContent() method to Request
|
||||||
$query = $request->getSwoole()->rawContent();
|
$query = $request->getSwoole()->rawContent();
|
||||||
}
|
}
|
||||||
if (empty($query)) {
|
if (empty($query)) {
|
||||||
|
@ -101,10 +101,13 @@ function graphqlRequest(
|
||||||
[
|
[
|
||||||
new QueryComplexity(App::getEnv('_APP_GRAPHQL_MAX_QUERY_COMPLEXITY', 200)),
|
new QueryComplexity(App::getEnv('_APP_GRAPHQL_MAX_QUERY_COMPLEXITY', 200)),
|
||||||
new QueryDepth(App::getEnv('_APP_GRAPHQL_MAX_QUERY_DEPTH', 3)),
|
new QueryDepth(App::getEnv('_APP_GRAPHQL_MAX_QUERY_DEPTH', 3)),
|
||||||
//new DisableIntrospection(),
|
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (App::isProduction()) {
|
||||||
|
$validations[] = new DisableIntrospection();
|
||||||
|
}
|
||||||
|
|
||||||
$schema = Builder::appendProjectSchema(
|
$schema = Builder::appendProjectSchema(
|
||||||
$apiSchema,
|
$apiSchema,
|
||||||
$utopia,
|
$utopia,
|
||||||
|
@ -125,21 +128,20 @@ function graphqlRequest(
|
||||||
// Blocking wait while queries resolve asynchronously
|
// Blocking wait while queries resolve asynchronously
|
||||||
$wg = new WaitGroup();
|
$wg = new WaitGroup();
|
||||||
$wg->add();
|
$wg->add();
|
||||||
$promise->then(
|
$promise->then(function ($result) use ($response, $debugFlags, $wg) {
|
||||||
function ($result) use ($response, $debugFlags, $wg) {
|
$result = $result->toArray($debugFlags);
|
||||||
$result = $result->toArray($debugFlags);
|
\var_dump("Result:" . $result);
|
||||||
if (isset($result['errors'])) {
|
if (isset($result['errors'])) {
|
||||||
$response->json(['data' => [], ...$result]);
|
$response->json(['data' => [], ...$result]);
|
||||||
$wg->done();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$response->json(['data' => $result]);
|
|
||||||
$wg->done();
|
|
||||||
},
|
|
||||||
function ($error) use ($response, $wg) {
|
|
||||||
$response->text(\json_encode(['errors' => [\json_encode($error)]]));
|
|
||||||
$wg->done();
|
$wg->done();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
);
|
$response->json(['data' => $result]);
|
||||||
|
$wg->done();
|
||||||
|
},
|
||||||
|
function ($error) use ($response, $wg) {
|
||||||
|
$response->text(\json_encode(['errors' => [\json_encode($error)]]));
|
||||||
|
$wg->done();
|
||||||
|
});
|
||||||
$wg->wait();
|
$wg->wait();
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ use Utopia\Database\Database;
|
||||||
use Utopia\Database\Document;
|
use Utopia\Database\Document;
|
||||||
use Utopia\Database\Validator\Authorization;
|
use Utopia\Database\Validator\Authorization;
|
||||||
use Utopia\Registry\Registry;
|
use Utopia\Registry\Registry;
|
||||||
|
use Utopia\Route;
|
||||||
use Utopia\Validator;
|
use Utopia\Validator;
|
||||||
|
|
||||||
class Builder
|
class Builder
|
||||||
|
@ -30,7 +31,7 @@ class Builder
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public static function init()
|
public static function init(): void
|
||||||
{
|
{
|
||||||
self::$typeMapping = [
|
self::$typeMapping = [
|
||||||
Model::TYPE_BOOLEAN => Type::boolean(),
|
Model::TYPE_BOOLEAN => Type::boolean(),
|
||||||
|
@ -99,8 +100,8 @@ class Builder
|
||||||
$fields[$escapedKey] = [
|
$fields[$escapedKey] = [
|
||||||
'type' => $type,
|
'type' => $type,
|
||||||
'description' => $props['description'],
|
'description' => $props['description'],
|
||||||
'resolve' => fn ($object, $args, $context, $info) => $object->then(function ($obj) use ($object, $key) {
|
'resolve' => fn ($object, $args, $context, $info) => $object->then(function ($obj) use ($object, $key, $props) {
|
||||||
return $obj['result'][$key];
|
return $obj[$key];
|
||||||
}),
|
}),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -504,6 +505,8 @@ class Builder
|
||||||
|
|
||||||
foreach ($utopia->getRoutes() as $method => $routes) {
|
foreach ($utopia->getRoutes() as $method => $routes) {
|
||||||
foreach ($routes as $route) {
|
foreach ($routes as $route) {
|
||||||
|
/** @var Route $route */
|
||||||
|
|
||||||
if (str_starts_with($route->getPath(), '/v1/mock/')) {
|
if (str_starts_with($route->getPath(), '/v1/mock/')) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -541,20 +544,18 @@ class Builder
|
||||||
$resolve = fn($type, $args, $context, $info) => new CoroutinePromise(
|
$resolve = fn($type, $args, $context, $info) => new CoroutinePromise(
|
||||||
function (callable $resolve, callable $reject) use ($utopia, $request, $response, &$register, $route, $args, $context, $info) {
|
function (callable $resolve, callable $reject) use ($utopia, $request, $response, &$register, $route, $args, $context, $info) {
|
||||||
// Mutate the original request object to include the query variables at the top level
|
// Mutate the original request object to include the query variables at the top level
|
||||||
$swooleRq = $request->getSwoole();
|
$swoole = $request->getSwoole();
|
||||||
$swooleRq->post = $args;
|
$swoole->post = $args;
|
||||||
|
|
||||||
// Drop json content type so post args are used directly
|
// Drop json content type so post args are used directly
|
||||||
if (\array_key_exists('content-type', $swooleRq->header)
|
if (\array_key_exists('content-type', $swoole->header)
|
||||||
&& $swooleRq->header['content-type'] === 'application/json') {
|
&& $swoole->header['content-type'] === 'application/json') {
|
||||||
unset($swooleRq->header['content-type']);
|
unset($swoole->header['content-type']);
|
||||||
}
|
}
|
||||||
$request = new Request($swooleRq);
|
$request = new Request($swoole);
|
||||||
|
|
||||||
$utopia
|
|
||||||
->setRoute($route)
|
|
||||||
->execute($route, $request);
|
|
||||||
|
|
||||||
|
$route->getAction();
|
||||||
|
$utopia->execute($route, $request);
|
||||||
$result = $response->getPayload();
|
$result = $response->getPayload();
|
||||||
|
|
||||||
if ($response->getCurrentModel() == Response::MODEL_ERROR_DEV) {
|
if ($response->getCurrentModel() == Response::MODEL_ERROR_DEV) {
|
||||||
|
@ -563,7 +564,7 @@ class Builder
|
||||||
$reject(new GQLException($result['message'], $result['code']));
|
$reject(new GQLException($result['message'], $result['code']));
|
||||||
}
|
}
|
||||||
|
|
||||||
$resolve($result['result']);
|
$resolve($result);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue