postgraphile-core
This module implements a compatibility layer between PostGraphQL v4 and
graphile-build
, loading the relevant graphile-build-pg
plugins and setting
the correct inflector depending on the PostGraphQL options provided.
It's also suitable for usage in your own application, but please be aware you
need to bring your own security in the form of an authenticated pgClient
(see
below).
For more information about graphile-build-pg
please see the documentation at
graphile.org.
createPostGraphQLSchema(pgConfig, schemas, options)
This is the function you're most likely to use in production, it will return a
promise to a GraphQL schema. You are responsible in the calling code for
implementing security by passing a pre-authenticated pgClient
on context
.
Example:
const schema = await createPostGraphQLSchema(
process.env.DATABASE_URL,
['users_schema', 'posts_schema'],
{
dynamicJson: true,
pgJwtSecret: process.env.JWT_SECRET,
pgJwtTypeIdentifier: 'users_schema.jwt_type',
}
);
Full example:
const { createPostGraphQLSchema } = require('graphile-build-pg');
const pg = require('pg');
const pgPool = new pg.Pool(process.env.DATABASE_URL);
async function runQuery(query, variables) {
const schema = await createPostGraphQLSchema(
process.env.DATABASE_URL,
['users_schema', 'posts_schema'],
{
dynamicJson: true,
pgJwtSecret: process.env.JWT_SECRET,
pgJwtTypeIdentifier: 'users_schema.jwt_type',
}
);
const pgClient = await pgPool.connect();
await pgClient.query("begin");
try {
await pgClient.query(`select
set_config('role', 'postgraphql_user', true),
set_config('jwt.claims.user_id', '27', true)
`);
return await graphql(
schema,
query,
null,
{
pgClient: pgClient,
},
variables
);
} finally {
await pgClient.query("commit");
await pgClient.release();
}
}
runQuery(
"query MyQuery { allPosts { nodes { id, title, author: userByAuthorId { username } } } }"
).then(result => {
console.dir(result);
pgPool.release();
}).catch(e => {
console.error(e);
process.exit(1);
});
TODO: ensure this example works.
To see how this works in a real application, check out
withPostGraphQLContext
in
PostGraphQL
watchPostGraphQLSchema(pgConfig, schemas, options, onNewSchema)
This function is useful in development; it returns a promise that resolves to a
release
function that you can call to stop watching. The onNewSchema
callback will be called every time a new schema is generated, and it is
guaranteed to be called before the returned promise resolves. Other than the
additional onNewSchema
option, the options are identical to that of
createPostGraphQLSchema
above.