From f6a6eb3fb4d99e0a5fca91aa5e5a06c284929dfe Mon Sep 17 00:00:00 2001
From: Martin Weise <martin.weise@tuwien.ac.at>
Date: Wed, 22 Jan 2025 15:19:09 +0100
Subject: [PATCH] Bumped yq and added schema validation

Signed-off-by: Martin Weise <martin.weise@tuwien.ac.at>
---
 .docs/.openapi/api-analyse.yaml               |  332 +
 .docs/.openapi/api-data.yaml                  | 1792 +++++
 .docs/.openapi/api-metadata.yaml              | 7043 +++++++++++++++++
 .docs/.openapi/api-search.yaml                |  387 +
 .docs/{.swagger => .openapi}/api.base.yaml    |    0
 .docs/{.swagger => .openapi}/api.yaml         |  810 +-
 .docs/{.swagger => .openapi}/custom.css       |    0
 .../openapi-generate.sh}                      |    4 +-
 .../{.swagger => .openapi}/openapi-merge.json |    0
 .docs/{.swagger => .openapi}/swagger-ui.html  |    0
 .gitlab-ci.yml                                |   20 +-
 .../api/database/table/columns/ColumnDto.java |   13 +-
 .../columns/concepts/ConceptBriefDto.java     |    5 +
 .../table/columns/concepts/UnitBriefDto.java  |    5 +
 lib/python/Pipfile                            |    1 +
 lib/python/Pipfile.lock                       |  233 +-
 lib/python/tests/conftest.py                  |   37 -
 lib/python/tests/test_dtos.py                 |   44 +
 lib/python/tests/test_system_database.py      |   34 -
 lib/python/tests/test_system_user.py          |   42 -
 lib/python/tests/test_unit_analyse.py         |    1 -
 lib/python/tests/test_unit_database.py        |   16 +-
 make/gen.mk                                   |    8 +-
 yq                                            | 7043 +++++++++++++++++
 24 files changed, 17272 insertions(+), 598 deletions(-)
 create mode 100644 .docs/.openapi/api-analyse.yaml
 create mode 100644 .docs/.openapi/api-data.yaml
 create mode 100644 .docs/.openapi/api-metadata.yaml
 create mode 100644 .docs/.openapi/api-search.yaml
 rename .docs/{.swagger => .openapi}/api.base.yaml (100%)
 rename .docs/{.swagger => .openapi}/api.yaml (97%)
 rename .docs/{.swagger => .openapi}/custom.css (100%)
 rename .docs/{.swagger/swagger-generate.sh => .openapi/openapi-generate.sh} (82%)
 rename .docs/{.swagger => .openapi}/openapi-merge.json (100%)
 rename .docs/{.swagger => .openapi}/swagger-ui.html (100%)
 delete mode 100644 lib/python/tests/conftest.py
 create mode 100644 lib/python/tests/test_dtos.py
 delete mode 100644 lib/python/tests/test_system_database.py
 delete mode 100644 lib/python/tests/test_system_user.py
 create mode 100644 yq

diff --git a/.docs/.openapi/api-analyse.yaml b/.docs/.openapi/api-analyse.yaml
new file mode 100644
index 0000000000..25e15521d5
--- /dev/null
+++ b/.docs/.openapi/api-analyse.yaml
@@ -0,0 +1,332 @@
+{
+  "components": {
+    "schemas": {
+      "AnalysisDto": {
+        "properties": {
+          "columns": {
+            "items": {
+              "properties": {
+                "column_name": {
+                  "$ref": "#/components/schemas/ColumnAnalysisDto"
+                }
+              }
+            },
+            "type": "array"
+          },
+          "line_termination": {
+            "example": "\r\n",
+            "type": "string"
+          },
+          "separator": {
+            "example": ",",
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
+      "ColumnAnalysisDto": {
+        "properties": {
+          "d": {
+            "example": 4,
+            "type": "integer"
+          },
+          "dfid": {
+            "example": null,
+            "type": "integer"
+          },
+          "enums": {
+            "example": null,
+            "properties": {
+              "type": "string"
+            },
+            "type": "array"
+          },
+          "null_allowed": {
+            "type": "boolean"
+          },
+          "sets": {
+            "example": null,
+            "properties": {
+              "type": "string"
+            },
+            "type": "array"
+          },
+          "size": {
+            "example": 10,
+            "type": "integer"
+          },
+          "type": {
+            "example": "decimal",
+            "type": "string"
+          }
+        },
+        "type": "object"
+      },
+      "ErrorDto": {
+        "properties": {
+          "message": {
+            "example": "Message",
+            "type": "string"
+          },
+          "success": {
+            "example": false,
+            "type": "boolean"
+          }
+        },
+        "type": "object"
+      },
+      "KeysDto": {
+        "properties": {
+          "keys": {
+            "items": {
+              "properties": {
+                "column_name": {
+                  "format": "int64",
+                  "type": "integer"
+                }
+              }
+            },
+            "type": "array"
+          }
+        },
+        "required": [
+          "keys"
+        ],
+        "type": "object"
+      }
+    },
+    "securitySchemes": {
+      "basicAuth": {
+        "in": "header",
+        "scheme": "basic",
+        "type": "http"
+      },
+      "bearerAuth": {
+        "bearerFormat": "JWT",
+        "in": "header",
+        "scheme": "bearer",
+        "type": "http"
+      }
+    }
+  },
+  "externalDocs": {
+    "description": "Sourcecode Documentation",
+    "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/"
+  },
+  "info": {
+    "contact": {
+      "email": "andreas.rauber@tuwien.ac.at",
+      "name": "Prof. Andreas Rauber"
+    },
+    "description": "Service that analyses data structures",
+    "license": {
+      "name": "Apache 2.0",
+      "url": "https://www.apache.org/licenses/LICENSE-2.0"
+    },
+    "title": "Database Repository Analyse Service API",
+    "version": "1.5"
+  },
+  "openapi": "3.0.0",
+  "paths": {
+    "/api/analyse/datatypes": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "description": "Determines MySQL 8 datatypes of a given dataset. Requires role `table-semantic-analyse`.",
+        "operationId": "analyse_datatypes",
+        "parameters": [
+          {
+            "example": "filename_s3_key",
+            "in": "query",
+            "name": "filename",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "example": ",",
+            "in": "query",
+            "name": "separator",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "example": "false",
+            "in": "query",
+            "name": "enum",
+            "required": false,
+            "schema": {
+              "type": "boolean"
+            }
+          },
+          {
+            "example": "2.5",
+            "in": "query",
+            "name": "enum_tol",
+            "required": false,
+            "schema": {
+              "type": "float"
+            }
+          }
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "responses": {
+          "202": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/AnalysisDto"
+                }
+              }
+            },
+            "description": "Determined data types successfully"
+          },
+          "400": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorDto"
+                }
+              }
+            },
+            "description": "Failed to determine data types"
+          },
+          "404": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorDto"
+                }
+              }
+            },
+            "description": "Failed to find file in Storage Service"
+          },
+          "500": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorDto"
+                }
+              }
+            },
+            "description": "Unexpected system error"
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ],
+        "summary": "Determine datatypes",
+        "tags": [
+          "analyse-endpoint"
+        ]
+      }
+    },
+    "/api/analyse/keys": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "description": "Determines primary keys of a given dataset. Requires role `table-semantic-analyse`.",
+        "operationId": "analyse_keys",
+        "parameters": [
+          {
+            "example": "filename_s3_key",
+            "in": "query",
+            "name": "filename",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "example": ",",
+            "in": "query",
+            "name": "separator",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "responses": {
+          "202": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/KeysDto"
+                }
+              }
+            },
+            "description": "Determined keys successfully"
+          },
+          "400": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorDto"
+                }
+              }
+            },
+            "description": "Failed to determine keys"
+          },
+          "404": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorDto"
+                }
+              }
+            },
+            "description": "Failed to find file in Storage Service or is empty"
+          },
+          "500": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorDto"
+                }
+              }
+            },
+            "description": "Unexpected system error"
+          }
+        },
+        "security": [
+          {
+            "bearerAuth": []
+          },
+          {
+            "basicAuth": []
+          }
+        ],
+        "summary": "Determine keys",
+        "tags": [
+          "analyse-endpoint"
+        ]
+      }
+    }
+  },
+  "servers": [
+    {
+      "description": "Generated server url",
+      "url": "http://localhost:5000"
+    },
+    {
+      "description": "Sandbox",
+      "url": "https://test.dbrepo.tuwien.ac.at"
+    }
+  ]
+}
diff --git a/.docs/.openapi/api-data.yaml b/.docs/.openapi/api-data.yaml
new file mode 100644
index 0000000000..7be3a4039a
--- /dev/null
+++ b/.docs/.openapi/api-data.yaml
@@ -0,0 +1,1792 @@
+openapi: 3.0.1
+info:
+  title: Database Repository Data Service API
+  description: Service that manages the data
+  contact:
+    name: Prof. Andreas Rauber
+    email: andreas.rauber@tuwien.ac.at
+  license:
+    name: Apache 2.0
+    url: https://www.apache.org/licenses/LICENSE-2.0
+  version: 1.6.2
+externalDocs:
+  description: Sourcecode Documentation
+  url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6.2/system-services-metadata/
+servers:
+- url: http://localhost
+  description: Development instance
+- url: https://test.dbrepo.tuwien.ac.at
+  description: Staging instance
+paths:
+  /api/database/{databaseId}/view/{viewId}/data:
+    get:
+      tags:
+      - view-endpoint
+      summary: Get view data
+      description: "Gets data from a view of a database. For private databases, the\
+        \ user needs at least *READ* access to the associated database. Requires role\
+        \ `view-database-view-data`."
+      operationId: getData
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: viewId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: page
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: size
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: timestamp
+        in: query
+        required: false
+        schema:
+          type: string
+          format: date-time
+      responses:
+        "400":
+          description: Request pagination is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Not allowed to retrieve view data
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Retrieved view data
+          headers:
+            Access-Control-Expose-Headers:
+              description: Expose `X-Count` custom header
+              required: true
+              style: simple
+            X-Count:
+              description: Number of rows
+              required: true
+              style: simple
+          content:
+            application/json:
+              schema:
+                type: string
+        "409":
+          description: View schema could not be mapped
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find view in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to establish connection with the metadata service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - basicAuth: []
+      - bearerAuth: []
+    head:
+      tags:
+      - view-endpoint
+      summary: Get view data
+      description: "Gets data from a view of a database. For private databases, the\
+        \ user needs at least *READ* access to the associated database. Requires role\
+        \ `view-database-view-data`."
+      operationId: getData_1
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: viewId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: page
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: size
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: timestamp
+        in: query
+        required: false
+        schema:
+          type: string
+          format: date-time
+      responses:
+        "400":
+          description: Request pagination is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Not allowed to retrieve view data
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Retrieved view data
+          headers:
+            Access-Control-Expose-Headers:
+              description: Expose `X-Count` custom header
+              required: true
+              style: simple
+            X-Count:
+              description: Number of rows
+              required: true
+              style: simple
+          content:
+            application/json:
+              schema:
+                type: string
+        "409":
+          description: View schema could not be mapped
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find view in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to establish connection with the metadata service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - basicAuth: []
+      - bearerAuth: []
+  /api/database/{databaseId}/table/{tableId}/data:
+    get:
+      tags:
+      - table-endpoint
+      summary: Get table data
+      description: "Gets data from a table with id. For a table in a private database,\
+        \ the user needs to have at least *READ* access to the associated database.\
+        \ Requests with HTTP method **GET** return the full dataset, requests with\
+        \ HTTP method **HEAD** only the number of tuples in the `X-Count` header."
+      operationId: getData_2
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: timestamp
+        in: query
+        required: false
+        schema:
+          type: string
+          format: date-time
+      - name: page
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: size
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "404":
+          description: Failed to find table in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Request pagination or table data select query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Get table data
+          headers:
+            Access-Control-Expose-Headers:
+              description: Expose `X-Count` custom header
+              required: true
+              style: simple
+            X-Count:
+              description: Number of rows
+              required: true
+              style: simple
+          content:
+            application/json:
+              schema:
+                type: string
+        "403":
+          description: Not allowed to get table data
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to establish connection with the metadata service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - basicAuth: []
+      - bearerAuth: []
+    put:
+      tags:
+      - table-endpoint
+      summary: Update tuple
+      description: "Updates a data tuple into a table, then the table statistics are\
+        \ updated. The user needs to have at least *WRITE_OWN* access to the associated\
+        \ database. Requires role `insert-table-data`."
+      operationId: updateRawTuple
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: Authorization
+        in: header
+        required: true
+        schema:
+          type: string
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/TupleUpdateDto"
+        required: true
+      responses:
+        "404":
+          description: Failed to find table in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Request pagination or table data select query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Updated table data
+        "403":
+          description: Update table data not allowed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to establish connection with the metadata service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - basicAuth: []
+      - bearerAuth: []
+    post:
+      tags:
+      - table-endpoint
+      summary: Insert tuple
+      description: "Inserts a data tuple into a table, then the table statistics are\
+        \ updated. The user needs to have at least *WRITE_OWN* access to the associated\
+        \ database. Requires role `insert-table-data`."
+      operationId: insertRawTuple
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: Authorization
+        in: header
+        required: true
+        schema:
+          type: string
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/TupleDto"
+        required: true
+      responses:
+        "503":
+          description: Failed to establish connection with the metadata service or
+            storage service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Request pagination or table data select query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Create table data not allowed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "201":
+          description: Created table data
+        "404":
+          description: Failed to find table in metadata database or blob in storage
+            service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - basicAuth: []
+      - bearerAuth: []
+    delete:
+      tags:
+      - table-endpoint
+      summary: Delete tuple
+      description: "Deletes a data tuple into a table, then the table statistics are\
+        \ updated. The user needs to have at least *WRITE_OWN* access to the associated\
+        \ database. Requires role `delete-table-data`."
+      operationId: deleteRawTuple
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: Authorization
+        in: header
+        required: true
+        schema:
+          type: string
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/TupleDeleteDto"
+        required: true
+      responses:
+        "404":
+          description: Failed to find table in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Request pagination or table data select query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Delete table data not allowed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Deleted table data
+        "503":
+          description: Failed to establish connection with the metadata service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - basicAuth: []
+      - bearerAuth: []
+    head:
+      tags:
+      - table-endpoint
+      summary: Get table data
+      description: "Gets data from a table with id. For a table in a private database,\
+        \ the user needs to have at least *READ* access to the associated database.\
+        \ Requests with HTTP method **GET** return the full dataset, requests with\
+        \ HTTP method **HEAD** only the number of tuples in the `X-Count` header."
+      operationId: getData_3
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: timestamp
+        in: query
+        required: false
+        schema:
+          type: string
+          format: date-time
+      - name: page
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: size
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "404":
+          description: Failed to find table in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Request pagination or table data select query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Get table data
+          headers:
+            Access-Control-Expose-Headers:
+              description: Expose `X-Count` custom header
+              required: true
+              style: simple
+            X-Count:
+              description: Number of rows
+              required: true
+              style: simple
+          content:
+            application/json:
+              schema:
+                type: string
+        "403":
+          description: Not allowed to get table data
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to establish connection with the metadata service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - basicAuth: []
+      - bearerAuth: []
+  /api/database/{databaseId}/subset/{subsetId}/data:
+    get:
+      tags:
+      - subset-endpoint
+      summary: Get subset data
+      description: "Gets data of subset with id. For private databases, the user needs\
+        \ at least *READ* access to the associated database. Requests with HTTP method\
+        \ **GET** return the subset dataset, requests with HTTP method **HEAD** only\
+        \ the number of rows in the subset dataset in the `X-Count` header"
+      operationId: getData_4
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: subsetId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: page
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: size
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "404":
+          description: Failed to find database in metadata database or query in query
+            store of the data database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Not allowed to retrieve subset data
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Invalid pagination
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Retrieved subset data
+          headers:
+            Access-Control-Expose-Headers:
+              description: Reverse proxy exposing of custom headers
+              required: true
+              style: simple
+            X-Count:
+              description: Number of rows
+              style: simple
+            X-Id:
+              description: The subset id
+              required: true
+              style: simple
+            X-Headers:
+              description: The list of headers separated by comma
+              style: simple
+          content:
+            application/json:
+              schema:
+                type: string
+        "503":
+          description: Failed to communicate with database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    head:
+      tags:
+      - subset-endpoint
+      summary: Get subset data
+      description: "Gets data of subset with id. For private databases, the user needs\
+        \ at least *READ* access to the associated database. Requests with HTTP method\
+        \ **GET** return the subset dataset, requests with HTTP method **HEAD** only\
+        \ the number of rows in the subset dataset in the `X-Count` header"
+      operationId: getData_5
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: subsetId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: page
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: size
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "404":
+          description: Failed to find database in metadata database or query in query
+            store of the data database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Not allowed to retrieve subset data
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Invalid pagination
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Retrieved subset data
+          headers:
+            Access-Control-Expose-Headers:
+              description: Reverse proxy exposing of custom headers
+              required: true
+              style: simple
+            X-Count:
+              description: Number of rows
+              style: simple
+            X-Id:
+              description: The subset id
+              required: true
+              style: simple
+            X-Headers:
+              description: The list of headers separated by comma
+              style: simple
+          content:
+            application/json:
+              schema:
+                type: string
+        "503":
+          description: Failed to communicate with database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/subset/{queryId}:
+    put:
+      tags:
+      - subset-endpoint
+      summary: Persist subset
+      description: Persists a subset with id. Requires role `persist-query`.
+      operationId: persist
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: queryId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/QueryPersistDto"
+        required: true
+      responses:
+        "404":
+          description: Failed to find database in metadata database or query in query
+            store of the data database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Persisted subset
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/QueryDto"
+        "403":
+          description: Not allowed to persist subset
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Malformed select query
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "417":
+          description: Failed to persist subset
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to communicate with database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/table/{tableId}/data/import:
+    post:
+      tags:
+      - table-endpoint
+      summary: Import dataset
+      description: Imports a dataset in a table. Then update the table statistics.
+        The user needs to have at least *WRITE_OWN* access to the associated database
+        when importing into a owned table. Otherwise *WRITE_ALL* access in needed.
+        Requires role `insert-table-data`.
+      operationId: importDataset
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: Authorization
+        in: header
+        required: true
+        schema:
+          type: string
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/ImportDto"
+        required: true
+      responses:
+        "202":
+          description: Imported dataset successfully
+        "403":
+          description: Import table dataset not allowed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find table in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Dataset and/or query are malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to establish connection with the metadata service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - basicAuth: []
+      - bearerAuth: []
+  /api/database/{databaseId}/subset:
+    get:
+      tags:
+      - subset-endpoint
+      summary: Find subsets
+      description: "Finds subsets in the query store. When the database schema is\
+        \ marked as hidden, the user needs to be authorized, have at least read-access\
+        \ to the database. The result can be optionally filtered by setting `persisted`.\
+        \ When set to *true*, only persisted queries are returned, otherwise only\
+        \ non-persisted queries are returned."
+      operationId: list
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: persisted
+        in: query
+        required: false
+        schema:
+          type: boolean
+      responses:
+        "403":
+          description: Not allowed to find subsets
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find database in metadata database or query in query
+            store of the data database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Found subsets
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/QueryDto"
+        "503":
+          description: Failed to communicate with database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - basicAuth: []
+      - bearerAuth: []
+    post:
+      tags:
+      - subset-endpoint
+      summary: Create subset
+      description: Creates a subset in the query store of the data database. Can also
+        be used without authentication if (and only if) the database is marked as
+        public (i.e. when `is_public` = `is_schema_public` is set to `true`). Otherwise
+        at least read access is required.
+      operationId: create
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: timestamp
+        in: query
+        required: false
+        schema:
+          type: string
+          format: date-time
+      - name: page
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: size
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/ExecuteStatementDto"
+        required: true
+      responses:
+        "404":
+          description: Failed to find database in metadata database or query in query
+            store of the data database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Malformed select query
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "501":
+          description: Failed to execute query as it contains non-supported keywords
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "417":
+          description: Failed to insert query into query store of data database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to communicate with database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "201":
+          description: Created subset
+          content:
+            application/json:
+              schema:
+                type: string
+        "403":
+          description: Not allowed to find subset
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - basicAuth: []
+      - bearerAuth: []
+  /api/database/{databaseId}/view/{viewId}/export:
+    get:
+      tags:
+      - view-endpoint
+      summary: Get view data
+      description: "Gets data from view with id as downloadable file. For tables in\
+        \ private databases, the user needs to have at least *READ* access to the\
+        \ associated database."
+      operationId: exportDataset
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: viewId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: timestamp
+        in: query
+        required: false
+        schema:
+          type: string
+          format: date-time
+      responses:
+        "403":
+          description: Export view data not allowed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Request pagination or view data select query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Exported view data
+          content:
+            application/json:
+              schema:
+                type: string
+                format: binary
+        "404":
+          description: Failed to find view in metadata database or export dataset
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to establish connection with the metadata service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - basicAuth: []
+      - bearerAuth: []
+  /api/database/{databaseId}/table/{tableId}/history:
+    get:
+      tags:
+      - table-endpoint
+      summary: Get history
+      description: "Gets the insert/delete operations history performed. For tables\
+        \ in private databases, the user needs to have at least *READ* access to the\
+        \ associated database."
+      operationId: getHistory
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: size
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "400":
+          description: "Invalid pagination size request, must be > 0"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Find table history not allowed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Found table history
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/TableHistoryDto"
+        "404":
+          description: Failed to find table history in data database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to establish connection with the metadata service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - basicAuth: []
+      - bearerAuth: []
+  /api/database/{databaseId}/table/{tableId}/export:
+    get:
+      tags:
+      - table-endpoint
+      summary: Get table data
+      description: "Gets data from table with id as downloadable file. For tables\
+        \ in private databases, the user needs to have at least *READ* access to the\
+        \ associated database."
+      operationId: exportDataset_1
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: timestamp
+        in: query
+        required: false
+        schema:
+          type: string
+          format: date-time
+      responses:
+        "403":
+          description: Export table data not allowed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find table in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Exported table data
+          content:
+            application/json:
+              schema:
+                type: string
+                format: binary
+        "400":
+          description: Request pagination or table data select query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to establish connection with the metadata service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - basicAuth: []
+      - bearerAuth: []
+  /api/database/{databaseId}/subset/{subsetId}:
+    get:
+      tags:
+      - subset-endpoint
+      summary: Find subset
+      description: "Finds a subset in the data database.  When the database schema\
+        \ is marked as hidden, the user needs to be authorized, have at least read-access\
+        \ to the database.  Requests with HTTP header `Accept=application/json` return\
+        \ the metadata, requests with HTTP header `Accept=text/csv` return the data\
+        \ as downloadable file."
+      operationId: findById
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: subsetId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: Accept
+        in: header
+        required: true
+        schema:
+          type: string
+      - name: timestamp
+        in: query
+        required: false
+        schema:
+          type: string
+          format: date-time
+      responses:
+        "200":
+          description: Found subset
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/QueryDto"
+            text/csv: {}
+        "404":
+          description: Failed to find database in metadata database or query in query
+            store of the data database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Malformed select query
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to communicate with database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Not allowed to find subset
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "406":
+          description: Failed to find acceptable representation
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - basicAuth: []
+      - bearerAuth: []
+components:
+  schemas:
+    ApiErrorDto:
+      required:
+      - code
+      - message
+      - status
+      type: object
+      properties:
+        status:
+          type: string
+          example: NOT_FOUND
+          enum:
+          - 100 CONTINUE
+          - 101 SWITCHING_PROTOCOLS
+          - 102 PROCESSING
+          - 103 EARLY_HINTS
+          - 103 CHECKPOINT
+          - 200 OK
+          - 201 CREATED
+          - 202 ACCEPTED
+          - 203 NON_AUTHORITATIVE_INFORMATION
+          - 204 NO_CONTENT
+          - 205 RESET_CONTENT
+          - 206 PARTIAL_CONTENT
+          - 207 MULTI_STATUS
+          - 208 ALREADY_REPORTED
+          - 226 IM_USED
+          - 300 MULTIPLE_CHOICES
+          - 301 MOVED_PERMANENTLY
+          - 302 FOUND
+          - 302 MOVED_TEMPORARILY
+          - 303 SEE_OTHER
+          - 304 NOT_MODIFIED
+          - 305 USE_PROXY
+          - 307 TEMPORARY_REDIRECT
+          - 308 PERMANENT_REDIRECT
+          - 400 BAD_REQUEST
+          - 401 UNAUTHORIZED
+          - 402 PAYMENT_REQUIRED
+          - 403 FORBIDDEN
+          - 404 NOT_FOUND
+          - 405 METHOD_NOT_ALLOWED
+          - 406 NOT_ACCEPTABLE
+          - 407 PROXY_AUTHENTICATION_REQUIRED
+          - 408 REQUEST_TIMEOUT
+          - 409 CONFLICT
+          - 410 GONE
+          - 411 LENGTH_REQUIRED
+          - 412 PRECONDITION_FAILED
+          - 413 PAYLOAD_TOO_LARGE
+          - 413 REQUEST_ENTITY_TOO_LARGE
+          - 414 URI_TOO_LONG
+          - 414 REQUEST_URI_TOO_LONG
+          - 415 UNSUPPORTED_MEDIA_TYPE
+          - 416 REQUESTED_RANGE_NOT_SATISFIABLE
+          - 417 EXPECTATION_FAILED
+          - 418 I_AM_A_TEAPOT
+          - 419 INSUFFICIENT_SPACE_ON_RESOURCE
+          - 420 METHOD_FAILURE
+          - 421 DESTINATION_LOCKED
+          - 422 UNPROCESSABLE_ENTITY
+          - 423 LOCKED
+          - 424 FAILED_DEPENDENCY
+          - 425 TOO_EARLY
+          - 426 UPGRADE_REQUIRED
+          - 428 PRECONDITION_REQUIRED
+          - 429 TOO_MANY_REQUESTS
+          - 431 REQUEST_HEADER_FIELDS_TOO_LARGE
+          - 451 UNAVAILABLE_FOR_LEGAL_REASONS
+          - 500 INTERNAL_SERVER_ERROR
+          - 501 NOT_IMPLEMENTED
+          - 502 BAD_GATEWAY
+          - 503 SERVICE_UNAVAILABLE
+          - 504 GATEWAY_TIMEOUT
+          - 505 HTTP_VERSION_NOT_SUPPORTED
+          - 506 VARIANT_ALSO_NEGOTIATES
+          - 507 INSUFFICIENT_STORAGE
+          - 508 LOOP_DETECTED
+          - 509 BANDWIDTH_LIMIT_EXCEEDED
+          - 510 NOT_EXTENDED
+          - 511 NETWORK_AUTHENTICATION_REQUIRED
+        message:
+          type: string
+          example: Error message
+        code:
+          type: string
+          example: error.service.code
+    TupleUpdateDto:
+      required:
+      - data
+      - keys
+      type: object
+      properties:
+        data:
+          type: object
+          additionalProperties:
+            type: object
+        keys:
+          type: object
+          additionalProperties:
+            type: object
+    QueryPersistDto:
+      required:
+      - persist
+      type: object
+      properties:
+        persist:
+          type: boolean
+          example: true
+    IdentifierBriefDto:
+      required:
+      - created_by
+      - database_id
+      - id
+      - publication_year
+      - publisher
+      - titles
+      - type
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        type:
+          type: string
+          enum:
+          - database
+          - subset
+          - table
+          - view
+        titles:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierTitleDto"
+        doi:
+          type: string
+          example: 10.1038/nphys1170
+        publisher:
+          type: string
+          example: TU Wien
+        status:
+          type: string
+          enum:
+          - draft
+          - published
+        database_id:
+          type: integer
+          format: int64
+          example: 1
+        query_id:
+          type: integer
+          format: int64
+          example: 1
+        table_id:
+          type: integer
+          format: int64
+          example: 1
+        view_id:
+          type: integer
+          format: int64
+          example: 1
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+        created_by:
+          type: string
+          format: uuid
+    IdentifierTitleDto:
+      required:
+      - id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        title:
+          type: string
+          example: Airquality Demonstrator
+        language:
+          type: string
+          example: en
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        type:
+          type: string
+          enum:
+          - AlternativeTitle
+          - Subtitle
+          - TranslatedTitle
+          - Other
+    QueryDto:
+      required:
+      - database_id
+      - execution
+      - id
+      - identifiers
+      - is_persisted
+      - owner
+      - query
+      - query_hash
+      - query_normalized
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        owner:
+          $ref: "#/components/schemas/UserBriefDto"
+        execution:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21Z
+        query:
+          type: string
+          example: SELECT `id` FROM `air_quality`
+        type:
+          type: string
+          example: query
+          enum:
+          - query
+          - view
+        identifiers:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierBriefDto"
+        database_id:
+          type: integer
+          format: int64
+        query_normalized:
+          type: string
+          example: SELECT `id` FROM `air_quality`
+        query_hash:
+          type: string
+          example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76
+        is_persisted:
+          type: boolean
+          example: true
+        result_hash:
+          type: string
+          example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76
+        result_number:
+          type: integer
+          format: int64
+          example: 1
+    UserBriefDto:
+      required:
+      - id
+      - username
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
+        username:
+          type: string
+          description: Only contains lowercase characters
+          example: jcarberry
+        name:
+          type: string
+          example: Josiah Carberry
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+        qualified_name:
+          type: string
+          example: Josiah Carberry — @jcarberry
+        given_name:
+          type: string
+          example: Josiah
+        family_name:
+          type: string
+          example: Carberry
+    TupleDto:
+      required:
+      - data
+      type: object
+      properties:
+        data:
+          type: object
+          additionalProperties:
+            type: object
+    ImportDto:
+      required:
+      - header
+      - location
+      - separator
+      type: object
+      properties:
+        location:
+          type: string
+          example: file.csv
+        header:
+          type: boolean
+          description: "If true, the first line contains the column names, otherwise\
+            \ it contains only data"
+        separator:
+          type: string
+          example: ","
+        quote:
+          type: string
+          example: '"'
+        line_termination:
+          type: string
+          example: \r\n
+    ExecuteStatementDto:
+      required:
+      - statement
+      type: object
+      properties:
+        statement:
+          type: string
+          example: SELECT `id` FROM `air_quality`
+    TableHistoryDto:
+      required:
+      - event
+      - timestamp
+      - total
+      type: object
+      properties:
+        timestamp:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21Z
+        event:
+          type: string
+        total:
+          type: integer
+          format: int64
+          example: 1
+    TupleDeleteDto:
+      required:
+      - keys
+      type: object
+      properties:
+        keys:
+          type: object
+          additionalProperties:
+            type: object
+  securitySchemes:
+    basicAuth:
+      type: http
+      scheme: basic
+    bearerAuth:
+      type: http
+      scheme: bearer
+      bearerFormat: JWT
diff --git a/.docs/.openapi/api-metadata.yaml b/.docs/.openapi/api-metadata.yaml
new file mode 100644
index 0000000000..5578822fb4
--- /dev/null
+++ b/.docs/.openapi/api-metadata.yaml
@@ -0,0 +1,7043 @@
+openapi: 3.0.1
+info:
+  title: Database Repository Metadata Service API
+  description: Service that manages the metadata
+  contact:
+    name: Prof. Andreas Rauber
+    email: andreas.rauber@tuwien.ac.at
+  license:
+    name: Apache 2.0
+    url: https://www.apache.org/licenses/LICENSE-2.0
+  version: 1.6.2
+externalDocs:
+  description: Sourcecode Documentation
+  url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6.2/system-services-metadata/
+servers:
+- url: http://localhost
+  description: Development instance
+- url: https://test.dbrepo.tuwien.ac.at
+  description: Staging instance
+paths:
+  /api/database:
+    get:
+      tags:
+      - database-endpoint
+      summary: List databases
+      description: "Lists all databases in the metadata database. Requests with HTTP\
+        \ method **GET** return the list of databases, requests with HTTP method **HEAD**\
+        \ only the number in the `X-Count` header."
+      operationId: list
+      parameters:
+      - name: internal_name
+        in: query
+        required: false
+        schema:
+          type: string
+      responses:
+        "200":
+          description: List of databases
+          headers:
+            Access-Control-Expose-Headers:
+              description: Expose `X-Count` custom header
+              required: true
+              style: simple
+            X-Count:
+              description: Number of databases
+              required: true
+              style: simple
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/DatabaseBriefDto"
+    post:
+      tags:
+      - database-endpoint
+      summary: Create database
+      description: Creates a database in the container with id. Requires roles `create-database`.
+      operationId: create_5
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/DatabaseCreateDto"
+        required: true
+      responses:
+        "409":
+          description: Query store could not be created
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Database create query is malformed or image is not supported
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "423":
+          description: Database quota exceeded
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Database create permission is missing or grant permissions
+            at broker service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to fin container/user/database in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "201":
+          description: Created a new database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseBriefDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    head:
+      tags:
+      - database-endpoint
+      summary: List databases
+      description: "Lists all databases in the metadata database. Requests with HTTP\
+        \ method **GET** return the list of databases, requests with HTTP method **HEAD**\
+        \ only the number in the `X-Count` header."
+      operationId: list_1
+      parameters:
+      - name: internal_name
+        in: query
+        required: false
+        schema:
+          type: string
+      responses:
+        "200":
+          description: List of databases
+          headers:
+            Access-Control-Expose-Headers:
+              description: Expose `X-Count` custom header
+              required: true
+              style: simple
+            X-Count:
+              description: Number of databases
+              required: true
+              style: simple
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/DatabaseBriefDto"
+  /api/database/{databaseId}/access/{userId}:
+    get:
+      tags:
+      - access-endpoint
+      summary: Find/Check access
+      description: "Finds or checks access of a user with given id to a database with\
+        \ given id. Requests with HTTP method **GET** return the access object, requests\
+        \ with HTTP method **HEAD** only the status. When the user has at least *READ*\
+        \ access, the status 200 is returned, 403 otherwise. Requires role `check-database-access`\
+        \ or `check-foreign-database-access`."
+      operationId: find
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: userId
+        in: path
+        required: true
+        schema:
+          type: string
+          format: uuid
+      responses:
+        "403":
+          description: No access to this database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Database not found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Found database access
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseAccessDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    put:
+      tags:
+      - access-endpoint
+      summary: Modify access
+      description: Modifies access of a user with given id to database with given
+        id. Requires role `update-database-access`.
+      operationId: update_5
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: userId
+        in: path
+        required: true
+        schema:
+          type: string
+          format: uuid
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/UpdateDatabaseAccessDto"
+        required: true
+      responses:
+        "404":
+          description: Database or user not found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Modify access not permitted when no access is granted in the
+            first place
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Access could not be updated in the data service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Modified access
+        "502":
+          description: Access could not be updated due to connection error in the
+            data service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Modify access query or database connection is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    post:
+      tags:
+      - access-endpoint
+      summary: Give access
+      description: Give a user with given id access to some database with given id.
+        Requires role `create-database-access`.
+      operationId: create_8
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: userId
+        in: path
+        required: true
+        schema:
+          type: string
+          format: uuid
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/UpdateDatabaseAccessDto"
+        required: true
+      responses:
+        "404":
+          description: Database or user not found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Access could not be created in the data service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Failed giving access
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Granting access succeeded
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseAccessDto"
+        "400":
+          description: Granting access query or database connection is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Access could not be created due to connection error
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    delete:
+      tags:
+      - access-endpoint
+      summary: Delete access
+      description: Delete access of a user with id to a database with id. Requires
+        role `delete-database-access`.
+      operationId: revoke
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: userId
+        in: path
+        required: true
+        schema:
+          type: string
+          format: uuid
+      responses:
+        "403":
+          description: Revoke of access not permitted as no access was found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Deleted access
+        "502":
+          description: Access could not be created due to connection error
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: "User, database with access was not found"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Access could not be revoked in the data service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Modify access query or database connection is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    head:
+      tags:
+      - access-endpoint
+      summary: Find/Check access
+      description: "Finds or checks access of a user with given id to a database with\
+        \ given id. Requests with HTTP method **GET** return the access object, requests\
+        \ with HTTP method **HEAD** only the status. When the user has at least *READ*\
+        \ access, the status 200 is returned, 403 otherwise. Requires role `check-database-access`\
+        \ or `check-foreign-database-access`."
+      operationId: find_1
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: userId
+        in: path
+        required: true
+        schema:
+          type: string
+          format: uuid
+      responses:
+        "403":
+          description: No access to this database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Database not found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Found database access
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseAccessDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/user/{userId}:
+    get:
+      tags:
+      - user-endpoint
+      summary: Get user
+      description: Gets own user information from the metadata database. Requires
+        authentication. Foreign user information can only be obtained if additional
+        role `find-foreign-user` is present. Finding information about internal users
+        results in a 404 error.
+      operationId: find_2
+      parameters:
+      - name: userId
+        in: path
+        required: true
+        schema:
+          type: string
+          format: uuid
+      responses:
+        "404":
+          description: User was not found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Found user
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/UserDto"
+        "403":
+          description: Find user is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    put:
+      tags:
+      - user-endpoint
+      summary: Update user
+      description: Updates user with id. Requires role `modify-user-information`.
+      operationId: modify
+      parameters:
+      - name: userId
+        in: path
+        required: true
+        schema:
+          type: string
+          format: uuid
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/UserUpdateDto"
+        required: true
+      responses:
+        "202":
+          description: Modified user information
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/UserDto"
+        "404":
+          description: Failed to find database/user in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Modify user query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Not allowed to modify user metadata
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/user/{userId}/password:
+    put:
+      tags:
+      - user-endpoint
+      summary: Update user password
+      description: Updates password of user with id. Requires authentication.
+      operationId: password
+      parameters:
+      - name: userId
+        in: path
+        required: true
+        schema:
+          type: string
+          format: uuid
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/UserPasswordDto"
+        required: true
+      responses:
+        "400":
+          description: Invalid password payload
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Modified user password
+        "403":
+          description: Not allowed to change foreign user password
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to get user in auth service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find database/user in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Connection to auth service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/user/token:
+    put:
+      tags:
+      - user-endpoint
+      summary: Refresh token
+      description: Refreshes user token by refresh token.
+      operationId: refreshToken
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/RefreshTokenRequestDto"
+        required: true
+      responses:
+        "202":
+          description: Refreshed user token
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/TokenDto"
+        "403":
+          description: Not allowed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Invalid refresh token
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Connection to auth service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+    post:
+      tags:
+      - user-endpoint
+      summary: Create token
+      description: Creates a user token via the Auth Service.
+      operationId: getToken
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/LoginRequestDto"
+        required: true
+      responses:
+        "400":
+          description: Invalid login request
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Not allowed to get token
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find user in auth database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to get user in auth service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Obtained user token
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/TokenDto"
+        "428":
+          description: Account is not fully setup in auth service (requires password
+            change?)
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Connection to auth service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+  /api/ontology/{ontologyId}:
+    get:
+      tags:
+      - ontology-endpoint
+      summary: Find ontology
+      description: Finds an ontology with id in the metadata database.
+      operationId: find_3
+      parameters:
+      - name: ontologyId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "404":
+          description: Could not find ontology
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Find one ontology
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/OntologyDto"
+    put:
+      tags:
+      - ontology-endpoint
+      summary: Update ontology
+      description: Updates an ontology with id. Requires role `update-ontology`.
+      operationId: update
+      parameters:
+      - name: ontologyId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/OntologyModifyDto"
+        required: true
+      responses:
+        "404":
+          description: Could not find ontology
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Updated ontology successfully
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/OntologyDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    delete:
+      tags:
+      - ontology-endpoint
+      summary: Delete ontology
+      description: Deletes an ontology with given id. Requires role `delete-ontology`.
+      operationId: delete
+      parameters:
+      - name: ontologyId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "202":
+          description: Deleted ontology successfully
+          content:
+            application/json: {}
+        "404":
+          description: Could not find ontology
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/message/{messageId}:
+    put:
+      tags:
+      - message-endpoint
+      summary: Update message
+      description: Updates a message with id. Requires role `update-maintenance-message`.
+      operationId: update_1
+      parameters:
+      - name: messageId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/BannerMessageUpdateDto"
+        required: true
+      responses:
+        "202":
+          description: Updated message
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/BannerMessageBriefDto"
+        "404":
+          description: Could not find message
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    delete:
+      tags:
+      - message-endpoint
+      summary: Delete message
+      description: Deletes a message with id. Requires role `delete-maintenance-message`.
+      operationId: delete_1
+      parameters:
+      - name: messageId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "404":
+          description: Could not find message
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Deleted message
+          content:
+            application/json: {}
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/image/{imageId}:
+    get:
+      tags:
+      - image-endpoint
+      summary: Find image
+      description: Finds a container image in the metadata database.
+      operationId: findById
+      parameters:
+      - name: imageId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "404":
+          description: Image could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Found image
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ImageDto"
+    put:
+      tags:
+      - image-endpoint
+      summary: Update image
+      description: Updates container image in the metadata database. Requires role
+        `modify-image`.
+      operationId: update_2
+      parameters:
+      - name: imageId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/ImageChangeDto"
+        required: true
+      responses:
+        "404":
+          description: Image could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Updated image successfully
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ImageDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    delete:
+      tags:
+      - image-endpoint
+      summary: Delete image
+      description: Deletes a container image in the metadata database. Requires role
+        `delete-image`.
+      operationId: delete_2
+      parameters:
+      - name: imageId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "202":
+          description: Deleted image successfully
+        "404":
+          description: Image could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/identifier/{identifierId}:
+    get:
+      tags:
+      - identifier-endpoint
+      summary: Find identifier
+      description: Finds an identifier with id. The response format depends on the
+        HTTP `Accept` header set on the request.
+      operationId: find_6
+      parameters:
+      - name: identifierId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: Accept
+        in: header
+        required: true
+        schema:
+          type: string
+      responses:
+        "200":
+          description: Found identifier successfully
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/IdentifierDto"
+            application/ld+json:
+              schema:
+                $ref: "#/components/schemas/LdDatasetDto"
+            text/csv: {}
+            text/xml: {}
+            text/bibliography: {}
+            text/bibliography; style=apa: {}
+            text/bibliography; style=ieee: {}
+            text/bibliography; style=bibtex: {}
+        "502":
+          description: Connection to data service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: "Identifier could not be exported, the requested style is not\
+            \ known"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "409":
+          description: Exported resource was not found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "410":
+          description: Failed to retrieve from S3 endpoint
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Identifier could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "406":
+          description: Failed to find acceptable representation
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to find in data service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+    put:
+      tags:
+      - identifier-endpoint
+      summary: Save identifier
+      description: Saves an identifier with id as a draft identifier. Identifiers
+        can only be created for objects the user has at least *READ* access in the
+        associated database (requires role `create-identifier`) or for any object
+        in any database (requires role `create-foreign-identifier`).
+      operationId: save
+      parameters:
+      - name: identifierId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/IdentifierSaveDto"
+        required: true
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: "Failed to find database, table or view"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Identifier form contains invalid request data
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Saved identifier
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/IdentifierDto"
+        "403":
+          description: Insufficient access rights or authorities
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    delete:
+      tags:
+      - identifier-endpoint
+      summary: Delete identifier
+      description: Deletes an identifier with id. Requires role `delete-identifier`.
+      operationId: delete_3
+      parameters:
+      - name: identifierId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to delete in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Identifier or database could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Deleted identifier
+        "403":
+          description: Deleting identifier not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/identifier/{identifierId}/publish:
+    put:
+      tags:
+      - identifier-endpoint
+      summary: Publish identifier
+      description: Publishes an identifier with id. A published identifier cannot
+        be changed anymore. Requires role `publish-identifier`.
+      operationId: publish
+      parameters:
+      - name: identifierId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: "Failed to find database, table or view"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Published identifier
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/IdentifierDto"
+        "400":
+          description: Identifier form contains invalid request data
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Insufficient access rights or authorities
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/visibility:
+    put:
+      tags:
+      - database-endpoint
+      summary: Update database visibility
+      description: Updates the database with id on the visibility. Only the database
+        owner can perform this operation. Requires role `modify-database-visibility`.
+      operationId: visibility
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/DatabaseModifyVisibilityDto"
+        required: true
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find database in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Visibility modified successfully
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseBriefDto"
+        "400":
+          description: The visibility payload is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Visibility modification is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/view/{viewId}:
+    get:
+      tags:
+      - view-endpoint
+      summary: Get view
+      description: Gets a view with id in the metadata database.
+      operationId: find_7
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: viewId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "403":
+          description: Find view is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: "Database, view or user could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Find view successfully
+          headers:
+            X-Username:
+              description: The authentication username
+              style: simple
+            Access-Control-Expose-Headers:
+              description: Expose custom headers
+              style: simple
+            X-Type:
+              description: The JDBC connection type
+              style: simple
+            X-View:
+              description: The view internal name
+              style: simple
+            X-Database:
+              description: The database internal name
+              style: simple
+            X-Password:
+              description: The authentication password
+              style: simple
+            X-Host:
+              description: The database hostname
+              style: simple
+            X-Port:
+              description: The database port number
+              style: simple
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ViewDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    put:
+      tags:
+      - view-endpoint
+      summary: Update view
+      description: Updates a view with id. This can only be performed by the view
+        owner or database owner. Requires role `create-database-view`.
+      operationId: update_3
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: viewId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/ViewUpdateDto"
+        required: true
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Database or View could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Update not allowed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Update view query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Update view successfully
+          content:
+            '*/*':
+              schema:
+                $ref: "#/components/schemas/ViewDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    delete:
+      tags:
+      - view-endpoint
+      summary: Delete view
+      description: Deletes a view with id. Requires role `delete-database-view`.
+      operationId: delete_4
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: viewId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "423":
+          description: Delete view resulted in an invalid query statement
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: "Database, view or user could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Delete view successfully
+          content:
+            '*/*':
+              schema:
+                type: object
+        "400":
+          description: Delete view query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Deletion not allowed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/table/{tableId}:
+    get:
+      tags:
+      - table-endpoint
+      summary: Find table
+      description: "Finds a table with id. When a table is hidden (i.e. when `is_public`\
+        \ is `false`), then the user needs to have at least read access and the role\
+        \ `find-table`. When the `system` role is present, the endpoint responds with\
+        \ additional connection metadata in the header."
+      operationId: findById_2
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "200":
+          description: Find table successfully
+          headers:
+            X-Username:
+              description: The authentication username
+              style: simple
+            X-Table:
+              description: The table internal name
+              style: simple
+            Access-Control-Expose-Headers:
+              description: Expose custom headers
+              style: simple
+            X-Type:
+              description: The JDBC connection type
+              style: simple
+            X-Database:
+              description: The database internal name
+              style: simple
+            X-Password:
+              description: The authentication password
+              style: simple
+            X-Host:
+              description: The database hostname
+              style: simple
+            X-Port:
+              description: The database port number
+              style: simple
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/TableDto"
+        "503":
+          description: Failed to obtain queue information from broker service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Access to the database is forbidden
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Failed to establish connection with broker service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: "Table, database or container could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    put:
+      tags:
+      - table-endpoint
+      summary: Update table
+      description: Updates a table in the database with id. Requires role `update-table`.
+      operationId: update_4
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/TableUpdateDto"
+        required: true
+      responses:
+        "403":
+          description: Update table visibility not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Table could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Updated the table
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/TableBriefDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Update table visibility payload is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    delete:
+      tags:
+      - table-endpoint
+      summary: Delete table
+      description: Deletes a table with id. Only the owner of a table can perform
+        this action (requires role `delete-table`) or anyone can delete a table (requires
+        role `delete-foreign-table`).
+      operationId: delete_5
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Access to the database is forbidden
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Delete table successfully
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Delete table query resulted in an invalid query statement
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: "Table, database or container could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/table/{tableId}/statistic:
+    put:
+      tags:
+      - table-endpoint
+      summary: Update statistics
+      description: "Updates basic statistical properties (min, max, mean, median,\
+        \ std.dev) for numerical columns in a table with id. This action can only\
+        \ be performed by the table owner. Requires role `update-table-statistic`."
+      operationId: updateStatistic
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Failed to map column statistic to known columns
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find database/table in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Not the owner
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Updated table statistics successfully
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/table/{tableId}/column/{columnId}:
+    put:
+      tags:
+      - table-endpoint
+      summary: Update semantics
+      description: Updates column semantics of a table column with id. Only the table
+        owner with at least *READ* access to the associated database can update the
+        column semantics (requires role `modify-table-column-semantics`) or foreign
+        table columns if role `modify-foreign-table-column-semantics`.
+      operationId: updateColumn
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: columnId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/ColumnSemanticsUpdateDto"
+        required: true
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Access to the database is forbidden
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find user/table/database/ontology in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Updated column semantics successfully
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ColumnDto"
+        "400":
+          description: Update semantic concept query is malformed or update unit of
+            measurement query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/owner:
+    put:
+      tags:
+      - database-endpoint
+      summary: Update database owner
+      description: Updates the database with id on the owner. Only the database owner
+        can perform this operation. Requires role `modify-database-owner`.
+      operationId: transfer
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/DatabaseTransferDto"
+        required: true
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Transfer of ownership was successful
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseBriefDto"
+        "403":
+          description: Transfer of ownership is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Database or user could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Owner payload is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/metadata/view:
+    put:
+      tags:
+      - database-endpoint
+      summary: Update database view schemas
+      description: Updates the database with id with generated metadata from view
+        that are not yet known to the database. Only the database owner can perform
+        this operation. Requires role `find-database`.
+      operationId: refreshViewMetadata
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find database in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Refreshed database views metadata
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseBriefDto"
+        "403":
+          description: Refresh view metadata is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/metadata/table:
+    put:
+      tags:
+      - database-endpoint
+      summary: Update database table schemas
+      description: Updates the database with id with generated metadata from tables
+        that are not yet known to the database. Only the database owner can perform
+        this operation. Requires role `find-database`.
+      operationId: refreshTableMetadata
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "403":
+          description: Not allowed to refresh table metadata
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to fin user/database in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Refreshed database tables metadata
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseBriefDto"
+        "400":
+          description: Failed to parse payload at search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/image:
+    get:
+      tags:
+      - database-endpoint
+      summary: Get database preview image
+      description: Gets the database with id on the preview image.
+      operationId: findPreviewImage
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "404":
+          description: Database or user could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: View of image was successful
+          content:
+            '*/*':
+              schema:
+                type: array
+                items:
+                  type: string
+                  format: byte
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    put:
+      tags:
+      - database-endpoint
+      summary: Update database preview image
+      description: Updates the database with id on the preview image. Only the database
+        owner can perform this operation. Requires role `modify-database-image`.
+      operationId: modifyImage
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/DatabaseModifyImageDto"
+        required: true
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Modify of image was successful
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseBriefDto"
+        "410":
+          description: File was not found in the Storage Service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Database could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Modify of image is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/user:
+    get:
+      tags:
+      - user-endpoint
+      summary: List users
+      description: "Lists users known to the metadata database. Internal users are\
+        \ omitted from the result list. If the optional query parameter `username`\
+        \ is present, the result list can be filtered by matching this exact username."
+      operationId: findAll
+      parameters:
+      - name: username
+        in: query
+        required: false
+        schema:
+          type: string
+      responses:
+        "200":
+          description: List users
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/UserBriefDto"
+    post:
+      tags:
+      - user-endpoint
+      summary: Create user
+      description: Creates a user in the auth service and metadata database. Requires
+        that no credentials are sent in the request.
+      operationId: create
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/SignupRequestDto"
+        required: true
+      responses:
+        "403":
+          description: Internal authentication to the auth service is invalid
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Parameters are not well-formed (likely email)
+          content:
+            application/json: {}
+        "409":
+          description: User with username already exists
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "417":
+          description: User with e-mail already exists
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to create in auth service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "201":
+          description: Created user
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/UserDto"
+        "502":
+          description: Failed to create in auth service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Default role not found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+  /api/ontology:
+    get:
+      tags:
+      - ontology-endpoint
+      summary: List ontologies
+      description: Lists all ontologies known to the metadata database.
+      operationId: findAll_2
+      responses:
+        "200":
+          description: List ontologies
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/OntologyBriefDto"
+    post:
+      tags:
+      - ontology-endpoint
+      summary: Create ontology
+      description: Creates an ontology in the metadata database. Requires role `create-ontology`.
+      operationId: create_1
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/OntologyCreateDto"
+        required: true
+      responses:
+        "201":
+          description: Registered ontology successfully
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/OntologyDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/message:
+    get:
+      tags:
+      - message-endpoint
+      summary: List messages
+      description: "Lists messages known to the metadata database. Messages can be\
+        \ filtered be filtered with the optional `active` parameter. If set to *true*,\
+        \ only active messages (that is, messages whose end time has not been reached)\
+        \ will be returned. Otherwise only inactive messages are returned. If not\
+        \ set, active and inactive messages are returned."
+      operationId: list_2
+      parameters:
+      - name: active
+        in: query
+        required: false
+        schema:
+          type: boolean
+      responses:
+        "200":
+          description: List messages
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/BannerMessageDto"
+    post:
+      tags:
+      - message-endpoint
+      summary: Create message
+      description: Creates a message in the metadata database. Requires role `create-maintenance-message`.
+      operationId: create_2
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/BannerMessageCreateDto"
+        required: true
+      responses:
+        "201":
+          description: Created message
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/BannerMessageBriefDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/image:
+    get:
+      tags:
+      - image-endpoint
+      summary: List images
+      description: Lists all container images known to the metadata database.
+      operationId: findAll_3
+      responses:
+        "200":
+          description: List images
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/ImageBriefDto"
+    post:
+      tags:
+      - image-endpoint
+      summary: Create image
+      description: Creates a container image in the metadata database. Requires role
+        `create-image`.
+      operationId: create_3
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/ImageCreateDto"
+        required: true
+      responses:
+        "409":
+          description: Image already exists
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Image specification is invalid
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "201":
+          description: Created image
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ImageDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/identifier:
+    get:
+      tags:
+      - identifier-endpoint
+      summary: List identifiers
+      description: Lists all identifiers known to the metadata database
+      operationId: findAll_4
+      parameters:
+      - name: dbid
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: qid
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: vid
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: tid
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: Accept
+        in: header
+        required: true
+        schema:
+          type: string
+      responses:
+        "200":
+          description: Found identifiers successfully
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  type: string
+            application/ld+json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/LdDatasetDto"
+        "406":
+          description: "Identifier could not be exported, the requested style is not\
+            \ known"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+    post:
+      tags:
+      - identifier-endpoint
+      summary: Create identifier
+      description: Create an identifier with id to create a draft identifier. Identifiers
+        can only be created for objects the user has at least *READ* access in the
+        associated database (requires role `create-identifier`) or for any object
+        in any database (requires role `create-foreign-identifier`).
+      operationId: create_4
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/IdentifierCreateDto"
+        required: true
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "201":
+          description: Drafted identifier
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/IdentifierDto"
+        "404":
+          description: "Failed to find database, table or view"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Identifier form contains invalid request data
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Insufficient access rights or authorities
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/view:
+    get:
+      tags:
+      - view-endpoint
+      summary: List views
+      description: Lists views known to the metadata database.
+      operationId: findAll_5
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "200":
+          description: Find views successfully
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/ViewBriefDto"
+        "404":
+          description: Database or user could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    post:
+      tags:
+      - view-endpoint
+      summary: Create view
+      description: Creates a view. This can only be performed by the database owner.
+        Requires role `create-database-view`.
+      operationId: create_6
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/ViewCreateDto"
+        required: true
+      responses:
+        "423":
+          description: Create view resulted in an invalid query statement
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "201":
+          description: Create view successfully
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ViewBriefDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Credentials missing
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find database/user in metadata database.
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Create view query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/table:
+    get:
+      tags:
+      - table-endpoint
+      summary: List tables
+      description: "Lists all tables known to the metadata database. When a database\
+        \ has a hidden schema (i.e. when `is_schema_public` is `false`), then the\
+        \ user needs to have at least read access and the role `list-tables`."
+      operationId: list_4
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "403":
+          description: List tables not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Database could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: List tables
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/TableBriefDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    post:
+      tags:
+      - table-endpoint
+      summary: Create table
+      description: Creates a table in the database with id. Requires role `create-table`.
+      operationId: create_7
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/TableCreateDto"
+        required: true
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Create table not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "201":
+          description: Created a new table
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/TableBriefDto"
+        "409":
+          description: Create table conflicts with existing table name
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: "Database, container or user could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Create table query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/container:
+    get:
+      tags:
+      - container-endpoint
+      summary: List containers
+      description: List all containers in the metadata database.
+      operationId: findAll_6
+      parameters:
+      - name: limit
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int32
+      responses:
+        "200":
+          description: List containers
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/ContainerBriefDto"
+    post:
+      tags:
+      - container-endpoint
+      summary: Create container
+      description: Creates a container in the metadata database. Requires role `create-container`.
+      operationId: create_9
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/ContainerCreateDto"
+        required: true
+      responses:
+        "400":
+          description: Container payload malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Container image or user could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "409":
+          description: Container name already exists
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "201":
+          description: Created a new container
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ContainerDto"
+        "403":
+          description: "Create container not permitted, need authority `create-container`"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/unit:
+    get:
+      tags:
+      - unit-endpoint
+      summary: List units
+      description: Lists units known to the metadata database.
+      operationId: findAll_1
+      responses:
+        "200":
+          description: Find all semantic units
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/UnitDto"
+  /api/ontology/{ontologyId}/entity:
+    get:
+      tags:
+      - ontology-endpoint
+      summary: Find entities
+      description: Finds semantic entities by label or uri in an ontology with id.
+        Requires role `execute-semantic-query`.
+      operationId: find_4
+      parameters:
+      - name: ontologyId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: label
+        in: query
+        required: false
+        schema:
+          type: string
+      - name: uri
+        in: query
+        required: false
+        schema:
+          type: string
+      responses:
+        "400":
+          description: Filter params are invalid
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Found entities
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/EntityDto"
+        "404":
+          description: Could not find ontology
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "422":
+          description: Ontology does not have rdf or sparql endpoint
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "417":
+          description: Generated query or uri is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/oai:
+    get:
+      tags:
+      - metadata-endpoint
+      summary: Get record
+      operationId: identify_1_1_1_1
+      parameters:
+      - name: verb
+        in: query
+      - name: parameters
+        in: query
+        required: true
+        schema:
+          $ref: "#/components/schemas/OaiListIdentifiersParameters"
+      responses:
+        "200":
+          description: List containers
+          content:
+            text/xml: {}
+  /api/message/message/{messageId}:
+    get:
+      tags:
+      - message-endpoint
+      summary: Find message
+      description: Finds a message with id in the metadata database.
+      operationId: find_5
+      parameters:
+      - name: messageId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "200":
+          description: Get messages
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/BannerMessageDto"
+        "404":
+          description: Could not find message
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+  /api/license:
+    get:
+      tags:
+      - license-endpoint
+      summary: List licenses
+      description: Lists licenses known to the metadata database.
+      operationId: list_3
+      responses:
+        "200":
+          description: List of licenses
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/LicenseDto"
+  /api/identifier/retrieve:
+    get:
+      tags:
+      - identifier-endpoint
+      summary: Retrieve PID metadata
+      description: "Retrieves Persistent Identifier (PID) metadata from external endpoints.\
+        \ Supported PIDs are: ORCID, ROR, DOI."
+      operationId: retrieve
+      parameters:
+      - name: url
+        in: query
+        required: true
+        schema:
+          type: string
+      responses:
+        "200":
+          description: Retrieved metadata from identifier
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/IdentifierDto"
+        "404":
+          description: Failed to find metadata for identifier
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+  /api/database/{databaseId}:
+    get:
+      tags:
+      - database-endpoint
+      summary: Find database
+      description: Finds a database with id.
+      operationId: findById_1
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "503":
+          description: Failed to find queue information in broker service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Connection to the broker service could not be established
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Database found successfully
+          headers:
+            X-Username:
+              description: The authentication username
+              style: simple
+            Access-Control-Expose-Headers:
+              description: Expose custom headers
+              style: simple
+            X-Password:
+              description: The authentication password
+              style: simple
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseBriefDto"
+        "403":
+          description: Not allowed to view database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: "Database, user or exchange could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/table/{tableId}/suggest:
+    get:
+      tags:
+      - table-endpoint
+      summary: Suggest semantics
+      description: Suggests semantic concepts for a table. This action can only be
+        performed by the table owner. Requires role `table-semantic-analyse`.
+      operationId: analyseTable
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "417":
+          description: Generated query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "422":
+          description: Ontology does not have rdf or sparql endpoint
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Failed to parse statistic in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Not the table owner.
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find database/table in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Suggested table semantics successfully
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/EntityDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/table/{tableId}/column/{columnId}/suggest:
+    get:
+      tags:
+      - table-endpoint
+      summary: Suggest semantics
+      description: Suggests column semantics. Requires role `table-semantic-analyse`.
+      operationId: analyseTableColumn
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: columnId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "400":
+          description: Generated query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "422":
+          description: Ontology does not have rdf or sparql endpoint
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Suggested table column semantics successfully
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/TableColumnEntityDto"
+        "404":
+          description: Failed to find database/table in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/container/{containerId}:
+    get:
+      tags:
+      - container-endpoint
+      summary: Find container
+      description: Finds a container in the metadata database.
+      operationId: findById_3
+      parameters:
+      - name: containerId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "200":
+          description: Found container
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ContainerDto"
+        "404":
+          description: Container image could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+    delete:
+      tags:
+      - container-endpoint
+      summary: Delete container
+      description: Deletes a container in the metadata database. Requires role `delete-container`.
+      operationId: delete_6
+      parameters:
+      - name: containerId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "404":
+          description: Container not found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Deleted container
+        "403":
+          description: "Create container not permitted, need authority `delete-container`"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/concept:
+    get:
+      tags:
+      - concept-endpoint
+      summary: List concepts
+      description: List all semantic concepts known to the metadata database
+      operationId: findAll_7
+      responses:
+        "200":
+          description: List concepts
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/ConceptDto"
+components:
+  schemas:
+    DatabaseBriefDto:
+      required:
+      - contact
+      - id
+      - internal_name
+      - is_public
+      - is_schema_public
+      - name
+      - owner_id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        description:
+          type: string
+          example: Air Quality
+        identifiers:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierBriefDto"
+        contact:
+          $ref: "#/components/schemas/UserBriefDto"
+        internal_name:
+          type: string
+          example: air_quality
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+        owner_id:
+          type: string
+          format: uuid
+        preview_image:
+          type: string
+    IdentifierBriefDto:
+      required:
+      - created_by
+      - database_id
+      - id
+      - publication_year
+      - publisher
+      - titles
+      - type
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        type:
+          type: string
+          enum:
+          - database
+          - subset
+          - table
+          - view
+        titles:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierTitleDto"
+        doi:
+          type: string
+          example: 10.1038/nphys1170
+        publisher:
+          type: string
+          example: TU Wien
+        status:
+          type: string
+          enum:
+          - draft
+          - published
+        database_id:
+          type: integer
+          format: int64
+          example: 1
+        query_id:
+          type: integer
+          format: int64
+          example: 1
+        table_id:
+          type: integer
+          format: int64
+          example: 1
+        view_id:
+          type: integer
+          format: int64
+          example: 1
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+        created_by:
+          type: string
+          format: uuid
+    IdentifierTitleDto:
+      required:
+      - id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        title:
+          type: string
+          example: Airquality Demonstrator
+        language:
+          type: string
+          example: en
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        type:
+          type: string
+          enum:
+          - AlternativeTitle
+          - Subtitle
+          - TranslatedTitle
+          - Other
+    UserBriefDto:
+      required:
+      - id
+      - username
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
+        username:
+          type: string
+          description: Only contains lowercase characters
+          example: jcarberry
+        name:
+          type: string
+          example: Josiah Carberry
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+        qualified_name:
+          type: string
+          example: Josiah Carberry — @jcarberry
+        given_name:
+          type: string
+          example: Josiah
+        family_name:
+          type: string
+          example: Carberry
+    ApiErrorDto:
+      required:
+      - code
+      - message
+      - status
+      type: object
+      properties:
+        status:
+          type: string
+          example: NOT_FOUND
+          enum:
+          - 100 CONTINUE
+          - 101 SWITCHING_PROTOCOLS
+          - 102 PROCESSING
+          - 103 EARLY_HINTS
+          - 103 CHECKPOINT
+          - 200 OK
+          - 201 CREATED
+          - 202 ACCEPTED
+          - 203 NON_AUTHORITATIVE_INFORMATION
+          - 204 NO_CONTENT
+          - 205 RESET_CONTENT
+          - 206 PARTIAL_CONTENT
+          - 207 MULTI_STATUS
+          - 208 ALREADY_REPORTED
+          - 226 IM_USED
+          - 300 MULTIPLE_CHOICES
+          - 301 MOVED_PERMANENTLY
+          - 302 FOUND
+          - 302 MOVED_TEMPORARILY
+          - 303 SEE_OTHER
+          - 304 NOT_MODIFIED
+          - 305 USE_PROXY
+          - 307 TEMPORARY_REDIRECT
+          - 308 PERMANENT_REDIRECT
+          - 400 BAD_REQUEST
+          - 401 UNAUTHORIZED
+          - 402 PAYMENT_REQUIRED
+          - 403 FORBIDDEN
+          - 404 NOT_FOUND
+          - 405 METHOD_NOT_ALLOWED
+          - 406 NOT_ACCEPTABLE
+          - 407 PROXY_AUTHENTICATION_REQUIRED
+          - 408 REQUEST_TIMEOUT
+          - 409 CONFLICT
+          - 410 GONE
+          - 411 LENGTH_REQUIRED
+          - 412 PRECONDITION_FAILED
+          - 413 PAYLOAD_TOO_LARGE
+          - 413 REQUEST_ENTITY_TOO_LARGE
+          - 414 URI_TOO_LONG
+          - 414 REQUEST_URI_TOO_LONG
+          - 415 UNSUPPORTED_MEDIA_TYPE
+          - 416 REQUESTED_RANGE_NOT_SATISFIABLE
+          - 417 EXPECTATION_FAILED
+          - 418 I_AM_A_TEAPOT
+          - 419 INSUFFICIENT_SPACE_ON_RESOURCE
+          - 420 METHOD_FAILURE
+          - 421 DESTINATION_LOCKED
+          - 422 UNPROCESSABLE_ENTITY
+          - 423 LOCKED
+          - 424 FAILED_DEPENDENCY
+          - 425 TOO_EARLY
+          - 426 UPGRADE_REQUIRED
+          - 428 PRECONDITION_REQUIRED
+          - 429 TOO_MANY_REQUESTS
+          - 431 REQUEST_HEADER_FIELDS_TOO_LARGE
+          - 451 UNAVAILABLE_FOR_LEGAL_REASONS
+          - 500 INTERNAL_SERVER_ERROR
+          - 501 NOT_IMPLEMENTED
+          - 502 BAD_GATEWAY
+          - 503 SERVICE_UNAVAILABLE
+          - 504 GATEWAY_TIMEOUT
+          - 505 HTTP_VERSION_NOT_SUPPORTED
+          - 506 VARIANT_ALSO_NEGOTIATES
+          - 507 INSUFFICIENT_STORAGE
+          - 508 LOOP_DETECTED
+          - 509 BANDWIDTH_LIMIT_EXCEEDED
+          - 510 NOT_EXTENDED
+          - 511 NETWORK_AUTHENTICATION_REQUIRED
+        message:
+          type: string
+          example: Error message
+        code:
+          type: string
+          example: error.service.code
+    DatabaseAccessDto:
+      required:
+      - type
+      - user
+      type: object
+      properties:
+        user:
+          $ref: "#/components/schemas/UserBriefDto"
+        type:
+          type: string
+          enum:
+          - read
+          - write_own
+          - write_all
+    UserUpdateDto:
+      required:
+      - language
+      - theme
+      type: object
+      properties:
+        firstname:
+          type: string
+          example: Josiah
+        lastname:
+          type: string
+          example: Carberry
+        affiliation:
+          type: string
+          example: Brown University
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+        theme:
+          type: string
+          example: dark
+        language:
+          type: string
+          example: en
+    UserAttributesDto:
+      required:
+      - language
+      - theme
+      type: object
+      properties:
+        theme:
+          type: string
+          example: light
+        orcid:
+          type: string
+          example: https://orcid.org/0000-0002-1825-0097
+        affiliation:
+          type: string
+          example: Brown University
+        language:
+          type: string
+          example: en
+    UserDto:
+      required:
+      - attributes
+      - id
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
+        name:
+          type: string
+          example: Josiah Carberry
+        attributes:
+          $ref: "#/components/schemas/UserAttributesDto"
+        last_retrieved:
+          type: string
+          format: date-time
+        qualified_name:
+          type: string
+          example: Josiah Carberry — @jcarberry
+        given_name:
+          type: string
+          example: Josiah
+        family_name:
+          type: string
+          example: Carberry
+    UserPasswordDto:
+      required:
+      - password
+      type: object
+      properties:
+        password:
+          type: string
+    RefreshTokenRequestDto:
+      required:
+      - refresh_token
+      type: object
+      properties:
+        refresh_token:
+          type: string
+          example: refresh_token
+    TokenDto:
+      required:
+      - access_token
+      - expires_in
+      - id_token
+      - not-before-policy
+      - refresh_expires_in
+      - refresh_token
+      - scope
+      - session_state
+      - token_type
+      type: object
+      properties:
+        scope:
+          type: string
+        access_token:
+          type: string
+        expires_in:
+          type: integer
+          format: int64
+        refresh_token:
+          type: string
+        refresh_expires_in:
+          type: integer
+          format: int64
+        id_token:
+          type: string
+        session_state:
+          type: string
+        token_type:
+          type: string
+        not-before-policy:
+          type: integer
+          format: int64
+    OntologyModifyDto:
+      required:
+      - prefix
+      - uri
+      type: object
+      properties:
+        uri:
+          type: string
+          example: Ontology URI
+        prefix:
+          type: string
+          example: Ontology prefix
+        sparql_endpoint:
+          type: string
+          example: Ontology SPARQL endpoint
+        rdf_path:
+          type: string
+          example: rdf/om-2.0.rdf
+    OntologyDto:
+      required:
+      - id
+      - prefix
+      - rdf
+      - sparql
+      - uri
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        uri:
+          type: string
+          example: http://www.wikidata.org/
+        prefix:
+          type: string
+          example: wd
+        sparql:
+          type: boolean
+          example: true
+        rdf:
+          type: boolean
+          example: false
+        uri_pattern:
+          type: string
+          example: http://www.wikidata.org/entity/.*
+        sparql_endpoint:
+          type: string
+          example: https://query.wikidata.org/sparql
+        rdf_path:
+          type: string
+          example: rdf/om-2.0.rdf
+    BannerMessageUpdateDto:
+      required:
+      - message
+      - type
+      type: object
+      properties:
+        type:
+          type: string
+          enum:
+          - error
+          - warning
+          - info
+        message:
+          type: string
+          example: Maintenance starts on 8am on Monday
+        link:
+          type: string
+          example: https://example.com
+        link_text:
+          type: string
+          example: More
+        display_start:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21Z
+        display_end:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21Z
+    BannerMessageBriefDto:
+      required:
+      - message
+      - type
+      type: object
+      properties:
+        type:
+          type: string
+          enum:
+          - error
+          - warning
+          - info
+        message:
+          type: string
+          example: Maintenance starts on 8am on Monday
+        link:
+          type: string
+          example: https://example.com
+        link_text:
+          type: string
+          example: More
+    ImageChangeDto:
+      required:
+      - dialect
+      - driver_class
+      - jdbc_method
+      - registry
+      type: object
+      properties:
+        registry:
+          type: string
+          example: docker.io/library
+        defaultPort:
+          maximum: 65535
+          minimum: 1024
+          type: integer
+          format: int32
+          example: 5432
+        dialect:
+          type: string
+          example: Postgres
+        driver_class:
+          type: string
+          example: org.postgresql.Driver
+        jdbc_method:
+          type: string
+          example: postgresql
+    DataTypeDto:
+      required:
+      - display_name
+      - documentation
+      - is_buildable
+      - is_quoted
+      - value
+      type: object
+      properties:
+        value:
+          type: string
+          example: time
+        documentation:
+          type: string
+          example: https://mariadb.com/kb/en/time/
+        display_name:
+          type: string
+          example: TIME(fsp)
+        size_min:
+          type: integer
+          format: int32
+          example: 0
+        size_max:
+          type: integer
+          format: int32
+          example: 6
+        size_default:
+          type: integer
+          format: int32
+          example: 0
+        size_required:
+          type: boolean
+          example: false
+        d_min:
+          type: integer
+          format: int32
+        d_max:
+          type: integer
+          format: int32
+        d_default:
+          type: integer
+          format: int32
+        d_required:
+          type: boolean
+        data_hint:
+          type: string
+          example: "e.g. HH:MM:SS, HH:MM, HHMMSS, H:M:S"
+        type_hint:
+          type: string
+          example: "fsp=microsecond precision, min. 0, max. 6"
+        is_quoted:
+          type: boolean
+          description: frontend needs to quote this data type
+          example: false
+        is_buildable:
+          type: boolean
+          description: frontend can build this data type
+          example: true
+    ImageDto:
+      required:
+      - data_types
+      - default
+      - default_port
+      - dialect
+      - driver_class
+      - id
+      - jdbc_method
+      - name
+      - operators
+      - registry
+      - version
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        registry:
+          type: string
+          example: docker.io/library
+        name:
+          type: string
+          example: mariadb
+        version:
+          type: string
+          example: "10.5"
+        dialect:
+          type: string
+          example: org.hibernate.dialect.MariaDBDialect
+        operators:
+          type: array
+          items:
+            $ref: "#/components/schemas/OperatorDto"
+        driver_class:
+          type: string
+          example: org.mariadb.jdbc.Driver
+        jdbc_method:
+          type: string
+          example: mariadb
+        default:
+          type: boolean
+          example: false
+        default_port:
+          type: integer
+          format: int32
+          example: 3306
+        data_types:
+          type: array
+          items:
+            $ref: "#/components/schemas/DataTypeDto"
+    OperatorDto:
+      required:
+      - display_name
+      - documentation
+      - value
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        value:
+          type: string
+          example: XOR
+        documentation:
+          type: string
+          example: https://mariadb.com/kb/en/xor/
+        display_name:
+          type: string
+          example: XOR
+    CreatorSaveDto:
+      required:
+      - creator_name
+      - id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 1
+        firstname:
+          type: string
+          example: Josiah
+        lastname:
+          type: string
+          example: Carberry
+        affiliation:
+          type: string
+          example: Wesleyan University
+        creator_name:
+          type: string
+          example: "Carberry, Josiah"
+        name_type:
+          type: string
+          example: Personal
+          enum:
+          - Personal
+          - Organizational
+        name_identifier:
+          type: string
+          example: 0000-0002-1825-0097
+        name_identifier_scheme:
+          type: string
+          example: ORCID
+          enum:
+          - ORCID
+          - ROR
+          - ISNI
+          - GRID
+        affiliation_identifier:
+          type: string
+          example: https://ror.org/04d836q62
+        affiliation_identifier_scheme:
+          type: string
+          example: ROR
+          enum:
+          - ROR
+          - GRID
+          - ISNI
+    IdentifierFunderSaveDto:
+      required:
+      - funder_name
+      - id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 1
+        funder_name:
+          type: string
+          example: European Commission
+        funder_identifier:
+          type: string
+          example: http://doi.org/10.13039/501100000780
+        funder_identifier_type:
+          type: string
+          example: Crossref Funder ID
+          enum:
+          - Crossref Funder ID
+          - ROR
+          - GND
+          - ISNI
+          - Other
+        scheme_uri:
+          type: string
+          example: http://doi.org/
+        award_number:
+          type: string
+          example: "824087"
+        award_title:
+          type: string
+          example: EOSC-Life
+    IdentifierSaveDescriptionDto:
+      required:
+      - description
+      - id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 1
+        description:
+          type: string
+          example: "Air quality reports at Stephansplatz, Vienna"
+        language:
+          type: string
+          example: en
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        type:
+          type: string
+          example: Abstract
+          enum:
+          - Abstract
+          - Methods
+          - SeriesInformation
+          - TableOfContents
+          - TechnicalInfo
+          - Other
+    IdentifierSaveDto:
+      required:
+      - creators
+      - database_id
+      - id
+      - publication_year
+      - publisher
+      - titles
+      - type
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 1
+        type:
+          type: string
+          example: database
+          enum:
+          - database
+          - subset
+          - table
+          - view
+        doi:
+          type: string
+          example: 10.1111/11111111
+        titles:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierSaveTitleDto"
+        descriptions:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierSaveDescriptionDto"
+        funders:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierFunderSaveDto"
+        licenses:
+          type: array
+          items:
+            $ref: "#/components/schemas/LicenseDto"
+        publisher:
+          type: string
+          example: TU Wien
+        language:
+          type: string
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        creators:
+          type: array
+          items:
+            $ref: "#/components/schemas/CreatorSaveDto"
+        database_id:
+          type: integer
+          format: int64
+          example: 1
+        query_id:
+          type: integer
+          format: int64
+        view_id:
+          type: integer
+          format: int64
+        table_id:
+          type: integer
+          format: int64
+        publication_day:
+          type: integer
+          format: int32
+          example: 15
+        publication_month:
+          type: integer
+          format: int32
+          example: 12
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+        related_identifiers:
+          type: array
+          items:
+            $ref: "#/components/schemas/RelatedIdentifierSaveDto"
+    IdentifierSaveTitleDto:
+      required:
+      - id
+      - title
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 1
+        title:
+          type: string
+          example: Airquality Demonstrator
+        language:
+          type: string
+          example: en
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        type:
+          type: string
+          example: Subtitle
+          enum:
+          - AlternativeTitle
+          - Subtitle
+          - TranslatedTitle
+          - Other
+    LicenseDto:
+      required:
+      - identifier
+      - uri
+      type: object
+      properties:
+        identifier:
+          type: string
+          example: MIT
+        uri:
+          type: string
+          example: https://opensource.org/licenses/MIT
+        description:
+          type: string
+          example: "A short and simple permissive license with conditions only requiring\
+            \ preservation of copyright and license notices. Licensed works, modifications,\
+            \ and larger works may be distributed under different terms and without\
+            \ source code."
+    RelatedIdentifierSaveDto:
+      required:
+      - id
+      - relation
+      - type
+      - value
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 1
+        value:
+          type: string
+          example: 10.70124/dc4zh-9ce78
+        type:
+          type: string
+          example: DOI
+          enum:
+          - DOI
+          - URL
+          - URN
+          - ARK
+          - arXiv
+          - bibcode
+          - EAN13
+          - EISSN
+          - Handle
+          - IGSN
+          - ISBN
+          - ISTC
+          - LISSN
+          - LSID
+          - PMID
+          - PURL
+          - UPC
+          - w3id
+        relation:
+          type: string
+          example: Cites
+          enum:
+          - IsCitedBy
+          - Cites
+          - IsSupplementTo
+          - IsSupplementedBy
+          - IsContinuedBy
+          - Continues
+          - IsDescribedBy
+          - Describes
+          - HasMetadata
+          - IsMetadataFor
+          - HasVersion
+          - IsVersionOf
+          - IsNewVersionOf
+          - IsPreviousVersionOf
+          - IsPartOf
+          - HasPart
+          - IsPublishedIn
+          - IsReferencedBy
+          - References
+          - IsDocumentedBy
+          - Documents
+          - IsCompiledBy
+          - Compiles
+          - IsVariantFormOf
+          - IsOriginalFormOf
+          - IsIdenticalTo
+          - IsReviewedBy
+          - Reviews
+          - IsDerivedFrom
+          - IsSourceOf
+          - IsRequiredBy
+          - Requires
+          - IsObsoletedBy
+          - Obsoletes
+    CreatorDto:
+      required:
+      - creator_name
+      - id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        firstname:
+          type: string
+          example: Josiah
+        lastname:
+          type: string
+          example: Carberry
+        affiliation:
+          type: string
+          example: Brown University
+        creator_name:
+          type: string
+          example: "Carberry, Josiah"
+        name_type:
+          type: string
+          example: Personal
+          enum:
+          - Personal
+          - Organizational
+        name_identifier:
+          type: string
+          example: 0000-0002-1825-0097
+        name_identifier_scheme:
+          type: string
+          example: ORCID
+          enum:
+          - ORCID
+          - ROR
+          - ISNI
+          - GRID
+        name_identifier_scheme_uri:
+          type: string
+          example: https://orcid.org/
+        affiliation_identifier:
+          type: string
+          example: https://ror.org/05gq02987
+        affiliation_identifier_scheme:
+          type: string
+          example: ROR
+          enum:
+          - ROR
+          - GRID
+          - ISNI
+        affiliation_identifier_scheme_uri:
+          type: string
+          example: https://ror.org/
+    IdentifierDescriptionDto:
+      required:
+      - id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        description:
+          type: string
+          example: "Air quality reports at Stephansplatz, Vienna"
+        language:
+          type: string
+          example: en
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        type:
+          type: string
+          example: Abstract
+          enum:
+          - Abstract
+          - Methods
+          - SeriesInformation
+          - TableOfContents
+          - TechnicalInfo
+          - Other
+    IdentifierDto:
+      required:
+      - creators
+      - database_id
+      - id
+      - owner
+      - publication_year
+      - publisher
+      - query
+      - query_hash
+      - query_normalized
+      - titles
+      - type
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        type:
+          type: string
+          enum:
+          - database
+          - subset
+          - table
+          - view
+        titles:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierTitleDto"
+        descriptions:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierDescriptionDto"
+        funders:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierFunderDto"
+        query:
+          type: string
+          example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\
+            \ = \"09:STEF\""
+        execution:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21Z
+        doi:
+          type: string
+          example: 10.1038/nphys1170
+        publisher:
+          type: string
+          example: TU Wien
+        owner:
+          $ref: "#/components/schemas/UserBriefDto"
+        language:
+          type: string
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        licenses:
+          type: array
+          items:
+            $ref: "#/components/schemas/LicenseDto"
+        creators:
+          type: array
+          items:
+            $ref: "#/components/schemas/CreatorDto"
+        status:
+          type: string
+          enum:
+          - draft
+          - published
+        database_id:
+          type: integer
+          format: int64
+          example: 1
+        query_id:
+          type: integer
+          format: int64
+          example: 1
+        table_id:
+          type: integer
+          format: int64
+          example: 1
+        view_id:
+          type: integer
+          format: int64
+          example: 1
+        query_normalized:
+          type: string
+          example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\
+            \ = \"09:STEF\""
+        related_identifiers:
+          type: array
+          items:
+            $ref: "#/components/schemas/RelatedIdentifierDto"
+        query_hash:
+          type: string
+          description: query hash in sha512
+        result_hash:
+          type: string
+          example: 34fe82cda2c53f13f8d90cfd7a3469e3a939ff311add50dce30d9136397bf8e5
+        result_number:
+          type: integer
+          format: int64
+          example: 1
+        publication_day:
+          type: integer
+          format: int32
+          example: 15
+        publication_month:
+          type: integer
+          format: int32
+          example: 12
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+    IdentifierFunderDto:
+      required:
+      - funder_name
+      - id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        funder_name:
+          type: string
+          example: European Commission
+        funder_identifier:
+          type: string
+          example: http://doi.org/10.13039/501100000780
+        funder_identifier_type:
+          type: string
+          example: Crossref Funder ID
+          enum:
+          - Crossref Funder ID
+          - ROR
+          - GND
+          - ISNI
+          - Other
+        scheme_uri:
+          type: string
+          example: http://doi.org/
+        award_number:
+          type: string
+          example: "824087"
+        award_title:
+          type: string
+          example: EOSC-Life
+    RelatedIdentifierDto:
+      required:
+      - id
+      - relation
+      - type
+      - value
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        value:
+          type: string
+          example: 10.70124/dc4zh-9ce78
+        type:
+          type: string
+          example: DOI
+          enum:
+          - DOI
+          - URL
+          - URN
+          - ARK
+          - arXiv
+          - bibcode
+          - EAN13
+          - EISSN
+          - Handle
+          - IGSN
+          - ISBN
+          - ISTC
+          - LISSN
+          - LSID
+          - PMID
+          - PURL
+          - UPC
+          - w3id
+        relation:
+          type: string
+          example: Cites
+          enum:
+          - IsCitedBy
+          - Cites
+          - IsSupplementTo
+          - IsSupplementedBy
+          - IsContinuedBy
+          - Continues
+          - IsDescribedBy
+          - Describes
+          - HasMetadata
+          - IsMetadataFor
+          - HasVersion
+          - IsVersionOf
+          - IsNewVersionOf
+          - IsPreviousVersionOf
+          - IsPartOf
+          - HasPart
+          - IsPublishedIn
+          - IsReferencedBy
+          - References
+          - IsDocumentedBy
+          - Documents
+          - IsCompiledBy
+          - Compiles
+          - IsVariantFormOf
+          - IsOriginalFormOf
+          - IsIdenticalTo
+          - IsReviewedBy
+          - Reviews
+          - IsDerivedFrom
+          - IsSourceOf
+          - IsRequiredBy
+          - Requires
+          - IsObsoletedBy
+          - Obsoletes
+    DatabaseModifyVisibilityDto:
+      required:
+      - is_public
+      - is_schema_public
+      type: object
+      properties:
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+    ViewUpdateDto:
+      required:
+      - is_public
+      - is_schema_public
+      type: object
+      properties:
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+    ViewColumnDto:
+      required:
+      - auto_generated
+      - database_id
+      - id
+      - internal_name
+      - is_null_allowed
+      - name
+      - ord
+      - type
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          maxLength: 64
+          minLength: 0
+          type: string
+          example: Date
+        size:
+          type: integer
+          format: int64
+          example: 255
+        d:
+          type: integer
+          format: int64
+          example: 0
+        description:
+          maxLength: 2048
+          minLength: 0
+          type: string
+          example: Column comment
+        database_id:
+          type: integer
+          format: int64
+        ord:
+          type: integer
+          format: int32
+          example: 0
+        internal_name:
+          maxLength: 64
+          minLength: 0
+          type: string
+          example: mdb_date
+        auto_generated:
+          type: boolean
+          example: false
+        index_length:
+          type: integer
+          format: int64
+        length:
+          type: integer
+          format: int64
+        type:
+          type: string
+          example: string
+          enum:
+          - char
+          - varchar
+          - binary
+          - varbinary
+          - tinyblob
+          - tinytext
+          - text
+          - blob
+          - mediumtext
+          - mediumblob
+          - longtext
+          - longblob
+          - enum
+          - set
+          - serial
+          - bit
+          - tinyint
+          - bool
+          - smallint
+          - mediumint
+          - int
+          - bigint
+          - float
+          - double
+          - decimal
+          - date
+          - datetime
+          - timestamp
+          - time
+          - year
+        is_null_allowed:
+          type: boolean
+          example: false
+    ViewDto:
+      required:
+      - columns
+      - database_id
+      - id
+      - internal_name
+      - name
+      - owner
+      - query
+      - query_hash
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        identifiers:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierDto"
+        query:
+          type: string
+          example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC
+        owner:
+          $ref: "#/components/schemas/UserBriefDto"
+        columns:
+          type: array
+          items:
+            $ref: "#/components/schemas/ViewColumnDto"
+        last_retrieved:
+          type: string
+          format: date-time
+        database_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: air_quality
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+        initial_view:
+          type: boolean
+          description: True if it is the default view for the database
+          example: true
+        query_hash:
+          type: string
+          example: 7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916
+    TableUpdateDto:
+      required:
+      - is_public
+      - is_schema_public
+      type: object
+      properties:
+        description:
+          maxLength: 180
+          minLength: 0
+          type: string
+          example: Air Quality in Austria
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+    TableBriefDto:
+      required:
+      - database_id
+      - id
+      - internal_name
+      - is_public
+      - is_schema_public
+      - is_versioned
+      - name
+      - owned_by
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        description:
+          type: string
+          example: Air Quality in Austria
+        database_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: air_quality
+        is_versioned:
+          type: boolean
+          example: true
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+        owned_by:
+          type: string
+          format: uuid
+    ColumnSemanticsUpdateDto:
+      type: object
+      properties:
+        concept_uri:
+          type: string
+        unit_uri:
+          type: string
+    ColumnDto:
+      required:
+      - database_id
+      - id
+      - internal_name
+      - is_null_allowed
+      - name
+      - ord
+      - table_id
+      - type
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 1
+        name:
+          maxLength: 64
+          minLength: 0
+          type: string
+          example: Given Name
+        alias:
+          type: string
+          example: firstname
+        size:
+          type: integer
+          format: int64
+          example: 255
+        d:
+          type: integer
+          format: int64
+          example: 0
+        mean:
+          type: number
+          example: 45.4
+        median:
+          type: number
+          example: 51
+        concept:
+          $ref: "#/components/schemas/ConceptBriefDto"
+        unit:
+          $ref: "#/components/schemas/UnitBriefDto"
+        description:
+          maxLength: 2048
+          minLength: 0
+          type: string
+          example: Column comment
+        enums:
+          type: array
+          items:
+            type: string
+        sets:
+          type: array
+          items:
+            type: string
+        database_id:
+          type: integer
+          format: int64
+          example: 2
+        table_id:
+          type: integer
+          format: int64
+          example: 3
+        ord:
+          type: integer
+          format: int32
+          example: 0
+        internal_name:
+          maxLength: 64
+          minLength: 0
+          type: string
+          example: given_name
+        index_length:
+          type: integer
+          format: int64
+          example: 255
+        length:
+          type: integer
+          format: int64
+          example: 255
+        type:
+          type: string
+          example: varchar
+          enum:
+          - char
+          - varchar
+          - binary
+          - varbinary
+          - tinyblob
+          - tinytext
+          - text
+          - blob
+          - mediumtext
+          - mediumblob
+          - longtext
+          - longblob
+          - enum
+          - set
+          - serial
+          - bit
+          - tinyint
+          - bool
+          - smallint
+          - mediumint
+          - int
+          - bigint
+          - float
+          - double
+          - decimal
+          - date
+          - datetime
+          - timestamp
+          - time
+          - year
+        data_length:
+          type: integer
+          format: int64
+          example: 34300
+        max_data_length:
+          type: integer
+          format: int64
+          example: 34300
+        num_rows:
+          type: integer
+          format: int64
+          example: 32
+        val_min:
+          type: number
+          example: 0
+        val_max:
+          type: number
+          example: 100
+        std_dev:
+          type: number
+          example: 5.32
+        is_null_allowed:
+          type: boolean
+          example: false
+    ConceptBriefDto:
+      required:
+      - id
+      - uri
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 23
+        uri:
+          type: string
+          example: http://www.wikidata.org/entity/Q202444
+        name:
+          type: string
+          example: given name
+        description:
+          type: string
+          example: "name typically used to differentiate people from the same family,\
+            \ clan, or other social group who have a common last name"
+    UnitBriefDto:
+      required:
+      - id
+      - uri
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 34
+        uri:
+          type: string
+          example: http://www.wikidata.org/entity/Q1422583
+        name:
+          type: string
+          example: importance
+        description:
+          type: string
+          example: "subjective magnitude of value, meaning, or purpose"
+    DatabaseTransferDto:
+      required:
+      - id
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+    DatabaseModifyImageDto:
+      type: object
+      properties:
+        key:
+          type: string
+    UpdateDatabaseAccessDto:
+      required:
+      - type
+      type: object
+      properties:
+        type:
+          type: string
+          enum:
+          - read
+          - write_own
+          - write_all
+    SignupRequestDto:
+      required:
+      - email
+      - password
+      - username
+      type: object
+      properties:
+        username:
+          pattern: "^[a-z0-9]{3,}$"
+          type: string
+          example: user
+        email:
+          type: string
+          example: user@example.com
+        password:
+          type: string
+    LoginRequestDto:
+      required:
+      - password
+      - username
+      type: object
+      properties:
+        username:
+          type: string
+          example: user
+        password:
+          type: string
+    OntologyCreateDto:
+      required:
+      - prefix
+      - uri
+      type: object
+      properties:
+        uri:
+          type: string
+          example: Ontology URI
+        prefix:
+          type: string
+          example: Ontology prefix
+        sparql_endpoint:
+          type: string
+          example: Ontology SPARQL endpoint
+    BannerMessageCreateDto:
+      required:
+      - message
+      - type
+      type: object
+      properties:
+        type:
+          type: string
+          enum:
+          - error
+          - warning
+          - info
+        message:
+          type: string
+          example: Maintenance starts on 8am on Monday
+        link:
+          type: string
+          example: https://example.com
+        link_text:
+          type: string
+          example: More
+        display_start:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21Z
+        display_end:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21Z
+    ImageCreateDto:
+      required:
+      - default_port
+      - dialect
+      - driver_class
+      - is_default
+      - jdbc_method
+      - name
+      - registry
+      - version
+      type: object
+      properties:
+        registry:
+          type: string
+          example: docker.io/library
+        name:
+          type: string
+          example: mariadb
+        version:
+          type: string
+        dialect:
+          type: string
+        is_default:
+          type: boolean
+          example: false
+        driver_class:
+          type: string
+        jdbc_method:
+          type: string
+        default_port:
+          maximum: 65535
+          minimum: 1024
+          type: integer
+          format: int32
+    IdentifierCreateDto:
+      required:
+      - creators
+      - database_id
+      - publication_year
+      - publisher
+      - titles
+      - type
+      type: object
+      properties:
+        type:
+          type: string
+          example: database
+          enum:
+          - database
+          - subset
+          - table
+          - view
+        doi:
+          type: string
+          example: 10.1111/11111111
+        titles:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierSaveTitleDto"
+        descriptions:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierSaveDescriptionDto"
+        funders:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierFunderSaveDto"
+        licenses:
+          type: array
+          items:
+            $ref: "#/components/schemas/LicenseDto"
+        publisher:
+          type: string
+          example: TU Wien
+        language:
+          type: string
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        creators:
+          type: array
+          items:
+            $ref: "#/components/schemas/CreatorSaveDto"
+        database_id:
+          type: integer
+          format: int64
+          example: 1
+        query_id:
+          type: integer
+          format: int64
+        view_id:
+          type: integer
+          format: int64
+        table_id:
+          type: integer
+          format: int64
+        publication_day:
+          type: integer
+          format: int32
+          example: 15
+        publication_month:
+          type: integer
+          format: int32
+          example: 12
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+        related_identifiers:
+          type: array
+          items:
+            $ref: "#/components/schemas/RelatedIdentifierSaveDto"
+    DatabaseCreateDto:
+      required:
+      - container_id
+      - is_public
+      - is_schema_public
+      - name
+      type: object
+      properties:
+        name:
+          type: string
+          example: Air Quality
+        container_id:
+          type: integer
+          format: int64
+          example: 1
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+    ViewCreateDto:
+      required:
+      - is_public
+      - is_schema_public
+      - name
+      - query
+      type: object
+      properties:
+        name:
+          maxLength: 63
+          minLength: 1
+          type: string
+          example: Air Quality
+        query:
+          type: string
+          example: SELECT `id` FROM `air_quality`
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+    ViewBriefDto:
+      required:
+      - database_id
+      - id
+      - internal_name
+      - name
+      - query
+      - query_hash
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        query:
+          type: string
+          example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC
+        database_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: air_quality
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+        initial_view:
+          type: boolean
+          description: True if it is the default view for the database
+          example: true
+        query_hash:
+          type: string
+          example: 7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916
+        owned_by:
+          type: string
+          format: uuid
+    ColumnCreateDto:
+      required:
+      - name
+      - null_allowed
+      - type
+      type: object
+      properties:
+        name:
+          type: string
+          example: Date
+        type:
+          type: string
+          example: string
+          enum:
+          - char
+          - varchar
+          - binary
+          - varbinary
+          - tinyblob
+          - tinytext
+          - text
+          - blob
+          - mediumtext
+          - mediumblob
+          - longtext
+          - longblob
+          - enum
+          - set
+          - serial
+          - bit
+          - tinyint
+          - bool
+          - smallint
+          - mediumint
+          - int
+          - bigint
+          - float
+          - double
+          - decimal
+          - date
+          - datetime
+          - timestamp
+          - time
+          - year
+        size:
+          type: integer
+          format: int64
+          example: 255
+        d:
+          type: integer
+          format: int64
+          example: 0
+        description:
+          maxLength: 2048
+          minLength: 0
+          type: string
+          example: Formatted as YYYY-MM-dd
+        enums:
+          type: array
+          description: "enum values, only considered when type = ENUM"
+          items:
+            type: string
+            description: "enum values, only considered when type = ENUM"
+        sets:
+          type: array
+          description: "set values, only considered when type = SET"
+          items:
+            type: string
+            description: "set values, only considered when type = SET"
+        index_length:
+          type: integer
+          format: int64
+        null_allowed:
+          type: boolean
+          example: true
+        concept_uri:
+          type: string
+        unit_uri:
+          type: string
+    ConstraintsCreateDto:
+      required:
+      - checks
+      - foreign_keys
+      - primary_key
+      - uniques
+      type: object
+      properties:
+        uniques:
+          type: array
+          items:
+            type: array
+            items:
+              type: string
+        checks:
+          uniqueItems: true
+          type: array
+          items:
+            type: string
+        foreign_keys:
+          type: array
+          items:
+            $ref: "#/components/schemas/ForeignKeyCreateDto"
+        primary_key:
+          uniqueItems: true
+          type: array
+          items:
+            type: string
+    ForeignKeyCreateDto:
+      required:
+      - columns
+      - referenced_columns
+      - referenced_table
+      type: object
+      properties:
+        columns:
+          type: array
+          items:
+            type: string
+        referenced_table:
+          type: string
+        referenced_columns:
+          type: array
+          items:
+            type: string
+        on_update:
+          type: string
+          enum:
+          - restrict
+          - cascade
+          - set_null
+          - no_action
+          - set_default
+        on_delete:
+          type: string
+          enum:
+          - restrict
+          - cascade
+          - set_null
+          - no_action
+          - set_default
+    TableCreateDto:
+      required:
+      - columns
+      - constraints
+      - is_public
+      - is_schema_public
+      - name
+      type: object
+      properties:
+        name:
+          maxLength: 64
+          minLength: 1
+          type: string
+          example: Air Quality
+        description:
+          maxLength: 180
+          minLength: 0
+          type: string
+          example: Air Quality in Austria
+        columns:
+          type: array
+          items:
+            $ref: "#/components/schemas/ColumnCreateDto"
+        constraints:
+          $ref: "#/components/schemas/ConstraintsCreateDto"
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+    ContainerCreateDto:
+      required:
+      - host
+      - image_id
+      - name
+      - privileged_password
+      - privileged_username
+      - quota
+      type: object
+      properties:
+        name:
+          type: string
+          example: Air Quality
+        host:
+          type: string
+          description: Hostname of container
+        port:
+          type: integer
+          description: Port of container
+          format: int32
+        quota:
+          type: integer
+          format: int64
+          example: 50
+        image_id:
+          type: integer
+          description: Image ID
+          format: int64
+        ui_host:
+          type: string
+        ui_port:
+          type: integer
+          format: int32
+        privileged_username:
+          type: string
+          description: Username of privileged user
+          example: root
+        privileged_password:
+          type: string
+          description: Password of privileged user
+    ContainerDto:
+      required:
+      - count
+      - id
+      - image
+      - internal_name
+      - name
+      - quota
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        image:
+          $ref: "#/components/schemas/ImageDto"
+        quota:
+          type: integer
+          format: int64
+          example: 50
+        count:
+          type: integer
+          format: int64
+          example: 10
+        last_retrieved:
+          type: string
+          format: date-time
+        internal_name:
+          type: string
+          example: data-db
+        ui_host:
+          type: string
+        ui_port:
+          type: integer
+          format: int32
+    ColumnBriefDto:
+      required:
+      - column_type
+      - database_id
+      - id
+      - internal_name
+      - name
+      - table_id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: date
+        alias:
+          type: string
+        database_id:
+          type: integer
+          format: int64
+        table_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: mdb_date
+        column_type:
+          type: string
+          example: date
+          enum:
+          - char
+          - varchar
+          - binary
+          - varbinary
+          - tinyblob
+          - tinytext
+          - text
+          - blob
+          - mediumtext
+          - mediumblob
+          - longtext
+          - longblob
+          - enum
+          - set
+          - serial
+          - bit
+          - tinyint
+          - bool
+          - smallint
+          - mediumint
+          - int
+          - bigint
+          - float
+          - double
+          - decimal
+          - date
+          - datetime
+          - timestamp
+          - time
+          - year
+    UnitDto:
+      required:
+      - columns
+      - id
+      - uri
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        uri:
+          type: string
+        name:
+          type: string
+        description:
+          type: string
+        columns:
+          type: array
+          items:
+            $ref: "#/components/schemas/ColumnBriefDto"
+    OntologyBriefDto:
+      required:
+      - id
+      - prefix
+      - rdf
+      - sparql
+      - uri
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        uri:
+          type: string
+          example: http://www.wikidata.org/
+        prefix:
+          type: string
+          example: wd
+        sparql:
+          type: boolean
+          example: true
+        rdf:
+          type: boolean
+          example: false
+        uri_pattern:
+          type: string
+          example: http://www.wikidata.org/entity/.*
+    EntityDto:
+      required:
+      - label
+      - uri
+      type: object
+      properties:
+        uri:
+          type: string
+          example: https://www.wikidata.org/entity/Q1686799
+        label:
+          type: string
+          example: Apache Jena
+        description:
+          type: string
+          example: open source semantic web framework for Java
+    OaiListIdentifiersParameters:
+      type: object
+      properties:
+        metadataPrefix:
+          type: string
+        from:
+          type: string
+        until:
+          type: string
+        set:
+          type: string
+        resumptionToken:
+          type: string
+        fromDate:
+          type: string
+          format: date-time
+        untilDate:
+          type: string
+          format: date-time
+        parametersString:
+          type: string
+    BannerMessageDto:
+      required:
+      - id
+      - message
+      - type
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        type:
+          type: string
+          enum:
+          - error
+          - warning
+          - info
+        message:
+          type: string
+          example: Maintenance starts on 8am on Monday
+        link:
+          type: string
+          example: https://example.com
+        link_text:
+          type: string
+          example: More
+        display_start:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21Z
+        display_end:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21Z
+    ImageBriefDto:
+      required:
+      - default
+      - id
+      - jdbc_method
+      - name
+      - version
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: mariadb
+        version:
+          type: string
+          example: "10.5"
+        jdbc_method:
+          type: string
+          example: mariadb
+        default:
+          type: boolean
+          example: false
+    LdCreatorDto:
+      required:
+      - '@type'
+      - name
+      type: object
+      properties:
+        name:
+          type: string
+        sameAs:
+          type: string
+        givenName:
+          type: string
+        familyName:
+          type: string
+        '@type':
+          type: string
+    LdDatasetDto:
+      required:
+      - '@context'
+      - '@type'
+      - citation
+      - creator
+      - description
+      - hasPart
+      - identifier
+      - name
+      - temporalCoverage
+      - url
+      - version
+      type: object
+      properties:
+        name:
+          type: string
+        description:
+          type: string
+        url:
+          type: string
+        identifier:
+          type: array
+          items:
+            type: string
+        license:
+          type: string
+        creator:
+          type: array
+          items:
+            $ref: "#/components/schemas/LdCreatorDto"
+        citation:
+          type: string
+        hasPart:
+          type: array
+          items:
+            $ref: "#/components/schemas/LdDatasetDto"
+        temporalCoverage:
+          type: string
+        version:
+          type: string
+          format: date-time
+        '@context':
+          type: string
+        '@type':
+          type: string
+    ConstraintsDto:
+      type: object
+      properties:
+        uniques:
+          type: array
+          items:
+            $ref: "#/components/schemas/UniqueDto"
+        checks:
+          uniqueItems: true
+          type: array
+          items:
+            type: string
+        foreign_keys:
+          type: array
+          items:
+            $ref: "#/components/schemas/ForeignKeyDto"
+        primary_key:
+          uniqueItems: true
+          type: array
+          items:
+            $ref: "#/components/schemas/PrimaryKeyDto"
+    ForeignKeyBriefDto:
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+    ForeignKeyDto:
+      required:
+      - name
+      - referenced_table
+      - references
+      - table
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+        references:
+          type: array
+          items:
+            $ref: "#/components/schemas/ForeignKeyReferenceDto"
+        table:
+          $ref: "#/components/schemas/TableBriefDto"
+        referenced_table:
+          $ref: "#/components/schemas/TableBriefDto"
+        on_update:
+          type: string
+          enum:
+          - restrict
+          - cascade
+          - set_null
+          - no_action
+          - set_default
+        on_delete:
+          type: string
+          enum:
+          - restrict
+          - cascade
+          - set_null
+          - no_action
+          - set_default
+    ForeignKeyReferenceDto:
+      required:
+      - column
+      - foreign_key
+      - referenced_column
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        column:
+          $ref: "#/components/schemas/ColumnBriefDto"
+        foreign_key:
+          $ref: "#/components/schemas/ForeignKeyBriefDto"
+        referenced_column:
+          $ref: "#/components/schemas/ColumnBriefDto"
+    PrimaryKeyDto:
+      required:
+      - column
+      - table
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        table:
+          $ref: "#/components/schemas/TableBriefDto"
+        column:
+          $ref: "#/components/schemas/ColumnBriefDto"
+    TableDto:
+      required:
+      - columns
+      - constraints
+      - database_id
+      - id
+      - internal_name
+      - is_public
+      - is_schema_public
+      - is_versioned
+      - name
+      - owner
+      - queue_name
+      - routing_key
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        alias:
+          type: string
+        identifiers:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierDto"
+        owner:
+          $ref: "#/components/schemas/UserBriefDto"
+        description:
+          maxLength: 2048
+          minLength: 0
+          type: string
+          example: Air Quality in Austria
+        columns:
+          type: array
+          items:
+            $ref: "#/components/schemas/ColumnDto"
+        constraints:
+          $ref: "#/components/schemas/ConstraintsDto"
+        last_retrieved:
+          type: string
+          format: date-time
+        database_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: air_quality
+        is_versioned:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+        queue_name:
+          type: string
+          example: air_quality
+        queue_type:
+          type: string
+          example: quorum
+        routing_key:
+          type: string
+          example: dbrepo.1.2
+        is_public:
+          type: boolean
+          example: true
+        num_rows:
+          type: integer
+          format: int64
+          example: 5
+        data_length:
+          type: integer
+          description: in bytes
+          format: int64
+          example: 16384
+        max_data_length:
+          type: integer
+          description: in bytes
+          format: int64
+          example: 0
+        avg_row_length:
+          type: integer
+          description: in bytes
+          format: int64
+          example: 3276
+    UniqueDto:
+      required:
+      - columns
+      - id
+      - name
+      - table
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+        table:
+          $ref: "#/components/schemas/TableBriefDto"
+        columns:
+          type: array
+          items:
+            $ref: "#/components/schemas/ColumnDto"
+    TableColumnEntityDto:
+      required:
+      - column_id
+      - database_id
+      - table_id
+      - uri
+      type: object
+      properties:
+        uri:
+          type: string
+          example: https://www.wikidata.org/entity/Q1686799
+        label:
+          type: string
+          example: Apache Jena
+        description:
+          type: string
+          example: open source semantic web framework for Java
+        database_id:
+          type: integer
+          format: int64
+          example: 1
+        table_id:
+          type: integer
+          format: int64
+          example: 1
+        column_id:
+          type: integer
+          format: int64
+          example: 1
+    ContainerBriefDto:
+      required:
+      - count
+      - hash
+      - id
+      - image
+      - internal_name
+      - name
+      - quota
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        hash:
+          type: string
+          example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50
+        name:
+          type: string
+          example: Air Quality
+        image:
+          $ref: "#/components/schemas/ImageBriefDto"
+        quota:
+          type: integer
+          format: int32
+          example: 50
+        count:
+          type: integer
+          format: int32
+          example: 10
+        internal_name:
+          type: string
+          example: air-quality
+    ConceptDto:
+      required:
+      - columns
+      - id
+      - uri
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        uri:
+          type: string
+        name:
+          type: string
+        description:
+          type: string
+        columns:
+          type: array
+          items:
+            $ref: "#/components/schemas/ColumnBriefDto"
+  securitySchemes:
+    basicAuth:
+      type: http
+      scheme: basic
+    bearerAuth:
+      type: http
+      scheme: bearer
+      bearerFormat: JWT
diff --git a/.docs/.openapi/api-search.yaml b/.docs/.openapi/api-search.yaml
new file mode 100644
index 0000000000..c47cbfb649
--- /dev/null
+++ b/.docs/.openapi/api-search.yaml
@@ -0,0 +1,387 @@
+{
+  "components": {
+    "schemas": {
+      "IndexDto": {
+        "properties": {
+          "results": {
+            "items": {
+              "type": "object"
+            },
+            "type": "array"
+          },
+          "type": {
+            "description": "Same as the requested type",
+            "enum": [
+              "database",
+              "table",
+              "view",
+              "column",
+              "user",
+              "identifier",
+              "concept",
+              "unit"
+            ],
+            "type": "string"
+          }
+        },
+        "required": [
+          "results",
+          "type"
+        ]
+      },
+      "IndexFieldDto": {
+        "properties": {
+          "attr_friendly_name": {
+            "example": "Name",
+            "type": "string"
+          },
+          "attr_name": {
+            "example": "name",
+            "type": "string"
+          },
+          "type": {
+            "description": "OpenSearch data types.",
+            "example": "string",
+            "type": "string"
+          }
+        },
+        "required": [
+          "attr_name",
+          "attr_friendly_name",
+          "type"
+        ],
+        "type": "object"
+      },
+      "IndexFieldsDto": {
+        "properties": {
+          "results": {
+            "items": {
+              "$ref": "#/components/schemas/IndexFieldDto"
+            },
+            "type": "array"
+          }
+        },
+        "required": [
+          "results"
+        ],
+        "type": "object"
+      },
+      "SearchRequestDto": {
+        "properties": {
+          "field_value_pairs": {
+            "type": "object"
+          },
+          "search_term": {
+            "type": "string"
+          }
+        },
+        "required": [
+          "search_term",
+          "field_value_pairs"
+        ],
+        "type": "object"
+      }
+    },
+    "securitySchemes": {
+      "basicAuth": {
+        "in": "header",
+        "scheme": "basic",
+        "type": "http"
+      },
+      "bearerAuth": {
+        "bearerFormat": "JWT",
+        "in": "header",
+        "scheme": "bearer",
+        "type": "http"
+      }
+    }
+  },
+  "externalDocs": {
+    "description": "Sourcecode Documentation",
+    "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/"
+  },
+  "info": {
+    "contact": {
+      "email": "andreas.rauber@tuwien.ac.at",
+      "name": "Prof. Andreas Rauber"
+    },
+    "description": "Service that searches the search database",
+    "license": {
+      "name": "Apache 2.0",
+      "url": "https://www.apache.org/licenses/LICENSE-2.0"
+    },
+    "title": "Database Repository Search Service API",
+    "version": "1.5"
+  },
+  "openapi": "3.0.0",
+  "paths": {
+    "/api/search": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "description": "Performs a fuzzy search",
+        "operationId": "post_fuzzy_search",
+        "parameters": [
+          {
+            "in": "query",
+            "name": "q",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "id": {
+                      "type": "string"
+                    }
+                  },
+                  "type": "array"
+                }
+              }
+            },
+            "description": "OK, contains the elements formatted as an array of JSON arrays"
+          },
+          "415": {
+            "description": "Wrong accept type"
+          }
+        },
+        "summary": "Performs a fuzzy search",
+        "tags": [
+          "search-endpoint"
+        ]
+      }
+    },
+    "/api/search/{field_type}": {
+      "post": {
+        "consumes": [
+          "application/json"
+        ],
+        "description": "Performs a general search",
+        "operationId": "post_general_search",
+        "parameters": [
+          {
+            "description": "The search type.",
+            "in": "path",
+            "name": "type",
+            "required": true,
+            "schema": {
+              "enum": [
+                "database",
+                "table",
+                "view",
+                "column",
+                "user",
+                "identifier",
+                "concept",
+                "unit"
+              ],
+              "type": "string"
+            }
+          },
+          {
+            "in": "query",
+            "name": "t1",
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "in": "query",
+            "name": "t2",
+            "schema": {
+              "type": "integer"
+            }
+          },
+          {
+            "in": "body",
+            "name": "body",
+            "required": true,
+            "schema": {
+              "$ref": "#/components/schemas/SearchRequestDto"
+            }
+          }
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "properties": {
+                    "results": {
+                      "items": {
+                        "type": "object"
+                      },
+                      "type": "array"
+                    },
+                    "type": {
+                      "description": "Same as the requested type",
+                      "enum": [
+                        "database",
+                        "table",
+                        "view",
+                        "column",
+                        "user",
+                        "identifier",
+                        "concept",
+                        "unit"
+                      ],
+                      "type": "string"
+                    }
+                  },
+                  "type": "object"
+                }
+              }
+            },
+            "description": "OK, contains the elements formatted as an array of JSON arrays"
+          }
+        },
+        "summary": "Performs a general search",
+        "tags": [
+          "search-endpoint"
+        ]
+      }
+    },
+    "/api/search/{field_type}/fields": {
+      "get": {
+        "operationId": "get_fields",
+        "parameters": [
+          {
+            "description": "The search type.",
+            "in": "path",
+            "name": "type",
+            "required": true,
+            "schema": {
+              "enum": [
+                "database",
+                "table",
+                "view",
+                "column",
+                "user",
+                "identifier",
+                "concept",
+                "unit"
+              ],
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/IndexFieldsDto"
+                }
+              }
+            },
+            "description": "List of fields"
+          },
+          "404": {
+            "description": "Invalid type."
+          }
+        },
+        "summary": "Get searchable fields",
+        "tags": [
+          "search-endpoint"
+        ]
+      }
+    },
+    "/api/search/{index}": {
+      "get": {
+        "consumes": [
+          "application/json"
+        ],
+        "description": "Gets the index",
+        "operationId": "get_index",
+        "parameters": [
+          {
+            "description": "The search type.",
+            "in": "path",
+            "name": "type",
+            "required": true,
+            "schema": {
+              "enum": [
+                "database",
+                "table",
+                "view",
+                "column",
+                "user",
+                "identifier",
+                "concept",
+                "unit"
+              ],
+              "type": "string"
+            }
+          },
+          {
+            "in": "body",
+            "name": "body",
+            "required": true,
+            "schema": {
+              "properties": {
+                "field_value_pairs": {
+                  "type": "object"
+                },
+                "search_term": {
+                  "example": "air quality",
+                  "type": "string"
+                },
+                "t1": {
+                  "example": 0,
+                  "type": "integer"
+                },
+                "t2": {
+                  "example": 100,
+                  "type": "integer"
+                }
+              },
+              "type": "object"
+            }
+          }
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "responses": {
+          "200": {
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/IndexDto"
+                }
+              }
+            },
+            "description": "OK, contains the elements formatted as an array of JSON arrays"
+          }
+        },
+        "summary": "Gets the index",
+        "tags": [
+          "search-endpoint"
+        ]
+      }
+    }
+  },
+  "servers": [
+    {
+      "description": "Generated server url",
+      "url": "http://localhost:4000"
+    },
+    {
+      "description": "Sandbox",
+      "url": "https://test.dbrepo.tuwien.ac.at"
+    }
+  ]
+}
diff --git a/.docs/.swagger/api.base.yaml b/.docs/.openapi/api.base.yaml
similarity index 100%
rename from .docs/.swagger/api.base.yaml
rename to .docs/.openapi/api.base.yaml
diff --git a/.docs/.swagger/api.yaml b/.docs/.openapi/api.yaml
similarity index 97%
rename from .docs/.swagger/api.yaml
rename to .docs/.openapi/api.yaml
index dc7a627e74..ef55c74ae9 100644
--- a/.docs/.swagger/api.yaml
+++ b/.docs/.openapi/api.yaml
@@ -432,6 +432,11 @@ paths:
           schema:
             type: integer
             format: int64
+        - name: Authorization
+          in: header
+          required: true
+          schema:
+            type: string
       requestBody:
         content:
           application/json:
@@ -490,6 +495,11 @@ paths:
           schema:
             type: integer
             format: int64
+        - name: Authorization
+          in: header
+          required: true
+          schema:
+            type: string
       requestBody:
         content:
           application/json:
@@ -550,6 +560,11 @@ paths:
           schema:
             type: integer
             format: int64
+        - name: Authorization
+          in: header
+          required: true
+          schema:
+            type: string
       requestBody:
         content:
           application/json:
@@ -937,6 +952,11 @@ paths:
           schema:
             type: integer
             format: int64
+        - name: Authorization
+          in: header
+          required: true
+          schema:
+            type: string
       requestBody:
         content:
           application/json:
@@ -979,9 +999,11 @@ paths:
         - subset-endpoint
       summary: Find subsets
       description: >-
-        Finds subsets in the query store. The result can be optionally filtered
-        by setting `persisted`. When set to *true*, only persisted queries are
-        returned, otherwise only non-persisted queries are returned.
+        Finds subsets in the query store. When the database schema is marked as
+        hidden, the user needs to be authorized, have at least read-access to
+        the database. The result can be optionally filtered by setting
+        `persisted`. When set to *true*, only persisted queries are returned,
+        otherwise only non-persisted queries are returned.
       operationId: list
       parameters:
         - name: databaseId
@@ -1032,8 +1054,10 @@ paths:
         - subset-endpoint
       summary: Create subset
       description: >-
-        Creates a subset in the query store of the data database. Requires role
-        `execute-query` for private databases.
+        Creates a subset in the query store of the data database. Can also be
+        used without authentication if (and only if) the database is marked as
+        public (i.e. when `is_public` = `is_schema_public` is set to `true`).
+        Otherwise at least read access is required.
       operationId: create
       parameters:
         - name: databaseId
@@ -1313,9 +1337,11 @@ paths:
         - subset-endpoint
       summary: Find subset
       description: >-
-        Finds a subset in the data database. Requests with HTTP header
-        `Accept=application/json` return the metadata, requests with HTTP header
-        `Accept=text/csv` return the data as downloadable file.
+        Finds a subset in the data database.  When the database schema is marked
+        as hidden, the user needs to be authorized, have at least read-access to
+        the database.  Requests with HTTP header `Accept=application/json`
+        return the metadata, requests with HTTP header `Accept=text/csv` return
+        the data as downloadable file.
       operationId: findById
       parameters:
         - name: databaseId
@@ -1330,6 +1356,11 @@ paths:
           schema:
             type: integer
             format: int64
+        - name: Accept
+          in: header
+          required: true
+          schema:
+            type: string
         - name: timestamp
           in: query
           required: false
@@ -1412,7 +1443,7 @@ paths:
               schema:
                 type: array
                 items:
-                  $ref: '#/components/schemas/DatabaseDto'
+                  $ref: '#/components/schemas/DatabaseBriefDto'
     post:
       tags:
         - database-endpoint
@@ -1433,7 +1464,7 @@ paths:
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/DatabaseDto'
+                $ref: '#/components/schemas/DatabaseBriefDto'
         '400':
           description: Database create query is malformed or image is not supported
           content:
@@ -1513,7 +1544,7 @@ paths:
               schema:
                 type: array
                 items:
-                  $ref: '#/components/schemas/DatabaseDto'
+                  $ref: '#/components/schemas/DatabaseBriefDto'
   '/api/database/{databaseId}/access/{userId}':
     get:
       tags:
@@ -1568,7 +1599,7 @@ paths:
       description: >-
         Modifies access of a user with given id to database with given id.
         Requires role `update-database-access`.
-      operationId: update_6
+      operationId: update_5
       parameters:
         - name: databaseId
           in: path
@@ -1803,7 +1834,11 @@ paths:
       tags:
         - user-endpoint
       summary: Get user
-      description: Gets user with id from the metadata database. Requires authentication.
+      description: >-
+        Gets own user information from the metadata database. Requires
+        authentication. Foreign user information can only be obtained if
+        additional role `find-foreign-user` is present. Finding information
+        about internal users results in a 404 error.
       operationId: find_2
       parameters:
         - name: userId
@@ -1979,7 +2014,7 @@ paths:
       tags:
         - user-endpoint
       summary: Create token
-      description: Creates a user token via the auth service.
+      description: Creates a user token via the Auth Service.
       operationId: getToken
       requestBody:
         content:
@@ -2544,7 +2579,7 @@ paths:
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/DatabaseDto'
+                $ref: '#/components/schemas/DatabaseBriefDto'
         '400':
           description: The visibility payload is malformed
           content:
@@ -2783,8 +2818,10 @@ paths:
         - table-endpoint
       summary: Find table
       description: >-
-        Finds a table with id. When the `system` role is present, the endpoint
-        responds with additional connection metadata in the header.
+        Finds a table with id. When a table is hidden (i.e. when `is_public` is
+        `false`), then the user needs to have at least read access and the role
+        `find-table`. When the `system` role is present, the endpoint responds
+        with additional connection metadata in the header.
       operationId: findById_2
       parameters:
         - name: databaseId
@@ -2988,8 +3025,8 @@ paths:
       summary: Update statistics
       description: >-
         Updates basic statistical properties (min, max, mean, median, std.dev)
-        for numerical columns in a table with id. Requires role
-        `update-table-statistic`.
+        for numerical columns in a table with id. This action can only be
+        performed by the table owner. Requires role `update-table-statistic`.
       operationId: updateStatistic
       parameters:
         - name: databaseId
@@ -3013,6 +3050,12 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/ApiErrorDto'
+        '403':
+          description: Not the owner
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
         '404':
           description: Failed to find database/table in metadata database
           content:
@@ -3044,7 +3087,7 @@ paths:
         with at least *READ* access to the associated database can update the
         column semantics (requires role `modify-table-column-semantics`) or
         foreign table columns if role `modify-foreign-table-column-semantics`.
-      operationId: update_5
+      operationId: updateColumn
       parameters:
         - name: databaseId
           in: path
@@ -3140,7 +3183,7 @@ paths:
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/DatabaseDto'
+                $ref: '#/components/schemas/DatabaseBriefDto'
         '400':
           description: Owner payload is malformed
           content:
@@ -3197,7 +3240,7 @@ paths:
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/DatabaseDto'
+                $ref: '#/components/schemas/DatabaseBriefDto'
         '403':
           description: Refresh view metadata is not permitted
           content:
@@ -3248,7 +3291,7 @@ paths:
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/DatabaseDto'
+                $ref: '#/components/schemas/DatabaseBriefDto'
         '400':
           description: Failed to parse payload at search service
           content:
@@ -3342,7 +3385,7 @@ paths:
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/DatabaseDto'
+                $ref: '#/components/schemas/DatabaseBriefDto'
         '403':
           description: Modify of image is not permitted
           content:
@@ -3350,7 +3393,7 @@ paths:
               schema:
                 $ref: '#/components/schemas/ApiErrorDto'
         '404':
-          description: Database or user could not be found
+          description: Database could not be found
           content:
             application/json:
               schema:
@@ -3381,7 +3424,11 @@ paths:
       tags:
         - user-endpoint
       summary: List users
-      description: Lists users known to the metadata database.
+      description: >-
+        Lists users known to the metadata database. Internal users are omitted
+        from the result list. If the optional query parameter `username` is
+        present, the result list can be filtered by matching this exact
+        username.
       operationId: findAll
       parameters:
         - name: username
@@ -3819,7 +3866,10 @@ paths:
       tags:
         - table-endpoint
       summary: List tables
-      description: Lists all tables known to the metadata database.
+      description: >-
+        Lists all tables known to the metadata database. When a database has a
+        hidden schema (i.e. when `is_schema_public` is `false`), then the user
+        needs to have at least read access and the role `list-tables`.
       operationId: list_4
       parameters:
         - name: databaseId
@@ -4186,7 +4236,13 @@ paths:
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/DatabaseDto'
+                $ref: '#/components/schemas/DatabaseBriefDto'
+        '403':
+          description: Not allowed to view database
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
         '404':
           description: 'Database, user or exchange could not be found'
           content:
@@ -4214,8 +4270,8 @@ paths:
         - table-endpoint
       summary: Suggest semantics
       description: >-
-        Suggests semantic concepts for a table. Requires role
-        `table-semantic-analyse`.
+        Suggests semantic concepts for a table. This action can only be
+        performed by the table owner. Requires role `table-semantic-analyse`.
       operationId: analyseTable
       parameters:
         - name: databaseId
@@ -4245,6 +4301,12 @@ paths:
             application/json:
               schema:
                 $ref: '#/components/schemas/ApiErrorDto'
+        '403':
+          description: Not the table owner.
+          content:
+            application/json:
+              schema:
+                $ref: '#/components/schemas/ApiErrorDto'
         '404':
           description: Failed to find database/table in metadata database
           content:
@@ -4417,7 +4479,10 @@ paths:
           content:
             application/json:
               schema:
-                $ref: '#/components/schemas/SearchResultDto'
+                properties:
+                  id:
+                    type: string
+                type: array
           description: 'OK, contains the elements formatted as an array of JSON arrays'
         '415':
           description: Wrong accept type
@@ -5168,64 +5233,15 @@ components:
           type: object
           additionalProperties:
             type: object
-    ContainerBriefDto:
-      required:
-        - count
-        - hash
-        - id
-        - image
-        - internal_name
-        - name
-        - quota
-      type: object
-      properties:
-        id:
-          type: integer
-          format: int64
-        hash:
-          type: string
-          example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50
-        name:
-          type: string
-          example: Air Quality
-        image:
-          $ref: '#/components/schemas/ImageBriefDto'
-        quota:
-          type: integer
-          format: int32
-          example: 50
-        count:
-          type: integer
-          format: int32
-          example: 10
-        internal_name:
-          type: string
-          example: air-quality
-    DatabaseAccessDto:
-      required:
-        - type
-        - user
-      type: object
-      properties:
-        user:
-          $ref: '#/components/schemas/UserBriefDto'
-        type:
-          type: string
-          enum:
-            - read
-            - write_own
-            - write_all
-    DatabaseDto:
+    DatabaseBriefDto:
       required:
         - contact
-        - container
-        - exchange_name
         - id
         - internal_name
         - is_public
         - is_schema_public
         - name
-        - owner
+        - owner_id
       type: object
       properties:
         id:
@@ -5237,153 +5253,40 @@ components:
         description:
           type: string
           example: Air Quality
-        tables:
-          type: array
-          items:
-            $ref: '#/components/schemas/TableBriefDto'
-        views:
-          type: array
-          items:
-            $ref: '#/components/schemas/ViewBriefDto'
-        container:
-          $ref: '#/components/schemas/ContainerBriefDto'
-        accesses:
-          type: array
-          items:
-            $ref: '#/components/schemas/DatabaseAccessDto'
         identifiers:
           type: array
           items:
             $ref: '#/components/schemas/IdentifierBriefDto'
-        subsets:
-          type: array
-          items:
-            $ref: '#/components/schemas/IdentifierBriefDto'
         contact:
           $ref: '#/components/schemas/UserBriefDto'
-        owner:
-          $ref: '#/components/schemas/UserBriefDto'
-        exchange_name:
-          type: string
-          example: dbrepo
-        exchange_type:
-          type: string
-          example: topic
-        internal_name:
-          type: string
-          example: air_quality
-        is_public:
-          type: boolean
-          example: true
-        is_schema_public:
-          type: boolean
-          example: true
-        preview_image:
-          type: string
-    ImageBriefDto:
-      required:
-        - default
-        - id
-        - jdbc_method
-        - name
-        - version
-      type: object
-      properties:
-        id:
-          type: integer
-          format: int64
-        name:
-          type: string
-          example: mariadb
-        version:
-          type: string
-          example: '10.5'
-        jdbc_method:
-          type: string
-          example: mariadb
-        default:
-          type: boolean
-          example: false
-    TableBriefDto:
-      required:
-        - database_id
-        - id
-        - internal_name
-        - is_public
-        - is_schema_public
-        - is_versioned
-        - name
-        - owned_by
-      type: object
-      properties:
-        id:
-          type: integer
-          format: int64
-        name:
-          type: string
-          example: Air Quality
-        description:
-          type: string
-          example: Air Quality in Austria
-        database_id:
-          type: integer
-          format: int64
         internal_name:
           type: string
           example: air_quality
-        is_versioned:
-          type: boolean
-          example: true
         is_public:
           type: boolean
           example: true
         is_schema_public:
           type: boolean
           example: true
-        owned_by:
+        owner_id:
           type: string
           format: uuid
-    ViewBriefDto:
+        preview_image:
+          type: string
+    DatabaseAccessDto:
       required:
-        - database_id
-        - id
-        - internal_name
-        - name
-        - query
-        - query_hash
+        - type
+        - user
       type: object
       properties:
-        id:
-          type: integer
-          format: int64
-        name:
-          type: string
-          example: Air Quality
-        query:
-          type: string
-          example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC
-        database_id:
-          type: integer
-          format: int64
-        internal_name:
-          type: string
-          example: air_quality
-        is_public:
-          type: boolean
-          example: true
-        is_schema_public:
-          type: boolean
-          example: true
-        initial_view:
-          type: boolean
-          description: True if it is the default view for the database
-          example: true
-        query_hash:
-          type: string
-          example: 7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916
-        owned_by:
+        user:
+          $ref: '#/components/schemas/UserBriefDto'
+        type:
           type: string
-          format: uuid
+          enum:
+            - read
+            - write_own
+            - write_all
     UserUpdateDto:
       required:
         - language
@@ -5430,22 +5333,20 @@ components:
       required:
         - attributes
         - id
-        - username
       type: object
       properties:
         id:
           type: string
           format: uuid
           example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
-        username:
-          type: string
-          description: Only contains lowercase characters
-          example: jcarberry
         name:
           type: string
           example: Josiah Carberry
         attributes:
           $ref: '#/components/schemas/UserAttributesDto'
+        last_retrieved:
+          type: string
+          format: date-time
         qualified_name:
           type: string
           example: Josiah Carberry — @jcarberry
@@ -5747,6 +5648,9 @@ components:
         - value
       type: object
       properties:
+        id:
+          type: integer
+          format: int64
         value:
           type: string
           example: XOR
@@ -6883,10 +6787,8 @@ components:
             - Other
     IdentifierDto:
       required:
-        - created_by
         - creators
         - database_id
-        - execution
         - id
         - owner
         - publication_year
@@ -6936,7 +6838,7 @@ components:
           type: string
           example: TU Wien
         owner:
-          $ref: '#/components/schemas/UserDto'
+          $ref: '#/components/schemas/UserBriefDto'
         language:
           type: string
           enum:
@@ -7184,9 +7086,6 @@ components:
           type: integer
           format: int32
           example: 2022
-        created_by:
-          type: string
-          format: uuid
     IdentifierFunderDto:
       required:
         - funder_name
@@ -7318,140 +7217,34 @@ components:
         is_schema_public:
           type: boolean
           example: true
-    ColumnBriefDto:
+    ViewColumnDto:
       required:
-        - column_type
+        - auto_generated
         - database_id
         - id
         - internal_name
+        - is_null_allowed
         - name
-        - table_id
+        - ord
+        - type
       type: object
       properties:
         id:
           type: integer
           format: int64
         name:
+          maxLength: 64
+          minLength: 0
           type: string
-          example: date
-        alias:
-          type: string
-        database_id:
+          example: Date
+        size:
           type: integer
           format: int64
-        table_id:
-          type: integer
-          format: int64
-        internal_name:
-          type: string
-          example: mdb_date
-        column_type:
-          type: string
-          example: date
-          enum:
-            - char
-            - varchar
-            - binary
-            - varbinary
-            - tinyblob
-            - tinytext
-            - text
-            - blob
-            - mediumtext
-            - mediumblob
-            - longtext
-            - longblob
-            - enum
-            - set
-            - serial
-            - bit
-            - tinyint
-            - bool
-            - smallint
-            - mediumint
-            - int
-            - bigint
-            - float
-            - double
-            - decimal
-            - date
-            - datetime
-            - timestamp
-            - time
-            - year
-    ConceptDto:
-      required:
-        - columns
-        - id
-        - uri
-      type: object
-      properties:
-        id:
-          type: integer
-          format: int64
-        uri:
-          type: string
-        name:
-          type: string
-        description:
-          type: string
-        columns:
-          type: array
-          items:
-            $ref: '#/components/schemas/ColumnBriefDto'
-    UnitDto:
-      required:
-        - columns
-        - id
-        - uri
-      type: object
-      properties:
-        id:
-          type: integer
-          format: int64
-        uri:
-          type: string
-        name:
-          type: string
-        description:
-          type: string
-        columns:
-          type: array
-          items:
-            $ref: '#/components/schemas/ColumnBriefDto'
-    ViewColumnDto:
-      required:
-        - auto_generated
-        - column_type
-        - database_id
-        - id
-        - internal_name
-        - is_null_allowed
-        - is_public
-        - name
-        - ordinal_position
-      type: object
-      properties:
-        id:
-          type: integer
-          format: int64
-        name:
-          maxLength: 64
-          minLength: 0
-          type: string
-          example: Date
-        size:
-          type: integer
-          format: int64
-          example: 255
-        d:
+          example: 255
+        d:
           type: integer
           format: int64
           example: 0
-        concept:
-          $ref: '#/components/schemas/ConceptDto'
-        unit:
-          $ref: '#/components/schemas/UnitDto'
         description:
           maxLength: 2048
           minLength: 0
@@ -7460,7 +7253,7 @@ components:
         database_id:
           type: integer
           format: int64
-        ordinal_position:
+        ord:
           type: integer
           format: int32
           example: 0
@@ -7478,7 +7271,7 @@ components:
         length:
           type: integer
           format: int64
-        column_type:
+        type:
           type: string
           example: string
           enum:
@@ -7512,16 +7305,12 @@ components:
             - timestamp
             - time
             - year
-        is_public:
-          type: boolean
-          example: true
         is_null_allowed:
           type: boolean
           example: false
     ViewDto:
       required:
         - columns
-        - database
         - database_id
         - id
         - internal_name
@@ -7534,8 +7323,6 @@ components:
         id:
           type: integer
           format: int64
-        database:
-          $ref: '#/components/schemas/DatabaseDto'
         name:
           type: string
           example: Air Quality
@@ -7552,6 +7339,9 @@ components:
           type: array
           items:
             $ref: '#/components/schemas/ViewColumnDto'
+        last_retrieved:
+          type: string
+          format: date-time
         database_id:
           type: integer
           format: int64
@@ -7588,6 +7378,45 @@ components:
         is_schema_public:
           type: boolean
           example: true
+    TableBriefDto:
+      required:
+        - database_id
+        - id
+        - internal_name
+        - is_public
+        - is_schema_public
+        - is_versioned
+        - name
+        - owned_by
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        description:
+          type: string
+          example: Air Quality in Austria
+        database_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: air_quality
+        is_versioned:
+          type: boolean
+          example: true
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+        owned_by:
+          type: string
+          format: uuid
     ColumnSemanticsUpdateDto:
       type: object
       properties:
@@ -7597,27 +7426,28 @@ components:
           type: string
     ColumnDto:
       required:
-        - column_type
         - database_id
         - id
         - internal_name
         - is_null_allowed
-        - is_public
         - name
-        - ordinal_position
+        - ord
         - table_id
+        - type
       type: object
       properties:
         id:
           type: integer
           format: int64
+          example: 1
         name:
           maxLength: 64
           minLength: 0
           type: string
-          example: Date
+          example: Given Name
         alias:
           type: string
+          example: firstname
         size:
           type: integer
           format: int64
@@ -7633,9 +7463,9 @@ components:
           type: number
           example: 51
         concept:
-          $ref: '#/components/schemas/ConceptDto'
+          $ref: '#/components/schemas/ConceptBriefDto'
         unit:
-          $ref: '#/components/schemas/UnitDto'
+          $ref: '#/components/schemas/UnitBriefDto'
         description:
           maxLength: 2048
           minLength: 0
@@ -7652,10 +7482,12 @@ components:
         database_id:
           type: integer
           format: int64
+          example: 2
         table_id:
           type: integer
           format: int64
-        ordinal_position:
+          example: 3
+        ord:
           type: integer
           format: int32
           example: 0
@@ -7663,16 +7495,18 @@ components:
           maxLength: 64
           minLength: 0
           type: string
-          example: mdb_date
+          example: given_name
         index_length:
           type: integer
           format: int64
+          example: 255
         length:
           type: integer
           format: int64
-        column_type:
+          example: 255
+        type:
           type: string
-          example: string
+          example: varchar
           enum:
             - char
             - varchar
@@ -7725,12 +7559,49 @@ components:
         std_dev:
           type: number
           example: 5.32
-        is_public:
-          type: boolean
-          example: true
         is_null_allowed:
           type: boolean
           example: false
+    ConceptBriefDto:
+      required:
+        - id
+        - uri
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 23
+        uri:
+          type: string
+          example: 'http://www.wikidata.org/entity/Q202444'
+        name:
+          type: string
+          example: given name
+        description:
+          type: string
+          example: >-
+            name typically used to differentiate people from the same family,
+            clan, or other social group who have a common last name
+    UnitBriefDto:
+      required:
+        - id
+        - uri
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 34
+        uri:
+          type: string
+          example: 'http://www.wikidata.org/entity/Q1422583'
+        name:
+          type: string
+          example: importance
+        description:
+          type: string
+          example: 'subjective magnitude of value, meaning, or purpose'
     DatabaseTransferDto:
       required:
         - id
@@ -8163,6 +8034,47 @@ components:
         is_schema_public:
           type: boolean
           example: true
+    ViewBriefDto:
+      required:
+        - database_id
+        - id
+        - internal_name
+        - name
+        - query
+        - query_hash
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        query:
+          type: string
+          example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC
+        database_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: air_quality
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+        initial_view:
+          type: boolean
+          description: True if it is the default view for the database
+          example: true
+        query_hash:
+          type: string
+          example: 7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916
+        owned_by:
+          type: string
+          format: uuid
     ColumnCreateDto:
       required:
         - name
@@ -8377,12 +8289,10 @@ components:
     ContainerDto:
       required:
         - count
-        - host
         - id
         - image
         - internal_name
         - name
-        - port
         - quota
       type: object
       properties:
@@ -8392,11 +8302,6 @@ components:
         name:
           type: string
           example: Air Quality
-        host:
-          type: string
-        port:
-          type: integer
-          format: int32
         image:
           $ref: '#/components/schemas/ImageDto'
         quota:
@@ -8407,6 +8312,9 @@ components:
           type: integer
           format: int64
           example: 10
+        last_retrieved:
+          type: string
+          format: date-time
         internal_name:
           type: string
           example: data-db
@@ -8415,6 +8323,87 @@ components:
         ui_port:
           type: integer
           format: int32
+    ColumnBriefDto:
+      required:
+        - column_type
+        - database_id
+        - id
+        - internal_name
+        - name
+        - table_id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: date
+        alias:
+          type: string
+        database_id:
+          type: integer
+          format: int64
+        table_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: mdb_date
+        column_type:
+          type: string
+          example: date
+          enum:
+            - char
+            - varchar
+            - binary
+            - varbinary
+            - tinyblob
+            - tinytext
+            - text
+            - blob
+            - mediumtext
+            - mediumblob
+            - longtext
+            - longblob
+            - enum
+            - set
+            - serial
+            - bit
+            - tinyint
+            - bool
+            - smallint
+            - mediumint
+            - int
+            - bigint
+            - float
+            - double
+            - decimal
+            - date
+            - datetime
+            - timestamp
+            - time
+            - year
+    UnitDto:
+      required:
+        - columns
+        - id
+        - uri
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        uri:
+          type: string
+        name:
+          type: string
+        description:
+          type: string
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/ColumnBriefDto'
     OntologyBriefDto:
       required:
         - id
@@ -8470,14 +8459,14 @@ components:
           type: string
         resumptionToken:
           type: string
-        parametersString:
-          type: string
         fromDate:
           type: string
           format: date-time
         untilDate:
           type: string
           format: date-time
+        parametersString:
+          type: string
     BannerMessageDto:
       required:
         - id
@@ -8511,6 +8500,30 @@ components:
           type: string
           format: date-time
           example: '2021-03-12T15:26:21.000Z'
+    ImageBriefDto:
+      required:
+        - default
+        - id
+        - jdbc_method
+        - name
+        - version
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: mariadb
+        version:
+          type: string
+          example: '10.5'
+        jdbc_method:
+          type: string
+          example: mariadb
+        default:
+          type: boolean
+          example: false
     LdCreatorDto:
       required:
         - '@type'
@@ -8707,6 +8720,9 @@ components:
             $ref: '#/components/schemas/ColumnDto'
         constraints:
           $ref: '#/components/schemas/ConstraintsDto'
+        last_retrieved:
+          type: string
+          format: date-time
         database_id:
           type: integer
           format: int64
@@ -8798,6 +8814,59 @@ components:
           type: integer
           format: int64
           example: 1
+    ContainerBriefDto:
+      required:
+        - count
+        - hash
+        - id
+        - image
+        - internal_name
+        - name
+        - quota
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        hash:
+          type: string
+          example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50
+        name:
+          type: string
+          example: Air Quality
+        image:
+          $ref: '#/components/schemas/ImageBriefDto'
+        quota:
+          type: integer
+          format: int32
+          example: 50
+        count:
+          type: integer
+          format: int32
+          example: 10
+        internal_name:
+          type: string
+          example: air-quality
+    ConceptDto:
+      required:
+        - columns
+        - id
+        - uri
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        uri:
+          type: string
+        name:
+          type: string
+        description:
+          type: string
+        columns:
+          type: array
+          items:
+            $ref: '#/components/schemas/ColumnBriefDto'
     IndexDto:
       properties:
         results:
@@ -8855,12 +8924,3 @@ components:
         - search_term
         - field_value_pairs
       type: object
-    SearchResultDto:
-      properties:
-        results:
-          items:
-            type: object
-          type: array
-      required:
-        - results
-      type: object
diff --git a/.docs/.swagger/custom.css b/.docs/.openapi/custom.css
similarity index 100%
rename from .docs/.swagger/custom.css
rename to .docs/.openapi/custom.css
diff --git a/.docs/.swagger/swagger-generate.sh b/.docs/.openapi/openapi-generate.sh
similarity index 82%
rename from .docs/.swagger/swagger-generate.sh
rename to .docs/.openapi/openapi-generate.sh
index 884c2adfac..edd927d202 100644
--- a/.docs/.swagger/swagger-generate.sh
+++ b/.docs/.openapi/openapi-generate.sh
@@ -10,10 +10,10 @@ services[9099]=metadata
 function retrieve () {
   if [[ "$2" == analyse ]] || [[ "$2" == search ]]; then
     echo "... retrieve json api from localhost:$1"
-    curl -sSL "http://localhost:$1/api-$2.json" | yq -p=json > "./.docs/.swagger/api-$2.yaml"
+    curl -sSL "http://localhost:$1/api-$2.json" | yq -o=json - > "./.docs/.openapi/api-$2.yaml"
   else
     echo "... retrieve yaml api from localhost:$1"
-    curl -sSL "http://localhost:$1/v3/api-docs.yaml" > "./.docs/.swagger/api-$2.yaml"
+    curl -sSL "http://localhost:$1/v3/api-docs.yaml" > "./.docs/.openapi/api-$2.yaml"
   fi
 }
 
diff --git a/.docs/.swagger/openapi-merge.json b/.docs/.openapi/openapi-merge.json
similarity index 100%
rename from .docs/.swagger/openapi-merge.json
rename to .docs/.openapi/openapi-merge.json
diff --git a/.docs/.swagger/swagger-ui.html b/.docs/.openapi/swagger-ui.html
similarity index 100%
rename from .docs/.swagger/swagger-ui.html
rename to .docs/.openapi/swagger-ui.html
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index dfc73f621d..100e56ff21 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -44,11 +44,11 @@ lint-docker-compose:
   image: docker.io/alpine:${ALPINE_VERSION}
   stage: lint
   variables:
-    VERSION: 3.3.0
+    VERSION: 4.45.1
     BINARY: yq_linux_amd64
   before_script:
     - 'apk --no-cache add bash wget'
-    - 'wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY} -O /usr/bin/yq && chmod +x /usr/bin/yq'
+    - 'wget https://github.com/mikefarah/yq/releases/download/v${VERSION}/${BINARY} -O /usr/bin/yq && chmod +x /usr/bin/yq'
   script:
     - "bash .scripts/check-compose.sh"
     - "yq compare -P docker-compose.yml .docker/docker-compose.yml 'volumes.*'"
@@ -116,18 +116,18 @@ lint-metadata-schema:
   script:
     - diff dbrepo-metadata-db/1_setup-schema.sql helm/dbrepo/files/01-setup-schema.sql
 
-lint-swagger-version:
+lint-open-api-version:
   image: docker.io/alpine:${ALPINE_VERSION}
   stage: lint
   variables:
-    VERSION: 3.3.0
+    VERSION: 4.45.1
     BINARY: yq_linux_amd64
   before_script:
     - 'apk --no-cache add bash wget'
-    - 'wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY} -O /usr/bin/yq && chmod +x /usr/bin/yq'
+    - 'wget https://github.com/mikefarah/yq/releases/download/v${VERSION}/${BINARY} -O /usr/bin/yq && chmod +x /usr/bin/yq'
   script:
-    - yq r ./.docs/.swagger/api.base.yaml 'externalDocs.url' | grep "${DOC_VERSION}"
-    - yq r ./.docs/.swagger/api.base.yaml 'info.version' | grep "${DOC_VERSION}"
+    - yq r ./.docs/.openapi/api.base.yaml 'externalDocs.url' | grep "${DOC_VERSION}"
+    - yq r ./.docs/.openapi/api.base.yaml 'info.version' | grep "${DOC_VERSION}"
 
 build-metadata-service:
   image: maven:3-openjdk-${JAVA_VERSION}
@@ -483,9 +483,9 @@ release-docs:
   script:
     - "make gen-lib-doc gen-docs-doc package-config"
     - "cp -r ./lib/python/docs/build/html ./final/${DOC_VERSION}/python" # sphinx
-    - "cp .docs/.swagger/api.yaml ./final/${DOC_VERSION}/rest/api.yaml" # swagger
-    - "cp .docs/.swagger/swagger-ui.html ./final/${DOC_VERSION}/rest/index.html" # swagger
-    - "cp .docs/.swagger/custom.css ./final/${DOC_VERSION}/rest/custom.css" # swagger
+    - "cp .docs/.openapi/api.yaml ./final/${DOC_VERSION}/rest/api.yaml" # openapi
+    - "cp .docs/.openapi/swagger-ui.html ./final/${DOC_VERSION}/rest/index.html" # openapi
+    - "cp .docs/.openapi/custom.css ./final/${DOC_VERSION}/rest/custom.css" # openapi
     - "cp -r ./site/* ./final/${DOC_VERSION}" # mkdocs
     - "cp .docker/dist.tar.gz ./final/${APP_VERSION}/dist.tar.gz" # dist
     - "cp .docs/index.html.tpl ./final/index.html" # redirect patch docs
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnDto.java
index 1f8d3b046e..465bd3bd1e 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnDto.java
@@ -25,13 +25,16 @@ import java.util.List;
 public class ColumnDto {
 
     @NotNull
+    @Schema(example = "1")
     private Long id;
 
     @NotNull
+    @Schema(example = "2")
     @JsonProperty("database_id")
     private Long databaseId;
 
     @NotNull
+    @Schema(example = "3")
     @JsonProperty("table_id")
     private Long tableId;
 
@@ -42,27 +45,29 @@ public class ColumnDto {
 
     @NotBlank
     @Size(max = 64)
-    @Schema(example = "Date")
+    @Schema(example = "Given Name")
     private String name;
 
     @NotBlank
     @Size(max = 64)
     @JsonProperty("internal_name")
-    @Schema(example = "mdb_date")
+    @Schema(example = "given_name")
     private String internalName;
 
-    @Schema
+    @Schema(example = "firstname")
     private String alias;
 
     @JsonProperty("index_length")
+    @Schema(example = "255")
     private Long indexLength;
 
     @JsonProperty("length")
+    @Schema(example = "255")
     private Long length;
 
     @NotNull
     @JsonProperty("type")
-    @Schema(example = "string")
+    @Schema(example = "varchar")
     private ColumnTypeDto columnType;
 
     @Schema(example = "255")
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/ConceptBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/ConceptBriefDto.java
index 1e2b36dc66..3cc1231c74 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/ConceptBriefDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/ConceptBriefDto.java
@@ -1,5 +1,6 @@
 package at.tuwien.api.database.table.columns.concepts;
 
+import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import lombok.*;
@@ -16,13 +17,17 @@ import lombok.extern.jackson.Jacksonized;
 public class ConceptBriefDto {
 
     @NotNull
+    @Schema(example = "23")
     private Long id;
 
     @NotBlank
+    @Schema(example = "http://www.wikidata.org/entity/Q202444")
     private String uri;
 
+    @Schema(example = "given name")
     private String name;
 
+    @Schema(example = "name typically used to differentiate people from the same family, clan, or other social group who have a common last name")
     private String description;
 
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/UnitBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/UnitBriefDto.java
index 407f3708eb..15d9ae9082 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/UnitBriefDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/UnitBriefDto.java
@@ -1,5 +1,6 @@
 package at.tuwien.api.database.table.columns.concepts;
 
+import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import lombok.*;
@@ -16,12 +17,16 @@ import lombok.extern.jackson.Jacksonized;
 public class UnitBriefDto {
 
     @NotNull
+    @Schema(example = "34")
     private Long id;
 
     @NotBlank
+    @Schema(example = "http://www.wikidata.org/entity/Q1422583")
     private String uri;
 
+    @Schema(example = "importance")
     private String name;
 
+    @Schema(example = "subjective magnitude of value, meaning, or purpose")
     private String description;
 }
diff --git a/lib/python/Pipfile b/lib/python/Pipfile
index b54561e5f8..62a93cc02a 100644
--- a/lib/python/Pipfile
+++ b/lib/python/Pipfile
@@ -13,6 +13,7 @@ pandas = "*"
 
 [dev-packages]
 build = "*"
+pyyaml = "*"
 setuptools = "*"
 twine = "*"
 coverage = "*"
diff --git a/lib/python/Pipfile.lock b/lib/python/Pipfile.lock
index 836140fd7b..52b7202c3e 100644
--- a/lib/python/Pipfile.lock
+++ b/lib/python/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "4fc272b993d5091dc8d60aee49575f17cd1de3145d916dc6aa82c09f7cefe4ee"
+            "sha256": "01e7f752292f6f3d558a9418f7172696f9bd200d00c7eed2745b74d08ef27eb4"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -442,64 +442,64 @@
         },
         "numpy": {
             "hashes": [
-                "sha256:059e6a747ae84fce488c3ee397cee7e5f905fd1bda5fb18c66bc41807ff119b2",
-                "sha256:08ef779aed40dbc52729d6ffe7dd51df85796a702afbf68a4f4e41fafdc8bda5",
-                "sha256:164a829b6aacf79ca47ba4814b130c4020b202522a93d7bff2202bfb33b61c60",
-                "sha256:26c9c4382b19fcfbbed3238a14abf7ff223890ea1936b8890f058e7ba35e8d71",
-                "sha256:27f5cdf9f493b35f7e41e8368e7d7b4bbafaf9660cba53fb21d2cd174ec09631",
-                "sha256:31b89fa67a8042e96715c68e071a1200c4e172f93b0fbe01a14c0ff3ff820fc8",
-                "sha256:32cb94448be47c500d2c7a95f93e2f21a01f1fd05dd2beea1ccd049bb6001cd2",
-                "sha256:360137f8fb1b753c5cde3ac388597ad680eccbbbb3865ab65efea062c4a1fd16",
-                "sha256:3683a8d166f2692664262fd4900f207791d005fb088d7fdb973cc8d663626faa",
-                "sha256:38efc1e56b73cc9b182fe55e56e63b044dd26a72128fd2fbd502f75555d92591",
-                "sha256:3d03883435a19794e41f147612a77a8f56d4e52822337844fff3d4040a142964",
-                "sha256:3ecc47cd7f6ea0336042be87d9e7da378e5c7e9b3c8ad0f7c966f714fc10d821",
-                "sha256:40f9e544c1c56ba8f1cf7686a8c9b5bb249e665d40d626a23899ba6d5d9e1484",
-                "sha256:4250888bcb96617e00bfa28ac24850a83c9f3a16db471eca2ee1f1714df0f957",
-                "sha256:4511d9e6071452b944207c8ce46ad2f897307910b402ea5fa975da32e0102800",
-                "sha256:45681fd7128c8ad1c379f0ca0776a8b0c6583d2f69889ddac01559dfe4390918",
-                "sha256:48fd472630715e1c1c89bf1feab55c29098cb403cc184b4859f9c86d4fcb6a95",
-                "sha256:4c86e2a209199ead7ee0af65e1d9992d1dce7e1f63c4b9a616500f93820658d0",
-                "sha256:4dfda918a13cc4f81e9118dea249e192ab167a0bb1966272d5503e39234d694e",
-                "sha256:5062dc1a4e32a10dc2b8b13cedd58988261416e811c1dc4dbdea4f57eea61b0d",
-                "sha256:51faf345324db860b515d3f364eaa93d0e0551a88d6218a7d61286554d190d73",
-                "sha256:526fc406ab991a340744aad7e25251dd47a6720a685fa3331e5c59fef5282a59",
-                "sha256:53c09385ff0b72ba79d8715683c1168c12e0b6e84fb0372e97553d1ea91efe51",
-                "sha256:55ba24ebe208344aa7a00e4482f65742969a039c2acfcb910bc6fcd776eb4355",
-                "sha256:5b6c390bfaef8c45a260554888966618328d30e72173697e5cabe6b285fb2348",
-                "sha256:5c5cc0cbabe9452038ed984d05ac87910f89370b9242371bd9079cb4af61811e",
-                "sha256:5edb4e4caf751c1518e6a26a83501fda79bff41cc59dac48d70e6d65d4ec4440",
-                "sha256:61048b4a49b1c93fe13426e04e04fdf5a03f456616f6e98c7576144677598675",
-                "sha256:676f4eebf6b2d430300f1f4f4c2461685f8269f94c89698d832cdf9277f30b84",
-                "sha256:67d4cda6fa6ffa073b08c8372aa5fa767ceb10c9a0587c707505a6d426f4e046",
-                "sha256:694f9e921a0c8f252980e85bce61ebbd07ed2b7d4fa72d0e4246f2f8aa6642ab",
-                "sha256:733585f9f4b62e9b3528dd1070ec4f52b8acf64215b60a845fa13ebd73cd0712",
-                "sha256:7671dc19c7019103ca44e8d94917eba8534c76133523ca8406822efdd19c9308",
-                "sha256:780077d95eafc2ccc3ced969db22377b3864e5b9a0ea5eb347cc93b3ea900315",
-                "sha256:7ba9cc93a91d86365a5d270dee221fdc04fb68d7478e6bf6af650de78a8339e3",
-                "sha256:89b16a18e7bba224ce5114db863e7029803c179979e1af6ad6a6b11f70545008",
-                "sha256:9036d6365d13b6cbe8f27a0eaf73ddcc070cae584e5ff94bb45e3e9d729feab5",
-                "sha256:93cf4e045bae74c90ca833cba583c14b62cb4ba2cba0abd2b141ab52548247e2",
-                "sha256:9ad014faa93dbb52c80d8f4d3dcf855865c876c9660cb9bd7553843dd03a4b1e",
-                "sha256:9b1d07b53b78bf84a96898c1bc139ad7f10fda7423f5fd158fd0f47ec5e01ac7",
-                "sha256:a7746f235c47abc72b102d3bce9977714c2444bdfaea7888d241b4c4bb6a78bf",
-                "sha256:aa3017c40d513ccac9621a2364f939d39e550c542eb2a894b4c8da92b38896ab",
-                "sha256:b34d87e8a3090ea626003f87f9392b3929a7bbf4104a05b6667348b6bd4bf1cd",
-                "sha256:b541032178a718c165a49638d28272b771053f628382d5e9d1c93df23ff58dbf",
-                "sha256:ba5511d8f31c033a5fcbda22dd5c813630af98c70b2661f2d2c654ae3cdfcfc8",
-                "sha256:bc8a37ad5b22c08e2dbd27df2b3ef7e5c0864235805b1e718a235bcb200cf1cb",
-                "sha256:bff7d8ec20f5f42607599f9994770fa65d76edca264a87b5e4ea5629bce12268",
-                "sha256:c1ad395cf254c4fbb5b2132fee391f361a6e8c1adbd28f2cd8e79308a615fe9d",
-                "sha256:f1d09e520217618e76396377c81fba6f290d5f926f50c35f3a5f72b01a0da780",
-                "sha256:f3eac17d9ec51be534685ba877b6ab5edc3ab7ec95c8f163e5d7b39859524716",
-                "sha256:f419290bc8968a46c4933158c91a0012b7a99bb2e465d5ef5293879742f8797e",
-                "sha256:f62aa6ee4eb43b024b0e5a01cf65a0bb078ef8c395e8713c6e8a12a697144528",
-                "sha256:f74e6fdeb9a265624ec3a3918430205dff1df7e95a230779746a6af78bc615af",
-                "sha256:f9b57eaa3b0cd8db52049ed0330747b0364e899e8a606a624813452b8203d5f7",
-                "sha256:fce4f615f8ca31b2e61aa0eb5865a21e14f5629515c9151850aa936c02a1ee51"
+                "sha256:02935e2c3c0c6cbe9c7955a8efa8908dd4221d7755644c59d1bba28b94fd334f",
+                "sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0",
+                "sha256:09d6a2032faf25e8d0cadde7fd6145118ac55d2740132c1d845f98721b5ebcfd",
+                "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2",
+                "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4",
+                "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648",
+                "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be",
+                "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb",
+                "sha256:159ff6ee4c4a36a23fe01b7c3d07bd8c14cc433d9720f977fcd52c13c0098160",
+                "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd",
+                "sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a",
+                "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84",
+                "sha256:2ec6c689c61df613b783aeb21f945c4cbe6c51c28cb70aae8430577ab39f163e",
+                "sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748",
+                "sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825",
+                "sha256:356ca982c188acbfa6af0d694284d8cf20e95b1c3d0aefa8929376fea9146f60",
+                "sha256:3fbe72d347fbc59f94124125e73fc4976a06927ebc503ec5afbfb35f193cd957",
+                "sha256:40c7ff5da22cd391944a28c6a9c638a5eef77fcf71d6e3a79e1d9d9e82752715",
+                "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317",
+                "sha256:451e854cfae0febe723077bd0cf0a4302a5d84ff25f0bfece8f29206c7bed02e",
+                "sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283",
+                "sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278",
+                "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9",
+                "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de",
+                "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369",
+                "sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb",
+                "sha256:642199e98af1bd2b6aeb8ecf726972d238c9877b0f6e8221ee5ab945ec8a2189",
+                "sha256:64bd6e1762cd7f0986a740fee4dff927b9ec2c5e4d9a28d056eb17d332158014",
+                "sha256:6d9fc9d812c81e6168b6d405bf00b8d6739a7f72ef22a9214c4241e0dc70b323",
+                "sha256:7079129b64cb78bdc8d611d1fd7e8002c0a2565da6a47c4df8062349fee90e3e",
+                "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49",
+                "sha256:860fd59990c37c3ef913c3ae390b3929d005243acca1a86facb0773e2d8d9e50",
+                "sha256:8e6da5cffbbe571f93588f562ed130ea63ee206d12851b60819512dd3e1ba50d",
+                "sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37",
+                "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39",
+                "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576",
+                "sha256:995f9e8181723852ca458e22de5d9b7d3ba4da3f11cc1cb113f093b271d7965a",
+                "sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba",
+                "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7",
+                "sha256:a972cec723e0563aa0823ee2ab1df0cb196ed0778f173b381c871a03719d4826",
+                "sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467",
+                "sha256:b0531f0b0e07643eb089df4c509d30d72c9ef40defa53e41363eca8a8cc61495",
+                "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc",
+                "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391",
+                "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0",
+                "sha256:b78ea78450fd96a498f50ee096f69c75379af5138f7881a51355ab0e11286c97",
+                "sha256:bd249bc894af67cbd8bad2c22e7cbcd46cf87ddfca1f1289d1e7e54868cc785c",
+                "sha256:c7d1fd447e33ee20c1f33f2c8e6634211124a9aabde3c617687d8b739aa69eac",
+                "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369",
+                "sha256:d6d6a0910c3b4368d89dde073e630882cdb266755565155bc33520283b2d9df8",
+                "sha256:da1eeb460ecce8d5b8608826595c777728cdf28ce7b5a5a8c8ac8d949beadcf2",
+                "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff",
+                "sha256:e0d4142eb40ca6f94539e4db929410f2a46052a0fe7a2c1c59f6179c39938d2a",
+                "sha256:e9e82dcb3f2ebbc8cb5ce1102d5f1c5ed236bf8a11730fb45ba82e2841ec21df",
+                "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f"
             ],
             "markers": "python_version == '3.11'",
-            "version": "==2.2.1"
+            "version": "==2.2.2"
         },
         "paho-mqtt": {
             "hashes": [
@@ -655,11 +655,11 @@
         },
         "pydantic": {
             "hashes": [
-                "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d",
-                "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06"
+                "sha256:278b38dbbaec562011d659ee05f63346951b3a248a6f3642e1bc68894ea2b4ff",
+                "sha256:4dd4e322dbe55472cb7ca7e73f4b63574eecccf2835ffa2af9021ce113c83c53"
             ],
             "index": "pypi",
-            "version": "==2.10.4"
+            "version": "==2.10.5"
         },
         "pydantic-core": {
             "hashes": [
@@ -824,11 +824,11 @@
         },
         "tzdata": {
             "hashes": [
-                "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc",
-                "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"
+                "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694",
+                "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"
             ],
             "markers": "python_version >= '2'",
-            "version": "==2024.2"
+            "version": "==2025.1"
         },
         "urllib3": {
             "hashes": [
@@ -1266,6 +1266,14 @@
             "index": "pypi",
             "version": "==2024.8.6"
         },
+        "id": {
+            "hashes": [
+                "sha256:292cb8a49eacbbdbce97244f47a97b4c62540169c976552e497fd57df0734c1d",
+                "sha256:f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==1.5.0"
+        },
         "idna": {
             "hashes": [
                 "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9",
@@ -1284,11 +1292,11 @@
         },
         "importlib-metadata": {
             "hashes": [
-                "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b",
-                "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"
+                "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e",
+                "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"
             ],
             "markers": "python_version < '3.12'",
-            "version": "==8.5.0"
+            "version": "==8.6.1"
         },
         "iniconfig": {
             "hashes": [
@@ -1431,11 +1439,11 @@
         },
         "more-itertools": {
             "hashes": [
-                "sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef",
-                "sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6"
+                "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b",
+                "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89"
             ],
-            "markers": "python_version >= '3.8'",
-            "version": "==10.5.0"
+            "markers": "python_version >= '3.9'",
+            "version": "==10.6.0"
         },
         "nh3": {
             "hashes": [
@@ -1475,14 +1483,6 @@
             "markers": "python_version >= '3.8'",
             "version": "==24.2"
         },
-        "pkginfo": {
-            "hashes": [
-                "sha256:8ad91a0445a036782b9366ef8b8c2c50291f83a553478ba8580c73d3215700cf",
-                "sha256:dcd589c9be4da8973eceffa247733c144812759aa67eaf4bbf97016a02f39088"
-            ],
-            "markers": "python_version >= '3.8'",
-            "version": "==1.12.0"
-        },
         "pluggy": {
             "hashes": [
                 "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1",
@@ -1501,11 +1501,11 @@
         },
         "pygments": {
             "hashes": [
-                "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199",
-                "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"
+                "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f",
+                "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==2.18.0"
+            "version": "==2.19.1"
         },
         "pyproject-hooks": {
             "hashes": [
@@ -1532,6 +1532,65 @@
             "index": "pypi",
             "version": "==0.6"
         },
+        "pyyaml": {
+            "hashes": [
+                "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff",
+                "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48",
+                "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086",
+                "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e",
+                "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133",
+                "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5",
+                "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484",
+                "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee",
+                "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5",
+                "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68",
+                "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a",
+                "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf",
+                "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99",
+                "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8",
+                "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85",
+                "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19",
+                "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc",
+                "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a",
+                "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1",
+                "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317",
+                "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c",
+                "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631",
+                "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d",
+                "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652",
+                "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5",
+                "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e",
+                "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b",
+                "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8",
+                "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476",
+                "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706",
+                "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563",
+                "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237",
+                "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b",
+                "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083",
+                "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180",
+                "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425",
+                "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e",
+                "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f",
+                "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725",
+                "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183",
+                "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab",
+                "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774",
+                "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725",
+                "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e",
+                "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5",
+                "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d",
+                "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290",
+                "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44",
+                "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed",
+                "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4",
+                "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba",
+                "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12",
+                "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"
+            ],
+            "index": "pypi",
+            "version": "==6.0.2"
+        },
         "readme-renderer": {
             "hashes": [
                 "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151",
@@ -1590,11 +1649,11 @@
         },
         "setuptools": {
             "hashes": [
-                "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6",
-                "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d"
+                "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6",
+                "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"
             ],
             "index": "pypi",
-            "version": "==75.6.0"
+            "version": "==75.8.0"
         },
         "snowballstemmer": {
             "hashes": [
@@ -1677,11 +1736,11 @@
         },
         "twine": {
             "hashes": [
-                "sha256:36158b09df5406e1c9c1fb8edb24fc2be387709443e7376689b938531582ee27",
-                "sha256:9c6025b203b51521d53e200f4a08b116dee7500a38591668c6a6033117bdc218"
+                "sha256:a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384",
+                "sha256:be324f6272eff91d07ee93f251edf232fc647935dd585ac003539b42404a8dbd"
             ],
             "index": "pypi",
-            "version": "==6.0.1"
+            "version": "==6.1.0"
         },
         "urllib3": {
             "hashes": [
diff --git a/lib/python/tests/conftest.py b/lib/python/tests/conftest.py
deleted file mode 100644
index 5270a5bfba..0000000000
--- a/lib/python/tests/conftest.py
+++ /dev/null
@@ -1,37 +0,0 @@
-import logging
-import uuid
-
-import pytest
-
-from dbrepo.RestClient import RestClient
-from dbrepo.api.dto import Database
-
-logging.basicConfig(level=logging.DEBUG)
-
-
-def pytest_configure(config):
-    TestKeyValue.username = str(uuid.uuid4()).replace("-", "")[0:10]
-    TestKeyValue.password = str(uuid.uuid4()).replace("-", "")[0:10]
-
-
-@pytest.fixture(scope='session', name='rest_client')
-def user_rest_client() -> RestClient:
-    TestKeyValue.user_id = RestClient().create_user(username=f'{TestKeyValue.username}',
-                                                    password=f'{TestKeyValue.password}',
-                                                    email=f'{TestKeyValue.username}@example.com').id
-    return RestClient(username=TestKeyValue.username, password=TestKeyValue.password)
-
-
-@pytest.fixture(scope='session', name='database')
-def database() -> Database:
-    name = str(uuid.uuid4()).replace("-", "")[0:10]
-    return RestClient(username=TestKeyValue.username,
-                      password=TestKeyValue.password).create_database(name=name, container_id=1, is_public=True,
-                                                                      is_schema_public=True)
-
-
-class TestKeyValue:
-    user_id: str = None
-    username: str = None
-    password: str = None
-    database_name: str = None
diff --git a/lib/python/tests/test_dtos.py b/lib/python/tests/test_dtos.py
new file mode 100644
index 0000000000..f338c30dcc
--- /dev/null
+++ b/lib/python/tests/test_dtos.py
@@ -0,0 +1,44 @@
+import inspect
+import sys
+import unittest
+
+from yaml import safe_load
+
+from dbrepo.api import dto
+
+
+class AnalyseUnitTest(unittest.TestCase):
+    schemas = None
+    models: [()] = []
+    found: int = 0
+    skipped: int = 0
+
+    def setUp(self):
+        with open('../../../.docs/.openapi/api.yaml', 'r') as f:
+            self.schemas = safe_load(f)['components']['schemas']
+            for name, obj in inspect.getmembers(sys.modules[dto.__name__]):
+                if not inspect.isclass(obj):
+                    self.found += 1
+                    continue
+                if f'{name}Dto' not in self.schemas:
+                    self.skipped += 1
+                    continue
+                self.models.append((name, obj))
+
+    def build_model(self, name: str, obj: any, definition: any) -> dict:
+        model_dict = dict()
+        for property in definition['properties']:
+            if 'example' not in definition['properties'][property]:
+                if '$ref' not in definition['properties'][property]:
+                    self.fail(f'OpenAPI model {name}Dto does not have example for property: {property}')
+                ref = definition['properties'][property]['$ref'][len('#/components/schemas/'):-3]
+                # recursive call
+                model_dict[property] = self.build_model(ref, obj, self.schemas[f'{name}Dto'])
+            model_dict[property] = definition['properties'][property]['example']
+        model = obj(**model_dict)
+
+    def test_dtos_succeeds(self):
+        for name, obj in self.models:
+            self.build_model(name, obj, self.schemas[f'{name}Dto'])
+
+    pass
diff --git a/lib/python/tests/test_system_database.py b/lib/python/tests/test_system_database.py
deleted file mode 100644
index 902b95435b..0000000000
--- a/lib/python/tests/test_system_database.py
+++ /dev/null
@@ -1,34 +0,0 @@
-import unittest
-import uuid
-
-import pytest
-
-
-class UserUnitTest(unittest.TestCase):
-
-    @pytest.fixture(autouse=True)
-    def prepare_fixture(self, rest_client, database):
-        self.rest_client = rest_client
-        self.database = database
-
-    @pytest.mark.usefixtures("rest_client")
-    def test_create_database_succeeds(self):
-        name = str(uuid.uuid4()).replace("-", "")[0:10]
-        # test
-        response = self.rest_client.create_database(name=name, container_id=1,
-                                                    is_public=True, is_schema_public=True)
-        self.assertEqual(True, response.is_public)
-        self.assertEqual(True, response.is_schema_public)
-        self.assertEqual(None, response.description)
-
-    @pytest.mark.usefixtures("rest_client", "database")
-    def test_update_database_visibility_succeeds(self):
-        # test
-        response = self.rest_client.update_database_visibility(database_id=self.database.id, is_public=False,
-                                                               is_schema_public=False)
-        self.assertEqual(False, response.is_public)
-        self.assertEqual(False, response.is_schema_public)
-
-
-if __name__ == "__main__":
-    unittest.main()
diff --git a/lib/python/tests/test_system_user.py b/lib/python/tests/test_system_user.py
deleted file mode 100644
index 350b341102..0000000000
--- a/lib/python/tests/test_system_user.py
+++ /dev/null
@@ -1,42 +0,0 @@
-import unittest
-import uuid
-
-import pytest
-
-from conftest import TestKeyValue
-from dbrepo.RestClient import RestClient
-
-
-class UserUnitTest(unittest.TestCase):
-
-    @pytest.fixture(autouse=True)
-    def prepare_fixture(self, rest_client):
-        self.rest_client = rest_client
-
-    def test_get_users_succeeds(self):
-        # test
-        response = RestClient().get_users()
-
-    def test_create_user_succeeds(self):
-        username = str(uuid.uuid4()).replace("-", "")[0:10]
-        password = str(uuid.uuid4()).replace("-", "")[0:10]
-        # test
-        response = RestClient().create_user(username=f'{username}', password=f'{password}',
-                                            email=f'{username}@example.com')
-        self.assertEqual(username, response.username)
-
-    @pytest.mark.usefixtures("rest_client")
-    def test_update_user_succeeds(self):
-        # test
-        response = self.rest_client.update_user(user_id=TestKeyValue.user_id, theme='dark', language='de',
-                                                firstname='Foo', lastname='Bar', affiliation='TU Wien',
-                                                orcid='https://orcid.org/0000-0003-4216-302X')
-        self.assertEqual('dark', response.attributes.theme)
-        self.assertEqual('Foo', response.given_name)
-        self.assertEqual('Bar', response.family_name)
-        self.assertEqual('TU Wien', response.attributes.affiliation)
-        self.assertEqual('https://orcid.org/0000-0003-4216-302X', response.attributes.orcid)
-
-
-if __name__ == "__main__":
-    unittest.main()
diff --git a/lib/python/tests/test_unit_analyse.py b/lib/python/tests/test_unit_analyse.py
index a26d7aa844..5ca2b8301c 100644
--- a/lib/python/tests/test_unit_analyse.py
+++ b/lib/python/tests/test_unit_analyse.py
@@ -1,6 +1,5 @@
 import unittest
 import requests_mock
-import dataclasses
 
 from dbrepo.RestClient import RestClient
 
diff --git a/lib/python/tests/test_unit_database.py b/lib/python/tests/test_unit_database.py
index eeeea68832..7605809e61 100644
--- a/lib/python/tests/test_unit_database.py
+++ b/lib/python/tests/test_unit_database.py
@@ -24,11 +24,23 @@ class DatabaseUnitTest(unittest.TestCase):
             DatabaseBrief(
                 id=1,
                 name='test',
-                owner_id='8638c043-5145-4be8-a3e4-4b79991b0a16',
+                owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'),
                 contact=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'),
                 internal_name='test_abcd',
                 is_public=True,
-                is_schema_public=True)
+                is_schema_public=True,
+                container=ContainerBrief(
+                    id=1,
+                    name='MariaDB Galera 11.1.3',
+                    internal_name='mariadb',
+                    image=ImageBrief(
+                        id=1,
+                        name='mariadb',
+                        version='11.2.2',
+                        jdbc_method='mariadb'
+                    )
+                )
+            )
         ]
         with requests_mock.Mocker() as mock:
             # mock
diff --git a/make/gen.mk b/make/gen.mk
index ed10c7e123..308a307b95 100644
--- a/make/gen.mk
+++ b/make/gen.mk
@@ -1,11 +1,11 @@
 ##@ Generate
 
-.PHONY: gen-swagger-doc
-gen-swagger-doc: build-images ## Generate Swagger documentation and fetch.
+.PHONY: gen-openapi-doc
+gen-openapi-doc: build-images ## Generate Swagger documentation and fetch.
 	docker compose up -d
-	bash .docs/.swagger/swagger-generate.sh
+	bash .docs/.openapi/openapi-generate.sh
 	docker compose down
-	openapi-merge-cli --config .docs/.swagger/openapi-merge.json
+	openapi-merge-cli --config .docs/.openapi/openapi-merge.json
 
 .PHONY: gen-helm-doc
 gen-helm-doc: build-helm ## Generate Helm documentation and schema
diff --git a/yq b/yq
new file mode 100644
index 0000000000..5578822fb4
--- /dev/null
+++ b/yq
@@ -0,0 +1,7043 @@
+openapi: 3.0.1
+info:
+  title: Database Repository Metadata Service API
+  description: Service that manages the metadata
+  contact:
+    name: Prof. Andreas Rauber
+    email: andreas.rauber@tuwien.ac.at
+  license:
+    name: Apache 2.0
+    url: https://www.apache.org/licenses/LICENSE-2.0
+  version: 1.6.2
+externalDocs:
+  description: Sourcecode Documentation
+  url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6.2/system-services-metadata/
+servers:
+- url: http://localhost
+  description: Development instance
+- url: https://test.dbrepo.tuwien.ac.at
+  description: Staging instance
+paths:
+  /api/database:
+    get:
+      tags:
+      - database-endpoint
+      summary: List databases
+      description: "Lists all databases in the metadata database. Requests with HTTP\
+        \ method **GET** return the list of databases, requests with HTTP method **HEAD**\
+        \ only the number in the `X-Count` header."
+      operationId: list
+      parameters:
+      - name: internal_name
+        in: query
+        required: false
+        schema:
+          type: string
+      responses:
+        "200":
+          description: List of databases
+          headers:
+            Access-Control-Expose-Headers:
+              description: Expose `X-Count` custom header
+              required: true
+              style: simple
+            X-Count:
+              description: Number of databases
+              required: true
+              style: simple
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/DatabaseBriefDto"
+    post:
+      tags:
+      - database-endpoint
+      summary: Create database
+      description: Creates a database in the container with id. Requires roles `create-database`.
+      operationId: create_5
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/DatabaseCreateDto"
+        required: true
+      responses:
+        "409":
+          description: Query store could not be created
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Database create query is malformed or image is not supported
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "423":
+          description: Database quota exceeded
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Database create permission is missing or grant permissions
+            at broker service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to fin container/user/database in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "201":
+          description: Created a new database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseBriefDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    head:
+      tags:
+      - database-endpoint
+      summary: List databases
+      description: "Lists all databases in the metadata database. Requests with HTTP\
+        \ method **GET** return the list of databases, requests with HTTP method **HEAD**\
+        \ only the number in the `X-Count` header."
+      operationId: list_1
+      parameters:
+      - name: internal_name
+        in: query
+        required: false
+        schema:
+          type: string
+      responses:
+        "200":
+          description: List of databases
+          headers:
+            Access-Control-Expose-Headers:
+              description: Expose `X-Count` custom header
+              required: true
+              style: simple
+            X-Count:
+              description: Number of databases
+              required: true
+              style: simple
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/DatabaseBriefDto"
+  /api/database/{databaseId}/access/{userId}:
+    get:
+      tags:
+      - access-endpoint
+      summary: Find/Check access
+      description: "Finds or checks access of a user with given id to a database with\
+        \ given id. Requests with HTTP method **GET** return the access object, requests\
+        \ with HTTP method **HEAD** only the status. When the user has at least *READ*\
+        \ access, the status 200 is returned, 403 otherwise. Requires role `check-database-access`\
+        \ or `check-foreign-database-access`."
+      operationId: find
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: userId
+        in: path
+        required: true
+        schema:
+          type: string
+          format: uuid
+      responses:
+        "403":
+          description: No access to this database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Database not found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Found database access
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseAccessDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    put:
+      tags:
+      - access-endpoint
+      summary: Modify access
+      description: Modifies access of a user with given id to database with given
+        id. Requires role `update-database-access`.
+      operationId: update_5
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: userId
+        in: path
+        required: true
+        schema:
+          type: string
+          format: uuid
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/UpdateDatabaseAccessDto"
+        required: true
+      responses:
+        "404":
+          description: Database or user not found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Modify access not permitted when no access is granted in the
+            first place
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Access could not be updated in the data service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Modified access
+        "502":
+          description: Access could not be updated due to connection error in the
+            data service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Modify access query or database connection is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    post:
+      tags:
+      - access-endpoint
+      summary: Give access
+      description: Give a user with given id access to some database with given id.
+        Requires role `create-database-access`.
+      operationId: create_8
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: userId
+        in: path
+        required: true
+        schema:
+          type: string
+          format: uuid
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/UpdateDatabaseAccessDto"
+        required: true
+      responses:
+        "404":
+          description: Database or user not found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Access could not be created in the data service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Failed giving access
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Granting access succeeded
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseAccessDto"
+        "400":
+          description: Granting access query or database connection is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Access could not be created due to connection error
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    delete:
+      tags:
+      - access-endpoint
+      summary: Delete access
+      description: Delete access of a user with id to a database with id. Requires
+        role `delete-database-access`.
+      operationId: revoke
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: userId
+        in: path
+        required: true
+        schema:
+          type: string
+          format: uuid
+      responses:
+        "403":
+          description: Revoke of access not permitted as no access was found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Deleted access
+        "502":
+          description: Access could not be created due to connection error
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: "User, database with access was not found"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Access could not be revoked in the data service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Modify access query or database connection is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    head:
+      tags:
+      - access-endpoint
+      summary: Find/Check access
+      description: "Finds or checks access of a user with given id to a database with\
+        \ given id. Requests with HTTP method **GET** return the access object, requests\
+        \ with HTTP method **HEAD** only the status. When the user has at least *READ*\
+        \ access, the status 200 is returned, 403 otherwise. Requires role `check-database-access`\
+        \ or `check-foreign-database-access`."
+      operationId: find_1
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: userId
+        in: path
+        required: true
+        schema:
+          type: string
+          format: uuid
+      responses:
+        "403":
+          description: No access to this database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Database not found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Found database access
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseAccessDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/user/{userId}:
+    get:
+      tags:
+      - user-endpoint
+      summary: Get user
+      description: Gets own user information from the metadata database. Requires
+        authentication. Foreign user information can only be obtained if additional
+        role `find-foreign-user` is present. Finding information about internal users
+        results in a 404 error.
+      operationId: find_2
+      parameters:
+      - name: userId
+        in: path
+        required: true
+        schema:
+          type: string
+          format: uuid
+      responses:
+        "404":
+          description: User was not found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Found user
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/UserDto"
+        "403":
+          description: Find user is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    put:
+      tags:
+      - user-endpoint
+      summary: Update user
+      description: Updates user with id. Requires role `modify-user-information`.
+      operationId: modify
+      parameters:
+      - name: userId
+        in: path
+        required: true
+        schema:
+          type: string
+          format: uuid
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/UserUpdateDto"
+        required: true
+      responses:
+        "202":
+          description: Modified user information
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/UserDto"
+        "404":
+          description: Failed to find database/user in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Modify user query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Not allowed to modify user metadata
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/user/{userId}/password:
+    put:
+      tags:
+      - user-endpoint
+      summary: Update user password
+      description: Updates password of user with id. Requires authentication.
+      operationId: password
+      parameters:
+      - name: userId
+        in: path
+        required: true
+        schema:
+          type: string
+          format: uuid
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/UserPasswordDto"
+        required: true
+      responses:
+        "400":
+          description: Invalid password payload
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Modified user password
+        "403":
+          description: Not allowed to change foreign user password
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to get user in auth service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find database/user in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Connection to auth service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/user/token:
+    put:
+      tags:
+      - user-endpoint
+      summary: Refresh token
+      description: Refreshes user token by refresh token.
+      operationId: refreshToken
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/RefreshTokenRequestDto"
+        required: true
+      responses:
+        "202":
+          description: Refreshed user token
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/TokenDto"
+        "403":
+          description: Not allowed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Invalid refresh token
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Connection to auth service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+    post:
+      tags:
+      - user-endpoint
+      summary: Create token
+      description: Creates a user token via the Auth Service.
+      operationId: getToken
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/LoginRequestDto"
+        required: true
+      responses:
+        "400":
+          description: Invalid login request
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Not allowed to get token
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find user in auth database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to get user in auth service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Obtained user token
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/TokenDto"
+        "428":
+          description: Account is not fully setup in auth service (requires password
+            change?)
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Connection to auth service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+  /api/ontology/{ontologyId}:
+    get:
+      tags:
+      - ontology-endpoint
+      summary: Find ontology
+      description: Finds an ontology with id in the metadata database.
+      operationId: find_3
+      parameters:
+      - name: ontologyId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "404":
+          description: Could not find ontology
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Find one ontology
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/OntologyDto"
+    put:
+      tags:
+      - ontology-endpoint
+      summary: Update ontology
+      description: Updates an ontology with id. Requires role `update-ontology`.
+      operationId: update
+      parameters:
+      - name: ontologyId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/OntologyModifyDto"
+        required: true
+      responses:
+        "404":
+          description: Could not find ontology
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Updated ontology successfully
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/OntologyDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    delete:
+      tags:
+      - ontology-endpoint
+      summary: Delete ontology
+      description: Deletes an ontology with given id. Requires role `delete-ontology`.
+      operationId: delete
+      parameters:
+      - name: ontologyId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "202":
+          description: Deleted ontology successfully
+          content:
+            application/json: {}
+        "404":
+          description: Could not find ontology
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/message/{messageId}:
+    put:
+      tags:
+      - message-endpoint
+      summary: Update message
+      description: Updates a message with id. Requires role `update-maintenance-message`.
+      operationId: update_1
+      parameters:
+      - name: messageId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/BannerMessageUpdateDto"
+        required: true
+      responses:
+        "202":
+          description: Updated message
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/BannerMessageBriefDto"
+        "404":
+          description: Could not find message
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    delete:
+      tags:
+      - message-endpoint
+      summary: Delete message
+      description: Deletes a message with id. Requires role `delete-maintenance-message`.
+      operationId: delete_1
+      parameters:
+      - name: messageId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "404":
+          description: Could not find message
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Deleted message
+          content:
+            application/json: {}
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/image/{imageId}:
+    get:
+      tags:
+      - image-endpoint
+      summary: Find image
+      description: Finds a container image in the metadata database.
+      operationId: findById
+      parameters:
+      - name: imageId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "404":
+          description: Image could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Found image
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ImageDto"
+    put:
+      tags:
+      - image-endpoint
+      summary: Update image
+      description: Updates container image in the metadata database. Requires role
+        `modify-image`.
+      operationId: update_2
+      parameters:
+      - name: imageId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/ImageChangeDto"
+        required: true
+      responses:
+        "404":
+          description: Image could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Updated image successfully
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ImageDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    delete:
+      tags:
+      - image-endpoint
+      summary: Delete image
+      description: Deletes a container image in the metadata database. Requires role
+        `delete-image`.
+      operationId: delete_2
+      parameters:
+      - name: imageId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "202":
+          description: Deleted image successfully
+        "404":
+          description: Image could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/identifier/{identifierId}:
+    get:
+      tags:
+      - identifier-endpoint
+      summary: Find identifier
+      description: Finds an identifier with id. The response format depends on the
+        HTTP `Accept` header set on the request.
+      operationId: find_6
+      parameters:
+      - name: identifierId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: Accept
+        in: header
+        required: true
+        schema:
+          type: string
+      responses:
+        "200":
+          description: Found identifier successfully
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/IdentifierDto"
+            application/ld+json:
+              schema:
+                $ref: "#/components/schemas/LdDatasetDto"
+            text/csv: {}
+            text/xml: {}
+            text/bibliography: {}
+            text/bibliography; style=apa: {}
+            text/bibliography; style=ieee: {}
+            text/bibliography; style=bibtex: {}
+        "502":
+          description: Connection to data service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: "Identifier could not be exported, the requested style is not\
+            \ known"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "409":
+          description: Exported resource was not found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "410":
+          description: Failed to retrieve from S3 endpoint
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Identifier could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "406":
+          description: Failed to find acceptable representation
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to find in data service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+    put:
+      tags:
+      - identifier-endpoint
+      summary: Save identifier
+      description: Saves an identifier with id as a draft identifier. Identifiers
+        can only be created for objects the user has at least *READ* access in the
+        associated database (requires role `create-identifier`) or for any object
+        in any database (requires role `create-foreign-identifier`).
+      operationId: save
+      parameters:
+      - name: identifierId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/IdentifierSaveDto"
+        required: true
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: "Failed to find database, table or view"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Identifier form contains invalid request data
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Saved identifier
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/IdentifierDto"
+        "403":
+          description: Insufficient access rights or authorities
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    delete:
+      tags:
+      - identifier-endpoint
+      summary: Delete identifier
+      description: Deletes an identifier with id. Requires role `delete-identifier`.
+      operationId: delete_3
+      parameters:
+      - name: identifierId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to delete in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Identifier or database could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Deleted identifier
+        "403":
+          description: Deleting identifier not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/identifier/{identifierId}/publish:
+    put:
+      tags:
+      - identifier-endpoint
+      summary: Publish identifier
+      description: Publishes an identifier with id. A published identifier cannot
+        be changed anymore. Requires role `publish-identifier`.
+      operationId: publish
+      parameters:
+      - name: identifierId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: "Failed to find database, table or view"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Published identifier
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/IdentifierDto"
+        "400":
+          description: Identifier form contains invalid request data
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Insufficient access rights or authorities
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/visibility:
+    put:
+      tags:
+      - database-endpoint
+      summary: Update database visibility
+      description: Updates the database with id on the visibility. Only the database
+        owner can perform this operation. Requires role `modify-database-visibility`.
+      operationId: visibility
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/DatabaseModifyVisibilityDto"
+        required: true
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find database in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Visibility modified successfully
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseBriefDto"
+        "400":
+          description: The visibility payload is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Visibility modification is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/view/{viewId}:
+    get:
+      tags:
+      - view-endpoint
+      summary: Get view
+      description: Gets a view with id in the metadata database.
+      operationId: find_7
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: viewId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "403":
+          description: Find view is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: "Database, view or user could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Find view successfully
+          headers:
+            X-Username:
+              description: The authentication username
+              style: simple
+            Access-Control-Expose-Headers:
+              description: Expose custom headers
+              style: simple
+            X-Type:
+              description: The JDBC connection type
+              style: simple
+            X-View:
+              description: The view internal name
+              style: simple
+            X-Database:
+              description: The database internal name
+              style: simple
+            X-Password:
+              description: The authentication password
+              style: simple
+            X-Host:
+              description: The database hostname
+              style: simple
+            X-Port:
+              description: The database port number
+              style: simple
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ViewDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    put:
+      tags:
+      - view-endpoint
+      summary: Update view
+      description: Updates a view with id. This can only be performed by the view
+        owner or database owner. Requires role `create-database-view`.
+      operationId: update_3
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: viewId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/ViewUpdateDto"
+        required: true
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Database or View could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Update not allowed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Update view query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Update view successfully
+          content:
+            '*/*':
+              schema:
+                $ref: "#/components/schemas/ViewDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    delete:
+      tags:
+      - view-endpoint
+      summary: Delete view
+      description: Deletes a view with id. Requires role `delete-database-view`.
+      operationId: delete_4
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: viewId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "423":
+          description: Delete view resulted in an invalid query statement
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: "Database, view or user could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Delete view successfully
+          content:
+            '*/*':
+              schema:
+                type: object
+        "400":
+          description: Delete view query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Deletion not allowed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/table/{tableId}:
+    get:
+      tags:
+      - table-endpoint
+      summary: Find table
+      description: "Finds a table with id. When a table is hidden (i.e. when `is_public`\
+        \ is `false`), then the user needs to have at least read access and the role\
+        \ `find-table`. When the `system` role is present, the endpoint responds with\
+        \ additional connection metadata in the header."
+      operationId: findById_2
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "200":
+          description: Find table successfully
+          headers:
+            X-Username:
+              description: The authentication username
+              style: simple
+            X-Table:
+              description: The table internal name
+              style: simple
+            Access-Control-Expose-Headers:
+              description: Expose custom headers
+              style: simple
+            X-Type:
+              description: The JDBC connection type
+              style: simple
+            X-Database:
+              description: The database internal name
+              style: simple
+            X-Password:
+              description: The authentication password
+              style: simple
+            X-Host:
+              description: The database hostname
+              style: simple
+            X-Port:
+              description: The database port number
+              style: simple
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/TableDto"
+        "503":
+          description: Failed to obtain queue information from broker service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Access to the database is forbidden
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Failed to establish connection with broker service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: "Table, database or container could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    put:
+      tags:
+      - table-endpoint
+      summary: Update table
+      description: Updates a table in the database with id. Requires role `update-table`.
+      operationId: update_4
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/TableUpdateDto"
+        required: true
+      responses:
+        "403":
+          description: Update table visibility not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Table could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Updated the table
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/TableBriefDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Update table visibility payload is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    delete:
+      tags:
+      - table-endpoint
+      summary: Delete table
+      description: Deletes a table with id. Only the owner of a table can perform
+        this action (requires role `delete-table`) or anyone can delete a table (requires
+        role `delete-foreign-table`).
+      operationId: delete_5
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Access to the database is forbidden
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Delete table successfully
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Delete table query resulted in an invalid query statement
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: "Table, database or container could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/table/{tableId}/statistic:
+    put:
+      tags:
+      - table-endpoint
+      summary: Update statistics
+      description: "Updates basic statistical properties (min, max, mean, median,\
+        \ std.dev) for numerical columns in a table with id. This action can only\
+        \ be performed by the table owner. Requires role `update-table-statistic`."
+      operationId: updateStatistic
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Failed to map column statistic to known columns
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find database/table in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Not the owner
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Updated table statistics successfully
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/table/{tableId}/column/{columnId}:
+    put:
+      tags:
+      - table-endpoint
+      summary: Update semantics
+      description: Updates column semantics of a table column with id. Only the table
+        owner with at least *READ* access to the associated database can update the
+        column semantics (requires role `modify-table-column-semantics`) or foreign
+        table columns if role `modify-foreign-table-column-semantics`.
+      operationId: updateColumn
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: columnId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/ColumnSemanticsUpdateDto"
+        required: true
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Access to the database is forbidden
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find user/table/database/ontology in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Updated column semantics successfully
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ColumnDto"
+        "400":
+          description: Update semantic concept query is malformed or update unit of
+            measurement query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/owner:
+    put:
+      tags:
+      - database-endpoint
+      summary: Update database owner
+      description: Updates the database with id on the owner. Only the database owner
+        can perform this operation. Requires role `modify-database-owner`.
+      operationId: transfer
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/DatabaseTransferDto"
+        required: true
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Transfer of ownership was successful
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseBriefDto"
+        "403":
+          description: Transfer of ownership is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Database or user could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Owner payload is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/metadata/view:
+    put:
+      tags:
+      - database-endpoint
+      summary: Update database view schemas
+      description: Updates the database with id with generated metadata from view
+        that are not yet known to the database. Only the database owner can perform
+        this operation. Requires role `find-database`.
+      operationId: refreshViewMetadata
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find database in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Refreshed database views metadata
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseBriefDto"
+        "403":
+          description: Refresh view metadata is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/metadata/table:
+    put:
+      tags:
+      - database-endpoint
+      summary: Update database table schemas
+      description: Updates the database with id with generated metadata from tables
+        that are not yet known to the database. Only the database owner can perform
+        this operation. Requires role `find-database`.
+      operationId: refreshTableMetadata
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "403":
+          description: Not allowed to refresh table metadata
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to fin user/database in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Refreshed database tables metadata
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseBriefDto"
+        "400":
+          description: Failed to parse payload at search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/image:
+    get:
+      tags:
+      - database-endpoint
+      summary: Get database preview image
+      description: Gets the database with id on the preview image.
+      operationId: findPreviewImage
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "404":
+          description: Database or user could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: View of image was successful
+          content:
+            '*/*':
+              schema:
+                type: array
+                items:
+                  type: string
+                  format: byte
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    put:
+      tags:
+      - database-endpoint
+      summary: Update database preview image
+      description: Updates the database with id on the preview image. Only the database
+        owner can perform this operation. Requires role `modify-database-image`.
+      operationId: modifyImage
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/DatabaseModifyImageDto"
+        required: true
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Modify of image was successful
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseBriefDto"
+        "410":
+          description: File was not found in the Storage Service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Database could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Modify of image is not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/user:
+    get:
+      tags:
+      - user-endpoint
+      summary: List users
+      description: "Lists users known to the metadata database. Internal users are\
+        \ omitted from the result list. If the optional query parameter `username`\
+        \ is present, the result list can be filtered by matching this exact username."
+      operationId: findAll
+      parameters:
+      - name: username
+        in: query
+        required: false
+        schema:
+          type: string
+      responses:
+        "200":
+          description: List users
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/UserBriefDto"
+    post:
+      tags:
+      - user-endpoint
+      summary: Create user
+      description: Creates a user in the auth service and metadata database. Requires
+        that no credentials are sent in the request.
+      operationId: create
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/SignupRequestDto"
+        required: true
+      responses:
+        "403":
+          description: Internal authentication to the auth service is invalid
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Parameters are not well-formed (likely email)
+          content:
+            application/json: {}
+        "409":
+          description: User with username already exists
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "417":
+          description: User with e-mail already exists
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to create in auth service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "201":
+          description: Created user
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/UserDto"
+        "502":
+          description: Failed to create in auth service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Default role not found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+  /api/ontology:
+    get:
+      tags:
+      - ontology-endpoint
+      summary: List ontologies
+      description: Lists all ontologies known to the metadata database.
+      operationId: findAll_2
+      responses:
+        "200":
+          description: List ontologies
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/OntologyBriefDto"
+    post:
+      tags:
+      - ontology-endpoint
+      summary: Create ontology
+      description: Creates an ontology in the metadata database. Requires role `create-ontology`.
+      operationId: create_1
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/OntologyCreateDto"
+        required: true
+      responses:
+        "201":
+          description: Registered ontology successfully
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/OntologyDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/message:
+    get:
+      tags:
+      - message-endpoint
+      summary: List messages
+      description: "Lists messages known to the metadata database. Messages can be\
+        \ filtered be filtered with the optional `active` parameter. If set to *true*,\
+        \ only active messages (that is, messages whose end time has not been reached)\
+        \ will be returned. Otherwise only inactive messages are returned. If not\
+        \ set, active and inactive messages are returned."
+      operationId: list_2
+      parameters:
+      - name: active
+        in: query
+        required: false
+        schema:
+          type: boolean
+      responses:
+        "200":
+          description: List messages
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/BannerMessageDto"
+    post:
+      tags:
+      - message-endpoint
+      summary: Create message
+      description: Creates a message in the metadata database. Requires role `create-maintenance-message`.
+      operationId: create_2
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/BannerMessageCreateDto"
+        required: true
+      responses:
+        "201":
+          description: Created message
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/BannerMessageBriefDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/image:
+    get:
+      tags:
+      - image-endpoint
+      summary: List images
+      description: Lists all container images known to the metadata database.
+      operationId: findAll_3
+      responses:
+        "200":
+          description: List images
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/ImageBriefDto"
+    post:
+      tags:
+      - image-endpoint
+      summary: Create image
+      description: Creates a container image in the metadata database. Requires role
+        `create-image`.
+      operationId: create_3
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/ImageCreateDto"
+        required: true
+      responses:
+        "409":
+          description: Image already exists
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Image specification is invalid
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "201":
+          description: Created image
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ImageDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/identifier:
+    get:
+      tags:
+      - identifier-endpoint
+      summary: List identifiers
+      description: Lists all identifiers known to the metadata database
+      operationId: findAll_4
+      parameters:
+      - name: dbid
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: qid
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: vid
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: tid
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int64
+      - name: Accept
+        in: header
+        required: true
+        schema:
+          type: string
+      responses:
+        "200":
+          description: Found identifiers successfully
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  type: string
+            application/ld+json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/LdDatasetDto"
+        "406":
+          description: "Identifier could not be exported, the requested style is not\
+            \ known"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+    post:
+      tags:
+      - identifier-endpoint
+      summary: Create identifier
+      description: Create an identifier with id to create a draft identifier. Identifiers
+        can only be created for objects the user has at least *READ* access in the
+        associated database (requires role `create-identifier`) or for any object
+        in any database (requires role `create-foreign-identifier`).
+      operationId: create_4
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/IdentifierCreateDto"
+        required: true
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "201":
+          description: Drafted identifier
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/IdentifierDto"
+        "404":
+          description: "Failed to find database, table or view"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Identifier form contains invalid request data
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Insufficient access rights or authorities
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/view:
+    get:
+      tags:
+      - view-endpoint
+      summary: List views
+      description: Lists views known to the metadata database.
+      operationId: findAll_5
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "200":
+          description: Find views successfully
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/ViewBriefDto"
+        "404":
+          description: Database or user could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    post:
+      tags:
+      - view-endpoint
+      summary: Create view
+      description: Creates a view. This can only be performed by the database owner.
+        Requires role `create-database-view`.
+      operationId: create_6
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/ViewCreateDto"
+        required: true
+      responses:
+        "423":
+          description: Create view resulted in an invalid query statement
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "201":
+          description: Create view successfully
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ViewBriefDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Credentials missing
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find database/user in metadata database.
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Create view query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/table:
+    get:
+      tags:
+      - table-endpoint
+      summary: List tables
+      description: "Lists all tables known to the metadata database. When a database\
+        \ has a hidden schema (i.e. when `is_schema_public` is `false`), then the\
+        \ user needs to have at least read access and the role `list-tables`."
+      operationId: list_4
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "403":
+          description: List tables not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Database could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: List tables
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/TableBriefDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+    post:
+      tags:
+      - table-endpoint
+      summary: Create table
+      description: Creates a table in the database with id. Requires role `create-table`.
+      operationId: create_7
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/TableCreateDto"
+        required: true
+      responses:
+        "502":
+          description: Connection to search service failed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Create table not permitted
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "201":
+          description: Created a new table
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/TableBriefDto"
+        "409":
+          description: Create table conflicts with existing table name
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: "Database, container or user could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "503":
+          description: Failed to save in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Create table query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/container:
+    get:
+      tags:
+      - container-endpoint
+      summary: List containers
+      description: List all containers in the metadata database.
+      operationId: findAll_6
+      parameters:
+      - name: limit
+        in: query
+        required: false
+        schema:
+          type: integer
+          format: int32
+      responses:
+        "200":
+          description: List containers
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/ContainerBriefDto"
+    post:
+      tags:
+      - container-endpoint
+      summary: Create container
+      description: Creates a container in the metadata database. Requires role `create-container`.
+      operationId: create_9
+      requestBody:
+        content:
+          application/json:
+            schema:
+              $ref: "#/components/schemas/ContainerCreateDto"
+        required: true
+      responses:
+        "400":
+          description: Container payload malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Container image or user could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "409":
+          description: Container name already exists
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "201":
+          description: Created a new container
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ContainerDto"
+        "403":
+          description: "Create container not permitted, need authority `create-container`"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/unit:
+    get:
+      tags:
+      - unit-endpoint
+      summary: List units
+      description: Lists units known to the metadata database.
+      operationId: findAll_1
+      responses:
+        "200":
+          description: Find all semantic units
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/UnitDto"
+  /api/ontology/{ontologyId}/entity:
+    get:
+      tags:
+      - ontology-endpoint
+      summary: Find entities
+      description: Finds semantic entities by label or uri in an ontology with id.
+        Requires role `execute-semantic-query`.
+      operationId: find_4
+      parameters:
+      - name: ontologyId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: label
+        in: query
+        required: false
+        schema:
+          type: string
+      - name: uri
+        in: query
+        required: false
+        schema:
+          type: string
+      responses:
+        "400":
+          description: Filter params are invalid
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Found entities
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/EntityDto"
+        "404":
+          description: Could not find ontology
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "422":
+          description: Ontology does not have rdf or sparql endpoint
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "417":
+          description: Generated query or uri is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/oai:
+    get:
+      tags:
+      - metadata-endpoint
+      summary: Get record
+      operationId: identify_1_1_1_1
+      parameters:
+      - name: verb
+        in: query
+      - name: parameters
+        in: query
+        required: true
+        schema:
+          $ref: "#/components/schemas/OaiListIdentifiersParameters"
+      responses:
+        "200":
+          description: List containers
+          content:
+            text/xml: {}
+  /api/message/message/{messageId}:
+    get:
+      tags:
+      - message-endpoint
+      summary: Find message
+      description: Finds a message with id in the metadata database.
+      operationId: find_5
+      parameters:
+      - name: messageId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "200":
+          description: Get messages
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/BannerMessageDto"
+        "404":
+          description: Could not find message
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+  /api/license:
+    get:
+      tags:
+      - license-endpoint
+      summary: List licenses
+      description: Lists licenses known to the metadata database.
+      operationId: list_3
+      responses:
+        "200":
+          description: List of licenses
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/LicenseDto"
+  /api/identifier/retrieve:
+    get:
+      tags:
+      - identifier-endpoint
+      summary: Retrieve PID metadata
+      description: "Retrieves Persistent Identifier (PID) metadata from external endpoints.\
+        \ Supported PIDs are: ORCID, ROR, DOI."
+      operationId: retrieve
+      parameters:
+      - name: url
+        in: query
+        required: true
+        schema:
+          type: string
+      responses:
+        "200":
+          description: Retrieved metadata from identifier
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/IdentifierDto"
+        "404":
+          description: Failed to find metadata for identifier
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+  /api/database/{databaseId}:
+    get:
+      tags:
+      - database-endpoint
+      summary: Find database
+      description: Finds a database with id.
+      operationId: findById_1
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "503":
+          description: Failed to find queue information in broker service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "502":
+          description: Connection to the broker service could not be established
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Database found successfully
+          headers:
+            X-Username:
+              description: The authentication username
+              style: simple
+            Access-Control-Expose-Headers:
+              description: Expose custom headers
+              style: simple
+            X-Password:
+              description: The authentication password
+              style: simple
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/DatabaseBriefDto"
+        "403":
+          description: Not allowed to view database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: "Database, user or exchange could not be found"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/table/{tableId}/suggest:
+    get:
+      tags:
+      - table-endpoint
+      summary: Suggest semantics
+      description: Suggests semantic concepts for a table. This action can only be
+        performed by the table owner. Requires role `table-semantic-analyse`.
+      operationId: analyseTable
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "417":
+          description: Generated query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "422":
+          description: Ontology does not have rdf or sparql endpoint
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "400":
+          description: Failed to parse statistic in search service
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "403":
+          description: Not the table owner.
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "404":
+          description: Failed to find database/table in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Suggested table semantics successfully
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/EntityDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/database/{databaseId}/table/{tableId}/column/{columnId}/suggest:
+    get:
+      tags:
+      - table-endpoint
+      summary: Suggest semantics
+      description: Suggests column semantics. Requires role `table-semantic-analyse`.
+      operationId: analyseTableColumn
+      parameters:
+      - name: databaseId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: tableId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      - name: columnId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "400":
+          description: Generated query is malformed
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "422":
+          description: Ontology does not have rdf or sparql endpoint
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "200":
+          description: Suggested table column semantics successfully
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/TableColumnEntityDto"
+        "404":
+          description: Failed to find database/table in metadata database
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/container/{containerId}:
+    get:
+      tags:
+      - container-endpoint
+      summary: Find container
+      description: Finds a container in the metadata database.
+      operationId: findById_3
+      parameters:
+      - name: containerId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "200":
+          description: Found container
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ContainerDto"
+        "404":
+          description: Container image could not be found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+    delete:
+      tags:
+      - container-endpoint
+      summary: Delete container
+      description: Deletes a container in the metadata database. Requires role `delete-container`.
+      operationId: delete_6
+      parameters:
+      - name: containerId
+        in: path
+        required: true
+        schema:
+          type: integer
+          format: int64
+      responses:
+        "404":
+          description: Container not found
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+        "202":
+          description: Deleted container
+        "403":
+          description: "Create container not permitted, need authority `delete-container`"
+          content:
+            application/json:
+              schema:
+                $ref: "#/components/schemas/ApiErrorDto"
+      security:
+      - bearerAuth: []
+      - basicAuth: []
+  /api/concept:
+    get:
+      tags:
+      - concept-endpoint
+      summary: List concepts
+      description: List all semantic concepts known to the metadata database
+      operationId: findAll_7
+      responses:
+        "200":
+          description: List concepts
+          content:
+            application/json:
+              schema:
+                type: array
+                items:
+                  $ref: "#/components/schemas/ConceptDto"
+components:
+  schemas:
+    DatabaseBriefDto:
+      required:
+      - contact
+      - id
+      - internal_name
+      - is_public
+      - is_schema_public
+      - name
+      - owner_id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        description:
+          type: string
+          example: Air Quality
+        identifiers:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierBriefDto"
+        contact:
+          $ref: "#/components/schemas/UserBriefDto"
+        internal_name:
+          type: string
+          example: air_quality
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+        owner_id:
+          type: string
+          format: uuid
+        preview_image:
+          type: string
+    IdentifierBriefDto:
+      required:
+      - created_by
+      - database_id
+      - id
+      - publication_year
+      - publisher
+      - titles
+      - type
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        type:
+          type: string
+          enum:
+          - database
+          - subset
+          - table
+          - view
+        titles:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierTitleDto"
+        doi:
+          type: string
+          example: 10.1038/nphys1170
+        publisher:
+          type: string
+          example: TU Wien
+        status:
+          type: string
+          enum:
+          - draft
+          - published
+        database_id:
+          type: integer
+          format: int64
+          example: 1
+        query_id:
+          type: integer
+          format: int64
+          example: 1
+        table_id:
+          type: integer
+          format: int64
+          example: 1
+        view_id:
+          type: integer
+          format: int64
+          example: 1
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+        created_by:
+          type: string
+          format: uuid
+    IdentifierTitleDto:
+      required:
+      - id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        title:
+          type: string
+          example: Airquality Demonstrator
+        language:
+          type: string
+          example: en
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        type:
+          type: string
+          enum:
+          - AlternativeTitle
+          - Subtitle
+          - TranslatedTitle
+          - Other
+    UserBriefDto:
+      required:
+      - id
+      - username
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
+        username:
+          type: string
+          description: Only contains lowercase characters
+          example: jcarberry
+        name:
+          type: string
+          example: Josiah Carberry
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+        qualified_name:
+          type: string
+          example: Josiah Carberry — @jcarberry
+        given_name:
+          type: string
+          example: Josiah
+        family_name:
+          type: string
+          example: Carberry
+    ApiErrorDto:
+      required:
+      - code
+      - message
+      - status
+      type: object
+      properties:
+        status:
+          type: string
+          example: NOT_FOUND
+          enum:
+          - 100 CONTINUE
+          - 101 SWITCHING_PROTOCOLS
+          - 102 PROCESSING
+          - 103 EARLY_HINTS
+          - 103 CHECKPOINT
+          - 200 OK
+          - 201 CREATED
+          - 202 ACCEPTED
+          - 203 NON_AUTHORITATIVE_INFORMATION
+          - 204 NO_CONTENT
+          - 205 RESET_CONTENT
+          - 206 PARTIAL_CONTENT
+          - 207 MULTI_STATUS
+          - 208 ALREADY_REPORTED
+          - 226 IM_USED
+          - 300 MULTIPLE_CHOICES
+          - 301 MOVED_PERMANENTLY
+          - 302 FOUND
+          - 302 MOVED_TEMPORARILY
+          - 303 SEE_OTHER
+          - 304 NOT_MODIFIED
+          - 305 USE_PROXY
+          - 307 TEMPORARY_REDIRECT
+          - 308 PERMANENT_REDIRECT
+          - 400 BAD_REQUEST
+          - 401 UNAUTHORIZED
+          - 402 PAYMENT_REQUIRED
+          - 403 FORBIDDEN
+          - 404 NOT_FOUND
+          - 405 METHOD_NOT_ALLOWED
+          - 406 NOT_ACCEPTABLE
+          - 407 PROXY_AUTHENTICATION_REQUIRED
+          - 408 REQUEST_TIMEOUT
+          - 409 CONFLICT
+          - 410 GONE
+          - 411 LENGTH_REQUIRED
+          - 412 PRECONDITION_FAILED
+          - 413 PAYLOAD_TOO_LARGE
+          - 413 REQUEST_ENTITY_TOO_LARGE
+          - 414 URI_TOO_LONG
+          - 414 REQUEST_URI_TOO_LONG
+          - 415 UNSUPPORTED_MEDIA_TYPE
+          - 416 REQUESTED_RANGE_NOT_SATISFIABLE
+          - 417 EXPECTATION_FAILED
+          - 418 I_AM_A_TEAPOT
+          - 419 INSUFFICIENT_SPACE_ON_RESOURCE
+          - 420 METHOD_FAILURE
+          - 421 DESTINATION_LOCKED
+          - 422 UNPROCESSABLE_ENTITY
+          - 423 LOCKED
+          - 424 FAILED_DEPENDENCY
+          - 425 TOO_EARLY
+          - 426 UPGRADE_REQUIRED
+          - 428 PRECONDITION_REQUIRED
+          - 429 TOO_MANY_REQUESTS
+          - 431 REQUEST_HEADER_FIELDS_TOO_LARGE
+          - 451 UNAVAILABLE_FOR_LEGAL_REASONS
+          - 500 INTERNAL_SERVER_ERROR
+          - 501 NOT_IMPLEMENTED
+          - 502 BAD_GATEWAY
+          - 503 SERVICE_UNAVAILABLE
+          - 504 GATEWAY_TIMEOUT
+          - 505 HTTP_VERSION_NOT_SUPPORTED
+          - 506 VARIANT_ALSO_NEGOTIATES
+          - 507 INSUFFICIENT_STORAGE
+          - 508 LOOP_DETECTED
+          - 509 BANDWIDTH_LIMIT_EXCEEDED
+          - 510 NOT_EXTENDED
+          - 511 NETWORK_AUTHENTICATION_REQUIRED
+        message:
+          type: string
+          example: Error message
+        code:
+          type: string
+          example: error.service.code
+    DatabaseAccessDto:
+      required:
+      - type
+      - user
+      type: object
+      properties:
+        user:
+          $ref: "#/components/schemas/UserBriefDto"
+        type:
+          type: string
+          enum:
+          - read
+          - write_own
+          - write_all
+    UserUpdateDto:
+      required:
+      - language
+      - theme
+      type: object
+      properties:
+        firstname:
+          type: string
+          example: Josiah
+        lastname:
+          type: string
+          example: Carberry
+        affiliation:
+          type: string
+          example: Brown University
+        orcid:
+          type: string
+          example: 0000-0002-1825-0097
+        theme:
+          type: string
+          example: dark
+        language:
+          type: string
+          example: en
+    UserAttributesDto:
+      required:
+      - language
+      - theme
+      type: object
+      properties:
+        theme:
+          type: string
+          example: light
+        orcid:
+          type: string
+          example: https://orcid.org/0000-0002-1825-0097
+        affiliation:
+          type: string
+          example: Brown University
+        language:
+          type: string
+          example: en
+    UserDto:
+      required:
+      - attributes
+      - id
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+          example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4
+        name:
+          type: string
+          example: Josiah Carberry
+        attributes:
+          $ref: "#/components/schemas/UserAttributesDto"
+        last_retrieved:
+          type: string
+          format: date-time
+        qualified_name:
+          type: string
+          example: Josiah Carberry — @jcarberry
+        given_name:
+          type: string
+          example: Josiah
+        family_name:
+          type: string
+          example: Carberry
+    UserPasswordDto:
+      required:
+      - password
+      type: object
+      properties:
+        password:
+          type: string
+    RefreshTokenRequestDto:
+      required:
+      - refresh_token
+      type: object
+      properties:
+        refresh_token:
+          type: string
+          example: refresh_token
+    TokenDto:
+      required:
+      - access_token
+      - expires_in
+      - id_token
+      - not-before-policy
+      - refresh_expires_in
+      - refresh_token
+      - scope
+      - session_state
+      - token_type
+      type: object
+      properties:
+        scope:
+          type: string
+        access_token:
+          type: string
+        expires_in:
+          type: integer
+          format: int64
+        refresh_token:
+          type: string
+        refresh_expires_in:
+          type: integer
+          format: int64
+        id_token:
+          type: string
+        session_state:
+          type: string
+        token_type:
+          type: string
+        not-before-policy:
+          type: integer
+          format: int64
+    OntologyModifyDto:
+      required:
+      - prefix
+      - uri
+      type: object
+      properties:
+        uri:
+          type: string
+          example: Ontology URI
+        prefix:
+          type: string
+          example: Ontology prefix
+        sparql_endpoint:
+          type: string
+          example: Ontology SPARQL endpoint
+        rdf_path:
+          type: string
+          example: rdf/om-2.0.rdf
+    OntologyDto:
+      required:
+      - id
+      - prefix
+      - rdf
+      - sparql
+      - uri
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        uri:
+          type: string
+          example: http://www.wikidata.org/
+        prefix:
+          type: string
+          example: wd
+        sparql:
+          type: boolean
+          example: true
+        rdf:
+          type: boolean
+          example: false
+        uri_pattern:
+          type: string
+          example: http://www.wikidata.org/entity/.*
+        sparql_endpoint:
+          type: string
+          example: https://query.wikidata.org/sparql
+        rdf_path:
+          type: string
+          example: rdf/om-2.0.rdf
+    BannerMessageUpdateDto:
+      required:
+      - message
+      - type
+      type: object
+      properties:
+        type:
+          type: string
+          enum:
+          - error
+          - warning
+          - info
+        message:
+          type: string
+          example: Maintenance starts on 8am on Monday
+        link:
+          type: string
+          example: https://example.com
+        link_text:
+          type: string
+          example: More
+        display_start:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21Z
+        display_end:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21Z
+    BannerMessageBriefDto:
+      required:
+      - message
+      - type
+      type: object
+      properties:
+        type:
+          type: string
+          enum:
+          - error
+          - warning
+          - info
+        message:
+          type: string
+          example: Maintenance starts on 8am on Monday
+        link:
+          type: string
+          example: https://example.com
+        link_text:
+          type: string
+          example: More
+    ImageChangeDto:
+      required:
+      - dialect
+      - driver_class
+      - jdbc_method
+      - registry
+      type: object
+      properties:
+        registry:
+          type: string
+          example: docker.io/library
+        defaultPort:
+          maximum: 65535
+          minimum: 1024
+          type: integer
+          format: int32
+          example: 5432
+        dialect:
+          type: string
+          example: Postgres
+        driver_class:
+          type: string
+          example: org.postgresql.Driver
+        jdbc_method:
+          type: string
+          example: postgresql
+    DataTypeDto:
+      required:
+      - display_name
+      - documentation
+      - is_buildable
+      - is_quoted
+      - value
+      type: object
+      properties:
+        value:
+          type: string
+          example: time
+        documentation:
+          type: string
+          example: https://mariadb.com/kb/en/time/
+        display_name:
+          type: string
+          example: TIME(fsp)
+        size_min:
+          type: integer
+          format: int32
+          example: 0
+        size_max:
+          type: integer
+          format: int32
+          example: 6
+        size_default:
+          type: integer
+          format: int32
+          example: 0
+        size_required:
+          type: boolean
+          example: false
+        d_min:
+          type: integer
+          format: int32
+        d_max:
+          type: integer
+          format: int32
+        d_default:
+          type: integer
+          format: int32
+        d_required:
+          type: boolean
+        data_hint:
+          type: string
+          example: "e.g. HH:MM:SS, HH:MM, HHMMSS, H:M:S"
+        type_hint:
+          type: string
+          example: "fsp=microsecond precision, min. 0, max. 6"
+        is_quoted:
+          type: boolean
+          description: frontend needs to quote this data type
+          example: false
+        is_buildable:
+          type: boolean
+          description: frontend can build this data type
+          example: true
+    ImageDto:
+      required:
+      - data_types
+      - default
+      - default_port
+      - dialect
+      - driver_class
+      - id
+      - jdbc_method
+      - name
+      - operators
+      - registry
+      - version
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        registry:
+          type: string
+          example: docker.io/library
+        name:
+          type: string
+          example: mariadb
+        version:
+          type: string
+          example: "10.5"
+        dialect:
+          type: string
+          example: org.hibernate.dialect.MariaDBDialect
+        operators:
+          type: array
+          items:
+            $ref: "#/components/schemas/OperatorDto"
+        driver_class:
+          type: string
+          example: org.mariadb.jdbc.Driver
+        jdbc_method:
+          type: string
+          example: mariadb
+        default:
+          type: boolean
+          example: false
+        default_port:
+          type: integer
+          format: int32
+          example: 3306
+        data_types:
+          type: array
+          items:
+            $ref: "#/components/schemas/DataTypeDto"
+    OperatorDto:
+      required:
+      - display_name
+      - documentation
+      - value
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        value:
+          type: string
+          example: XOR
+        documentation:
+          type: string
+          example: https://mariadb.com/kb/en/xor/
+        display_name:
+          type: string
+          example: XOR
+    CreatorSaveDto:
+      required:
+      - creator_name
+      - id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 1
+        firstname:
+          type: string
+          example: Josiah
+        lastname:
+          type: string
+          example: Carberry
+        affiliation:
+          type: string
+          example: Wesleyan University
+        creator_name:
+          type: string
+          example: "Carberry, Josiah"
+        name_type:
+          type: string
+          example: Personal
+          enum:
+          - Personal
+          - Organizational
+        name_identifier:
+          type: string
+          example: 0000-0002-1825-0097
+        name_identifier_scheme:
+          type: string
+          example: ORCID
+          enum:
+          - ORCID
+          - ROR
+          - ISNI
+          - GRID
+        affiliation_identifier:
+          type: string
+          example: https://ror.org/04d836q62
+        affiliation_identifier_scheme:
+          type: string
+          example: ROR
+          enum:
+          - ROR
+          - GRID
+          - ISNI
+    IdentifierFunderSaveDto:
+      required:
+      - funder_name
+      - id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 1
+        funder_name:
+          type: string
+          example: European Commission
+        funder_identifier:
+          type: string
+          example: http://doi.org/10.13039/501100000780
+        funder_identifier_type:
+          type: string
+          example: Crossref Funder ID
+          enum:
+          - Crossref Funder ID
+          - ROR
+          - GND
+          - ISNI
+          - Other
+        scheme_uri:
+          type: string
+          example: http://doi.org/
+        award_number:
+          type: string
+          example: "824087"
+        award_title:
+          type: string
+          example: EOSC-Life
+    IdentifierSaveDescriptionDto:
+      required:
+      - description
+      - id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 1
+        description:
+          type: string
+          example: "Air quality reports at Stephansplatz, Vienna"
+        language:
+          type: string
+          example: en
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        type:
+          type: string
+          example: Abstract
+          enum:
+          - Abstract
+          - Methods
+          - SeriesInformation
+          - TableOfContents
+          - TechnicalInfo
+          - Other
+    IdentifierSaveDto:
+      required:
+      - creators
+      - database_id
+      - id
+      - publication_year
+      - publisher
+      - titles
+      - type
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 1
+        type:
+          type: string
+          example: database
+          enum:
+          - database
+          - subset
+          - table
+          - view
+        doi:
+          type: string
+          example: 10.1111/11111111
+        titles:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierSaveTitleDto"
+        descriptions:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierSaveDescriptionDto"
+        funders:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierFunderSaveDto"
+        licenses:
+          type: array
+          items:
+            $ref: "#/components/schemas/LicenseDto"
+        publisher:
+          type: string
+          example: TU Wien
+        language:
+          type: string
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        creators:
+          type: array
+          items:
+            $ref: "#/components/schemas/CreatorSaveDto"
+        database_id:
+          type: integer
+          format: int64
+          example: 1
+        query_id:
+          type: integer
+          format: int64
+        view_id:
+          type: integer
+          format: int64
+        table_id:
+          type: integer
+          format: int64
+        publication_day:
+          type: integer
+          format: int32
+          example: 15
+        publication_month:
+          type: integer
+          format: int32
+          example: 12
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+        related_identifiers:
+          type: array
+          items:
+            $ref: "#/components/schemas/RelatedIdentifierSaveDto"
+    IdentifierSaveTitleDto:
+      required:
+      - id
+      - title
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 1
+        title:
+          type: string
+          example: Airquality Demonstrator
+        language:
+          type: string
+          example: en
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        type:
+          type: string
+          example: Subtitle
+          enum:
+          - AlternativeTitle
+          - Subtitle
+          - TranslatedTitle
+          - Other
+    LicenseDto:
+      required:
+      - identifier
+      - uri
+      type: object
+      properties:
+        identifier:
+          type: string
+          example: MIT
+        uri:
+          type: string
+          example: https://opensource.org/licenses/MIT
+        description:
+          type: string
+          example: "A short and simple permissive license with conditions only requiring\
+            \ preservation of copyright and license notices. Licensed works, modifications,\
+            \ and larger works may be distributed under different terms and without\
+            \ source code."
+    RelatedIdentifierSaveDto:
+      required:
+      - id
+      - relation
+      - type
+      - value
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 1
+        value:
+          type: string
+          example: 10.70124/dc4zh-9ce78
+        type:
+          type: string
+          example: DOI
+          enum:
+          - DOI
+          - URL
+          - URN
+          - ARK
+          - arXiv
+          - bibcode
+          - EAN13
+          - EISSN
+          - Handle
+          - IGSN
+          - ISBN
+          - ISTC
+          - LISSN
+          - LSID
+          - PMID
+          - PURL
+          - UPC
+          - w3id
+        relation:
+          type: string
+          example: Cites
+          enum:
+          - IsCitedBy
+          - Cites
+          - IsSupplementTo
+          - IsSupplementedBy
+          - IsContinuedBy
+          - Continues
+          - IsDescribedBy
+          - Describes
+          - HasMetadata
+          - IsMetadataFor
+          - HasVersion
+          - IsVersionOf
+          - IsNewVersionOf
+          - IsPreviousVersionOf
+          - IsPartOf
+          - HasPart
+          - IsPublishedIn
+          - IsReferencedBy
+          - References
+          - IsDocumentedBy
+          - Documents
+          - IsCompiledBy
+          - Compiles
+          - IsVariantFormOf
+          - IsOriginalFormOf
+          - IsIdenticalTo
+          - IsReviewedBy
+          - Reviews
+          - IsDerivedFrom
+          - IsSourceOf
+          - IsRequiredBy
+          - Requires
+          - IsObsoletedBy
+          - Obsoletes
+    CreatorDto:
+      required:
+      - creator_name
+      - id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        firstname:
+          type: string
+          example: Josiah
+        lastname:
+          type: string
+          example: Carberry
+        affiliation:
+          type: string
+          example: Brown University
+        creator_name:
+          type: string
+          example: "Carberry, Josiah"
+        name_type:
+          type: string
+          example: Personal
+          enum:
+          - Personal
+          - Organizational
+        name_identifier:
+          type: string
+          example: 0000-0002-1825-0097
+        name_identifier_scheme:
+          type: string
+          example: ORCID
+          enum:
+          - ORCID
+          - ROR
+          - ISNI
+          - GRID
+        name_identifier_scheme_uri:
+          type: string
+          example: https://orcid.org/
+        affiliation_identifier:
+          type: string
+          example: https://ror.org/05gq02987
+        affiliation_identifier_scheme:
+          type: string
+          example: ROR
+          enum:
+          - ROR
+          - GRID
+          - ISNI
+        affiliation_identifier_scheme_uri:
+          type: string
+          example: https://ror.org/
+    IdentifierDescriptionDto:
+      required:
+      - id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        description:
+          type: string
+          example: "Air quality reports at Stephansplatz, Vienna"
+        language:
+          type: string
+          example: en
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        type:
+          type: string
+          example: Abstract
+          enum:
+          - Abstract
+          - Methods
+          - SeriesInformation
+          - TableOfContents
+          - TechnicalInfo
+          - Other
+    IdentifierDto:
+      required:
+      - creators
+      - database_id
+      - id
+      - owner
+      - publication_year
+      - publisher
+      - query
+      - query_hash
+      - query_normalized
+      - titles
+      - type
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        type:
+          type: string
+          enum:
+          - database
+          - subset
+          - table
+          - view
+        titles:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierTitleDto"
+        descriptions:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierDescriptionDto"
+        funders:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierFunderDto"
+        query:
+          type: string
+          example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\
+            \ = \"09:STEF\""
+        execution:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21Z
+        doi:
+          type: string
+          example: 10.1038/nphys1170
+        publisher:
+          type: string
+          example: TU Wien
+        owner:
+          $ref: "#/components/schemas/UserBriefDto"
+        language:
+          type: string
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        licenses:
+          type: array
+          items:
+            $ref: "#/components/schemas/LicenseDto"
+        creators:
+          type: array
+          items:
+            $ref: "#/components/schemas/CreatorDto"
+        status:
+          type: string
+          enum:
+          - draft
+          - published
+        database_id:
+          type: integer
+          format: int64
+          example: 1
+        query_id:
+          type: integer
+          format: int64
+          example: 1
+        table_id:
+          type: integer
+          format: int64
+          example: 1
+        view_id:
+          type: integer
+          format: int64
+          example: 1
+        query_normalized:
+          type: string
+          example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\
+            \ = \"09:STEF\""
+        related_identifiers:
+          type: array
+          items:
+            $ref: "#/components/schemas/RelatedIdentifierDto"
+        query_hash:
+          type: string
+          description: query hash in sha512
+        result_hash:
+          type: string
+          example: 34fe82cda2c53f13f8d90cfd7a3469e3a939ff311add50dce30d9136397bf8e5
+        result_number:
+          type: integer
+          format: int64
+          example: 1
+        publication_day:
+          type: integer
+          format: int32
+          example: 15
+        publication_month:
+          type: integer
+          format: int32
+          example: 12
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+    IdentifierFunderDto:
+      required:
+      - funder_name
+      - id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        funder_name:
+          type: string
+          example: European Commission
+        funder_identifier:
+          type: string
+          example: http://doi.org/10.13039/501100000780
+        funder_identifier_type:
+          type: string
+          example: Crossref Funder ID
+          enum:
+          - Crossref Funder ID
+          - ROR
+          - GND
+          - ISNI
+          - Other
+        scheme_uri:
+          type: string
+          example: http://doi.org/
+        award_number:
+          type: string
+          example: "824087"
+        award_title:
+          type: string
+          example: EOSC-Life
+    RelatedIdentifierDto:
+      required:
+      - id
+      - relation
+      - type
+      - value
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        value:
+          type: string
+          example: 10.70124/dc4zh-9ce78
+        type:
+          type: string
+          example: DOI
+          enum:
+          - DOI
+          - URL
+          - URN
+          - ARK
+          - arXiv
+          - bibcode
+          - EAN13
+          - EISSN
+          - Handle
+          - IGSN
+          - ISBN
+          - ISTC
+          - LISSN
+          - LSID
+          - PMID
+          - PURL
+          - UPC
+          - w3id
+        relation:
+          type: string
+          example: Cites
+          enum:
+          - IsCitedBy
+          - Cites
+          - IsSupplementTo
+          - IsSupplementedBy
+          - IsContinuedBy
+          - Continues
+          - IsDescribedBy
+          - Describes
+          - HasMetadata
+          - IsMetadataFor
+          - HasVersion
+          - IsVersionOf
+          - IsNewVersionOf
+          - IsPreviousVersionOf
+          - IsPartOf
+          - HasPart
+          - IsPublishedIn
+          - IsReferencedBy
+          - References
+          - IsDocumentedBy
+          - Documents
+          - IsCompiledBy
+          - Compiles
+          - IsVariantFormOf
+          - IsOriginalFormOf
+          - IsIdenticalTo
+          - IsReviewedBy
+          - Reviews
+          - IsDerivedFrom
+          - IsSourceOf
+          - IsRequiredBy
+          - Requires
+          - IsObsoletedBy
+          - Obsoletes
+    DatabaseModifyVisibilityDto:
+      required:
+      - is_public
+      - is_schema_public
+      type: object
+      properties:
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+    ViewUpdateDto:
+      required:
+      - is_public
+      - is_schema_public
+      type: object
+      properties:
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+    ViewColumnDto:
+      required:
+      - auto_generated
+      - database_id
+      - id
+      - internal_name
+      - is_null_allowed
+      - name
+      - ord
+      - type
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          maxLength: 64
+          minLength: 0
+          type: string
+          example: Date
+        size:
+          type: integer
+          format: int64
+          example: 255
+        d:
+          type: integer
+          format: int64
+          example: 0
+        description:
+          maxLength: 2048
+          minLength: 0
+          type: string
+          example: Column comment
+        database_id:
+          type: integer
+          format: int64
+        ord:
+          type: integer
+          format: int32
+          example: 0
+        internal_name:
+          maxLength: 64
+          minLength: 0
+          type: string
+          example: mdb_date
+        auto_generated:
+          type: boolean
+          example: false
+        index_length:
+          type: integer
+          format: int64
+        length:
+          type: integer
+          format: int64
+        type:
+          type: string
+          example: string
+          enum:
+          - char
+          - varchar
+          - binary
+          - varbinary
+          - tinyblob
+          - tinytext
+          - text
+          - blob
+          - mediumtext
+          - mediumblob
+          - longtext
+          - longblob
+          - enum
+          - set
+          - serial
+          - bit
+          - tinyint
+          - bool
+          - smallint
+          - mediumint
+          - int
+          - bigint
+          - float
+          - double
+          - decimal
+          - date
+          - datetime
+          - timestamp
+          - time
+          - year
+        is_null_allowed:
+          type: boolean
+          example: false
+    ViewDto:
+      required:
+      - columns
+      - database_id
+      - id
+      - internal_name
+      - name
+      - owner
+      - query
+      - query_hash
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        identifiers:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierDto"
+        query:
+          type: string
+          example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC
+        owner:
+          $ref: "#/components/schemas/UserBriefDto"
+        columns:
+          type: array
+          items:
+            $ref: "#/components/schemas/ViewColumnDto"
+        last_retrieved:
+          type: string
+          format: date-time
+        database_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: air_quality
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+        initial_view:
+          type: boolean
+          description: True if it is the default view for the database
+          example: true
+        query_hash:
+          type: string
+          example: 7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916
+    TableUpdateDto:
+      required:
+      - is_public
+      - is_schema_public
+      type: object
+      properties:
+        description:
+          maxLength: 180
+          minLength: 0
+          type: string
+          example: Air Quality in Austria
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+    TableBriefDto:
+      required:
+      - database_id
+      - id
+      - internal_name
+      - is_public
+      - is_schema_public
+      - is_versioned
+      - name
+      - owned_by
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        description:
+          type: string
+          example: Air Quality in Austria
+        database_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: air_quality
+        is_versioned:
+          type: boolean
+          example: true
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+        owned_by:
+          type: string
+          format: uuid
+    ColumnSemanticsUpdateDto:
+      type: object
+      properties:
+        concept_uri:
+          type: string
+        unit_uri:
+          type: string
+    ColumnDto:
+      required:
+      - database_id
+      - id
+      - internal_name
+      - is_null_allowed
+      - name
+      - ord
+      - table_id
+      - type
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 1
+        name:
+          maxLength: 64
+          minLength: 0
+          type: string
+          example: Given Name
+        alias:
+          type: string
+          example: firstname
+        size:
+          type: integer
+          format: int64
+          example: 255
+        d:
+          type: integer
+          format: int64
+          example: 0
+        mean:
+          type: number
+          example: 45.4
+        median:
+          type: number
+          example: 51
+        concept:
+          $ref: "#/components/schemas/ConceptBriefDto"
+        unit:
+          $ref: "#/components/schemas/UnitBriefDto"
+        description:
+          maxLength: 2048
+          minLength: 0
+          type: string
+          example: Column comment
+        enums:
+          type: array
+          items:
+            type: string
+        sets:
+          type: array
+          items:
+            type: string
+        database_id:
+          type: integer
+          format: int64
+          example: 2
+        table_id:
+          type: integer
+          format: int64
+          example: 3
+        ord:
+          type: integer
+          format: int32
+          example: 0
+        internal_name:
+          maxLength: 64
+          minLength: 0
+          type: string
+          example: given_name
+        index_length:
+          type: integer
+          format: int64
+          example: 255
+        length:
+          type: integer
+          format: int64
+          example: 255
+        type:
+          type: string
+          example: varchar
+          enum:
+          - char
+          - varchar
+          - binary
+          - varbinary
+          - tinyblob
+          - tinytext
+          - text
+          - blob
+          - mediumtext
+          - mediumblob
+          - longtext
+          - longblob
+          - enum
+          - set
+          - serial
+          - bit
+          - tinyint
+          - bool
+          - smallint
+          - mediumint
+          - int
+          - bigint
+          - float
+          - double
+          - decimal
+          - date
+          - datetime
+          - timestamp
+          - time
+          - year
+        data_length:
+          type: integer
+          format: int64
+          example: 34300
+        max_data_length:
+          type: integer
+          format: int64
+          example: 34300
+        num_rows:
+          type: integer
+          format: int64
+          example: 32
+        val_min:
+          type: number
+          example: 0
+        val_max:
+          type: number
+          example: 100
+        std_dev:
+          type: number
+          example: 5.32
+        is_null_allowed:
+          type: boolean
+          example: false
+    ConceptBriefDto:
+      required:
+      - id
+      - uri
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 23
+        uri:
+          type: string
+          example: http://www.wikidata.org/entity/Q202444
+        name:
+          type: string
+          example: given name
+        description:
+          type: string
+          example: "name typically used to differentiate people from the same family,\
+            \ clan, or other social group who have a common last name"
+    UnitBriefDto:
+      required:
+      - id
+      - uri
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+          example: 34
+        uri:
+          type: string
+          example: http://www.wikidata.org/entity/Q1422583
+        name:
+          type: string
+          example: importance
+        description:
+          type: string
+          example: "subjective magnitude of value, meaning, or purpose"
+    DatabaseTransferDto:
+      required:
+      - id
+      type: object
+      properties:
+        id:
+          type: string
+          format: uuid
+    DatabaseModifyImageDto:
+      type: object
+      properties:
+        key:
+          type: string
+    UpdateDatabaseAccessDto:
+      required:
+      - type
+      type: object
+      properties:
+        type:
+          type: string
+          enum:
+          - read
+          - write_own
+          - write_all
+    SignupRequestDto:
+      required:
+      - email
+      - password
+      - username
+      type: object
+      properties:
+        username:
+          pattern: "^[a-z0-9]{3,}$"
+          type: string
+          example: user
+        email:
+          type: string
+          example: user@example.com
+        password:
+          type: string
+    LoginRequestDto:
+      required:
+      - password
+      - username
+      type: object
+      properties:
+        username:
+          type: string
+          example: user
+        password:
+          type: string
+    OntologyCreateDto:
+      required:
+      - prefix
+      - uri
+      type: object
+      properties:
+        uri:
+          type: string
+          example: Ontology URI
+        prefix:
+          type: string
+          example: Ontology prefix
+        sparql_endpoint:
+          type: string
+          example: Ontology SPARQL endpoint
+    BannerMessageCreateDto:
+      required:
+      - message
+      - type
+      type: object
+      properties:
+        type:
+          type: string
+          enum:
+          - error
+          - warning
+          - info
+        message:
+          type: string
+          example: Maintenance starts on 8am on Monday
+        link:
+          type: string
+          example: https://example.com
+        link_text:
+          type: string
+          example: More
+        display_start:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21Z
+        display_end:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21Z
+    ImageCreateDto:
+      required:
+      - default_port
+      - dialect
+      - driver_class
+      - is_default
+      - jdbc_method
+      - name
+      - registry
+      - version
+      type: object
+      properties:
+        registry:
+          type: string
+          example: docker.io/library
+        name:
+          type: string
+          example: mariadb
+        version:
+          type: string
+        dialect:
+          type: string
+        is_default:
+          type: boolean
+          example: false
+        driver_class:
+          type: string
+        jdbc_method:
+          type: string
+        default_port:
+          maximum: 65535
+          minimum: 1024
+          type: integer
+          format: int32
+    IdentifierCreateDto:
+      required:
+      - creators
+      - database_id
+      - publication_year
+      - publisher
+      - titles
+      - type
+      type: object
+      properties:
+        type:
+          type: string
+          example: database
+          enum:
+          - database
+          - subset
+          - table
+          - view
+        doi:
+          type: string
+          example: 10.1111/11111111
+        titles:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierSaveTitleDto"
+        descriptions:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierSaveDescriptionDto"
+        funders:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierFunderSaveDto"
+        licenses:
+          type: array
+          items:
+            $ref: "#/components/schemas/LicenseDto"
+        publisher:
+          type: string
+          example: TU Wien
+        language:
+          type: string
+          enum:
+          - ab
+          - aa
+          - af
+          - ak
+          - sq
+          - am
+          - ar
+          - an
+          - hy
+          - as
+          - av
+          - ae
+          - ay
+          - az
+          - bm
+          - ba
+          - eu
+          - be
+          - bn
+          - bh
+          - bi
+          - bs
+          - br
+          - bg
+          - my
+          - ca
+          - km
+          - ch
+          - ce
+          - ny
+          - zh
+          - cu
+          - cv
+          - kw
+          - co
+          - cr
+          - hr
+          - cs
+          - da
+          - dv
+          - nl
+          - dz
+          - en
+          - eo
+          - et
+          - ee
+          - fo
+          - fj
+          - fi
+          - fr
+          - ff
+          - gd
+          - gl
+          - lg
+          - ka
+          - de
+          - ki
+          - el
+          - kl
+          - gn
+          - gu
+          - ht
+          - ha
+          - he
+          - hz
+          - hi
+          - ho
+          - hu
+          - is
+          - io
+          - ig
+          - id
+          - ia
+          - ie
+          - iu
+          - ik
+          - ga
+          - it
+          - ja
+          - jv
+          - kn
+          - kr
+          - ks
+          - kk
+          - rw
+          - kv
+          - kg
+          - ko
+          - kj
+          - ku
+          - ky
+          - lo
+          - la
+          - lv
+          - lb
+          - li
+          - ln
+          - lt
+          - lu
+          - mk
+          - mg
+          - ms
+          - ml
+          - mt
+          - gv
+          - mi
+          - mr
+          - mh
+          - ro
+          - mn
+          - na
+          - nv
+          - nd
+          - ng
+          - ne
+          - se
+          - "no"
+          - nb
+          - nn
+          - ii
+          - oc
+          - oj
+          - or
+          - om
+          - os
+          - pi
+          - pa
+          - ps
+          - fa
+          - pl
+          - pt
+          - qu
+          - rm
+          - rn
+          - ru
+          - sm
+          - sg
+          - sa
+          - sc
+          - sr
+          - sn
+          - sd
+          - si
+          - sk
+          - sl
+          - so
+          - st
+          - nr
+          - es
+          - su
+          - sw
+          - ss
+          - sv
+          - tl
+          - ty
+          - tg
+          - ta
+          - tt
+          - te
+          - th
+          - bo
+          - ti
+          - to
+          - ts
+          - tn
+          - tr
+          - tk
+          - tw
+          - ug
+          - uk
+          - ur
+          - uz
+          - ve
+          - vi
+          - vo
+          - wa
+          - cy
+          - fy
+          - wo
+          - xh
+          - yi
+          - yo
+          - za
+          - zu
+        creators:
+          type: array
+          items:
+            $ref: "#/components/schemas/CreatorSaveDto"
+        database_id:
+          type: integer
+          format: int64
+          example: 1
+        query_id:
+          type: integer
+          format: int64
+        view_id:
+          type: integer
+          format: int64
+        table_id:
+          type: integer
+          format: int64
+        publication_day:
+          type: integer
+          format: int32
+          example: 15
+        publication_month:
+          type: integer
+          format: int32
+          example: 12
+        publication_year:
+          type: integer
+          format: int32
+          example: 2022
+        related_identifiers:
+          type: array
+          items:
+            $ref: "#/components/schemas/RelatedIdentifierSaveDto"
+    DatabaseCreateDto:
+      required:
+      - container_id
+      - is_public
+      - is_schema_public
+      - name
+      type: object
+      properties:
+        name:
+          type: string
+          example: Air Quality
+        container_id:
+          type: integer
+          format: int64
+          example: 1
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+    ViewCreateDto:
+      required:
+      - is_public
+      - is_schema_public
+      - name
+      - query
+      type: object
+      properties:
+        name:
+          maxLength: 63
+          minLength: 1
+          type: string
+          example: Air Quality
+        query:
+          type: string
+          example: SELECT `id` FROM `air_quality`
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+    ViewBriefDto:
+      required:
+      - database_id
+      - id
+      - internal_name
+      - name
+      - query
+      - query_hash
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        query:
+          type: string
+          example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC
+        database_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: air_quality
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+        initial_view:
+          type: boolean
+          description: True if it is the default view for the database
+          example: true
+        query_hash:
+          type: string
+          example: 7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916
+        owned_by:
+          type: string
+          format: uuid
+    ColumnCreateDto:
+      required:
+      - name
+      - null_allowed
+      - type
+      type: object
+      properties:
+        name:
+          type: string
+          example: Date
+        type:
+          type: string
+          example: string
+          enum:
+          - char
+          - varchar
+          - binary
+          - varbinary
+          - tinyblob
+          - tinytext
+          - text
+          - blob
+          - mediumtext
+          - mediumblob
+          - longtext
+          - longblob
+          - enum
+          - set
+          - serial
+          - bit
+          - tinyint
+          - bool
+          - smallint
+          - mediumint
+          - int
+          - bigint
+          - float
+          - double
+          - decimal
+          - date
+          - datetime
+          - timestamp
+          - time
+          - year
+        size:
+          type: integer
+          format: int64
+          example: 255
+        d:
+          type: integer
+          format: int64
+          example: 0
+        description:
+          maxLength: 2048
+          minLength: 0
+          type: string
+          example: Formatted as YYYY-MM-dd
+        enums:
+          type: array
+          description: "enum values, only considered when type = ENUM"
+          items:
+            type: string
+            description: "enum values, only considered when type = ENUM"
+        sets:
+          type: array
+          description: "set values, only considered when type = SET"
+          items:
+            type: string
+            description: "set values, only considered when type = SET"
+        index_length:
+          type: integer
+          format: int64
+        null_allowed:
+          type: boolean
+          example: true
+        concept_uri:
+          type: string
+        unit_uri:
+          type: string
+    ConstraintsCreateDto:
+      required:
+      - checks
+      - foreign_keys
+      - primary_key
+      - uniques
+      type: object
+      properties:
+        uniques:
+          type: array
+          items:
+            type: array
+            items:
+              type: string
+        checks:
+          uniqueItems: true
+          type: array
+          items:
+            type: string
+        foreign_keys:
+          type: array
+          items:
+            $ref: "#/components/schemas/ForeignKeyCreateDto"
+        primary_key:
+          uniqueItems: true
+          type: array
+          items:
+            type: string
+    ForeignKeyCreateDto:
+      required:
+      - columns
+      - referenced_columns
+      - referenced_table
+      type: object
+      properties:
+        columns:
+          type: array
+          items:
+            type: string
+        referenced_table:
+          type: string
+        referenced_columns:
+          type: array
+          items:
+            type: string
+        on_update:
+          type: string
+          enum:
+          - restrict
+          - cascade
+          - set_null
+          - no_action
+          - set_default
+        on_delete:
+          type: string
+          enum:
+          - restrict
+          - cascade
+          - set_null
+          - no_action
+          - set_default
+    TableCreateDto:
+      required:
+      - columns
+      - constraints
+      - is_public
+      - is_schema_public
+      - name
+      type: object
+      properties:
+        name:
+          maxLength: 64
+          minLength: 1
+          type: string
+          example: Air Quality
+        description:
+          maxLength: 180
+          minLength: 0
+          type: string
+          example: Air Quality in Austria
+        columns:
+          type: array
+          items:
+            $ref: "#/components/schemas/ColumnCreateDto"
+        constraints:
+          $ref: "#/components/schemas/ConstraintsCreateDto"
+        is_public:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+    ContainerCreateDto:
+      required:
+      - host
+      - image_id
+      - name
+      - privileged_password
+      - privileged_username
+      - quota
+      type: object
+      properties:
+        name:
+          type: string
+          example: Air Quality
+        host:
+          type: string
+          description: Hostname of container
+        port:
+          type: integer
+          description: Port of container
+          format: int32
+        quota:
+          type: integer
+          format: int64
+          example: 50
+        image_id:
+          type: integer
+          description: Image ID
+          format: int64
+        ui_host:
+          type: string
+        ui_port:
+          type: integer
+          format: int32
+        privileged_username:
+          type: string
+          description: Username of privileged user
+          example: root
+        privileged_password:
+          type: string
+          description: Password of privileged user
+    ContainerDto:
+      required:
+      - count
+      - id
+      - image
+      - internal_name
+      - name
+      - quota
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        image:
+          $ref: "#/components/schemas/ImageDto"
+        quota:
+          type: integer
+          format: int64
+          example: 50
+        count:
+          type: integer
+          format: int64
+          example: 10
+        last_retrieved:
+          type: string
+          format: date-time
+        internal_name:
+          type: string
+          example: data-db
+        ui_host:
+          type: string
+        ui_port:
+          type: integer
+          format: int32
+    ColumnBriefDto:
+      required:
+      - column_type
+      - database_id
+      - id
+      - internal_name
+      - name
+      - table_id
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: date
+        alias:
+          type: string
+        database_id:
+          type: integer
+          format: int64
+        table_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: mdb_date
+        column_type:
+          type: string
+          example: date
+          enum:
+          - char
+          - varchar
+          - binary
+          - varbinary
+          - tinyblob
+          - tinytext
+          - text
+          - blob
+          - mediumtext
+          - mediumblob
+          - longtext
+          - longblob
+          - enum
+          - set
+          - serial
+          - bit
+          - tinyint
+          - bool
+          - smallint
+          - mediumint
+          - int
+          - bigint
+          - float
+          - double
+          - decimal
+          - date
+          - datetime
+          - timestamp
+          - time
+          - year
+    UnitDto:
+      required:
+      - columns
+      - id
+      - uri
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        uri:
+          type: string
+        name:
+          type: string
+        description:
+          type: string
+        columns:
+          type: array
+          items:
+            $ref: "#/components/schemas/ColumnBriefDto"
+    OntologyBriefDto:
+      required:
+      - id
+      - prefix
+      - rdf
+      - sparql
+      - uri
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        uri:
+          type: string
+          example: http://www.wikidata.org/
+        prefix:
+          type: string
+          example: wd
+        sparql:
+          type: boolean
+          example: true
+        rdf:
+          type: boolean
+          example: false
+        uri_pattern:
+          type: string
+          example: http://www.wikidata.org/entity/.*
+    EntityDto:
+      required:
+      - label
+      - uri
+      type: object
+      properties:
+        uri:
+          type: string
+          example: https://www.wikidata.org/entity/Q1686799
+        label:
+          type: string
+          example: Apache Jena
+        description:
+          type: string
+          example: open source semantic web framework for Java
+    OaiListIdentifiersParameters:
+      type: object
+      properties:
+        metadataPrefix:
+          type: string
+        from:
+          type: string
+        until:
+          type: string
+        set:
+          type: string
+        resumptionToken:
+          type: string
+        fromDate:
+          type: string
+          format: date-time
+        untilDate:
+          type: string
+          format: date-time
+        parametersString:
+          type: string
+    BannerMessageDto:
+      required:
+      - id
+      - message
+      - type
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        type:
+          type: string
+          enum:
+          - error
+          - warning
+          - info
+        message:
+          type: string
+          example: Maintenance starts on 8am on Monday
+        link:
+          type: string
+          example: https://example.com
+        link_text:
+          type: string
+          example: More
+        display_start:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21Z
+        display_end:
+          type: string
+          format: date-time
+          example: 2021-03-12T15:26:21Z
+    ImageBriefDto:
+      required:
+      - default
+      - id
+      - jdbc_method
+      - name
+      - version
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: mariadb
+        version:
+          type: string
+          example: "10.5"
+        jdbc_method:
+          type: string
+          example: mariadb
+        default:
+          type: boolean
+          example: false
+    LdCreatorDto:
+      required:
+      - '@type'
+      - name
+      type: object
+      properties:
+        name:
+          type: string
+        sameAs:
+          type: string
+        givenName:
+          type: string
+        familyName:
+          type: string
+        '@type':
+          type: string
+    LdDatasetDto:
+      required:
+      - '@context'
+      - '@type'
+      - citation
+      - creator
+      - description
+      - hasPart
+      - identifier
+      - name
+      - temporalCoverage
+      - url
+      - version
+      type: object
+      properties:
+        name:
+          type: string
+        description:
+          type: string
+        url:
+          type: string
+        identifier:
+          type: array
+          items:
+            type: string
+        license:
+          type: string
+        creator:
+          type: array
+          items:
+            $ref: "#/components/schemas/LdCreatorDto"
+        citation:
+          type: string
+        hasPart:
+          type: array
+          items:
+            $ref: "#/components/schemas/LdDatasetDto"
+        temporalCoverage:
+          type: string
+        version:
+          type: string
+          format: date-time
+        '@context':
+          type: string
+        '@type':
+          type: string
+    ConstraintsDto:
+      type: object
+      properties:
+        uniques:
+          type: array
+          items:
+            $ref: "#/components/schemas/UniqueDto"
+        checks:
+          uniqueItems: true
+          type: array
+          items:
+            type: string
+        foreign_keys:
+          type: array
+          items:
+            $ref: "#/components/schemas/ForeignKeyDto"
+        primary_key:
+          uniqueItems: true
+          type: array
+          items:
+            $ref: "#/components/schemas/PrimaryKeyDto"
+    ForeignKeyBriefDto:
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+    ForeignKeyDto:
+      required:
+      - name
+      - referenced_table
+      - references
+      - table
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+        references:
+          type: array
+          items:
+            $ref: "#/components/schemas/ForeignKeyReferenceDto"
+        table:
+          $ref: "#/components/schemas/TableBriefDto"
+        referenced_table:
+          $ref: "#/components/schemas/TableBriefDto"
+        on_update:
+          type: string
+          enum:
+          - restrict
+          - cascade
+          - set_null
+          - no_action
+          - set_default
+        on_delete:
+          type: string
+          enum:
+          - restrict
+          - cascade
+          - set_null
+          - no_action
+          - set_default
+    ForeignKeyReferenceDto:
+      required:
+      - column
+      - foreign_key
+      - referenced_column
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        column:
+          $ref: "#/components/schemas/ColumnBriefDto"
+        foreign_key:
+          $ref: "#/components/schemas/ForeignKeyBriefDto"
+        referenced_column:
+          $ref: "#/components/schemas/ColumnBriefDto"
+    PrimaryKeyDto:
+      required:
+      - column
+      - table
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        table:
+          $ref: "#/components/schemas/TableBriefDto"
+        column:
+          $ref: "#/components/schemas/ColumnBriefDto"
+    TableDto:
+      required:
+      - columns
+      - constraints
+      - database_id
+      - id
+      - internal_name
+      - is_public
+      - is_schema_public
+      - is_versioned
+      - name
+      - owner
+      - queue_name
+      - routing_key
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+          example: Air Quality
+        alias:
+          type: string
+        identifiers:
+          type: array
+          items:
+            $ref: "#/components/schemas/IdentifierDto"
+        owner:
+          $ref: "#/components/schemas/UserBriefDto"
+        description:
+          maxLength: 2048
+          minLength: 0
+          type: string
+          example: Air Quality in Austria
+        columns:
+          type: array
+          items:
+            $ref: "#/components/schemas/ColumnDto"
+        constraints:
+          $ref: "#/components/schemas/ConstraintsDto"
+        last_retrieved:
+          type: string
+          format: date-time
+        database_id:
+          type: integer
+          format: int64
+        internal_name:
+          type: string
+          example: air_quality
+        is_versioned:
+          type: boolean
+          example: true
+        is_schema_public:
+          type: boolean
+          example: true
+        queue_name:
+          type: string
+          example: air_quality
+        queue_type:
+          type: string
+          example: quorum
+        routing_key:
+          type: string
+          example: dbrepo.1.2
+        is_public:
+          type: boolean
+          example: true
+        num_rows:
+          type: integer
+          format: int64
+          example: 5
+        data_length:
+          type: integer
+          description: in bytes
+          format: int64
+          example: 16384
+        max_data_length:
+          type: integer
+          description: in bytes
+          format: int64
+          example: 0
+        avg_row_length:
+          type: integer
+          description: in bytes
+          format: int64
+          example: 3276
+    UniqueDto:
+      required:
+      - columns
+      - id
+      - name
+      - table
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        name:
+          type: string
+        table:
+          $ref: "#/components/schemas/TableBriefDto"
+        columns:
+          type: array
+          items:
+            $ref: "#/components/schemas/ColumnDto"
+    TableColumnEntityDto:
+      required:
+      - column_id
+      - database_id
+      - table_id
+      - uri
+      type: object
+      properties:
+        uri:
+          type: string
+          example: https://www.wikidata.org/entity/Q1686799
+        label:
+          type: string
+          example: Apache Jena
+        description:
+          type: string
+          example: open source semantic web framework for Java
+        database_id:
+          type: integer
+          format: int64
+          example: 1
+        table_id:
+          type: integer
+          format: int64
+          example: 1
+        column_id:
+          type: integer
+          format: int64
+          example: 1
+    ContainerBriefDto:
+      required:
+      - count
+      - hash
+      - id
+      - image
+      - internal_name
+      - name
+      - quota
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        hash:
+          type: string
+          example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50
+        name:
+          type: string
+          example: Air Quality
+        image:
+          $ref: "#/components/schemas/ImageBriefDto"
+        quota:
+          type: integer
+          format: int32
+          example: 50
+        count:
+          type: integer
+          format: int32
+          example: 10
+        internal_name:
+          type: string
+          example: air-quality
+    ConceptDto:
+      required:
+      - columns
+      - id
+      - uri
+      type: object
+      properties:
+        id:
+          type: integer
+          format: int64
+        uri:
+          type: string
+        name:
+          type: string
+        description:
+          type: string
+        columns:
+          type: array
+          items:
+            $ref: "#/components/schemas/ColumnBriefDto"
+  securitySchemes:
+    basicAuth:
+      type: http
+      scheme: basic
+    bearerAuth:
+      type: http
+      scheme: bearer
+      bearerFormat: JWT
-- 
GitLab