mirror of
https://github.com/directus/directus.git
synced 2026-04-25 03:00:53 -04:00
* Content Versioning (#19463)
Co-authored-by: Azri Kahar <42867097+azrikahar@users.noreply.github.com>
* Update clean-berries-do.md
* Prerelease mode
* v10.7.0-beta.0
* Ignore format of auto-generated pre.json file
* Update naming conventions for Content Versioning (#19678)
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* Content versioning tweaks (#19700)
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* Add additional system fields to Content Versioning & include preview in promote drawer (#19752)
* Use key instead of name for Content Versioning (#19813)
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* Reorder component tags
* Prompt user to keep or delete the version before promoting (#19829)
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* Fix multiple constraints to users system table from versions system table for MSSQL (#19912)
* fix multiple constraints from versions to users
* fix users unit test
* Add Sorting by Aggregated Queries (#19568)
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
Co-authored-by: ian <licitdev@gmail.com>
Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>
* Update API References for Content Versioning (#19911)
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* Add version argument in GraphQL (#19910)
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* Merge branch 'main' into next (#19974)
* Show installed extensions in settings pane (#19964)
* Setup boilerplate for extensions page
* Allow reading all extensions from the root endpoint
* Add basic sidebar info detail
* Render list of extensions
* Move extensions manager to folder
* Move stuff related to extensions to @directus/extensions
* Import extensions utils/types/etc from ext. package
* Resolve last imports
* Add no-extensions warning
* Start on extensions grouped
* Remove string type
* Improve naming conventions
* Couple more optimizations
* Add more structure
* Add comments
we finally understand how this works! hehe
* Remove constructor in favor of static set
* Add more comments
* Don't filter in get-extensions
TBD if this will break things horrendously
* Sprinkle on better names / comments
* Render by section, nested bundled extensions
* Fix typo
* Live-saving tip from the formatter
* Don't know where this came frmo
* Add a changeset
* 📈 Insights QoL Part 1 (#19467)
* Start adding Create Default Modal
* Add Metric List
* Number Formatter Utility
* Start on Label Formatting Options and Resizing
* Update Metric List to use New Number Formatter
* fix auto fit and styling
* fix typings for number formatter and error catching
* add conditional formatting to metric list
* Add Number Formatting to Metrics and Size Formats
* Add Option to Hide Percentage and Fix Sizing of Meter
* Add manual sizing for labels
* Add translation strings
* Add comments to insights
* Fix color errors and add icon
* update translations
* Refine Linechart
* Revert "Start adding Create Default Modal"
This reverts commit 184dd0bb73.
* Run prettier
* Remove Console Logging
* Fix Typings
* Create itchy-berries-rule.md
* Format file
* Fix Metric List for Aggre Group PR
* Remove Empty Class
* Run formatter
* Fix linter errors
* Fix import
* Update app/src/panels/label/panel-label.vue
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* Update app/src/panels/label/panel-label.vue
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* Update app/src/panels/line-chart/panel-line-chart.vue
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* Remove commented css
* Remove unneeded logic
* Fix auto resizing and text alignment
* Remove Expect Error Typechecking
* Add Migration
* Fix Prettier
* Lint auto-fixes
* Fix Resizing CSS and JS
* Add Metric List Translation
* Optimize migration
* Format files
* Fix metric-list translations
* Fix type issue in metric-list/index.ts
> Default export of the module has or is using private name 'Aggregate'.ts(4082)
> Default export of the module has or is using private name 'Group'.ts(4082)
* Remove Unit Translations
* De-duplicate migration
---------
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>
* SDK support for Content Versioning (#20000)
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
Co-authored-by: Brainslug <br41nslug@users.noreply.github.com>
* Add basic support for theming! (#20026)
* WIP start integrating theming
* Fix name
* Fix typo
* Move theme definition to json files
* Generate json from vite plugin
* Move default themes to root
* Render theme-provider in app
* Format variable names
* Move build script to separate npm run scrip
t
* Render correct var names in provider
* Render dark mode
* Update dependencies
* Setup styling rules for module bar
* Remove variables
* Don't rely on scoped var in editor
* Move light styles to theme
* Use theme vars in module bar
* Render theme styles in head
* Render alongside rather than wrapped
* Themable nav
* Allow using local devtools
* Do magic
* Fix auto theme fallback
* Update vue-i18n
* Use proper unicode symbol for multiplication
* Reorganize settings sidebar
* Use global translations for appearance options
* Add fields to migration
* Add theming group fields to system data
* Add strings to en-us for theming
* Add theming route that only renders theme group
* Add custom css to theming group
* Add system-theme interface
* Move default themes above custom css
* Move theme to global translations
* Use an array instead of object structure
* Add defaults for system fields
* Update migrations
* Pass theming information to provider
* Don't use default key in theme settings
* Use lodash.merge instead of defu
Better TypeScript type inference
* Nevermind the standalone app
It kinda sucks
* Only override rules
* Fetch theme overrides from user
* Use same field layout as settings
* Add theme overrides to db
* Classic 🤦🏻♂️
* Fix import
* Boilerplate overrides interface
* Update themes rules to use type def
* Boilerplate nested sections for themes
* Custom favicon (#19968)
* Add public_favicon field
* Add translation for favicon note
* Allow favicon regardless of permissions
* Return favicon as project info
* Type favicon in store
* Replace set-favicon with generate-fav util
* Render favicon in usehead
* Add changset
* Reads a little cleaner
* Semi-colons are a sign of wealth in wisdom
* Add a theme-overrides interface (#19970)
* Install typebox
* Rough in overrides interface
* Update theming settings in settings
* Upgrade dependencies
* Move theme output generation to separate composable
* Upgrade typebox
* Rename app/use-theme to use theme config
* Rework overrides interface
* Add changeset
* Allow default inheritAttrs
* Fixed handling of multiple WebSocket subscriptions on same target (#20005)
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* Add a cache clear method to the UtilsService (#19990)
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* Change csv db type to text (#19953)
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* Update placeholder text in file-image interface (#20004)
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* Use current Directus version in docs (#20008)
* Use theme background instead of background-page
* Replace foreground normal with theme foreground
* Add missing translation
* Use foreground-accent and foreground-subdued from theme
* Rename --brand to --project-color
* Reuse variable color
* Replace primary/secondary/success/warning/danger
* Use theme based vars in api data
* Add header bar theming options
* Add more theming rules
* Nest icon colors
* Fix names
* Fix names in sidebar icon
* Update theming form layout
* Consolidate shades
* Consolidate primary shades
* Add primary shades
* Use shade-calculcated primary alternatives
* Use primary as mixing color
* Define warning/danger/success/secondary as shades
* Support form field label
* Add schema for interface foreground
* Allow setting input colors
* Add Google custom font loading algorithm
* Use font variables from theme
* Use unhead to load google fonts
* Install unhead to themes provider
* Use display font in title text and large dividers
* Add the dark mode default
* Run formatter
* Updating seeds is a no-no
* 😔
* Fix test
---------
Co-authored-by: Nihcep <32708027+Nihcep@users.noreply.github.com>
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
Co-authored-by: Rob Lee <rob@nodeworks.com>
Co-authored-by: Daniel Biegler <DanielBiegler@users.noreply.github.com>
Co-authored-by: Azri Kahar <42867097+azrikahar@users.noreply.github.com>
* Fix build script on components package
* Fix RGB var usage
* Resolve Azri's notes
See https://github.com/directus/directus/pull/20026#pullrequestreview-1676876461
* Fix extensions icon
* Add ability to enable/disable extensions from App Settings (#20015)
* Add migrations for directus extensions table
* Prevent duplicate extensions from being loaded
* Add extension settings type
* Add settings getter with db sync
* Add commented out columns
For part 2!
* Load settings when loading extensions
* Normalize settings into extension info
* Use system-like output for extensions endpoint
* Render extensions overview from new meta type
* white space
* Bundle shared stuff as node exports as well
* Format file
* Fix output type of nested bundle entries
* Update package lock
* Hide uninstalled extensions
* Add disable context menu
* Hide disable controls on bundles
* Add API endpoint to update enabled state in DB
* Reload extensions on enable/disable
* Add refreshing on state change for disabled
* Remove commented out code
* Remove commented fields
* Add changeset
* Image having no empty line at the end
* Update GraphQL endpoints for extensions enable/disable (#20017)
* Update type for extensions read
* Add update extension
* Add changeset
* Update docs for updates in 19988 (#20019)
* SDK methods for extension reading/updating (#20018)
* Update SDK methods for extensions
* Add changeset
* Resolve Pascal's notes
* extracted extension api output type
* updated the update command
* Update sdk/src/types/extensions.ts
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
---------
Co-authored-by: Brainslug <tim@brainslug.nl>
Co-authored-by: Brainslug <br41nslug@users.noreply.github.com>
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* Run formatter
* Add extensions to app deny list
* Fix input param name
* Fix typo in docs
* Azri is right, again!
* Remove extraneous fields
* Fix registration of operation and bundle extensions (#20030)
* Fix icon map
* Fix extension enable flag type on SQLite
* Fetch settings from itemservice
Fixes database inconsistency issues
* Only load extensions service when database is installed
---------
Co-authored-by: Brainslug <tim@brainslug.nl>
Co-authored-by: Brainslug <br41nslug@users.noreply.github.com>
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
Co-authored-by: Nicola Krumschmidt <nicola.krumschmidt@freenet.de>
* Use theme colors in extensions settings
* 📈 Insights QoL Part 2 (#20029)
* Update Dashboard Overview Page + New Only Import Sidebar
* Update Panel Config Drawer
* Remove Old Export Function
* Add changeset
* Add Back Missing Translations
* Fix Styling
* Update Styling to use new themeing
* Fox Formatting
* Fix Last CSS Var
---------
Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>
* Fix auto-theme issue on public pages (#20045)
* Return default appearance from server info
* Don't default to auto
* Render light/dark class based on theme appearance
* Render browser matches dynamically
* Read default appearance on public project info
* No-mo' auto
* Fix linter error
* Use unhead to set body class attr
* Content Versioning: Small tweaks & fixes (#20020)
Co-authored-by: Azri Kahar <42867097+azrikahar@users.noreply.github.com>
* fix input-rich-text-html body color css variable (#20049)
* Fix three small issues in `next` (#20051)
* Fix casting of json fields on sqlite
* Cast to json on user settings as well
* Prevent multiple versions of Vue/Pinia (#20066)
Co-authored-by: Brainslug <tim@brainslug.nl>
* Insights QoL - QA Fixes (#20063)
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* Add changeset for #20066 (#20071)
* Merge `main` into `next` (#20082)
* added save options and hide archive button for Content Versioning (#20095)
* Allow removal of version name (#20101)
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* Merge `main` into `next` (#20100)
* Add max length to `key` & `name` for Content Versioning (#20097)
* Make `next` ready for `main` (#20104)
* Durus: test for o2m (#19957)
* Fix casing in file names
* Refactor file structure
* Split up related field node
* formatter
* renamed fields-node.ts to fields.ts
* added o2m field in tdd test
* Split up tests
Co-authored-by: Nitwel <mail@nitwel.de>
* moved variables to test
* used random values in db response mock
* finalized actual test
* added some explanation
* encapsulated mock stream creation
* encapsulated receiving data from stream
* removed root prop in query
* Fix some spelling errors and variable names
* Remove mocked stream hotfix
* Reset mock after each test
* reduced test to a minimum
---------
Co-authored-by: Nicola Krumschmidt <nicola.krumschmidt@freenet.de>
Co-authored-by: Nitwel <mail@nitwel.de>
* fix styling for specific map buttons (#20047)
* fix styling for specific map buttons
* added myself to contributors.yml
* fix format
* fix location of code.
* removed extra space
* signed cla (#20058)
* Fix format of contributors.yml (#20068)
* Correct count param in BlobClient.download() (#20056)
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* move api/errors to @directus/errors package (#20054)
Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* Fix http range request when transformation in use (#20060)
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
* Fixed SDK docblock for docs build (#20075)
* Docs: Snippet Toggler Improvements (#20077)
* Enforce Vue shorthand form for `true` attribute (#20079)
* Add homepage for quick ref in root package.json (#20083)
* Apply min-width for attached menus only (#20092)
* Apply min-width for attached menus only
* Add changeset
* Content Versioning Documentation (#20070)
* docs: add content-versioning guide
* docs: add versioning to user guide items
* updates: made updates to docs
* updates: add to headless cms guide
* fix: format
* fix: typo
* Fix link to versions ref page
Co-authored-by: Brainslug <br41nslug@users.noreply.github.com>
* Use "Content Versioning" capitalized
* Addressed comments
* Format file
---------
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
Co-authored-by: Brainslug <br41nslug@users.noreply.github.com>
Co-authored-by: Kevin Lewis <kvn@lws.io>
* Allow disabling of field menu options (#20094)
* New Crowdin updates (#19816)
* New translations en-us.yaml (German)
* New translations en-us.yaml (Portuguese, Brazilian)
* New translations en-us.yaml (Persian)
* New translations en-us.yaml (Chinese Simplified)
* New translations en-us.yaml (Arabic)
* New translations en-us.yaml (Italian)
* New translations en-us.yaml (Dutch)
* New translations en-us.yaml (Vietnamese)
* New translations en-us.yaml (Spanish, Mexico)
* New translations en-us.yaml (Spanish)
* New translations en-us.yaml (Croatian)
* New translations en-us.yaml (Turkish)
* New translations en-us.yaml (Romanian)
* New translations en-us.yaml (French)
* New translations en-us.yaml (Afrikaans)
* New translations en-us.yaml (Bulgarian)
* New translations en-us.yaml (Catalan)
* New translations en-us.yaml (Czech)
* New translations en-us.yaml (Danish)
* New translations en-us.yaml (Greek)
* New translations en-us.yaml (Finnish)
* New translations en-us.yaml (Hebrew)
* New translations en-us.yaml (Hungarian)
* New translations en-us.yaml (Japanese)
* New translations en-us.yaml (Korean)
* New translations en-us.yaml (Lithuanian)
* New translations en-us.yaml (Norwegian)
* New translations en-us.yaml (Polish)
* New translations en-us.yaml (Portuguese)
* New translations en-us.yaml (Russian)
* New translations en-us.yaml (Slovak)
* New translations en-us.yaml (Slovenian)
* New translations en-us.yaml (Albanian)
* New translations en-us.yaml (Swedish)
* New translations en-us.yaml (Ukrainian)
* New translations en-us.yaml (Chinese Traditional)
* New translations en-us.yaml (Icelandic)
* New translations en-us.yaml (Indonesian)
* New translations en-us.yaml (Spanish, Chile)
* New translations en-us.yaml (Thai)
* New translations en-us.yaml (Estonian)
* New translations en-us.yaml (Hindi)
* New translations en-us.yaml (Malay)
* New translations en-us.yaml (English, Canada)
* New translations en-us.yaml (English, United Kingdom)
* New translations en-us.yaml (French, Canada)
* New translations en-us.yaml (Faroese)
* New translations en-us.yaml (Esperanto)
* New translations en-us.yaml (Breton)
* New translations en-us.yaml (Bosnian)
* New translations en-us.yaml (Serbian (Latin))
* New translations en-us.yaml (Nepali)
* New translations en-us.yaml (Sorani (Kurdish))
* New translations en-us.yaml (Spanish, Latin America)
* Update source file en-US.yaml
* Update source file en-US.yaml
* New translations en-us.yaml (Croatian)
* New translations en-us.yaml (Croatian)
* New translations en-us.yaml (Russian)
* New translations en-us.yaml (Italian)
* New translations en-us.yaml (Italian)
* New translations en-us.yaml (Italian)
* New translations en-us.yaml (Croatian)
* Update source file en-US.yaml
* Update source file en-US.yaml
* New translations en-us.yaml (German)
* New translations en-us.yaml (Greek)
* New translations en-us.yaml (Italian)
* New translations en-us.yaml (Greek)
* New translations en-us.yaml (Albanian)
* 10.6.4 (#20102)
* Exit prerelease mode
---------
Co-authored-by: Jan Arends <jan.arends@mailbox.org>
Co-authored-by: Nicola Krumschmidt <nicola.krumschmidt@freenet.de>
Co-authored-by: Nitwel <mail@nitwel.de>
Co-authored-by: Boegie19 <34578426+Boegie19@users.noreply.github.com>
Co-authored-by: Dominic <dmarx@marxulm.de>
Co-authored-by: mscbpi <ms@cbpi.ch>
Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>
Co-authored-by: Brainslug <br41nslug@users.noreply.github.com>
Co-authored-by: Esther Agbaje <53586167+estheragbaje@users.noreply.github.com>
Co-authored-by: Kevin Lewis <kvn@lws.io>
---------
Co-authored-by: Azri Kahar <42867097+azrikahar@users.noreply.github.com>
Co-authored-by: Rijk van Zanten <rijkvanzanten@me.com>
Co-authored-by: Connor <12714889+ConnorSimply@users.noreply.github.com>
Co-authored-by: ian <licitdev@gmail.com>
Co-authored-by: Brainslug <br41nslug@users.noreply.github.com>
Co-authored-by: Nihcep <32708027+Nihcep@users.noreply.github.com>
Co-authored-by: Rob Lee <rob@nodeworks.com>
Co-authored-by: Daniel Biegler <DanielBiegler@users.noreply.github.com>
Co-authored-by: Brainslug <tim@brainslug.nl>
Co-authored-by: Nicola Krumschmidt <nicola.krumschmidt@freenet.de>
Co-authored-by: Jan Arends <jan.arends@mailbox.org>
Co-authored-by: Nitwel <mail@nitwel.de>
Co-authored-by: Boegie19 <34578426+Boegie19@users.noreply.github.com>
Co-authored-by: Dominic <dmarx@marxulm.de>
Co-authored-by: mscbpi <ms@cbpi.ch>
Co-authored-by: Esther Agbaje <53586167+estheragbaje@users.noreply.github.com>
Co-authored-by: Kevin Lewis <kvn@lws.io>
290 lines
9.8 KiB
Markdown
290 lines
9.8 KiB
Markdown
---
|
|
description: An introduction to the REST and GraphQL APIs in Directus.
|
|
readTime: 7 min read
|
|
pageClass: page-reference
|
|
---
|
|
|
|
# API Reference
|
|
|
|
> Directus offers both a REST and GraphQL API to manage the data in the database. The API has predictable
|
|
> resource-oriented URLs, relies on standard HTTP status codes, and uses JSON for input and output.
|
|
|
|
## Dynamic API
|
|
|
|
The platform's API uses [Database Mirroring](/getting-started/introduction#database-mirroring) to dynamically generate
|
|
REST endpoints and a GraphQL schema based on the connected database's architecture. Since these endpoints return data
|
|
based on your specific schema and configured permissions, the input/output of the API differs greatly for individual
|
|
installations.
|
|
|
|
## REST vs. GraphQL
|
|
|
|
**There is no difference in the functionality available between the REST and GraphQL endpoints.** The functionality
|
|
available in both is mapped to the same set of core services, meaning that you don't lose any performance or
|
|
capabilities by choosing one or the other.
|
|
|
|
Which one you choose is ultimately up to you.
|
|
|
|
## Authentication
|
|
|
|
By default, all data in the system is off-limits for unauthenticated users. To gain access to protected data, you must
|
|
[include an access token with every request](/reference/authentication#access-tokens), or
|
|
[configure permissions for the public role](/getting-started/quickstart#_6-set-role-public-permissions).
|
|
|
|
Useful references:
|
|
|
|
- [Authenticating into the API](/reference/authentication)
|
|
- [Login endpoint reference](/reference/authentication#login)
|
|
|
|
## Relational Data
|
|
|
|
By default, Directus only retrieves the reference value of a relational field in your items. To also retrieve _nested_
|
|
data of a relational field [the `fields` parameter](/reference/query#fields) in REST can be used, or regular nested
|
|
queries in GraphQL. This allows you to retrieve the author of your article included in the articles data, or fetch
|
|
related log entry points for your app's analytics data for example.
|
|
|
|
### Creating / Updating / Deleting
|
|
|
|
Similarly to fetching, relational content can be modified deeply as well.
|
|
|
|
#### Many-to-One
|
|
|
|
Many-to-One relationships are fairly straightforward to manage relationally. You can simply submit the changes you want
|
|
as an object under the relational key in your collection. For example, if you wanted to create a new featured article on
|
|
your page, you could submit:
|
|
|
|
```json
|
|
{
|
|
"featured_article": {
|
|
"title": "This is my new article!"
|
|
}
|
|
}
|
|
```
|
|
|
|
This will create a new record in the related collection, and save its primary key in the `featured_article` field for
|
|
this item. To update an existing item, simply provide the primary key with the updates, and Directus will treat it as an
|
|
update instead of a creation:
|
|
|
|
```json
|
|
{
|
|
"featured_article": {
|
|
"id": 15,
|
|
"title": "This is an updated title for my article!"
|
|
}
|
|
}
|
|
```
|
|
|
|
Seeing that the Many-to-One relationship stores the foreign key on the field itself, removing the item can be done by
|
|
nullifying the field:
|
|
|
|
```json
|
|
{
|
|
"featured_article": null
|
|
}
|
|
```
|
|
|
|
#### One-to-Many (/ Many-to-Many)
|
|
|
|
One-to-Many, and therefore Many-to-Many and Many-to-Any, relationships can be updated in one of two ways:
|
|
|
|
**Basic**
|
|
|
|
The API will return one-to-many fields as an array of nested keys or items (based on the `fields` parameter). You can
|
|
use this same structure to select what the related items are:
|
|
|
|
```json
|
|
{
|
|
"children": [2, 7, 149]
|
|
}
|
|
```
|
|
|
|
You can also provide an object instead of a primary key in order to create new items nested on the fly, or an object
|
|
with a primary key included to update an existing item:
|
|
|
|
```json
|
|
{
|
|
"children": [
|
|
2, // assign existing item 2 to be a child of the current item
|
|
{
|
|
"name": "A new nested item"
|
|
},
|
|
{
|
|
"id": 149,
|
|
"name": "Assign and update existing item 149"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
To remove items from this relationship, simply omit them from the array:
|
|
|
|
```json
|
|
{
|
|
"children": [2, 149]
|
|
}
|
|
```
|
|
|
|
This method of updating a one-to-many is very useful for smaller relational datasets.
|
|
|
|
**"Detailed"**
|
|
|
|
Alternatively, you can provide an object detailing the changes as follows:
|
|
|
|
```json
|
|
{
|
|
"children": {
|
|
"create": [{ "name": "A new nested item" }],
|
|
"update": [{ "id": 149, "name": "A new nested item" }],
|
|
"delete": [7]
|
|
}
|
|
}
|
|
```
|
|
|
|
This is useful if you need to have more tightly control on staged changes, or when you're working with a big relational
|
|
dataset.
|
|
|
|
#### Many-to-Any (Union Types)
|
|
|
|
Many-to-Any fields work very similar to a "regular" many-to-many, with the exception that the related field can pull in
|
|
the fields from any of the related collections, for example:
|
|
|
|
```json
|
|
{
|
|
"sections": [
|
|
{
|
|
"collection": "headings",
|
|
"item": {
|
|
/* headings fields */
|
|
}
|
|
},
|
|
{
|
|
"collection": "paragraphs",
|
|
"item": {
|
|
/* paragraphs fields */
|
|
}
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
##### REST API
|
|
|
|
To scope the fields that are returned per collection type, you can use the `<field>:<scope>` syntax in the fields
|
|
parameter as follows:
|
|
|
|
```
|
|
GET /items/pages
|
|
?fields[]=sections.item:headings.id
|
|
&fields[]=sections.item:headings.title
|
|
&fields[]=sections.item:paragraphs.body
|
|
&fields[]=sections.item:paragraphs.background_color
|
|
```
|
|
|
|
##### GraphQL
|
|
|
|
In GraphQL, you can use nested fragments on the Union Type to select the fields:
|
|
|
|
```graphql
|
|
query {
|
|
pages {
|
|
sections {
|
|
item {
|
|
... on headings {
|
|
id
|
|
title
|
|
}
|
|
|
|
... on paragraphs {
|
|
body
|
|
background_color
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
::: tip Updating
|
|
|
|
Updating records in a many-to-any is identical to the other relationship types.
|
|
|
|
:::
|
|
|
|
## SEARCH HTTP Method
|
|
|
|
When using the REST API to read multiple items by (very) advanced filters, you might run into the issue where the URL
|
|
simply can't hold enough data to include the full query structure. In those cases, you can use the SEARCH HTTP method as
|
|
a drop-in replacement for GET, where you're allowed to put the query into the request body as follows:
|
|
|
|
**Before:**
|
|
|
|
```
|
|
GET /items/articles?filter[title][_eq]=Hello World
|
|
```
|
|
|
|
**After:**
|
|
|
|
```http
|
|
SEARCH /items/articles
|
|
|
|
{
|
|
"query": {
|
|
"filter": {
|
|
"title": {
|
|
"_eq": "Hello World"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
There's a lot of discussion around whether or not to put a body in a GET request, to use POSTs to create search queries,
|
|
or to rely on a different method altogether. As of right now, we've chosen
|
|
[to align with IETF's _HTTP SEARCH Method_ specification](https://datatracker.ietf.org/doc/draft-ietf-httpbis-safe-method-w-body).
|
|
While we recognize this is still a draft spec, the SEARCH method has been used extensively before in the WebDAV world
|
|
([spec](https://tools.ietf.org/html/rfc5323)), and compared to the other available options, it feels like the "cleanest"
|
|
and most correct to handle this moving forward. As with everything else, if you have any ideas, opinions, or concerns,
|
|
[we'd love to hear your thoughts](https://github.com/directus/directus/discussions/new).
|
|
|
|
Useful reading:
|
|
|
|
- [_HTTP SEARCH Method_ (IETF, 2021)](https://datatracker.ietf.org/doc/draft-ietf-httpbis-safe-method-w-body)
|
|
- [_Defining a new HTTP method: HTTP SEARCH_ (Tim Perry, 2021)](https://httptoolkit.tech/blog/http-search-method)
|
|
- [_HTTP GET with request body_ (StackOverflow, 2009 and ongoing)](https://stackoverflow.com/questions/978061/http-get-with-request-body)
|
|
- [_Elastic Search GET body usage_ (elastic, n.d.)](https://www.elastic.co/guide/en/elasticsearch/guide/current/_empty_search.html)
|
|
- [_Dropbox starts using POST, and why this is poor API design._ (Evert Pot, 2015)](https://evertpot.com/dropbox-post-api)
|
|
|
|
## System data in GraphQL
|
|
|
|
Due to restrictions in GraphQL itself, it's impossible to properly scope/namespace system functionality from regular
|
|
data access. In order to prevent any naming conflicts between user-created and system data, we've scoped the access of
|
|
the two into separate endpoints for user and system data respectively: `/graphql` and `/graphql/system`. Both endpoints
|
|
share the same underlying schema, so **nested relations will work as expected** regardless if they "cross over" between
|
|
user and system data. The only difference in the two endpoints are the root query and mutation fields available.
|
|
|
|
## Error Codes
|
|
|
|
Below are the global error codes used within Directus, and what they mean.
|
|
|
|
| Error Code | HTTP Status | Description |
|
|
| ------------------------ | ----------- | --------------------------------------------------------------- |
|
|
| `FAILED_VALIDATION` | 400 | Validation for this particular item failed |
|
|
| `FORBIDDEN` | 403 | You are not allowed to do the current action |
|
|
| `INVALID_TOKEN` | 403 | Provided token is invalid |
|
|
| `TOKEN_EXPIRED` | 401 | Provided token is valid but has expired |
|
|
| `INVALID_CREDENTIALS` | 401 | Username / password or access token is wrong |
|
|
| `INVALID_IP` | 401 | Your IP address isn't allow-listed to be used with this user |
|
|
| `INVALID_OTP` | 401 | Wrong OTP was provided |
|
|
| `INVALID_PAYLOAD` | 400 | Provided payload is invalid |
|
|
| `INVALID_QUERY` | 400 | The requested query parameters can not be used |
|
|
| `UNSUPPORTED_MEDIA_TYPE` | 415 | Provided payload format or `Content-Type` header is unsupported |
|
|
| `REQUESTS_EXCEEDED` | 429 | Hit the rate limit |
|
|
| `ROUTE_NOT_FOUND` | 404 | Endpoint does not exist |
|
|
| `SERVICE_UNAVAILABLE` | 503 | Could not use external service |
|
|
| `UNPROCESSABLE_CONTENT` | 422 | You tried doing something illegal |
|
|
|
|
::: warning Security
|
|
|
|
To prevent leaking which items exist, all actions for non-existing items will return a `FORBIDDEN` error.
|
|
|
|
:::
|