mirror of
https://github.com/directus/directus.git
synced 2026-02-03 08:54:59 -05:00
* Start on GraphQL "2.0", add methodnotallowed exceptoin * Fix relative file pointer in peer dep * [WIP] Add pre-filtered schema to SchemaOverview * Use root schema as is, add reduce-schema util * Use reduceSchema in the wild * Base schema on local reduced schema * Remove todo * Use graphql-compose to build out schema * Start restructuring resolvers * Add create mutation * Return boolean true for empty create mutation selections * Add update mutation * Add delete mutation * Add system/items scoping * Fix merge conflicts for real now * Use system services, rename ids->keys * Start on docs on mutations * Updates to match main * Add fetch-by-id * Add one/many resolvers for mutations * Check system collection rows for singleton * Fix resolver extraction for single read * Share delete return type * Add comments * Use collection root name for readable type * Add specs endpoint for GraphQL SDL * Update docs * Add note on SDL spec * Fix delete single example * Remove package-lock * Fix collection read scoping in non-read
212 lines
3.8 KiB
Markdown
212 lines
3.8 KiB
Markdown
# GraphQL API
|
|
|
|
> Directus offers a GraphQL endpoint out-of-the-box. It can be accessed through `/graphql` and `/graphql/system`.
|
|
|
|
[[toc]]
|
|
|
|
::: tip Authentication
|
|
|
|
By default, the GraphQL endpoint will access data as the public role. If you feel like collections or fields are
|
|
missing, make sure you're authenticated as a user that has access to those fields or that your public role has the
|
|
correct permissions. See [Authentication](/reference/api/authentication).
|
|
|
|
:::
|
|
|
|
::: tip User- vs System-Data
|
|
|
|
To avoid naming conflicts between user-created collections and Directus' system data, the two have been split up into
|
|
two endpoints: `/graphql` and `/graphql/system` respectively.
|
|
|
|
:::
|
|
|
|
## Query
|
|
|
|
Basic queries are done by using the collection name as the query field, for example:
|
|
|
|
```graphql
|
|
query {
|
|
articles {
|
|
id
|
|
title
|
|
}
|
|
}
|
|
```
|
|
|
|
This will fetch the `id`, and `title` fields in the `articles` collection using the default [arguments](#arguments).
|
|
|
|
### Arguments
|
|
|
|
All [global query parameters](/reference/api/query/) are available as Arguments in GraphQL, for example:
|
|
|
|
```graphql
|
|
query {
|
|
articles(sort: ["published_on"], limit: 15, filter: { status: { _eq: "published" } }) {
|
|
id
|
|
title
|
|
body
|
|
}
|
|
}
|
|
```
|
|
|
|
### Fetching a Single Item
|
|
|
|
To fetch a single item by ID, append `_by_id` to the collection name in the query, and provide the `id` attribute, for
|
|
example:
|
|
|
|
```graphql
|
|
query {
|
|
# Fetch article with ID 5
|
|
articles_by_id(id: 5) {
|
|
id
|
|
title
|
|
}
|
|
}
|
|
```
|
|
|
|
### Variables
|
|
|
|
Variables can be used to dynamically insert/override parts of the query, for example:
|
|
|
|
```graphql
|
|
query($id: ID) {
|
|
articles_by_id(id: $id) {
|
|
id
|
|
title
|
|
}
|
|
}
|
|
```
|
|
|
|
```json
|
|
// Variables
|
|
{
|
|
"id": 5
|
|
}
|
|
```
|
|
|
|
### Fragments & Many-to-Any / Union Types
|
|
|
|
Fragments can be used to reuse selection sets between multiple queries, for example:
|
|
|
|
```graphql
|
|
fragment article_content on articles {
|
|
id
|
|
title
|
|
}
|
|
|
|
query {
|
|
rijksArticles: articles(filter: { author: { first_name: { _eq: "Rijk" } } }) {
|
|
...article_content
|
|
}
|
|
|
|
bensArticles: articles(filter: { author: { first_name: { _eq: "Ben" } } }) {
|
|
...article_content
|
|
}
|
|
}
|
|
```
|
|
|
|
Fragments are also used to dynamically query the correct fields in nested Many-to-Any fields:
|
|
|
|
```graphql
|
|
query {
|
|
pages {
|
|
sections {
|
|
item {
|
|
__typename
|
|
|
|
... on headings {
|
|
title
|
|
level
|
|
}
|
|
|
|
... on paragraphs {
|
|
body
|
|
}
|
|
|
|
... on videos {
|
|
source
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
## Mutation
|
|
|
|
Directus' GraphQL endpoint supports creating, updating, and deleting items through the GraphQL endpoint.
|
|
|
|
All mutations follow the `<action>_<collection>_<items | item>` format where `_item` operates on a single item, and
|
|
`_items` on a set of items, for example:
|
|
|
|
```
|
|
create_articles_items(data: [{}])
|
|
update_services_item(id: 1, data: {})
|
|
delete_likes_items(ids: [1, 5])
|
|
```
|
|
|
|
Singletons don't have this item vs items delineation, as they're only a single record at all times.
|
|
|
|
### Create
|
|
|
|
```graphql
|
|
mutation {
|
|
# Multiple
|
|
create_articles_items(data: [{ title: "Hello World!" }, { title: "Hello Again!" }]) {
|
|
id
|
|
title
|
|
created_by
|
|
}
|
|
|
|
# Single
|
|
create_articles_item(data: { title: "Hello World!" }) {
|
|
id
|
|
title
|
|
created_by
|
|
}
|
|
}
|
|
```
|
|
|
|
### Update
|
|
|
|
```graphql
|
|
mutation {
|
|
# Multiple
|
|
update_articles_items(ids: [15, 21, 42], data: { title: "Hello World!" }) {
|
|
id
|
|
title
|
|
modified_on
|
|
}
|
|
|
|
# Single
|
|
update_articles_item(id: 15, data: { title: "Hello World!" }) {
|
|
id
|
|
title
|
|
modified_on
|
|
}
|
|
}
|
|
```
|
|
|
|
### Delete
|
|
|
|
Delete mutations will only return the affected row IDs.
|
|
|
|
```graphql
|
|
mutation {
|
|
# Multiple
|
|
delete_articles_items(ids: [15, 21, 42]) {
|
|
ids
|
|
}
|
|
|
|
# Single
|
|
delete_articles_item(id: 15) {
|
|
id
|
|
}
|
|
}
|
|
```
|
|
|
|
## SDL Spec
|
|
|
|
You can download the SDL for the current project / user by opening `/server/specs/graphql` (or
|
|
`/server/specs/graphql/system`) in the browser. See [Get GraphQL SDL](/reference/api/rest/server/#get-graphql-sdl) for
|
|
more information.
|