Metadata API Reference: Manage metadata¶
Table of contents
Introduction¶
APIs to manage Hasura metadata which is stored in hdb_catalog
schema.
Supported from
The metadata API is supported for versions v2.0.0
and above and replaces the older
schema/metadata API.
export_metadata¶
export_metadata
is used to export the current metadata from the server as a JSON file.
POST /v1/metadata HTTP/1.1
Content-Type: application/json
X-Hasura-Role: admin
{
"type" : "export_metadata",
"version": 1 | 2
"args": {}
}
Response:
The response JSON will be the metadata object. The structure of the metadata object is just a JSON version of the metadata files generated by the CLI.
V2 Example:
POST /v1/metadata HTTP/1.1
Content-Type: application/json
X-Hasura-Role: admin
{
"type": "export_metadata",
"version": 2,
"args": {}
}
Response:
{
"resource_version": 8,
"metadata": {
"version": 3,
"sources": [
{
"name": "default",
"tables": [
{
"table": {
...
replace_metadata¶
replace_metadata
is used to replace/import metadata into Hasura. Existing
metadata will be replaced with the new one.
POST /v1/metadata HTTP/1.1
Content-Type: application/json
X-Hasura-Role: admin
{
"type" : "replace_metadata",
"version": 1 | 2
"args": <replace-metadata-args>
}
Args syntax¶
If version is set to 1, then args should be the JSON object which is same as the output of export_metadata.
For version 2, the following structure is used:
{
allow_inconsistent_metadata: Boolean
metadata: metadata-object
}
Key | Required | Schema | Description |
---|---|---|---|
allow_inconsistent_metadata | false | Boolean | If set to true , metadata will be replaced with a warning in the response indicating which items are inconsistent (default: false ) |
metadata | true | export_metadata | The metadata that will replace the current metadata. |
If the version is not specified, then it is inferred from the format of args
.
Request¶
POST /v1/metadata HTTP/1.1
Content-Type: application/json
X-Hasura-Role: admin
{
"type" : "replace_metadata",
"version": 2
"args": {
"allow_inconsistent_metadata": Boolean,
"metadata": <metadata-object>
}
}
Responses¶
Version 2 with inconsistencies and allow_inconsistent_metadata=false, or omitted corresponds with the response document in replace_metadata.
Version 2 example with inconsistencies and allow_inconsistent_metadata=true includes an is_consistent
and inconsistent_objects
corresponding to get_inconsistent_metadata.
HTTP/1.1 400 Bad Request
{
"internal": [
{
"type": "remote_schema",
"reason": "HTTP exception occurred while sending the request to http://localhost:5000/hello-graphql",
"definition": {
"definition": {
"url": "http://localhost:5000/hello-graphql",
"forward_client_headers": false
},
"name": "test",
"permissions": [],
"comment": "testing replace metadata with remote schemas"
}
}, ...
]
}
Version 2 example with inconsistencies and allow_inconsistent_metadata=true:
HTTP/1.1 200 OK
{
"is_consistent": false,
"inconsistent_objects": [
{
"definition": {
"definition": {
"url": "http://localhost:5000/hello-graphql",
"forward_client_headers": false
},
"name": "test",
"permissions": [],
"comment": "testing replace metadata with remote schemas"
},
"reason": "HTTP exception occurred while sending the request to http://localhost:5000/hello-graphql",
"type": "remote_schema"
}, ...
Version 2 example with invalid resource_version
:
HTTP/1.1 409 Conflict
{
"path": "$",
"error": "metadata resource version referenced (2) did not match current version",
"code": "conflict"
}
reload_metadata¶
reload_metadata
should be used when there is a change in underlying Postgres
database that Hasura should be aware of. Example: a new column is added to a
table using psql
and this column should now be added to the GraphQL schema.
POST /v1/metadata HTTP/1.1
Content-Type: application/json
X-Hasura-Role: admin
{
"type" : "reload_metadata",
"args": {
"reload_remote_schemas": true,
"reload_sources": false,
"recreate_event_triggers": true
}
}
Args syntax¶
Key | Required | Schema | Description |
---|---|---|---|
reload_remote_schemas | false | Boolean | [RemoteSchemaName] |
If set to true , all remote schemas’ (including inconsistent ones) cached GraphQL schemas are refreshed (default: true ) |
reload_sources | false | Boolean | [SourceName] |
If set to true , all sources’ (including inconsistent ones) cached GraphQL schemas are refreshed (default: true ) |
recreate_event_triggers | false | Boolean | [SourceName] |
If set to true , all sources’ (including inconsistent ones) cached event triggers and their corresponding SQL
triggers present in the source database will be recreated. When an array of SourceName is provided, the event triggers will only be recreated for those sources. (default: false i.e. no sources’ event triggers will be recreated) |
clear_metadata¶
clear_metadata
can be used to reset the state of Hasura – clean the current
state by forgetting the tables tracked, relationships, permissions, event
triggers etc.
POST /v1/metadata HTTP/1.1
Content-Type: application/json
X-Hasura-Role: admin
{
"type" : "clear_metadata",
"args": {}
}
get_inconsistent_metadata¶
get_inconsistent_metadata
can be used to fetch all inconsistent metadata objects.
POST /v1/metadata HTTP/1.1
Content-Type: application/json
X-Hasura-Role: admin
{
"type": "get_inconsistent_metadata",
"args": {}
}
Response:
[
{
"definition": {
"using": {
"foreign_key_constraint_on": {
"column": "author_id",
"table": "article"
}
},
"name": "articles",
"comment": null,
"table": "author"
},
"reason": "table \"article\" does not exist",
"type": "array_relation"
},
{
"definition": {
"using": {
"foreign_key_constraint_on": "author_id"
},
"name": "author",
"comment": null,
"table": "article"
},
"reason": "table \"article\" does not exist",
"type": "object_relation"
},
{
"definition": "article",
"reason": "no such table/view exists in source : \"article\"",
"type": "table"
}
]
drop_inconsistent_metadata¶
drop_inconsistent_metadata
can be used to purge all inconsistent objects from the metadata.
POST /v1/metadata HTTP/1.1
Content-Type: application/json
X-Hasura-Role: admin
{
"type": "drop_inconsistent_metadata",
"args": {}
}
test_webhook_transform¶
test_webhook_transform
can be used to test out request transformations using mock data.
POST /v1/metadata HTTP/1.1
Content-Type: application/json
X-Hasura-Role: admin
{
"type" : "test_webhook_transform",
"args" : {
"webhook_url": "http://localhost:1234",
"body": { "hello": "world" },
"request_transform": {
"body": "{{ $body.world }}",
"template_engine": "Kriti"
}
}
}
The webhook_url can be provided in an Environment Variable supplied in an object with the from_env key:
POST /v1/metadata HTTP/1.1
Content-Type: application/json
X-Hasura-Role: admin
{
"type" : "test_webhook_transform",
"args" : {
"webhook_url": {"from_env": "url_env_var" },
"body": { "hello": "world" },
"request_transform": {
"body": "{{ $body.world }}",
"template_engine": "Kriti"
}
}
}