mirror of
https://github.com/directus/directus.git
synced 2026-04-25 03:00:53 -04:00
* items semi complete
* updated items page to use snippet toggler and migrated endpoint docs to use it
* updated files page to use snippet toggler and migrated REST and GraphQL endpoint docs to it
* updated activity page to use snippet toggler and migrated REST and GraphQL endpoint doc to it
* updated collections page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* updated dashboards page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated extensions page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated fields page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated flows page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated folders page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated notifications page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated operations page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated panels page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated permissions page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated presets page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated relations page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated revisions page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated roles page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Made headlines consistant with the rest of the doc pages
* Updated server page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated settings page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated shares page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated translations page to use snippet togglers and migrated REST endpoint docs to them
* Updated users page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated utilities page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated webhooks page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated authentication page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* Updated Global Parameters page to use snippet togglers where there are adjacent REST and GraphQL Examples
* Added SDK code snippets to items page and made generic variables consistant
* Added SDK code snippets to files page and made generic variables consistant
* Few lang changes for files page
* Added SDK code snippets to activity page and made generic variables consistant
* Added SDK code snippets to collections page and made generic variables consistant
* Added SDK code snippets to dashboards page and made generic variables consistant
* removed query word from query parameter objects
* Added SDK code snippets to fields page and made generic variables consistant
* SnippetToggler border
* Used dynamic border color for snippettoggler heading
* Spacing top and bottom of snippet toggler in docs
* Removed extra HRs
* Remove manual TOC in query reference
* Small code styling change in items page
* Updated users page to use snippet togglers and migrated REST and GraphQL endpoint docs to them
* dashboards fixed up property names
* Small copy update on extensions page
* Updated keys in delete mult notifications REST
* Updated keys in operations
* Update keys in panel delete many
* Update keys in permissions
* Added quotes around generic example ID strings
* Added code formatting to final example in share public info
* Format files
* Refined sidebar
* Insert newline before ending template tags
* Fixed extra closing tags, causing an error, un users ref
* Text Formatting Users
* Put GQL related notes inside toggler
* Added SDK code snippets to flows page and made generic variables consistant
* Added SDK code snippets to folder page and made generic variables consistant
* fixing whitepsace for flows and folders page
* Consistent newlines in SnippetToggler usages
* Run prettier
* Fix 'alwaysDark' definition
* Home page snippet toggler style fixes
* Fix snippet toggler lang hover color in light mode
* Introduce different code theme for light mode
* Added SDK code snippets to notifications page and made generic variables consistant
* Switch to 'material-theme-lighter'
* Format file
* Fix tip
* Fix tip in sdk ref
* Consistent spacing for custom containers
* Added SDK code snippets to operations page and made generic variables consistant
* Lint & format code blocks
* Lint & format operations
* Added SDK code snippets to panels page and made generic variables consistant
* Added SDK code snippets to permissions page and made generic variables consistant
* Added SDK code snippets to presets page and made generic variables consistant
* Added SDK code snippets to relations page and made generic variables consistant
* Added SDK code snippets to revisions page and made generic variables consistant
* Added SDK code snippets to roles page and made generic variables consistant
* Added SDK code snippets to server page and made generic variables consistant
* Added SDK code snippets to settings page and made generic variables consistant
* app_url -> directus_project_url
* Omitted auth details in delete multiple files
* Added quotes to values in roles
* Upload a file snippets
* Pluralization for upload/import files
* More files functions typos
* Added SDK code snippets to shares page (still missing createShare(s) as endpoint not functioning currently) and made generic variables consistant
* Added SDK code snippets to translations page (missing delete endponts because not working) and made generic variables consistant
* Added SDK code snippets to users page and made generic variables consistant
* Added SDK code snippets to webhooks page and made generic variables consistant
* Added SDK code snippets to utilites page (except cleaning cache, will be tested and added in later commit) and made generic variables consistant
* Added SDK code snippets to auth page (not login, refresh, and logout though due to errors)
* Added SDK code snippets for utilsExport and clearCache
* added github username be7DOTis to contributors
* Omit auth commands in updateComment
* utilsImport
* rename app_url generic value
* changed instances of updated*operation* to update*Operation*
* missed some 'updated' changse
* Added SDK Snippets to Query Parameters page
* Add section on file security
* added create(s)Shares SDK snippet to shares page
* added console.log to create snippets
* Added delete(s)Webhook SDK snippet to webhooks page
* Added SDK snippets to extensions page
* Added create/updateSingleton section to items page
* Links in files security
* Added SDK Snippets to Schema page
* Added GQL Generic examples to snippet togglers and removed snippet toggler from Login Using SSO Providers
* Added create(s)Presets SDK Snippets to presets page
* replaced fields query in generics snippets for a more generic
* replaced fields query in generics snippets for a more generic
* Use storage value only if valid choice
* Sync snippet togglers across page
* Update docs/reference/system/activity.md
* Update docs/reference/system/activity.md
* Update docs/reference/system/extensions.md
* Update docs/reference/system/revisions.md
* Update docs/reference/system/settings.md
* Update docs/reference/system/revisions.md
* Update docs/reference/system/settings.md
* Update docs/reference/system/activity.md
* Update docs/reference/system/roles.md
* Update docs/reference/system/roles.md
* Update docs/reference/system/roles.md
* Update docs/reference/system/roles.md
* Update docs/reference/system/schema.md
* Update docs/reference/system/server.md
* Update docs/reference/system/shares.md
* Replace all directus_project_url placeholders
* Revert "Sync snippet togglers across page"
This reverts commit 8b36f0d778.
* Update docs/reference/system/shares.md
* Update docs/reference/system/webhooks.md
* Clarify singleton section
* Consistent newlines between SnippetToggler templates
* Format files
* Remove console.log(result) statements from snippet
* Add examples for shares & users
Co-authored-by: Brainslug <tim@brainslug.nl>
* Fix hash GraphQL example
* Clarify update singleton section
* Add auth examples
Co-authored-by: Brainslug <tim@brainslug.nl>
* Final run on consistent newlines between SnippetToggler
* Switch to github themes
* The "Last One"
Co-authored-by: Brainslug <tim@brainslug.nl>
* The "Big One"
* Fix dead links
---------
Co-authored-by: Bevis Halsey-Perry <hi@be7.is>
Co-authored-by: Kevin Lewis <kvn@lws.io>
Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch>
Co-authored-by: Brainslug <br41nslug@users.noreply.github.com>
Co-authored-by: rijkvanzanten <rijkvanzanten@me.com>
Co-authored-by: Brainslug <tim@brainslug.nl>
212 lines
5.4 KiB
Markdown
212 lines
5.4 KiB
Markdown
---
|
|
description: Learn how to migrate your data model to a new Directus project using Node.js.
|
|
tags: []
|
|
skill_level:
|
|
directus_version: 9.23.0
|
|
author_override:
|
|
author: Kevin Lewis
|
|
---
|
|
|
|
# Migrate Your Data Model with Node.js
|
|
|
|
> {{ $frontmatter.description }}
|
|
|
|
::: tip Author: {{$frontmatter.author}}
|
|
|
|
**Directus Version:** {{$frontmatter.directus_version}}
|
|
|
|
:::
|
|
|
|
## Explanation
|
|
|
|
Directus' schema migration endpoints allow users to retrieve a project's data model and apply changes to another
|
|
project.
|
|
|
|
This is useful if you make changes to a data model in a development project and need to apply them to a production
|
|
project, or to move from a self-hosted project to Directus Cloud.
|
|
|
|
## How-To Guide
|
|
|
|
::: tip Permissions
|
|
|
|
You must be an admin user to use these endpoints and follow this guide.
|
|
|
|
:::
|
|
|
|
You should have two Directus projects - this guide will refer to them as the "base" and the "target". Before starting,
|
|
make sure you have a static access token for both projects.
|
|
|
|
### Set Up Project
|
|
|
|
Open a new empty directory in your code editor. In your terminal, navigate to the directory and install dependencies
|
|
with `npm install cross-fetch`.
|
|
|
|
Create a new `index.js` file and set it up:
|
|
|
|
```js
|
|
const fetch = require('cross-fetch');
|
|
|
|
const BASE_DIRECTUS_URL = 'https://your-base-project.directus.app';
|
|
const BASE_ACCESS_TOKEN = 'your-access-token';
|
|
|
|
const TARGET_DIRECTUS_URL = 'https://your-target-project.directus.app';
|
|
const TARGET_ACCESS_TOKEN = 'your-access-token';
|
|
|
|
async function main() {}
|
|
|
|
main();
|
|
```
|
|
|
|
### Retrieve Data Model Snapshot From Base Project
|
|
|
|
At the bottom of `index.js`, create a `getSnapshot()` function:
|
|
|
|
```js
|
|
async function getSnapshot() {
|
|
const URL = `${BASE_DIRECTUS_URL}/schema/snapshot?access_token=${BASE_ACCESS_TOKEN}`;
|
|
const { data } = await fetch(URL).then((r) => r.json());
|
|
return data;
|
|
}
|
|
```
|
|
|
|
Note that the data property is destructured from the response and returned. In the `main()` function, call
|
|
`getSnapshot()`:
|
|
|
|
```js
|
|
async function main() {
|
|
const snapshot = await getSnapshot(); // [!code ++]
|
|
console.log(snapshot); // [!code ++]
|
|
}
|
|
```
|
|
|
|
Get your snapshot by running `node index.js`.
|
|
|
|
### Retrieve Data Model Diff
|
|
|
|
This section will create a "diff" that describes all differences between your base and target project's data models.
|
|
|
|
At the bottom of `index.js`, create a `getDiff()` function which accepts a `snapshot` parameter:
|
|
|
|
```js
|
|
async function getDiff(snapshot) {
|
|
const URL = `${TARGET_DIRECTUS_URL}/schema/diff?access_token=${TARGET_ACCESS_TOKEN}`;
|
|
|
|
const { data } = await fetch(URL, {
|
|
method: 'POST',
|
|
body: JSON.stringify(snapshot),
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
}).then((r) => r.json());
|
|
|
|
return data;
|
|
}
|
|
```
|
|
|
|
Update your `main()` function:
|
|
|
|
```js
|
|
async function main() {
|
|
const snapshot = await getSnapshot();
|
|
console.log(snapshot); // [!code --]
|
|
const diff = await getDiff(snapshot); // [!code ++]
|
|
console.log(diff); // [!code ++]
|
|
}
|
|
```
|
|
|
|
Get your diff by running `node index.js`.
|
|
|
|
### Apply Diff To Target Project
|
|
|
|
At the bottom of `index.js`, create a `applyDiff()` function which accepts a `diff` parameter:
|
|
|
|
```js
|
|
async function applyDiff(diff) {
|
|
const URL = `${TARGET_DIRECTUS_URL}/schema/apply?access_token=${TARGET_ACCESS_TOKEN}`;
|
|
|
|
await fetch(URL, {
|
|
method: 'POST',
|
|
body: JSON.stringify(diff),
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
});
|
|
}
|
|
```
|
|
|
|
Update your `main()` function:
|
|
|
|
```js
|
|
async function main() {
|
|
const snapshot = await getSnapshot();
|
|
const diff = await getDiff(snapshot);
|
|
console.log(diff); // [!code --]
|
|
await applyDiff(diff); // [!code ++]
|
|
}
|
|
```
|
|
|
|
Apply the diff by running `node index.js`.
|
|
|
|
## Final Tips
|
|
|
|
The diff endpoint does not allow different Directus versions and database vendors by default. This is to avoid any
|
|
unintentional diffs from being generated. You can opt in to bypass these checks by adding a second query parameter
|
|
called `force` with the value of `true`.
|
|
|
|
The hash property in the diff is based on the target instance's schema and version. It is used to safeguard against
|
|
changes that may happen after the current diff was generated which can potentially incur unexpected side effects when
|
|
applying the diffs without this safeguard. In case the schema has been changed in the meantime, the diff must be
|
|
regenerated.
|
|
|
|
The complete and final code is available below.
|
|
|
|
```js
|
|
const fetch = require('cross-fetch');
|
|
|
|
const BASE_DIRECTUS_URL = 'https://your-base-project.directus.app';
|
|
const BASE_ACCESS_TOKEN = 'your-access-token';
|
|
|
|
const TARGET_DIRECTUS_URL = 'https://your-target-project.directus.app';
|
|
const TARGET_ACCESS_TOKEN = 'your-access-token';
|
|
|
|
async function main() {
|
|
const snapshot = await getSnapshot();
|
|
const diff = await getDiff(snapshot);
|
|
await applyDiff(diff);
|
|
}
|
|
|
|
main();
|
|
|
|
async function getSnapshot() {
|
|
const URL = `${BASE_DIRECTUS_URL}/schema/snapshot?access_token=${BASE_ACCESS_TOKEN}`;
|
|
const { data } = await fetch(URL).then((r) => r.json());
|
|
return data;
|
|
}
|
|
|
|
async function getDiff(snapshot) {
|
|
const URL = `${TARGET_DIRECTUS_URL}/schema/diff?access_token=${TARGET_ACCESS_TOKEN}`;
|
|
|
|
const { data } = await fetch(URL, {
|
|
method: 'POST',
|
|
body: JSON.stringify(snapshot),
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
}).then((r) => r.json());
|
|
|
|
return data;
|
|
}
|
|
|
|
async function applyDiff(diff) {
|
|
const URL = `${TARGET_DIRECTUS_URL}/schema/apply?access_token=${TARGET_ACCESS_TOKEN}`;
|
|
|
|
await fetch(URL, {
|
|
method: 'POST',
|
|
body: JSON.stringify(diff),
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
});
|
|
}
|
|
```
|