From 3ff3644f3c531ed468324f0808c95b811f0ca857 Mon Sep 17 00:00:00 2001 From: Martin Weise <martin.weise@tuwien.ac.at> Date: Mon, 27 May 2024 14:17:26 +0000 Subject: [PATCH] Dev --- .docs/.prometheus/metrics-generate.sh | 4 + .docs/.swagger/api-analyse.yaml | 205 - .docs/.swagger/api-data.yaml | 3118 ------- .docs/.swagger/api-metadata.yaml | 7396 ----------------- .docs/.swagger/api-search.yaml | 385 - .docs/.swagger/api-sidecar.yaml | 106 - .docs/.swagger/api-upload.yaml | 30 - .docs/.swagger/api.base.yaml | 30 + .docs/.swagger/api.yaml | 3874 +++++++++ .docs/.swagger/custom.css | 4 + .docs/.swagger/swagger-generate.sh | 2 +- .docs/.swagger/swagger-site.sh | 24 +- .docs/.swagger/swagger-ui.html | 16 +- .../analyse-service.md} | 2 - .../auth-service.md} | 4 +- .../broker-service.md} | 6 +- .../data-db.md} | 6 +- .../data-service.md} | 4 - .../gateway-service.md} | 2 - .docs/{usage-overview.md => api/index.md} | 0 .docs/api/metadata-db.md | 5 + .../metadata-service.md} | 2 - .docs/api/open-api.md | 7 + .docs/{usage-python.md => api/python.md} | 8 +- .../search-service.md} | 10 +- .../storage-service.md} | 6 - .docs/{system-other-ui.md => api/ui.md} | 29 +- .../upload-service.md} | 4 +- .docs/concepts/authentication.md | 15 + .docs/concepts/databases.md | 33 + .docs/concepts/index.md | 16 + .docs/concepts/messaging.md | 15 + .docs/concepts/monitoring.md | 136 + .docs/concepts/pid.md | 7 + .docs/concepts/search.md | 13 + .docs/concepts/storage.md | 15 + .docs/concepts/ui.md | 21 + .docs/{dev-guide-app.md => contributing.md} | 15 +- .docs/deployment-helm.md | 2 + .docs/dev-guide-infra.md | 78 - .docs/dev-overview.md | 21 - .docs/examples/covid19.md | 21 + .docs/examples/influenza.md | 21 + .docs/examples/manufacturing.md | 19 + .docs/examples/power.md | 21 + .docs/examples/transportation.md | 11 + .docs/help.md | 11 + .docs/images/logos.png | Bin 0 -> 32796 bytes .docs/images/logos.psd | Bin 1125499 -> 1208810 bytes .docs/index.md | 65 +- .docs/migration.md | 5 + .docs/operation-actuator.md | 9 - .docs/operation-prometheus.md | 9 - .../extra.scssc | Bin 9822 -> 10506 bytes .docs/stylesheets/extra.css | 21 +- .docs/stylesheets/extra.css.map | 2 +- .docs/stylesheets/extra.scss | 19 +- .docs/system-databases-authentication.md | 33 - .docs/system-databases-metadata.md | 37 - .docs/system-databases-search.md | 45 - .docs/system-other-search-dashboard.md | 38 - .docs/system-overview.md | 27 - .docs/why.md | 50 + .gitignore | 3 +- .gitlab-ci.yml | 44 +- {.trivy => .gitlab}/gitlab.tpl | 0 bin/teardown.sh | 26 - dbrepo-analyse-service/Pipfile | 2 +- dbrepo-analyse-service/Pipfile.lock | 248 +- dbrepo-analyse-service/app.py | 7 +- dbrepo-analyse-service/clients/s3_client.py | 7 +- .../lib/dbrepo-1.4.3-py3-none-any.whl | Bin 27029 -> 27105 bytes .../lib/dbrepo-1.4.3.tar.gz | Bin 37117 -> 37342 bytes .../lib/dbrepo-1.4.4-py3-none-any.whl | Bin 0 -> 27104 bytes .../lib/dbrepo-1.4.4.tar.gz | Bin 0 -> 37351 bytes dbrepo-analyse-service/metrics.md | 6 + dbrepo-auth-service/dbrepo-realm.json | 50 +- dbrepo-data-db/sidecar/app.py | 12 +- dbrepo-data-db/sidecar/clients/s3_client.py | 19 +- dbrepo-data-db/sidecar/metrics.md | 4 + dbrepo-data-service/metrics.md | 17 + dbrepo-data-service/pom.xml | 2 +- dbrepo-data-service/querystore/pom.xml | 4 +- dbrepo-data-service/report/pom.xml | 4 +- dbrepo-data-service/rest-service/pom.xml | 6 +- .../at/tuwien/endpoints/AccessEndpoint.java | 64 +- .../at/tuwien/endpoints/DatabaseEndpoint.java | 42 +- .../at/tuwien/endpoints/SubsetEndpoint.java | 148 +- .../at/tuwien/endpoints/TableEndpoint.java | 256 +- .../at/tuwien/endpoints/ViewEndpoint.java | 152 +- .../tuwien/handlers/ApiExceptionHandler.java | 22 +- .../src/main/resources/application-local.yml | 4 + .../src/main/resources/application.yml | 6 +- .../endpoint/SubsetEndpointUnitTest.java | 2 +- .../endpoint/TableEndpointUnitTest.java | 21 +- .../tuwien/endpoint/ViewEndpointUnitTest.java | 36 +- .../at/tuwien/mvc/OpenApiEndpointMvcTest.java | 4 +- .../tuwien/mvc/PrometheusEndpointMvcTest.java | 87 +- .../service/SchemaServiceIntegrationTest.java | 143 + .../service/TableServiceIntegrationTest.java | 66 + .../service/ViewServiceIntegrationTest.java | 40 +- .../src/test/resources/init/weather.sql | 23 +- dbrepo-data-service/services/pom.xml | 6 +- .../java/at/tuwien/config/QueryConfig.java | 9 + .../main/java/at/tuwien/config/S3Config.java | 3 + .../exception/DatabaseMalformedException.java | 2 +- .../exception/QueryStoreCreateException.java | 2 +- .../exception/QueryStoreInsertException.java | 2 +- .../exception/QueryStorePersistException.java | 2 +- .../exception/TableSchemaException.java | 21 + .../tuwien/exception/ViewSchemaException.java | 21 + .../at/tuwien/listener/DefaultListener.java | 2 + .../java/at/tuwien/mapper/MariaDbMapper.java | 312 +- .../java/at/tuwien/mapper/MetadataMapper.java | 10 + .../at/tuwien/service/DatabaseService.java | 3 +- .../java/at/tuwien/service/SchemaService.java | 9 +- .../java/at/tuwien/service/TableService.java | 9 +- .../java/at/tuwien/service/ViewService.java | 16 +- .../impl/DatabaseServiceMariaDbImpl.java | 10 +- .../service/impl/HibernateConnector.java | 1 - .../impl/QueueServiceRabbitMqImpl.java | 2 - .../impl/SchemaServiceMariaDbImpl.java | 146 +- .../impl/SubsetServiceMariaDbImpl.java | 8 +- .../service/impl/TableServiceMariaDbImpl.java | 62 +- .../service/impl/ViewServiceMariaDbImpl.java | 106 +- dbrepo-metadata-db/setup-schema.sql | 89 +- dbrepo-metadata-service/api/pom.xml | 4 +- .../internal/PrivilegedContainerDto.java | 6 +- .../tuwien/api/database/DatabaseBriefDto.java | 59 + .../at/tuwien/api/database/ViewColumnDto.java | 89 + .../at/tuwien/api/database/ViewCreateDto.java | 8 +- .../java/at/tuwien/api/database/ViewDto.java | 5 +- .../database/internal/PrivilegedViewDto.java | 3 +- .../api/database/table/TableBriefDto.java | 19 +- .../tuwien/api/database/table/TableDto.java | 2 + .../table/columns/ColumnCreateDto.java | 5 + .../api/database/table/columns/ColumnDto.java | 9 + .../constraints/ConstraintsCreateDto.java | 2 +- .../table/constraints/ConstraintsDto.java | 5 +- .../ForeignKeyCreateDto.java | 2 +- .../ForeignKeyDto.java | 29 +- .../foreign/ForeignKeyReferenceDto.java | 32 + .../ReferenceTypeDto.java | 2 +- .../constraints/primary/PrimaryKeyDto.java | 27 + .../table/constraints/unique/UniqueDto.java | 8 +- dbrepo-metadata-service/entities/pom.xml | 4 +- .../tuwien/entities/container/Container.java | 6 +- .../container/image/ContainerImage.java | 2 +- .../container/image/ContainerImageDate.java | 8 +- .../at/tuwien/entities/database/Database.java | 2 +- .../at/tuwien/entities/database/View.java | 27 +- .../tuwien/entities/database/ViewColumn.java | 50 +- .../tuwien/entities/database/table/Table.java | 44 +- .../database/table/columns/TableColumn.java | 20 +- .../constraints/foreignKey/ForeignKey.java | 2 - .../foreignKey/ForeignKeyReference.java | 6 +- .../table/constraints/unique/Unique.java | 1 + dbrepo-metadata-service/metrics.md | 67 + dbrepo-metadata-service/oai/pom.xml | 24 +- dbrepo-metadata-service/pom.xml | 8 +- dbrepo-metadata-service/report/pom.xml | 4 +- dbrepo-metadata-service/repositories/pom.xml | 4 +- .../CredentialsInvalidException.java | 2 +- .../java/at/tuwien/mapper/DatabaseMapper.java | 6 +- .../java/at/tuwien/mapper/QueryMapper.java | 196 - .../java/at/tuwien/mapper/TableMapper.java | 52 +- .../java/at/tuwien/mapper/ViewMapper.java | 27 +- .../repository/ContainerRepository.java | 1 + dbrepo-metadata-service/rest-service/pom.xml | 4 +- .../at/tuwien/endpoints/AccessEndpoint.java | 8 +- .../at/tuwien/endpoints/ConceptEndpoint.java | 2 +- .../tuwien/endpoints/ContainerEndpoint.java | 9 +- .../at/tuwien/endpoints/DatabaseEndpoint.java | 182 +- .../tuwien/endpoints/IdentifierEndpoint.java | 76 +- .../at/tuwien/endpoints/ImageEndpoint.java | 10 +- .../at/tuwien/endpoints/LicenseEndpoint.java | 2 +- .../at/tuwien/endpoints/MessageEndpoint.java | 10 +- .../at/tuwien/endpoints/MetadataEndpoint.java | 10 +- .../at/tuwien/endpoints/OntologyEndpoint.java | 21 +- .../at/tuwien/endpoints/TableEndpoint.java | 92 +- .../at/tuwien/endpoints/UnitEndpoint.java | 2 +- .../at/tuwien/endpoints/UserEndpoint.java | 93 +- .../at/tuwien/endpoints/ViewEndpoint.java | 24 +- .../tuwien/handlers/ApiExceptionHandler.java | 2 +- .../src/main/resources/application-local.yml | 4 +- .../endpoints/DatabaseEndpointUnitTest.java | 4 +- .../at/tuwien/mvc/OpenApiEndpointMvcTest.java | 9 +- .../tuwien/mvc/PrometheusEndpointMvcTest.java | 197 +- .../service/ConceptServiceUnitTest.java | 6 +- ...aCiteIdentifierServicePersistenceTest.java | 8 - .../DatabaseServicePersistenceTest.java | 33 +- .../service/DatabaseServiceUnitTest.java | 2 +- ....java => ImageServicePersistenceTest.java} | 5 +- .../tuwien/service/ImageServiceUnitTest.java | 2 +- .../service/TableServicePersistenceTest.java | 17 +- .../tuwien/service/TableServiceUnitTest.java | 4 +- .../service/ViewServicePersistenceTest.java | 68 + .../tuwien/service/ViewServiceUnitTest.java | 5 +- .../src/test/resources/init/weather.sql | 38 +- dbrepo-metadata-service/services/pom.xml | 4 +- .../at/tuwien/gateway/DataServiceGateway.java | 9 +- .../impl/BrokerServiceGatewayImpl.java | 2 - .../gateway/impl/DataServiceGatewayImpl.java | 83 +- .../impl/SearchServiceGatewayImpl.java | 40 +- .../at/tuwien/service/DatabaseService.java | 8 + .../service/impl/DatabaseServiceImpl.java | 111 +- .../tuwien/service/impl/ViewServiceImpl.java | 15 +- dbrepo-metadata-service/test/pom.xml | 4 +- .../java/at/tuwien/test/AbstractUnitTest.java | 24 +- .../main/java/at/tuwien/test/BaseTest.java | 2462 +++--- dbrepo-search-service/Pipfile | 2 +- dbrepo-search-service/Pipfile.lock | 152 +- dbrepo-search-service/app.py | 8 + .../lib/dbrepo-1.4.3-py3-none-any.whl | Bin 27029 -> 27105 bytes dbrepo-search-service/lib/dbrepo-1.4.3.tar.gz | Bin 37117 -> 37342 bytes .../lib/dbrepo-1.4.4-py3-none-any.whl | Bin 0 -> 27104 bytes dbrepo-search-service/lib/dbrepo-1.4.4.tar.gz | Bin 0 -> 37351 bytes dbrepo-search-service/metrics.md | 8 + dbrepo-ui/components/subset/SubsetList.vue | 12 +- dbrepo-ui/components/table/TableList.vue | 2 +- dbrepo-ui/components/view/ViewList.vue | 4 - dbrepo-ui/composables/axios-instance.ts | 11 +- dbrepo-ui/composables/database-service.ts | 34 + dbrepo-ui/composables/query-service.ts | 4 +- dbrepo-ui/composables/table-service.ts | 4 +- dbrepo-ui/composables/user-service.ts | 2 - dbrepo-ui/composables/view-service.ts | 4 +- dbrepo-ui/locales/de-AT.json | 28 +- dbrepo-ui/locales/en-US.json | 26 +- .../pages/database/[database_id]/settings.vue | 50 + .../[database_id]/table/[table_id]/schema.vue | 11 +- dbrepo-ui/pages/user/info.vue | 10 +- dbrepo-ui/utils/index.ts | 9 + docker-compose.yml | 13 +- helm/dbrepo/Chart.yaml | 4 +- helm/dbrepo/Makefile | 2 +- helm/dbrepo/README.md | 61 +- helm/dbrepo/templates/data-secret.yaml | 10 +- helm/dbrepo/templates/metadata-configmap.yaml | 5 +- helm/dbrepo/values.schema.json | 21 + helm/dbrepo/values.yaml | 36 +- .../{build-website.sh => build-site.sh} | 4 +- lib/python/dbrepo/RestClient.py | 131 +- lib/python/dbrepo/api/dto.py | 23 + lib/python/docs/conf.py | 2 +- lib/python/docs/index.rst | 2 +- lib/python/package.sh | 5 - lib/python/pyproject.toml | 2 +- lib/python/setup.py | 2 +- make/gen.mk | 2 +- mkdocs.yml | 75 +- versions.json | 7 +- 252 files changed, 9542 insertions(+), 14406 deletions(-) create mode 100755 .docs/.prometheus/metrics-generate.sh delete mode 100644 .docs/.swagger/api-analyse.yaml delete mode 100644 .docs/.swagger/api-data.yaml delete mode 100644 .docs/.swagger/api-metadata.yaml delete mode 100644 .docs/.swagger/api-search.yaml delete mode 100644 .docs/.swagger/api-sidecar.yaml delete mode 100644 .docs/.swagger/api-upload.yaml create mode 100644 .docs/.swagger/api.base.yaml create mode 100644 .docs/.swagger/api.yaml rename .docs/{system-services-analyse.md => api/analyse-service.md} (99%) rename .docs/{system-services-authentication.md => api/auth-service.md} (99%) rename .docs/{system-services-broker.md => api/broker-service.md} (96%) rename .docs/{system-databases-data.md => api/data-db.md} (97%) rename .docs/{system-services-data.md => api/data-service.md} (90%) rename .docs/{system-services-gateway.md => api/gateway-service.md} (99%) rename .docs/{usage-overview.md => api/index.md} (100%) create mode 100644 .docs/api/metadata-db.md rename .docs/{system-services-metadata.md => api/metadata-service.md} (99%) create mode 100644 .docs/api/open-api.md rename .docs/{usage-python.md => api/python.md} (95%) rename .docs/{system-services-search.md => api/search-service.md} (92%) rename .docs/{system-services-storage.md => api/storage-service.md} (95%) rename .docs/{system-other-ui.md => api/ui.md} (75%) rename .docs/{system-services-upload.md => api/upload-service.md} (95%) create mode 100644 .docs/concepts/authentication.md create mode 100644 .docs/concepts/databases.md create mode 100644 .docs/concepts/index.md create mode 100644 .docs/concepts/messaging.md create mode 100644 .docs/concepts/monitoring.md create mode 100644 .docs/concepts/pid.md create mode 100644 .docs/concepts/search.md create mode 100644 .docs/concepts/storage.md create mode 100644 .docs/concepts/ui.md rename .docs/{dev-guide-app.md => contributing.md} (91%) delete mode 100644 .docs/dev-guide-infra.md delete mode 100644 .docs/dev-overview.md create mode 100644 .docs/examples/covid19.md create mode 100644 .docs/examples/influenza.md create mode 100644 .docs/examples/manufacturing.md create mode 100644 .docs/examples/power.md create mode 100644 .docs/examples/transportation.md create mode 100644 .docs/help.md create mode 100644 .docs/images/logos.png create mode 100644 .docs/migration.md delete mode 100644 .docs/operation-actuator.md delete mode 100644 .docs/operation-prometheus.md delete mode 100644 .docs/system-databases-authentication.md delete mode 100644 .docs/system-databases-metadata.md delete mode 100644 .docs/system-databases-search.md delete mode 100644 .docs/system-other-search-dashboard.md delete mode 100644 .docs/system-overview.md create mode 100644 .docs/why.md rename {.trivy => .gitlab}/gitlab.tpl (100%) delete mode 100755 bin/teardown.sh create mode 100644 dbrepo-analyse-service/lib/dbrepo-1.4.4-py3-none-any.whl create mode 100644 dbrepo-analyse-service/lib/dbrepo-1.4.4.tar.gz create mode 100644 dbrepo-analyse-service/metrics.md create mode 100644 dbrepo-data-db/sidecar/metrics.md create mode 100644 dbrepo-data-service/metrics.md create mode 100644 dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java create mode 100644 dbrepo-data-service/services/src/main/java/at/tuwien/exception/TableSchemaException.java create mode 100644 dbrepo-data-service/services/src/main/java/at/tuwien/exception/ViewSchemaException.java create mode 100644 dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseBriefDto.java create mode 100644 dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewColumnDto.java rename dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/{foreignKey => foreign}/ForeignKeyCreateDto.java (91%) rename dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/{foreignKey => foreign}/ForeignKeyDto.java (54%) create mode 100644 dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreign/ForeignKeyReferenceDto.java rename dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/{foreignKey => foreign}/ReferenceTypeDto.java (90%) create mode 100644 dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/primary/PrimaryKeyDto.java create mode 100644 dbrepo-metadata-service/metrics.md delete mode 100644 dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java rename dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/{ImageServiceIntegrationTest.java => ImageServicePersistenceTest.java} (92%) create mode 100644 dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceTest.java create mode 100644 dbrepo-search-service/lib/dbrepo-1.4.4-py3-none-any.whl create mode 100644 dbrepo-search-service/lib/dbrepo-1.4.4.tar.gz create mode 100644 dbrepo-search-service/metrics.md rename lib/python/{build-website.sh => build-site.sh} (54%) diff --git a/.docs/.prometheus/metrics-generate.sh b/.docs/.prometheus/metrics-generate.sh new file mode 100755 index 0000000000..2e78c1cef1 --- /dev/null +++ b/.docs/.prometheus/metrics-generate.sh @@ -0,0 +1,4 @@ +#!/bin/bash +mvn -f ./dbrepo-metadata-service/pom.xml install +mvn -f ./dbrepo-data-service/pom.xml -pl rest-service -Dtest="PrometheusEndpointMvcTest" test +mvn -f ./dbrepo-metadata-service/pom.xml -pl rest-service -Dtest="PrometheusEndpointMvcTest" test diff --git a/.docs/.swagger/api-analyse.yaml b/.docs/.swagger/api-analyse.yaml deleted file mode 100644 index 211d54bd15..0000000000 --- a/.docs/.swagger/api-analyse.yaml +++ /dev/null @@ -1,205 +0,0 @@ -components: - 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/__APPVERSION__/ -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: __APPVERSION__ -openapi: 3.0.0 -paths: - /api/analyse/database/{database_id}/table/{table_id}/statistics: - get: - operationId: analyse_table_stat - parameters: - - example: 1 - in: path - name: database_id - required: true - schema: - format: int64 - type: integer - - example: 1 - in: path - name: table_id - required: true - schema: - format: int64 - type: integer - responses: - '202': - content: - application/json: - schema: - $ref: '#/components/schemas/TableStats' - description: Determined statistics - '400': - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorDto' - description: Missing parameters - '404': - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorDto' - description: Table not found - security: - - bearerAuth: [] - - basicAuth: [] - summary: Determine table statistics - tags: - - analyse-endpoint - /api/analyse/datatypes: - get: - consumes: - - application/json - description: This is a simple API which returns the datatypes of a (path) csv - file - 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/DataTypesDto' - 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 - summary: Determine datatypes - tags: - - analyse-endpoint - /api/analyse/keys: - get: - consumes: - - application/json - description: This is a simple API which returns the primary keys + ranking of - a (path) csv file - 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 - summary: Determine primary keys - tags: - - analyse-endpoint - /health: - get: - consumes: - - application/json - description: This is a simple API which checks if the application is healthy - produces: - - application/json - responses: - '200': - description: OK - schema: - properties: - status: - example: UP - type: string - type: object - summary: Check if application is running - tags: - - health-endpoint -servers: - - description: Generated server url - url: http://localhost:5000 - - description: Sandbox - url: https://test.dbrepo.tuwien.ac.at diff --git a/.docs/.swagger/api-data.yaml b/.docs/.swagger/api-data.yaml deleted file mode 100644 index 662cecc317..0000000000 --- a/.docs/.swagger/api-data.yaml +++ /dev/null @@ -1,3118 +0,0 @@ -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.4.3 -externalDocs: - description: Sourcecode Documentation - url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.3/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 - 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: - "200": - description: Returned view data - content: - application/json: - schema: - $ref: '#/components/schemas/QueryResultDto' - security: - - basicAuth: [] - - bearerAuth: [] - head: - tags: - - view-endpoint - summary: Get 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: - "200": - description: Returned view data - content: - application/json: - schema: - $ref: '#/components/schemas/QueryResultDto' - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/table/{tableId}/data: - get: - tags: - - table-endpoint - summary: Find table data - 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: - "200": - description: Found table data - content: - application/json: - schema: - $ref: '#/components/schemas/QueryResultDto' - security: - - basicAuth: [] - - bearerAuth: [] - put: - tags: - - table-endpoint - summary: Update table data - operationId: updateTuple - 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/TupleUpdateDto' - required: true - responses: - "202": - description: Updated table data - security: - - basicAuth: [] - - bearerAuth: [] - post: - tags: - - table-endpoint - summary: Create table data - operationId: createTuple - 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/TupleDto' - required: true - responses: - "201": - description: Created table data - security: - - basicAuth: [] - - bearerAuth: [] - delete: - tags: - - table-endpoint - summary: Delete table data - operationId: deleteTuple - 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/TupleDeleteDto' - required: true - responses: - "202": - description: Deleted table data - security: - - basicAuth: [] - - bearerAuth: [] - head: - tags: - - table-endpoint - summary: Find table data - 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: - "200": - description: Found table data - content: - application/json: - schema: - $ref: '#/components/schemas/QueryResultDto' - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/subset/{subsetId}/data: - get: - tags: - - subset-endpoint - summary: Re-execute some query - 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: - "200": - description: Get subset data - content: - application/json: - schema: - $ref: '#/components/schemas/QueryResultDto' - security: - - bearerAuth: [] - - basicAuth: [] - head: - tags: - - subset-endpoint - summary: Re-execute some query - 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: - "200": - description: Get subset data - content: - application/json: - schema: - $ref: '#/components/schemas/QueryResultDto' - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}: - put: - tags: - - database-endpoint - summary: Update user password in database - operationId: update - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/UpdateUserPasswordDto' - required: true - responses: - "202": - description: Created a new database - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseDto' - "400": - description: Database create query is malformed or image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - basicAuth: [] - /api/database/{databaseId}/subset/{queryId}: - put: - tags: - - subset-endpoint - summary: Persist some 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: - "202": - description: Persist query successful - content: - application/json: - schema: - $ref: '#/components/schemas/QueryDto' - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/access/{userId}: - put: - tags: - - access-endpoint - summary: Modify access to some database - operationId: update_1 - 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' - "400": - description: Modify access query or database connection is malformed - 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' - "403": - description: Modify access not permitted when no access is granted in the - first place - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Modify access succeeded - security: - - basicAuth: [] - post: - tags: - - access-endpoint - summary: Give access to some database - operationId: create_4 - 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: - "202": - description: Granting access succeeded - "404": - description: Database or user not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Granting access not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Failed giving access - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Granting access query or database connection is malformed - 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' - security: - - basicAuth: [] - delete: - tags: - - access-endpoint - summary: Revoke access to some database - 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: - "202": - description: Revoked access successfully - "400": - description: Modify access query or database connection is malformed - 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' - "403": - description: Revoke of access not permitted as no access was found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - basicAuth: [] - /api/database: - post: - tags: - - database-endpoint - summary: Create database - operationId: create - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/CreateDatabaseDto' - required: true - responses: - "201": - description: Created a new database - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseDto' - "400": - description: Database create query is malformed or image is not supported - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - basicAuth: [] - /api/database/{databaseId}/view: - post: - tags: - - view-endpoint - summary: Create view - operationId: create_1 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ViewCreateDto' - required: true - responses: - "202": - description: Created a new view - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseDto' - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/table: - post: - tags: - - table-endpoint - summary: Create table - operationId: create_2 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/TableCreateDto' - required: true - responses: - "202": - description: Created a new table - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseDto' - security: - - basicAuth: [] - /api/database/{databaseId}/table/{tableId}/data/import: - post: - tags: - - table-endpoint - summary: Insert data from csv - operationId: importData - 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/ImportCsvDto' - required: true - responses: - "202": - description: Import successfully - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/subset: - get: - tags: - - subset-endpoint - summary: Find subsets - operationId: findAllById - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: persisted - in: query - required: false - schema: - type: boolean - responses: - "200": - description: Found subsets - content: - application/json: - schema: - type: string - security: - - basicAuth: [] - - bearerAuth: [] - post: - tags: - - subset-endpoint - summary: Create subset - operationId: create_3 - parameters: - - name: databaseId - 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 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ExecuteStatementDto' - required: true - responses: - "201": - description: Created subset - content: - application/json: - schema: - $ref: '#/components/schemas/QueryResultDto' - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/table/{tableId}/history: - get: - tags: - - table-endpoint - summary: Find table history - 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 - responses: - "200": - description: Found table history - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseDto' - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/table/{tableId}/export: - get: - tags: - - table-endpoint - summary: Export table data - operationId: exportData - 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: - "200": - description: Exported table data - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseDto' - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/subset/{subsetId}: - get: - tags: - - subset-endpoint - summary: Find subset - 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: timestamp - in: query - required: false - schema: - type: string - format: date-time - responses: - "200": - description: Found subset - content: - '*/*': - schema: - type: object - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/view/{viewId}: - delete: - tags: - - view-endpoint - summary: Delete view in database - operationId: delete - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: viewId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "201": - description: Deleted table - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseDto' - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/table/{tableId}: - delete: - tags: - - table-endpoint - summary: Delete table in database - operationId: delete_1 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - - name: tableId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "201": - description: Deleted table - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseDto' - security: - - basicAuth: [] -components: - schemas: - QueryResultDto: - required: - - headers - - id - - result - type: object - properties: - result: - type: array - items: - type: object - additionalProperties: - type: object - headers: - type: array - items: - type: object - additionalProperties: - type: integer - format: int32 - id: - type: integer - format: int64 - UpdateUserPasswordDto: - required: - - password - - username - type: object - properties: - username: - type: string - password: - type: string - 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 - - bit - - tinyint - - bool - - smallint - - mediumint - - int - - bigint - - float - - double - - decimal - - date - - datetime - - timestamp - - time - - year - ColumnDto: - required: - - auto_generated - - column_type - - database_id - - id - - internal_name - - is_null_allowed - - is_public - - name - - ordinal_position - - table_id - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Date - alias: - type: string - 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/ConceptDto' - unit: - $ref: '#/components/schemas/UnitDto' - table: - $ref: '#/components/schemas/TableDto' - views: - type: array - items: - $ref: '#/components/schemas/ViewDto' - enums: - type: array - items: - type: string - sets: - type: array - items: - type: string - database_id: - type: integer - format: int64 - table_id: - type: integer - format: int64 - ordinal_position: - type: integer - format: int32 - example: 0 - internal_name: - type: string - example: mdb_date - date_format: - $ref: '#/components/schemas/ImageDateDto' - auto_generated: - type: boolean - example: false - index_length: - type: integer - format: int64 - length: - type: integer - format: int64 - column_type: - type: string - example: string - enum: - - char - - varchar - - binary - - varbinary - - tinyblob - - tinytext - - text - - blob - - mediumtext - - mediumblob - - longtext - - longblob - - enum - - set - - 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_public: - type: boolean - example: true - is_null_allowed: - type: boolean - example: false - ConceptDto: - required: - - columns - - created - - id - - uri - type: object - properties: - id: - type: integer - format: int64 - uri: - type: string - name: - type: string - description: - type: string - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - 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: - type: string - ContainerDto: - required: - - created - - host - - id - - image - - internal_name - - name - - sidecar_host - - sidecar_port - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - host: - type: string - port: - type: integer - format: int32 - image: - $ref: '#/components/schemas/ImageDto' - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - internal_name: - type: string - example: data-db - sidecar_host: - type: string - sidecar_port: - type: integer - format: int32 - ui_host: - type: string - ui_port: - type: integer - format: int32 - 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/ - DatabaseAccessDto: - required: - - created - - type - - user - type: object - properties: - user: - $ref: '#/components/schemas/UserDto' - type: - type: string - enum: - - read - - write_own - - write_all - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - DatabaseDto: - required: - - contact - - container - - created - - creator - - exchange_name - - id - - internal_name - - is_public - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality - tables: - type: array - items: - $ref: '#/components/schemas/TableDto' - views: - type: array - items: - $ref: '#/components/schemas/ViewDto' - container: - $ref: '#/components/schemas/ContainerDto' - accesses: - type: array - items: - $ref: '#/components/schemas/DatabaseAccessDto' - identifiers: - type: array - items: - $ref: '#/components/schemas/IdentifierDto' - subsets: - type: array - items: - $ref: '#/components/schemas/IdentifierDto' - creator: - $ref: '#/components/schemas/UserDto' - contact: - $ref: '#/components/schemas/UserDto' - owner: - $ref: '#/components/schemas/UserDto' - image: - type: array - items: - type: string - format: byte - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - 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 - ForeignKeyDto: - type: object - properties: - name: - type: string - columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - referenced_table: - $ref: '#/components/schemas/TableBriefDto' - referenced_columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - 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 - 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: - - created - - created_by - - creator - - creators - - database_id - - execution - - id - - last_modified - - 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 - creator: - $ref: '#/components/schemas/UserDto' - 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 - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - 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 - created_by: - type: string - format: uuid - last_modified: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - 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 - 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 - ImageDateDto: - required: - - created_at - - database_format - - has_time - - id - - unix_format - type: object - properties: - id: - type: integer - format: int64 - database_format: - type: string - example: '%d.%c.%Y' - unix_format: - type: string - example: dd.MM.YYYY - has_time: - type: boolean - example: false - created_at: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - ImageDto: - required: - - default_port - - dialect - - driver_class - - id - - jdbc_method - - name - - 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 - driver_class: - type: string - example: org.mariadb.jdbc.Driver - date_formats: - type: array - items: - $ref: '#/components/schemas/ImageDateDto' - jdbc_method: - type: string - example: mariadb - default_port: - type: integer - format: int32 - example: 3306 - 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." - 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 - TableBriefDto: - required: - - columns - - description - - id - - internal_name - - is_versioned - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality in Austria - owner: - $ref: '#/components/schemas/UserBriefDto' - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - internal_name: - type: string - example: air_quality - is_versioned: - type: boolean - example: true - TableDto: - required: - - columns - - constraints - - created - - created_by - - creator - - database_id - - id - - internal_name - - is_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' - creator: - $ref: '#/components/schemas/UserDto' - owner: - $ref: '#/components/schemas/UserDto' - description: - type: string - example: Air Quality in Austria - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - constraints: - $ref: '#/components/schemas/ConstraintsDto' - database_id: - type: integer - format: int64 - internal_name: - type: string - example: air_quality - is_versioned: - type: boolean - example: true - created_by: - type: string - format: uuid - 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 - - table - - uid - type: object - properties: - uid: - type: integer - format: int64 - table: - $ref: '#/components/schemas/TableDto' - columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - UnitDto: - required: - - columns - - created - - id - - uri - type: object - properties: - id: - type: integer - format: int64 - uri: - type: string - name: - type: string - description: - type: string - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - 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 - 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 - UserDto: - 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' - qualified_name: - type: string - example: Josiah Carberry — @jcarberry - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - ViewDto: - required: - - created - - creator - - database - - database_id - - id - - internal_name - - name - - query - - query_hash - type: object - properties: - id: - type: integer - format: int64 - database: - $ref: '#/components/schemas/DatabaseDto' - 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 - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - creator: - $ref: '#/components/schemas/UserDto' - database_id: - type: integer - format: int64 - internal_name: - type: string - example: air_quality - is_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 - last_modified: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - 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 - QueryDto: - required: - - created - - creator - - database_id - - execution - - id - - identifiers - - is_persisted - - last_modified - - query - - query_hash - - query_normalized - type: object - properties: - id: - type: integer - format: int64 - creator: - $ref: '#/components/schemas/UserDto' - 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/IdentifierDto' - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - 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 - last_modified: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - UpdateDatabaseAccessDto: - required: - - type - type: object - properties: - type: - type: string - enum: - - read - - write_own - - write_all - CreateDatabaseDto: - required: - - container_id - - internal_name - - password - - privileged_password - - privileged_username - - user_id - - username - type: object - properties: - username: - type: string - example: foobar - password: - type: string - example: s3cr3t - container_id: - type: integer - format: int64 - example: 1 - internal_name: - type: string - example: weather - privileged_username: - type: string - example: root - privileged_password: - type: string - example: mariadb - user_id: - type: string - format: uuid - example: 0e695ea5-9249-4a75-a77a-eeac3ec1c2c0 - ViewCreateDto: - required: - - is_public - - name - - query - type: object - properties: - name: - type: string - example: Air Quality - query: - type: string - example: SELECT `id` FROM `air_quality` - is_public: - type: boolean - example: true - 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 - - 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 - dfid: - type: integer - description: date format id - format: int64 - 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 - 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 - - name - - need_sequence - 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' - need_sequence: - type: boolean - TupleDto: - required: - - data - type: object - properties: - data: - type: object - additionalProperties: - type: object - ImportCsvDto: - required: - - location - - separator - type: object - properties: - location: - type: string - example: file.csv - separator: - type: string - example: "," - quote: - type: string - example: '"' - skip_lines: - minimum: 0 - type: integer - format: int64 - false_element: - type: string - true_element: - type: string - null_element: - type: string - example: NA - line_termination: - type: string - example: \r\n - ExecuteStatementDto: - required: - - statement - type: object - properties: - statement: - type: string - example: SELECT `id` FROM `air_quality` - 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/.swagger/api-metadata.yaml b/.docs/.swagger/api-metadata.yaml deleted file mode 100644 index 46906b8786..0000000000 --- a/.docs/.swagger/api-metadata.yaml +++ /dev/null @@ -1,7396 +0,0 @@ -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.4.3 -externalDocs: - description: Sourcecode Documentation - url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.3/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 - operationId: list - parameters: - - name: internal_name - in: query - required: false - schema: - type: string - responses: - "200": - description: List of databases - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/DatabaseDto' - post: - tags: - - database-endpoint - summary: Create database - operationId: create_5 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseCreateDto' - required: true - responses: - "503": - description: Connection to the database 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' - "409": - description: Query store could not be created - 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' - "201": - description: Created a new database - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseDto' - "404": - description: "Container, user or database could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - head: - tags: - - database-endpoint - summary: List databases - operationId: list_1 - parameters: - - name: internal_name - in: query - required: false - schema: - type: string - responses: - "200": - description: List of databases - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/DatabaseDto' - /api/database/{databaseId}/access/{userId}: - get: - tags: - - access-endpoint - summary: Check access to some database - 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: - "200": - description: Found database access - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseAccessDto' - "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' - security: - - bearerAuth: [] - - basicAuth: [] - put: - tags: - - access-endpoint - summary: Modify access to some database - operationId: update_4 - 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: - "202": - description: Modify access succeeded - "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' - "502": - description: Access could not be updated due to connection error in the - data service - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: Database or user not found - 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 to some database - 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: - "503": - description: Access could not be created in the data service - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Granting access query or database connection is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Failed giving access - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Granting access not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Granting access succeeded - "404": - description: Database or user not found - 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: Revoke access to some database - 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: - "202": - description: Revoked access successfully - "403": - description: Revoke of access not permitted as no access was found - 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' - "502": - description: Access could not be created due to connection error - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - head: - tags: - - access-endpoint - summary: Check access to some database - 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: - "200": - description: Found database access - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseAccessDto' - "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' - security: - - bearerAuth: [] - - basicAuth: [] - /api/user/{userId}: - get: - tags: - - user-endpoint - summary: Get a user info - operationId: find_2 - parameters: - - name: userId - in: path - required: true - schema: - type: string - format: uuid - responses: - "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' - "404": - description: User was not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - put: - tags: - - user-endpoint - summary: 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' - "400": - description: Modify user query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - /api/user/{userId}/password: - put: - tags: - - user-endpoint - summary: Modify user password - 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: - "202": - description: Modified user password - content: - application/json: - schema: - $ref: '#/components/schemas/UserDto' - security: - - bearerAuth: [] - - basicAuth: [] - /api/user/token: - put: - tags: - - user-endpoint - summary: Refresh user 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' - post: - tags: - - user-endpoint - summary: Obtain user token - operationId: getToken - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/LoginRequestDto' - required: true - responses: - "202": - description: Obtained user token - content: - application/json: - schema: - $ref: '#/components/schemas/TokenDto' - /api/ontology/{ontologyId}: - get: - tags: - - ontology-endpoint - summary: Find one ontology - operationId: find_3 - parameters: - - name: ontologyId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: Find one ontology - content: - application/json: - schema: - $ref: '#/components/schemas/OntologyDto' - "404": - description: Could not find ontology - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - put: - tags: - - ontology-endpoint - summary: Update an 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: - "202": - description: Updated ontology successfully - content: - application/json: - schema: - $ref: '#/components/schemas/OntologyDto' - "404": - description: Could not find ontology - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - ontology-endpoint - summary: Delete an 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 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: - "404": - description: Could not find message - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Updated message - content: - application/json: - schema: - $ref: '#/components/schemas/BannerMessageBriefDto' - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - message-endpoint - summary: 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 some image - operationId: findById - parameters: - - name: imageId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "200": - description: Found image - content: - application/json: - schema: - $ref: '#/components/schemas/ImageDto' - "404": - description: Image could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - put: - tags: - - image-endpoint - summary: Update some 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: - "202": - description: Updated image successfully - content: - application/json: - schema: - $ref: '#/components/schemas/ImageDto' - "404": - description: Image could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - image-endpoint - summary: Delete some 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 some identifier - 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: - "404": - description: Identifier could not be found - content: - text/csv: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: "Identifier could not be exported, the requested style is not\ - \ known" - content: - text/bibliography: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "410": - description: Failed to retrieve from S3 endpoint - content: - text/csv: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "409": - description: Exported resource was not found - content: - text/csv: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "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: {} - "422": - description: Failed to retrieve from database sidecar - content: - text/csv: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "503": - description: Identifier could not exported from database as it is not reachable - content: - text/csv: - schema: - $ref: '#/components/schemas/ApiErrorDto' - put: - tags: - - identifier-endpoint - summary: Save 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: - "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' - "202": - description: Saved identifier - content: - application/json: - schema: - $ref: '#/components/schemas/IdentifierDto' - "503": - description: DataCite system did not respond - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Creating identifier not permitted - 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: [] - delete: - tags: - - identifier-endpoint - summary: Delete some identifier - operationId: delete_3 - parameters: - - name: identifierId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "404": - description: Identifier or database could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Deleted identifier - content: - '*/*': - schema: - type: object - "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 - operationId: publish - parameters: - - name: identifierId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "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: DataCite system did not respond - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Creating identifier not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Published 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: [] - /api/database/{databaseId}/visibility: - put: - tags: - - database-endpoint - summary: Update 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: - "202": - description: Visibility modified successfully - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseDto' - "403": - description: Visibility modification is 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' - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/table/{tableId}: - get: - tags: - - table-endpoint - summary: Get information about table - 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 - content: - application/json: - schema: - $ref: '#/components/schemas/TableDto' - "403": - description: Access to the database is forbidden - 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' - "503": - description: Could not communicate with the broker service - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - put: - tags: - - table-endpoint - summary: Update table statistics - 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 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/TableStatisticDto' - required: true - responses: - "202": - description: Updated table statistics successfully - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - table-endpoint - summary: Delete a 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: - "202": - description: Delete table successfully - "403": - description: Access to the database is forbidden - 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' - "400": - description: Delete table query resulted in an invalid query statement - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/table/{tableId}/column/{columnId}: - put: - tags: - - table-endpoint - summary: Update a table column semantic mapping - operationId: update_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: columnId - in: path - required: true - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ColumnSemanticsUpdateDto' - required: true - responses: - "404": - description: Table or database could not be found - 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' - "403": - description: Access to the database is forbidden - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/owner: - put: - tags: - - database-endpoint - summary: Update 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: - "404": - description: Database or user could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Transfer of ownership was successful - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseDto' - "403": - description: Transfer of ownership is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/image: - put: - tags: - - database-endpoint - summary: Update 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: - "403": - description: Modify of image 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' - "410": - description: File was not found in the Storage Service - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Modify of image was successful - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseDto' - security: - - bearerAuth: [] - - basicAuth: [] - /api/user: - get: - tags: - - user-endpoint - summary: Find all users - operationId: findAll - responses: - "200": - description: List users - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/UserBriefDto' - post: - tags: - - user-endpoint - summary: Create user - operationId: create - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/SignupRequestDto' - required: true - responses: - "417": - description: User with e-mail already exists - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: default role not found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "409": - description: User with username already exists - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "201": - description: Created user - content: - application/json: - schema: - $ref: '#/components/schemas/UserBriefDto' - "400": - description: Parameters are not well-formed (likely email) - content: - application/json: {} - /api/ontology: - get: - tags: - - ontology-endpoint - summary: List all ontologies - operationId: findAll_2 - responses: - "200": - description: List all ontologies - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/OntologyDto' - post: - tags: - - ontology-endpoint - summary: Register a new 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: Find maintenance messages - operationId: list_2 - parameters: - - name: filter - in: query - required: false - schema: - type: string - responses: - "200": - description: List messages - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/BannerMessageDto' - post: - tags: - - message-endpoint - summary: 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: Find all images - operationId: findAll_3 - responses: - "200": - description: List images - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/ContainerImage' - post: - tags: - - image-endpoint - summary: Create image - operationId: create_3 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ImageCreateDto' - required: true - responses: - "201": - description: Created image - content: - application/json: - schema: - $ref: '#/components/schemas/ImageDto' - "400": - description: Image specification is invalid - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "409": - description: Image already exists - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - /api/identifier: - get: - tags: - - identifier-endpoint - summary: Find all identifiers - 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: - "406": - description: "Identifier could not be exported, the requested style is not\ - \ known" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Found identifiers successfully - content: - application/json: - schema: - type: string - application/ld+json: - schema: - type: string - post: - tags: - - identifier-endpoint - summary: Draft identifier - operationId: create_4 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/IdentifierCreateDto' - required: true - responses: - "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: DataCite system did not respond - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Creating identifier not permitted - 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: Find all views - operationId: findAll_5 - 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: Find views successfully - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/ViewBriefDto' - security: - - bearerAuth: [] - - basicAuth: [] - post: - tags: - - view-endpoint - summary: Create a 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: - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Create view query is malformed - 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' - "401": - description: Credentials missing - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "201": - description: Create view successfully - content: - application/json: - schema: - $ref: '#/components/schemas/ViewBriefDto' - "403": - description: Credentials missing - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "423": - description: Create view resulted in an invalid query statement - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "405": - description: Create view is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/table: - get: - tags: - - table-endpoint - summary: List all 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' - "200": - description: List tables - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/TableBriefDto' - "404": - description: Database could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - post: - tags: - - table-endpoint - summary: Create a 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: - "409": - description: Create table conflicts with existing table name - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "201": - description: Created a new table - content: - application/json: - schema: - $ref: '#/components/schemas/TableBriefDto' - "400": - description: Create table query is malformed - 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' - "403": - description: Create table not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - /api/container: - get: - tags: - - container-endpoint - summary: Find all containers - 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: - type: string - post: - tags: - - container-endpoint - summary: Create container - operationId: create_9 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ContainerCreateDto' - required: true - responses: - "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/ContainerBriefDto' - "404": - description: Container image or user could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - /api/unit: - get: - tags: - - unit-endpoint - summary: List semantic units - 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 - 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' - "417": - description: Generated query or uri is malformed - 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' - security: - - bearerAuth: [] - - basicAuth: [] - /api/oai: - get: - tags: - - metadata-endpoint - summary: Get the 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 one maintenance message - operationId: find_5 - 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' - "200": - description: Get messages - content: - application/json: - schema: - $ref: '#/components/schemas/BannerMessageDto' - /api/license: - get: - tags: - - license-endpoint - summary: Get all licenses - operationId: list_3 - responses: - "200": - description: List of licenses - content: - application/json: - schema: - type: array - items: - type: string - /api/identifier/retrieve: - get: - tags: - - identifier-endpoint - summary: Retrieve metadata from identifier - operationId: retrieve - parameters: - - name: url - in: query - required: true - schema: - type: string - responses: - "404": - description: Failed to find metadata for identifier - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Retrieved metadata from identifier - content: - application/json: - schema: - $ref: '#/components/schemas/IdentifierDto' - /api/database/{databaseId}: - get: - tags: - - database-endpoint - summary: Find some database - operationId: findById_1 - parameters: - - name: databaseId - in: path - required: true - schema: - type: integer - format: int64 - responses: - "503": - description: Connection to the broker service could not be established - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Database found successfully - content: - application/json: - schema: - $ref: '#/components/schemas/DatabaseDto' - "404": - description: Database or exchange could not be found - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/view/{viewId}: - get: - tags: - - view-endpoint - summary: Find one view - 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: - "404": - description: "Database, view or user could not be found" - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "200": - description: Find view successfully - content: - application/json: - schema: - $ref: '#/components/schemas/ViewDto' - "403": - description: Find view is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - view-endpoint - summary: Delete one 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: - "503": - description: Connection to the database failed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "202": - description: Delete view successfully - "404": - description: "Database, view or user could not be found" - 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' - "405": - description: Delete view is not permitted - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "403": - description: Deletion not allowed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "400": - description: Delete view query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/table/{tableId}/suggest: - get: - tags: - - table-endpoint - summary: Suggest table semantics - 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' - "200": - description: Suggested table semantics successfully - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/TableColumnEntityDto' - "404": - description: Could not find the table - 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' - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/table/{tableId}/column/{columnId}/suggest: - get: - tags: - - table-endpoint - summary: Suggest table column semantics - 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: - "417": - description: Generated query is malformed - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - "404": - description: Could not find the table column - 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' - "422": - description: Ontology does not have rdf or sparql endpoint - content: - application/json: - schema: - $ref: '#/components/schemas/ApiErrorDto' - security: - - bearerAuth: [] - - basicAuth: [] - /api/container/{containerId}: - get: - tags: - - container-endpoint - summary: Find some container - 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 some 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 successfully - content: - '*/*': - schema: - type: object - security: - - bearerAuth: [] - - basicAuth: [] - /api/concept: - get: - tags: - - concept-endpoint - summary: List semantic concepts - operationId: findAll_7 - responses: - "200": - description: Find all semantic concepts - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/ConceptDto' -components: - schemas: - 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 - - bit - - tinyint - - bool - - smallint - - mediumint - - int - - bigint - - float - - double - - decimal - - date - - datetime - - timestamp - - time - - year - ColumnDto: - required: - - auto_generated - - column_type - - database_id - - id - - internal_name - - is_null_allowed - - is_public - - name - - ordinal_position - - table_id - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Date - alias: - type: string - 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/ConceptDto' - unit: - $ref: '#/components/schemas/UnitDto' - table: - $ref: '#/components/schemas/TableDto' - views: - type: array - items: - $ref: '#/components/schemas/ViewDto' - enums: - type: array - items: - type: string - sets: - type: array - items: - type: string - database_id: - type: integer - format: int64 - table_id: - type: integer - format: int64 - ordinal_position: - type: integer - format: int32 - example: 0 - internal_name: - type: string - example: mdb_date - date_format: - $ref: '#/components/schemas/ImageDateDto' - auto_generated: - type: boolean - example: false - index_length: - type: integer - format: int64 - length: - type: integer - format: int64 - column_type: - type: string - example: string - enum: - - char - - varchar - - binary - - varbinary - - tinyblob - - tinytext - - text - - blob - - mediumtext - - mediumblob - - longtext - - longblob - - enum - - set - - 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_public: - type: boolean - example: true - is_null_allowed: - type: boolean - example: false - ConceptDto: - required: - - columns - - created - - id - - uri - type: object - properties: - id: - type: integer - format: int64 - uri: - type: string - name: - type: string - description: - type: string - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - 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: - type: string - ContainerDto: - required: - - created - - host - - id - - image - - internal_name - - name - - sidecar_host - - sidecar_port - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - host: - type: string - port: - type: integer - format: int32 - image: - $ref: '#/components/schemas/ImageDto' - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - internal_name: - type: string - example: data-db - sidecar_host: - type: string - sidecar_port: - type: integer - format: int32 - ui_host: - type: string - ui_port: - type: integer - format: int32 - 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/ - DatabaseAccessDto: - required: - - created - - type - - user - type: object - properties: - user: - $ref: '#/components/schemas/UserDto' - type: - type: string - enum: - - read - - write_own - - write_all - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - DatabaseDto: - required: - - contact - - container - - created - - creator - - exchange_name - - id - - internal_name - - is_public - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality - tables: - type: array - items: - $ref: '#/components/schemas/TableDto' - container: - $ref: '#/components/schemas/ContainerDto' - accesses: - type: array - items: - $ref: '#/components/schemas/DatabaseAccessDto' - identifiers: - type: array - items: - $ref: '#/components/schemas/IdentifierDto' - subsets: - type: array - items: - $ref: '#/components/schemas/IdentifierDto' - creator: - $ref: '#/components/schemas/UserDto' - contact: - $ref: '#/components/schemas/UserDto' - owner: - $ref: '#/components/schemas/UserDto' - image: - type: array - items: - type: string - format: byte - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - 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 - ForeignKeyDto: - type: object - properties: - name: - type: string - columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - referenced_table: - $ref: '#/components/schemas/TableBriefDto' - referenced_columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - 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 - 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: - - created - - created_by - - creator - - creators - - database_id - - execution - - id - - last_modified - - 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 - creator: - $ref: '#/components/schemas/UserDto' - 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 - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - 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 - created_by: - type: string - format: uuid - last_modified: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - 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 - 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 - ImageDateDto: - required: - - created_at - - database_format - - has_time - - id - - unix_format - type: object - properties: - id: - type: integer - format: int64 - database_format: - type: string - example: '%d.%c.%Y' - unix_format: - type: string - example: dd.MM.YYYY - has_time: - type: boolean - example: false - created_at: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - ImageDto: - required: - - default_port - - dialect - - driver_class - - id - - jdbc_method - - name - - 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 - driver_class: - type: string - example: org.mariadb.jdbc.Driver - date_formats: - type: array - items: - $ref: '#/components/schemas/ImageDateDto' - jdbc_method: - type: string - example: mariadb - default_port: - type: integer - format: int32 - example: 3306 - 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." - 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 - TableBriefDto: - required: - - columns - - description - - id - - internal_name - - is_versioned - - name - - owner - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality in Austria - owner: - $ref: '#/components/schemas/UserBriefDto' - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - internal_name: - type: string - example: air_quality - is_versioned: - type: boolean - example: true - TableDto: - required: - - columns - - constraints - - created - - created_by - - creator - - database_id - - id - - internal_name - - is_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' - creator: - $ref: '#/components/schemas/UserDto' - owner: - $ref: '#/components/schemas/UserDto' - description: - type: string - example: Air Quality in Austria - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - columns: - type: array - items: - $ref: '#/components/schemas/ColumnDto' - constraints: - $ref: '#/components/schemas/ConstraintsDto' - database_id: - type: integer - format: int64 - internal_name: - type: string - example: air_quality - is_versioned: - type: boolean - example: true - created_by: - type: string - format: uuid - 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: - - table - - uid - type: object - properties: - uid: - type: integer - format: int64 - table: - $ref: '#/components/schemas/TableDto' - UnitDto: - required: - - columns - - created - - id - - uri - type: object - properties: - id: - type: integer - format: int64 - uri: - type: string - name: - type: string - description: - type: string - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - columns: - type: array - items: - $ref: '#/components/schemas/ColumnBriefDto' - 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 - 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 - UserDto: - 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' - qualified_name: - type: string - example: Josiah Carberry — @jcarberry - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - ViewDto: - required: - - created - - creator - - database - - database_id - - id - - internal_name - - name - - query - - query_hash - type: object - properties: - id: - type: integer - format: int64 - database: - $ref: '#/components/schemas/DatabaseDto' - 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 - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - creator: - $ref: '#/components/schemas/UserDto' - database_id: - type: integer - format: int64 - internal_name: - type: string - example: air_quality - is_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 - last_modified: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - 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 - 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 - 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: - - created - - 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 - creator: - $ref: '#/components/schemas/UserBriefDto' - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - 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 - 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 - 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 - DatabaseModifyVisibilityDto: - required: - - is_public - type: object - properties: - is_public: - type: boolean - example: true - ColumnStatisticDto: - required: - - mean - - median - - std_dev - - val_max - - val_min - type: object - properties: - mean: - type: number - median: - type: number - std_dev: - type: number - val_min: - type: number - val_max: - type: number - TableStatisticDto: - required: - - columns - type: object - properties: - columns: - type: object - additionalProperties: - $ref: '#/components/schemas/ColumnStatisticDto' - ColumnSemanticsUpdateDto: - type: object - properties: - concept_uri: - type: string - unit_uri: - type: string - 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 - - 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 - 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 - - name - type: object - properties: - name: - type: string - example: Air Quality - container_id: - type: integer - format: int64 - example: 1 - is_public: - type: boolean - example: true - ViewCreateDto: - required: - - is_public - - name - - query - type: object - properties: - name: - type: string - example: Air Quality - query: - type: string - example: SELECT `id` FROM `air_quality` - is_public: - type: boolean - example: true - ViewBriefDto: - required: - - created - - creator - - database_id - - id - - internal_name - - name - - query - - query_hash - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - example: Air Quality - identifier: - $ref: '#/components/schemas/IdentifierDto' - query: - type: string - example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - creator: - $ref: '#/components/schemas/UserDto' - database_id: - type: integer - format: int64 - internal_name: - type: string - example: air_quality - is_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 - last_modified: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - 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 - - 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 - dfid: - type: integer - description: date format id - format: int64 - 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 - 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 - - 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' - need_sequence: - type: boolean - ContainerCreateDto: - required: - - host - - image_id - - name - - privileged_password - - privileged_username - - sidecar_host - - sidecar_port - 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 - image_id: - type: integer - description: Image ID - format: int64 - sidecar_host: - type: string - sidecar_port: - type: integer - format: int32 - 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 - ContainerBriefDto: - required: - - created - - hash - - id - - image - - internal_name - - name - - running - type: object - properties: - id: - type: integer - format: int64 - hash: - type: string - example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50 - name: - type: string - example: Air Quality - image: - $ref: '#/components/schemas/ImageBriefDto' - running: - type: boolean - example: true - created: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - internal_name: - type: string - example: air-quality - ImageBriefDto: - required: - - 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 - 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 - parametersString: - type: string - fromDate: - type: string - format: date-time - untilDate: - type: string - format: date-time - 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 - Constraints: - type: object - properties: - uniques: - type: array - items: - $ref: '#/components/schemas/Unique' - foreignKeys: - type: array - items: - $ref: '#/components/schemas/ForeignKey' - checks: - uniqueItems: true - type: array - items: - type: string - primaryKey: - type: array - items: - $ref: '#/components/schemas/PrimaryKey' - Container: - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - internalName: - type: string - host: - type: string - port: - type: integer - format: int32 - sidecarHost: - type: string - sidecarPort: - type: integer - format: int32 - uiHost: - type: string - uiPort: - type: integer - format: int32 - uiAdditionalFlags: - type: string - databases: - type: array - items: - $ref: '#/components/schemas/Database' - image: - $ref: '#/components/schemas/ContainerImage' - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - privilegedUsername: - type: string - privilegedPassword: - type: string - ContainerImage: - type: object - properties: - id: - type: integer - format: int64 - name: - type: string - registry: - type: string - version: - type: string - driverClass: - type: string - dialect: - type: string - jdbcMethod: - type: string - defaultPort: - type: integer - format: int32 - dateFormats: - type: array - items: - $ref: '#/components/schemas/ContainerImageDate' - containers: - type: array - items: - $ref: '#/components/schemas/Container' - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - ContainerImageDate: - type: object - properties: - id: - type: integer - format: int64 - iid: - type: integer - format: int64 - image: - $ref: '#/components/schemas/ContainerImage' - example: - type: string - hasTime: - type: boolean - databaseFormat: - type: string - unixFormat: - type: string - createdAt: - type: string - format: date-time - Creator: - type: object - properties: - id: - type: integer - format: int64 - firstname: - type: string - lastname: - type: string - creatorName: - type: string - nameType: - type: string - enum: - - PERSONAL - - ORGANIZATIONAL - nameIdentifier: - type: string - nameIdentifierScheme: - type: string - enum: - - ORCID - - ROR - - ISNI - - GRID - nameIdentifierSchemeUri: - type: string - affiliation: - type: string - affiliationIdentifier: - type: string - affiliationIdentifierScheme: - type: string - enum: - - ROR - - GRID - - ISNI - affiliationIdentifierSchemeUri: - type: string - identifier: - $ref: '#/components/schemas/Identifier' - apaName: - type: string - bibtexName: - type: string - ieeeName: - type: string - Database: - type: object - properties: - id: - type: integer - format: int64 - createdBy: - type: string - format: uuid - creator: - $ref: '#/components/schemas/User' - ownedBy: - type: string - format: uuid - owner: - $ref: '#/components/schemas/User' - cid: - type: integer - format: int64 - container: - $ref: '#/components/schemas/Container' - name: - type: string - internalName: - type: string - exchangeName: - type: string - description: - type: string - contactPerson: - type: string - format: uuid - contact: - $ref: '#/components/schemas/User' - identifiers: - type: array - items: - $ref: '#/components/schemas/Identifier' - subsets: - type: array - items: - $ref: '#/components/schemas/Identifier' - tables: - type: array - items: - $ref: '#/components/schemas/Table' - views: - type: array - items: - $ref: '#/components/schemas/View' - accesses: - type: array - items: - $ref: '#/components/schemas/DatabaseAccess' - isPublic: - type: boolean - image: - type: array - items: - type: string - format: byte - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - DatabaseAccess: - type: object - properties: - huserid: - type: string - format: uuid - user: - $ref: '#/components/schemas/User' - hdbid: - type: integer - format: int64 - database: - $ref: '#/components/schemas/Database' - type: - type: string - enum: - - AccessType.READ - - AccessType.WRITE_OWN - - AccessType.WRITE_ALL - created: - type: string - format: date-time - ForeignKey: - type: object - properties: - fkid: - type: integer - format: int64 - name: - type: string - table: - $ref: '#/components/schemas/Table' - referencedTable: - $ref: '#/components/schemas/Table' - references: - type: array - items: - $ref: '#/components/schemas/ForeignKeyReference' - onUpdate: - type: string - enum: - - ReferenceType.RESTRICT - - ReferenceType.CASCADE - - ReferenceType.SET_NULL - - ReferenceType.NO_ACTION - - ReferenceType.SET_DEFAULT - onDelete: - type: string - enum: - - ReferenceType.RESTRICT - - ReferenceType.CASCADE - - ReferenceType.SET_NULL - - ReferenceType.NO_ACTION - - ReferenceType.SET_DEFAULT - ForeignKeyReference: - type: object - properties: - id: - type: integer - format: int64 - foreignKey: - $ref: '#/components/schemas/ForeignKey' - column: - $ref: '#/components/schemas/TableColumn' - referencedColumn: - $ref: '#/components/schemas/TableColumn' - Identifier: - type: object - properties: - id: - type: integer - format: int64 - queryId: - type: integer - format: int64 - tableId: - type: integer - format: int64 - viewId: - type: integer - format: int64 - creators: - type: array - items: - $ref: '#/components/schemas/Creator' - publisher: - type: string - status: - type: string - enum: - - DRAFT - - PUBLISHED - 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 - titles: - type: array - items: - $ref: '#/components/schemas/IdentifierTitle' - descriptions: - type: array - items: - $ref: '#/components/schemas/IdentifierDescription' - funders: - type: array - items: - $ref: '#/components/schemas/IdentifierFunder' - licenses: - type: array - items: - $ref: '#/components/schemas/License' - type: - type: string - enum: - - DATABASE - - SUBSET - - TABLE - - VIEW - query: - type: string - queryNormalized: - type: string - queryHash: - type: string - resultHash: - type: string - execution: - type: string - format: date-time - resultNumber: - type: integer - format: int64 - publicationYear: - type: integer - format: int32 - publicationMonth: - type: integer - format: int32 - publicationDay: - type: integer - format: int32 - database: - $ref: '#/components/schemas/Database' - relatedIdentifiers: - type: array - items: - $ref: '#/components/schemas/RelatedIdentifier' - doi: - type: string - createdBy: - type: string - format: uuid - creator: - $ref: '#/components/schemas/User' - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - IdentifierDescription: - type: object - properties: - id: - type: integer - format: int64 - description: - type: string - descriptionType: - type: string - enum: - - Abstract - - Methods - - SeriesInformation - - TableOfContents - - TechnicalInfo - - Other - 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 - identifier: - $ref: '#/components/schemas/Identifier' - IdentifierFunder: - type: object - properties: - id: - type: integer - format: int64 - funderName: - type: string - funderIdentifier: - type: string - funderIdentifierType: - type: string - enum: - - CROSSREF_FUNDER_ID - - ROR - - GND - - ISNI - - OTHER - schemeUri: - type: string - awardNumber: - type: string - awardTitle: - type: string - identifier: - $ref: '#/components/schemas/Identifier' - IdentifierTitle: - type: object - properties: - id: - type: integer - format: int64 - title: - type: string - titleType: - type: string - enum: - - AlternativeTitle - - Subtitle - - TranslatedTitle - - Other - 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 - identifier: - $ref: '#/components/schemas/Identifier' - License: - type: object - properties: - identifier: - type: string - uri: - type: string - description: - type: string - PrimaryKey: - type: object - properties: - pkid: - type: integer - format: int64 - table: - $ref: '#/components/schemas/Table' - column: - $ref: '#/components/schemas/TableColumn' - RelatedIdentifier: - type: object - properties: - id: - type: integer - format: int64 - value: - type: string - type: - type: string - enum: - - DOI - - URL - - URN - - ARK - - arXiv - - bibcode - - EAN13 - - EISSN - - Handle - - IGSN - - ISBN - - ISTC - - LISSN - - LSID - - PMID - - PURL - - UPC - - w3id - relation: - type: string - 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 - identifier: - $ref: '#/components/schemas/Identifier' - Table: - type: object - properties: - id: - type: integer - format: int64 - tdbid: - type: integer - format: int64 - createdBy: - type: string - format: uuid - creator: - $ref: '#/components/schemas/User' - ownedBy: - type: string - format: uuid - owner: - $ref: '#/components/schemas/User' - name: - type: string - internalName: - type: string - queueName: - type: string - description: - type: string - database: - $ref: '#/components/schemas/Database' - columns: - type: array - items: - $ref: '#/components/schemas/TableColumn' - identifiers: - type: array - items: - $ref: '#/components/schemas/Identifier' - constraints: - $ref: '#/components/schemas/Constraints' - isVersioned: - type: boolean - numRows: - type: integer - format: int64 - dataLength: - type: integer - format: int64 - maxDataLength: - type: integer - format: int64 - avgRowLength: - type: integer - format: int64 - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - TableColumn: - type: object - properties: - id: - type: integer - format: int64 - dateFormat: - $ref: '#/components/schemas/ContainerImageDate' - table: - $ref: '#/components/schemas/Table' - views: - type: array - items: - $ref: '#/components/schemas/View' - name: - type: string - autoGenerated: - type: boolean - internalName: - type: string - indexLength: - type: integer - format: int64 - alias: - type: string - columnType: - type: string - enum: - - TableColumnType.CHAR - - TableColumnType.VARCHAR - - TableColumnType.BINARY - - TableColumnType.VARBINARY - - TableColumnType.TINYBLOB - - TableColumnType.TINYTEXT - - TableColumnType.TEXT - - TableColumnType.BLOB - - TableColumnType.MEDIUMTEXT - - TableColumnType.MEDIUMBLOB - - TableColumnType.LONGTEXT - - TableColumnType.LONGBLOB - - TableColumnType.ENUM - - TableColumnType.SET - - TableColumnType.BIT - - TableColumnType.TINYINT - - TableColumnType.BOOL - - TableColumnType.SMALLINT - - TableColumnType.MEDIUMINT - - TableColumnType.INT - - TableColumnType.BIGINT - - TableColumnType.FLOAT - - TableColumnType.DOUBLE - - TableColumnType.DECIMAL - - TableColumnType.DATE - - TableColumnType.DATETIME - - TableColumnType.TIMESTAMP - - TableColumnType.TIME - - TableColumnType.YEAR - length: - type: integer - format: int64 - isNullAllowed: - type: boolean - ordinalPosition: - type: integer - format: int32 - created: - type: string - format: date-time - concept: - $ref: '#/components/schemas/TableColumnConcept' - unit: - $ref: '#/components/schemas/TableColumnUnit' - enums: - type: array - items: - type: string - sets: - type: array - items: - type: string - size: - type: integer - format: int64 - d: - type: integer - format: int64 - min: - type: number - max: - type: number - mean: - type: number - median: - type: number - stdDev: - type: number - lastModified: - type: string - format: date-time - TableColumnConcept: - type: object - properties: - id: - type: integer - format: int64 - uri: - type: string - name: - type: string - description: - type: string - created: - type: string - format: date-time - columns: - type: array - items: - $ref: '#/components/schemas/TableColumn' - TableColumnUnit: - type: object - properties: - id: - type: integer - format: int64 - uri: - type: string - name: - type: string - description: - type: string - created: - type: string - format: date-time - columns: - type: array - items: - $ref: '#/components/schemas/TableColumn' - Unique: - type: object - properties: - uid: - type: integer - format: int64 - name: - type: string - table: - $ref: '#/components/schemas/Table' - columns: - type: array - items: - $ref: '#/components/schemas/TableColumn' - User: - type: object - properties: - id: - type: string - format: uuid - username: - type: string - firstname: - type: string - lastname: - type: string - email: - type: string - orcid: - type: string - affiliation: - type: string - language: - type: string - accesses: - type: array - items: - $ref: '#/components/schemas/DatabaseAccess' - theme: - type: string - mariadbPassword: - type: string - View: - type: object - properties: - id: - type: integer - format: int64 - vdbid: - type: integer - format: int64 - createdBy: - type: string - format: uuid - creator: - $ref: '#/components/schemas/User' - name: - type: string - internalName: - type: string - isPublic: - type: boolean - isInitialView: - type: boolean - query: - type: string - queryHash: - type: string - identifiers: - type: array - items: - $ref: '#/components/schemas/Identifier' - database: - $ref: '#/components/schemas/Database' - columns: - type: array - items: - $ref: '#/components/schemas/ViewColumn' - created: - type: string - format: date-time - lastModified: - type: string - format: date-time - ViewColumn: - type: object - properties: - id: - type: integer - format: int64 - alias: - type: string - ordinalPosition: - type: integer - format: int32 - view: - $ref: '#/components/schemas/View' - column: - $ref: '#/components/schemas/TableColumn' - 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 - 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 - securitySchemes: - basicAuth: - type: http - scheme: basic - bearerAuth: - type: http - scheme: bearer - bearerFormat: JWT diff --git a/.docs/.swagger/api-search.yaml b/.docs/.swagger/api-search.yaml deleted file mode 100644 index 0bd4f541c8..0000000000 --- a/.docs/.swagger/api-search.yaml +++ /dev/null @@ -1,385 +0,0 @@ -components: - 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/__APPVERSION__/ -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: __APPVERSION__ -openapi: 3.0.0 -paths: - /api/search: - get: - consumes: - - application/json - description: Performs a fuzzy search - operationId: post_fuzzy_search - parameters: - - in: query - required: true - schema: - properties: - q: - example: air quality - type: string - type: string - produces: - - application/json - responses: - '200': - content: - application/json: - schema: - properties: - results: - items: - type: object - type: array - type: object - 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/database/{database_id}: - delete: - consumes: - - application/json - description: Deletes a database - operationId: delete_database - produces: - - application/json - responses: - '202': - content: - application/json: - schema: - properties: - id: - example: 1 - implementation: int64 - type: integer - required: - - id - type: object - description: Deleted database successfully - '404': - content: - application/json: - schema: - properties: - message: - example: Message - type: string - success: - example: false - type: boolean - required: - - success - - message - type: object - description: Database not found - security: - - bearerAuth: [] - - basicAuth: [] - summary: Deletes a database - tags: - - database-endpoint - put: - consumes: - - application/json - description: Updates a database - operationId: update_database - parameters: - - in: body - name: body - required: true - schema: - properties: - internal_name: - example: air_quality_abcd - type: string - name: - example: Air Quality - type: string - type: object - produces: - - application/json - responses: - '202': - content: - application/json: - schema: - properties: - id: - example: 1 - implementation: int64 - type: integer - required: - - id - type: object - description: Updated database successfully - '400': - content: - application/json: - schema: - properties: - message: - example: Message - type: string - success: - example: false - type: boolean - required: - - success - - message - type: object - description: Invalid schema - '404': - content: - application/json: - schema: - properties: - message: - example: Message - type: string - success: - example: false - type: boolean - required: - - success - - message - type: object - description: Database not found - security: - - bearerAuth: [] - - basicAuth: [] - summary: Updates a database - tags: - - database-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: - 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: Gets the index - tags: - - search-endpoint - /api/search/{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: - properties: - field_value_pairs: - type: object - search_term: - example: air quality - type: string - type: object - 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/{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: - properties: - results: - items: - properties: - attr_friendly_name: - example: Name - type: string - attr_name: - example: name - type: string - type: - description: OpenSearch data types. - example: string - type: string - type: object - type: array - type: object - description: List of fields - '404': - description: Invalid type. - summary: Get searchable fields - tags: - - search-endpoint - /health: - get: - consumes: - - application/json - description: 'Return UP if the instance is ready to serve connections. - - ' - produces: - - application/json - responses: - '200': - description: OK, service is up and running - schema: - $ref: '#/definitions/Column' - '404': - description: Service is not yet ready - summary: Return a healthcheck - tags: - - actuator -servers: - - description: Generated server url - url: http://localhost:4000 - - description: Sandbox - url: https://test.dbrepo.tuwien.ac.at diff --git a/.docs/.swagger/api-sidecar.yaml b/.docs/.swagger/api-sidecar.yaml deleted file mode 100644 index 0d455b2526..0000000000 --- a/.docs/.swagger/api-sidecar.yaml +++ /dev/null @@ -1,106 +0,0 @@ -components: - 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/__APPVERSION__/ -info: - contact: - email: andreas.rauber@tuwien.ac.at - name: Prof. Andreas Rauber - description: Sidecar that downloads the import .csv file - license: - name: Apache 2.0 - url: https://www.apache.org/licenses/LICENSE-2.0 - title: Database Repository Data Database sidecar API - version: __APPVERSION__ -openapi: 3.0.0 -paths: - /health: - get: - consumes: - - application/json - description: 'Return UP if the instance is ready to serve connections. - - ' - produces: - - application/json - responses: - '200': - content: - application/json: - schema: - $ref: '#/components/schemas/Health' - description: OK, service is up and running - '404': - description: Service is not yet ready - summary: Return a healthcheck - tags: - - actuator - /sidecar/export/{filename}: - post: - consumes: - - application/json - description: 'Exports a specific .csv file to the Storage Service via S3 - - ' - parameters: - - description: Name of the object file to export to the Storage Service - in: path - name: filename - required: true - produces: - - application/json - responses: - '202': - content: {} - description: Exported the .csv - '400': - description: The Storage Service could not be contacted or .csv was not - found. - security: - - bearerAuth: [] - - basicAuth: [] - summary: Exports a .csv to the Storage Service - tags: - - sidecar - /sidecar/import/{filename}: - post: - consumes: - - application/json - description: 'Imports a specific .csv file from the Storage Service via S3 - - ' - parameters: - - description: Name of the object file to import from the Storage Service - in: path - name: filename - required: true - produces: - - application/json - responses: - '202': - content: {} - description: Imported the .csv - '400': - description: The Storage Service could not be contacted or .csv was not - found. - security: - - bearerAuth: [] - - basicAuth: [] - summary: Imports a .csv from the Storage Service - tags: - - sidecar -servers: - - description: Generated server url - url: http://localhost:8080 - - description: Sandbox - url: https://test.dbrepo.tuwien.ac.at diff --git a/.docs/.swagger/api-upload.yaml b/.docs/.swagger/api-upload.yaml deleted file mode 100644 index b08342a543..0000000000 --- a/.docs/.swagger/api-upload.yaml +++ /dev/null @@ -1,30 +0,0 @@ -openapi: 3.0.0 -info: - title: Database Repository Upload Service API - description: Service that manages the uploads - 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: __APPVERSION__ -externalDocs: - description: Sourcecode Documentation - url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services -servers: - - url: http://localhost:1080 - description: Generated server url - - url: https://test.dbrepo.tuwien.ac.at - description: Sandbox -paths: - /api/upload/files: - post: - tags: - - upload-endpoint - summary: Uploads a file - operationId: upload - responses: - "201": - description: "Successfully uploaded a file" - security: { } \ No newline at end of file diff --git a/.docs/.swagger/api.base.yaml b/.docs/.swagger/api.base.yaml new file mode 100644 index 0000000000..aa83c853ce --- /dev/null +++ b/.docs/.swagger/api.base.yaml @@ -0,0 +1,30 @@ +components: + 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/ +info: + contact: + email: andreas.rauber@tuwien.ac.at + name: Prof. Andreas Rauber + description: The REST API + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0 + title: DBRepo REST API + version: 1.4.4 +openapi: 3.1.0 +servers: + - description: Test Instance + url: https://test.dbrepo.tuwien.ac.at + - description: Local Instance + url: http://localhost diff --git a/.docs/.swagger/api.yaml b/.docs/.swagger/api.yaml new file mode 100644 index 0000000000..607276e81a --- /dev/null +++ b/.docs/.swagger/api.yaml @@ -0,0 +1,3874 @@ +components: + 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/ +info: + contact: + email: andreas.rauber@tuwien.ac.at + name: Prof. Andreas Rauber + description: The REST API + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0 + title: DBRepo REST API + version: 1.4.4 +openapi: 3.1.0 +servers: + - description: Test Instance + url: https://test.dbrepo.tuwien.ac.at + - description: Local Instance + url: http://localhost +paths: + /api/database: + post: + tags: + - database-endpoint + summary: Create database + operationId: create + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CreateDatabaseDto' + required: true + responses: + "201": + description: Created a database + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseDto' + "400": + description: Database create query is malformed or image is not supported + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "417": + description: Failed to create query store in database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "503": + description: Failed to communicate with database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: Failed to find container in metadata database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - basicAuth: [] + /api/database/{databaseId}/access/{userId}: + put: + tags: + - access-endpoint + summary: Update access to some database + operationId: update_1 + 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: + "400": + description: Update access query or database connection is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "417": + description: Failed to update access in database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "503": + description: Failed to establish connection with metadata service + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Not allowed to update access + 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' + "202": + description: Update access succeeded + security: + - basicAuth: [] + post: + tags: + - access-endpoint + summary: Give access to some database + operationId: create_4 + 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: + "417": + description: Failed to give access in the database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Granting access succeeded + content: + '*/*': + schema: + type: object + "503": + description: Failed to establish connection to metadata service + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Not allowed to give access + 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: Granting access query or database connection is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - basicAuth: [] + delete: + tags: + - access-endpoint + summary: Revoke access to some database + 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: + "400": + description: Revoke access query or database connection is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "417": + description: Failed to revoke access in database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Not allowed to revoke access + 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' + "404": + description: Failed to find database/user in metadata database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Revoked access successfully + content: + '*/*': + schema: + type: object + security: + - basicAuth: [] + /api/user/{userId}: + get: + tags: + - user-endpoint + summary: Get a user info + operationId: find_2 + parameters: + - name: userId + in: path + required: true + schema: + type: string + format: uuid + responses: + "403": + description: Find user is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Found user + content: + application/json: + schema: + $ref: '#/components/schemas/UserDto' + "404": + description: User was not found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + - basicAuth: [] + put: + tags: + - user-endpoint + summary: 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: + "404": + description: Failed to find database/user in metadata database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Not allowed to modify user metadata + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Modify user query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Modified user information + content: + application/json: + schema: + $ref: '#/components/schemas/UserDto' + security: + - bearerAuth: [] + - basicAuth: [] + /api/user/{userId}/password: + put: + tags: + - user-endpoint + summary: Modify user password + 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: + "403": + description: Not allowed to change foreign user password + 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' + "503": + description: Failed to get user in auth service + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Modified user password + content: + application/json: + schema: + $ref: '#/components/schemas/UserDto' + "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 user 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' + "502": + description: Connection to auth service failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Invalid refresh token + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + post: + tags: + - user-endpoint + summary: Obtain user token + operationId: getToken + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/LoginRequestDto' + required: true + responses: + "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' + "403": + description: Not allowed to get token + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "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 one ontology + 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 an 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 an ontology + operationId: delete + 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' + "202": + description: Deleted ontology successfully + content: + application/json: {} + security: + - bearerAuth: [] + - basicAuth: [] + /api/message/{messageId}: + put: + tags: + - message-endpoint + summary: 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 maintenance message + operationId: delete_1 + parameters: + - name: messageId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "202": + description: Deleted message + content: + application/json: {} + "404": + description: Could not find message + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + - basicAuth: [] + /api/image/{imageId}: + get: + tags: + - image-endpoint + summary: Find some image + 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 some 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 some 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 some identifier + 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: + "406": + description: Failed to find acceptable representation + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "422": + description: Failed to retrieve from database sidecar + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "503": + description: Failed to find in data service + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "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: {} + "404": + description: Identifier could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "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' + "410": + description: Failed to retrieve from S3 endpoint + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "409": + description: Exported resource was not found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + put: + tags: + - identifier-endpoint + summary: Save 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: + "403": + description: Insufficient access rights or authorities + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "502": + description: Connection to search service failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Creating identifier not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Identifier form contains invalid request data + 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: Saved identifier + content: + application/json: + schema: + $ref: '#/components/schemas/IdentifierDto' + "503": + description: Failed to save in search service + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + - basicAuth: [] + delete: + tags: + - identifier-endpoint + summary: Delete some 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' + "403": + description: Deleting identifier not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "503": + description: Failed to delete in search service + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Deleted identifier + content: + '*/*': + schema: + type: object + "404": + description: Identifier or database could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + - basicAuth: [] + /api/identifier/{identifierId}/publish: + put: + tags: + - identifier-endpoint + summary: Publish identifier + operationId: publish + parameters: + - name: identifierId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "403": + description: Insufficient access rights or authorities + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "502": + description: Connection to search service failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Creating identifier not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Identifier form contains invalid request data + 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' + "503": + description: Failed to save in search service + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + - basicAuth: [] + /api/database/{databaseId}/visibility: + put: + tags: + - database-endpoint + summary: Update 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: + "202": + description: Visibility modified successfully + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseDto' + "403": + description: Visibility modification is 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: 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' + security: + - bearerAuth: [] + - basicAuth: [] + /api/database/{databaseId}/table/{tableId}: + delete: + tags: + - table-endpoint + summary: Delete table + operationId: delete_1 + parameters: + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: tableId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "404": + description: Failed to find table in metadata database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Deleted table + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseDto' + "503": + description: Failed to establish connection with the metadata service + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Deletion query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - basicAuth: [] + /api/database/{databaseId}/table/{tableId}/column/{columnId}: + put: + tags: + - table-endpoint + summary: Update a table column semantic mapping + operationId: update_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: columnId + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ColumnSemanticsUpdateDto' + required: true + responses: + "400": + description: Update semantic concept query is malformed or update unit of measurement query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "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: Updated column semantics successfully + content: + application/json: + schema: + $ref: '#/components/schemas/ColumnDto' + "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' + security: + - bearerAuth: [] + - basicAuth: [] + /api/database/{databaseId}/owner: + put: + tags: + - database-endpoint + summary: Update 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: + "403": + description: Transfer of ownership is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Transfer of ownership was successful + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseDto' + "404": + description: Database or user could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "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' + security: + - bearerAuth: [] + - basicAuth: [] + /api/database/{databaseId}/metadata/view: + put: + tags: + - database-endpoint + summary: Refresh database views metadata + operationId: refreshViewMetadata + parameters: + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "403": + description: Refresh view metadata is 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' + "200": + description: Refreshed database views metadata + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseDto' + "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' + security: + - bearerAuth: [] + - basicAuth: [] + /api/database/{databaseId}/metadata/table: + put: + tags: + - database-endpoint + summary: Refresh database tables metadata + operationId: refreshTableMetadata + parameters: + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: Refreshed database tables metadata + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseDto' + "400": + description: Failed to parse payload at search service + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "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' + security: + - bearerAuth: [] + - basicAuth: [] + /api/database/{databaseId}/image: + put: + tags: + - database-endpoint + summary: Update 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: + "404": + description: Database or user could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "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/DatabaseDto' + "410": + description: File was not found in the Storage 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' + "503": + description: Failed to save in search service + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + - basicAuth: [] + /api/user: + get: + tags: + - user-endpoint + summary: Find all users + operationId: findAll + responses: + "200": + description: List users + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/UserBriefDto' + post: + tags: + - user-endpoint + summary: Create user + operationId: create + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SignupRequestDto' + required: true + responses: + "503": + description: Failed to create in auth service + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "417": + description: User with e-mail already exists + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "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' + "400": + description: Parameters are not well-formed (likely email) + content: + application/json: {} + "201": + description: Created user + content: + application/json: + schema: + $ref: '#/components/schemas/UserBriefDto' + "409": + description: User with username already exists + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + /api/ontology: + get: + tags: + - ontology-endpoint + summary: List all ontologies + operationId: findAll_2 + responses: + "200": + description: List all ontologies + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/OntologyDto' + post: + tags: + - ontology-endpoint + summary: Register a new 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: Find maintenance messages + operationId: list_2 + parameters: + - name: filter + in: query + required: false + schema: + type: string + responses: + "200": + description: List messages + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/BannerMessageDto' + post: + tags: + - message-endpoint + summary: 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: Find all images + operationId: findAll_3 + responses: + "200": + description: List images + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ContainerImage' + post: + tags: + - image-endpoint + summary: Create image + operationId: create_3 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ImageCreateDto' + required: true + responses: + "201": + description: Created image + content: + application/json: + schema: + $ref: '#/components/schemas/ImageDto' + "400": + description: Image specification is invalid + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "409": + description: Image already exists + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + - basicAuth: [] + /api/identifier: + get: + tags: + - identifier-endpoint + summary: Find all identifiers + 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: string + application/ld+json: + schema: + type: string + "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: Draft identifier + operationId: create_4 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/IdentifierCreateDto' + required: true + responses: + "403": + description: Insufficient access rights or authorities + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "502": + description: Connection to search service failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Creating identifier not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Identifier form contains invalid request data + 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' + "201": + description: Drafted identifier + content: + application/json: + schema: + $ref: '#/components/schemas/IdentifierDto' + "503": + description: Failed to save in search service + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + - basicAuth: [] + /api/database/{databaseId}/view: + get: + tags: + - view-endpoint + summary: Find view schemas + operationId: getSchema + parameters: + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "417": + description: View schema could not be retrieved + 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' + "409": + description: View schema could not be mapped to known columns + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: Failed to find database/view in metadata database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Database schema is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Found view schemas + content: + application/json: + schema: + type: string + post: + tags: + - view-endpoint + summary: Create view + operationId: create_1 + parameters: + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ViewCreateDto' + required: true + responses: + "400": + description: View schema is malformed + 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' + "409": + description: View schema could not be mapped + 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' + "202": + description: Created view + content: + application/json: + schema: + $ref: '#/components/schemas/ViewDto' + security: + - basicAuth: [] + - bearerAuth: [] + /api/database/{databaseId}/table: + get: + tags: + - table-endpoint + summary: Find table schemas + operationId: getSchema_1 + parameters: + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "403": + description: Find table schema not allowed + 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' + "417": + description: Failed to parse table schema + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Got table schemas + content: + application/json: + schema: + type: string + "503": + description: Failed to establish connection with the metadata service + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Schema data malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + post: + tags: + - table-endpoint + summary: Create table + operationId: create_2 + parameters: + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TableCreateDto' + required: true + responses: + "400": + description: Table schema or query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "409": + description: Table name already exists in database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: Failed to find database in metadata database or table 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' + "201": + description: Created table + content: + application/json: + schema: + $ref: '#/components/schemas/TableDto' + security: + - basicAuth: [] + /api/container: + get: + tags: + - container-endpoint + summary: Find all containers + 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: + type: string + post: + tags: + - container-endpoint + summary: Create container + operationId: create_9 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ContainerCreateDto' + required: true + responses: + "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/ContainerBriefDto' + security: + - bearerAuth: [] + - basicAuth: [] + /api/unit: + get: + tags: + - unit-endpoint + summary: List semantic units + 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 + 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: + "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' + "200": + description: Found entities + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/EntityDto' + "400": + description: Filter params are invalid + 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 the 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 one maintenance message + 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: Get all licenses + operationId: list_3 + responses: + "200": + description: List of licenses + content: + application/json: + schema: + type: array + items: + type: string + /api/identifier/retrieve: + get: + tags: + - identifier-endpoint + summary: Retrieve metadata from identifier + 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}: + put: + tags: + - database-endpoint + summary: Update user password in database + operationId: update + parameters: + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateUserPasswordDto' + required: true + responses: + "404": + description: Failed to find database in metadata database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Updated user password in database + "503": + description: Failed to communicate with database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "417": + description: Failed to update user password in database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - basicAuth: [] + /api/database/{databaseId}/view/{viewId}: + delete: + tags: + - view-endpoint + summary: Delete view + operationId: delete + parameters: + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: viewId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "202": + description: Deleted view + "409": + description: View schema could not be mapped + 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' + "404": + description: Failed to find view in metadata database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Database schema is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - basicAuth: [] + - bearerAuth: [] + /api/database/{databaseId}/table/{tableId}/suggest: + get: + tags: + - table-endpoint + summary: Suggest table semantics + 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: + "200": + description: Suggested table semantics successfully + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/TableColumnEntityDto' + "400": + description: Failed to parse statistic in search service + 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' + "404": + description: Failed to find database/table in metadata database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "417": + description: Generated query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + - basicAuth: [] + /api/database/{databaseId}/table/{tableId}/column/{columnId}/suggest: + get: + tags: + - table-endpoint + summary: Suggest table column semantics + 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: + "200": + description: Suggested table column semantics successfully + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/TableColumnEntityDto' + "422": + description: Ontology does not have rdf or sparql endpoint + 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' + "400": + description: Generated query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + - basicAuth: [] + /api/container/{containerId}: + get: + tags: + - container-endpoint + summary: Find some container + 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 some 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 successfully + content: + '*/*': + schema: + type: object + security: + - bearerAuth: [] + - basicAuth: [] + /api/concept: + get: + tags: + - concept-endpoint + summary: List semantic concepts + operationId: findAll_7 + responses: + "200": + description: Find all semantic concepts + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ConceptDto' + /api/database/{databaseId}/view/{viewId}/data: + get: + tags: + - view-endpoint + summary: Retrieve 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: + "403": + description: Not allowed to retrieve view data + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "409": + description: View schema could not be mapped + 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' + "404": + description: Failed to find view in metadata database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Request pagination is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Retrieved view data + content: + application/json: + schema: + $ref: '#/components/schemas/QueryResultDto' + security: + - basicAuth: [] + - bearerAuth: [] + head: + tags: + - view-endpoint + summary: Retrieve 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: + "403": + description: Not allowed to retrieve view data + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "409": + description: View schema could not be mapped + 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' + "404": + description: Failed to find view in metadata database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Request pagination is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Retrieved view data + content: + application/json: + schema: + $ref: '#/components/schemas/QueryResultDto' + security: + - basicAuth: [] + - bearerAuth: [] + /api/database/{databaseId}/table/{tableId}/data: + get: + tags: + - table-endpoint + summary: Retrieve table data + 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: + "200": + description: Retrieved table data + content: + application/json: + schema: + $ref: '#/components/schemas/QueryResultDto' + "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' + "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 table data + operationId: updateTuple + 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/TupleUpdateDto' + required: true + responses: + "403": + description: Update 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' + "202": + description: Updated table data + "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: [] + post: + tags: + - table-endpoint + summary: Create table data + operationId: createTuple + 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/TupleDto' + required: true + responses: + "403": + description: Create 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' + "201": + description: Created table data + "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: [] + delete: + tags: + - table-endpoint + summary: Delete table data + operationId: deleteTuple + 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/TupleDeleteDto' + required: true + responses: + "403": + description: Delete 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' + "202": + description: Deleted table data + "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: [] + head: + tags: + - table-endpoint + summary: Retrieve table data + 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: + "200": + description: Retrieved table data + content: + application/json: + schema: + $ref: '#/components/schemas/QueryResultDto' + "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' + "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: Retrieved subset data + 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: + "400": + description: Malformed select query + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Not allowed to retrieve subset data + 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' + "503": + description: Failed to communicate with database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Retrieved subset data + content: + application/json: + schema: + $ref: '#/components/schemas/QueryResultDto' + security: + - bearerAuth: [] + - basicAuth: [] + head: + tags: + - subset-endpoint + summary: Retrieved subset data + 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: + "400": + description: Malformed select query + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Not allowed to retrieve subset data + 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' + "503": + description: Failed to communicate with database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Retrieved subset data + content: + application/json: + schema: + $ref: '#/components/schemas/QueryResultDto' + security: + - bearerAuth: [] + - basicAuth: [] + /api/database/{databaseId}/subset/{queryId}: + put: + tags: + - subset-endpoint + summary: Persist subset + 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: + "202": + description: Persisted subset + content: + application/json: + schema: + $ref: '#/components/schemas/QueryDto' + "400": + description: Malformed select query + 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' + "503": + description: Failed to communicate with database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Not allowed to persist subset + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "417": + description: Failed to persist subset + 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 + operationId: importData + 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/ImportCsvDto' + required: true + responses: + "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' + "503": + description: Failed to establish connection with the metadata service + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Import dataset query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Import dataset successfully + security: + - basicAuth: [] + - bearerAuth: [] + /api/database/{databaseId}/subset: + get: + tags: + - subset-endpoint + summary: Find subsets + operationId: list + parameters: + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: persisted + in: query + required: false + schema: + type: boolean + 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' + "503": + description: Failed to communicate with database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Not allowed to find subsets + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Found subsets + content: + application/json: + schema: + type: string + security: + - basicAuth: [] + - bearerAuth: [] + post: + tags: + - subset-endpoint + summary: Create subset + operationId: create_3 + parameters: + - name: databaseId + 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 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ExecuteStatementDto' + required: true + responses: + "400": + description: Malformed select query + 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' + "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' + "201": + description: Created subset + content: + application/json: + schema: + $ref: '#/components/schemas/QueryResultDto' + "417": + description: Failed to insert query into query store of data database + 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' + security: + - basicAuth: [] + - bearerAuth: [] + /api/database/{databaseId}/table/{tableId}/history: + get: + tags: + - table-endpoint + summary: Find table history + 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 + responses: + "404": + description: Failed to find table history in data database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Found table history + content: + application/json: + schema: + type: string + "403": + description: Find table history 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: [] + /api/database/{databaseId}/table/{tableId}/export: + get: + tags: + - table-endpoint + summary: Export table data + operationId: exportData + 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: + "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' + "403": + description: Export table data not allowed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - basicAuth: [] + - bearerAuth: [] + /api/database/{databaseId}/subset/{subsetId}: + get: + tags: + - subset-endpoint + summary: Find subset + 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: timestamp + in: query + required: false + schema: + type: string + format: date-time + responses: + "400": + description: Malformed select query + 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' + "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' + "200": + description: Found subset + content: + application/json: + schema: + $ref: '#/components/schemas/QueryDto' + text/csv: {} + security: + - basicAuth: [] + - bearerAuth: [] + /api/search: + get: + consumes: + - application/json + description: Performs a fuzzy search + operationId: post_fuzzy_search + parameters: + - in: query + required: true + schema: + properties: + q: + example: air quality + type: string + type: string + produces: + - application/json + responses: + "200": + content: + application/json: + schema: + properties: + results: + items: + type: object + type: array + type: object + 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/database/{database_id}: + delete: + consumes: + - application/json + description: Deletes a database + operationId: delete_database + produces: + - application/json + responses: + "202": + content: + application/json: + schema: + properties: + id: + example: 1 + implementation: int64 + type: integer + required: + - id + type: object + description: Deleted database successfully + "404": + content: + application/json: + schema: + properties: + message: + example: Message + type: string + success: + example: false + type: boolean + required: + - success + - message + type: object + description: Database not found + security: + - bearerAuth: [] + - basicAuth: [] + summary: Deletes a database + tags: + - database-endpoint + put: + consumes: + - application/json + description: Updates a database + operationId: update_database + parameters: + - in: body + name: body + required: true + schema: + properties: + internal_name: + example: air_quality_abcd + type: string + name: + example: Air Quality + type: string + type: object + produces: + - application/json + responses: + "202": + content: + application/json: + schema: + properties: + id: + example: 1 + implementation: int64 + type: integer + required: + - id + type: object + description: Updated database successfully + "400": + content: + application/json: + schema: + properties: + message: + example: Message + type: string + success: + example: false + type: boolean + required: + - success + - message + type: object + description: Invalid schema + "404": + content: + application/json: + schema: + properties: + message: + example: Message + type: string + success: + example: false + type: boolean + required: + - success + - message + type: object + description: Database not found + security: + - bearerAuth: [] + - basicAuth: [] + summary: Updates a database + tags: + - database-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: + 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: Gets the index + tags: + - search-endpoint + /api/search/{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: + properties: + field_value_pairs: + type: object + search_term: + example: air quality + type: string + type: object + 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/{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: + properties: + results: + items: + properties: + attr_friendly_name: + example: Name + type: string + attr_name: + example: name + type: string + type: + description: OpenSearch data types. + example: string + type: string + type: object + type: array + type: object + description: List of fields + "404": + description: Invalid type. + summary: Get searchable fields + tags: + - search-endpoint + /health: + get: + consumes: + - application/json + description: | + Return UP if the instance is ready to serve connections. + produces: + - application/json + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/Health' + description: OK, service is up and running + "404": + description: Service is not yet ready + summary: Return a healthcheck + tags: + - actuator + /api/analyse/database/{database_id}/table/{table_id}/statistics: + get: + operationId: analyse_table_stat + parameters: + - example: 1 + in: path + name: database_id + required: true + schema: + format: int64 + type: integer + - example: 1 + in: path + name: table_id + required: true + schema: + format: int64 + type: integer + responses: + "202": + content: + application/json: + schema: + $ref: '#/components/schemas/TableStats' + description: Determined statistics + "400": + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDto' + description: Missing parameters + "404": + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorDto' + description: Table not found + security: + - bearerAuth: [] + - basicAuth: [] + summary: Determine table statistics + tags: + - analyse-endpoint + /api/analyse/datatypes: + get: + consumes: + - application/json + description: This is a simple API which returns the datatypes of a (path) csv file + 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/DataTypesDto' + 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 + summary: Determine datatypes + tags: + - analyse-endpoint + /api/analyse/keys: + get: + consumes: + - application/json + description: This is a simple API which returns the primary keys + ranking of a (path) csv file + 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 + summary: Determine primary keys + tags: + - analyse-endpoint + /sidecar/export/{filename}: + post: + consumes: + - application/json + description: | + Exports a specific .csv file to the Storage Service via S3 + parameters: + - description: Name of the object file to export to the Storage Service + in: path + name: filename + required: true + produces: + - application/json + responses: + "202": + content: {} + description: Exported the .csv + "400": + description: The Storage Service could not be contacted or .csv was not found. + security: + - bearerAuth: [] + - basicAuth: [] + summary: Exports a .csv to the Storage Service + tags: + - sidecar + /sidecar/import/{filename}: + post: + consumes: + - application/json + description: | + Imports a specific .csv file from the Storage Service via S3 + parameters: + - description: Name of the object file to import from the Storage Service + in: path + name: filename + required: true + produces: + - application/json + responses: + "202": + content: {} + description: Imported the .csv + "400": + description: The Storage Service could not be contacted or .csv was not found. + security: + - bearerAuth: [] + - basicAuth: [] + summary: Imports a .csv from the Storage Service + tags: + - sidecar diff --git a/.docs/.swagger/custom.css b/.docs/.swagger/custom.css index b4eb2af41e..c1056f453d 100644 --- a/.docs/.swagger/custom.css +++ b/.docs/.swagger/custom.css @@ -3,6 +3,10 @@ body { background: #eee; } +#logo { + margin-top: 1rem; +} + .scheme-container { background: none !important; box-shadow: none !important; diff --git a/.docs/.swagger/swagger-generate.sh b/.docs/.swagger/swagger-generate.sh index 1469a23bd0..c293e6c5cf 100644 --- a/.docs/.swagger/swagger-generate.sh +++ b/.docs/.swagger/swagger-generate.sh @@ -9,7 +9,7 @@ services[3305]=sidecar function retrieve () { if [[ "$2" == analyse ]] || [[ "$2" == search ]] || [[ "$2" == sidecar ]]; then echo "... retrieve json api from localhost:$1" - curl -sSL "http://localhost:$1/api-$2.json" | yq -y > "./.docs/.swagger/api-$2.yaml" + curl -sSL "http://localhost:$1/api-$2.json" | yq -p=json > "./.docs/.swagger/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" diff --git a/.docs/.swagger/swagger-site.sh b/.docs/.swagger/swagger-site.sh index f6f91bc910..d8d91a73cb 100644 --- a/.docs/.swagger/swagger-site.sh +++ b/.docs/.swagger/swagger-site.sh @@ -1,23 +1,21 @@ #!/bin/bash declare -A services -services[1080]=upload +#services[1080]=upload services[4000]=search services[5000]=analyse services[9093]=data services[9099]=metadata services[3305]=sidecar -# ensure target directories are present -echo "ensure target directory ./site are present" -mkdir -p ./site +rm -f ./tmp.yaml +mkdir -p ./site/swagger +touch ./tmp.yaml -# extract static site -echo "extract static site .docs/.swagger/dist.tar.gz" +# -> build paths: map for key in "${!services[@]}"; do - mkdir -p ./site/${services[$key]} - echo "extract static site ./swagger-ui.html -> ./site/${services[$key]}" - cp .docs/.swagger/swagger-ui.html ./site/${services[$key]}/index.html - cp .docs/.swagger/custom.css ./site/${services[$key]}/custom.css - sed -i -e "s/__SERVICENAME__/${services[$key]^} Service/g" ./site/${services[$key]}/index.html - cp ".docs/.swagger/api-${services[$key]}.yaml" "./site/${services[$key]}/api.yaml" -done \ No newline at end of file + cat .docs/.swagger/api-${services[$key]}.yaml | yq .paths >> ./tmp.yaml +done + +# -> merge with api.base.yaml into final api.yaml +yq ".paths *= load(\"tmp.yaml\")" .docs/.swagger/api.base.yaml > .docs/.swagger/api.yaml + diff --git a/.docs/.swagger/swagger-ui.html b/.docs/.swagger/swagger-ui.html index ef3ce55743..98f7cb441f 100644 --- a/.docs/.swagger/swagger-ui.html +++ b/.docs/.swagger/swagger-ui.html @@ -3,16 +3,22 @@ <head> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> - <meta name="description" content="__SERVICENAME__ API description in OpenAPI 3.0"/> - <title>__SERVICENAME__ API</title> - <link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@5.11.1/swagger-ui.css"/> + <meta name="description" content="DBRepo REST API description in OpenAPI 3.0"/> + <title>DBRepo REST API</title> + <link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@5.17.12/swagger-ui.css"/> <link rel="stylesheet" href="./custom.css"/> <link rel="icon" href="https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/.docs/images/signet_white.png" /> </head> <body> +<div class="swagger-ui"> + <div class="wrapper"> + <img id="logo" width="300" alt="DBRepo Logo" + src="https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/dbrepo-ui/public/logo.png" /> + </div> +</div> <div id="swagger-ui"></div> -<script src="https://unpkg.com/swagger-ui-dist@5.11.1/swagger-ui-bundle.js" crossorigin></script> -<script src="https://unpkg.com/swagger-ui-dist@5.11.1/swagger-ui-standalone-preset.js" crossorigin></script> +<script src="https://unpkg.com/swagger-ui-dist@5.17.12/swagger-ui-bundle.js" crossorigin></script> +<script src="https://unpkg.com/swagger-ui-dist@5.17.12/swagger-ui-standalone-preset.js" crossorigin></script> <script> window.onload = () => { window.ui = SwaggerUIBundle({ diff --git a/.docs/system-services-analyse.md b/.docs/api/analyse-service.md similarity index 99% rename from .docs/system-services-analyse.md rename to .docs/api/analyse-service.md index 8d940aba68..be5efdbf5c 100644 --- a/.docs/system-services-analyse.md +++ b/.docs/api/analyse-service.md @@ -2,8 +2,6 @@ author: Martin Weise --- -# Analyse Service - ## tl;dr !!! debug "Debug Information" diff --git a/.docs/system-services-authentication.md b/.docs/api/auth-service.md similarity index 99% rename from .docs/system-services-authentication.md rename to .docs/api/auth-service.md index 0ec89e11c1..5d3e0f42b2 100644 --- a/.docs/system-services-authentication.md +++ b/.docs/api/auth-service.md @@ -2,8 +2,6 @@ author: Martin Weise --- -# Authentication Service - ## tl;dr !!! debug "Debug Information" @@ -38,7 +36,7 @@ We organize the roles into default- and escalated composite roles. There are thr Each of the composite role has a set of other associated composite roles. <figure markdown> - + <figcaption>Three groups (Researchers, Developers, Data Stewards) and their composite roles associated.</figcaption> </figure> diff --git a/.docs/system-services-broker.md b/.docs/api/broker-service.md similarity index 96% rename from .docs/system-services-broker.md rename to .docs/api/broker-service.md index 7ed0c3333f..0345271bf1 100644 --- a/.docs/system-services-broker.md +++ b/.docs/api/broker-service.md @@ -2,8 +2,6 @@ author: Martin Weise --- -# Broker Service - ## tl;dr !!! debug "Debug Information" @@ -40,14 +38,14 @@ queue `dbrepo`, connected with a binding of `dbrepo.#` which routes all tuples w the dot!) to this queue. <figure markdown> -  +  <figcaption>Replicated quorum queue dbrepo in a cluster with three nodes</figcaption> </figure> The consumer takes care of writing it to the correct table in the [Data Service](../system-services-data). <figure markdown> -  +  <figcaption>Architecture Broker Service</figcaption> </figure> diff --git a/.docs/system-databases-data.md b/.docs/api/data-db.md similarity index 97% rename from .docs/system-databases-data.md rename to .docs/api/data-db.md index e290bc1342..859264a53a 100644 --- a/.docs/system-databases-data.md +++ b/.docs/api/data-db.md @@ -2,10 +2,6 @@ author: Martin Weise --- -# Data Database - -## tl;dr - !!! debug "Debug Information" Image: [`bitnami/mariadb-galera:11.2.2-debian-11-r0`](https://hub.docker.com/r/bitnami/mariadb-galera) @@ -64,7 +60,7 @@ the [`boto3`](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html natively. <figure markdown> - + <figcaption>Sidecar that handles the CSV-file upload/download.</figcaption> </figure> diff --git a/.docs/system-services-data.md b/.docs/api/data-service.md similarity index 90% rename from .docs/system-services-data.md rename to .docs/api/data-service.md index b8a1fe6263..df6b87e2f0 100644 --- a/.docs/system-services-data.md +++ b/.docs/api/data-service.md @@ -2,8 +2,6 @@ author: Martin Weise --- -# Data Service - ## tl;dr !!! debug "Debug Information" @@ -26,8 +24,6 @@ Data Service up. ## Limitations -* No clear differentiation for data-handling endpoints from the [Metadata Service](../system-services-metadata) yet. - !!! question "Do you miss functionality? Do these limitations affect you?" We strongly encourage you to help us implement it as we are welcoming contributors to open-source software and get diff --git a/.docs/system-services-gateway.md b/.docs/api/gateway-service.md similarity index 99% rename from .docs/system-services-gateway.md rename to .docs/api/gateway-service.md index 9950110c71..172892e3bd 100644 --- a/.docs/system-services-gateway.md +++ b/.docs/api/gateway-service.md @@ -2,8 +2,6 @@ author: Martin Weise --- -# Gateway Service - ## tl;dr !!! debug "Debug Information" diff --git a/.docs/usage-overview.md b/.docs/api/index.md similarity index 100% rename from .docs/usage-overview.md rename to .docs/api/index.md diff --git a/.docs/api/metadata-db.md b/.docs/api/metadata-db.md new file mode 100644 index 0000000000..e56b88ab8b --- /dev/null +++ b/.docs/api/metadata-db.md @@ -0,0 +1,5 @@ +--- +author: Martin Weise +--- + +TBD \ No newline at end of file diff --git a/.docs/system-services-metadata.md b/.docs/api/metadata-service.md similarity index 99% rename from .docs/system-services-metadata.md rename to .docs/api/metadata-service.md index b7fe150c8b..33f3db3bfe 100644 --- a/.docs/system-services-metadata.md +++ b/.docs/api/metadata-service.md @@ -2,8 +2,6 @@ author: Martin Weise --- -# Metadata Service - ## tl;dr !!! debug "Debug Information" diff --git a/.docs/api/open-api.md b/.docs/api/open-api.md new file mode 100644 index 0000000000..f06ec67a0d --- /dev/null +++ b/.docs/api/open-api.md @@ -0,0 +1,7 @@ +--- +author: Martin Weise +--- + +All services are documented using the +[](https://www.openapis.org/){ tabindex=-1 } +documentation standard. diff --git a/.docs/usage-python.md b/.docs/api/python.md similarity index 95% rename from .docs/usage-python.md rename to .docs/api/python.md index ce83d6304f..7289639bfa 100644 --- a/.docs/usage-python.md +++ b/.docs/api/python.md @@ -2,15 +2,11 @@ author: Martin Weise --- -# Python Library +[](https://pypi.org/project/dbrepo/){ tabindex=-1 } ## tl;dr -!!! debug "Debug Information" - - PyPI: [`dbrepo`](https://pypi.org/project/dbrepo/) - - * Full module documentation <a href="../sphinx" target="_blank">:fontawesome-solid-square-up-right: view online</a> +[:fontawesome-solid-cube: View Docs](../sphinx){ .md-button .md-button--primary } ## Installing diff --git a/.docs/system-services-search.md b/.docs/api/search-service.md similarity index 92% rename from .docs/system-services-search.md rename to .docs/api/search-service.md index edca2df6fc..fff317d6f8 100644 --- a/.docs/system-services-search.md +++ b/.docs/api/search-service.md @@ -2,8 +2,6 @@ author: Martin Weise --- -# Search Service - ## tl;dr !!! debug "Debug Information" @@ -22,7 +20,7 @@ the [User Interface](../system-other-ui) to allow structured search of databases views, semantic concepts & units of measurements used in databases. <figure markdown> -{ .img-border } +{ .img-border } <figcaption>Figure 1: Faceted browsing</figcaption> </figure> @@ -33,7 +31,7 @@ index [`database`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fd that holds all the metadata information which is mirrored from the [Metadata Database](../system-databases-metadata). <figure markdown> - + <figcaption>Figure 2: Statistical properties in Metadata Database and Search Database</figcaption> </figure> @@ -58,7 +56,7 @@ search can be performed when at least two columns have the same semantic concept the units of measurements can be transformed. <figure markdown> - + <figcaption>Figure 3: Two tables with compatible semantic concepts and units of measurement</figcaption> </figure> @@ -70,7 +68,7 @@ search service transforms the query to the dataset on the right from °F to c between 32 - 50 °F"* instead. <figure markdown> - + <figcaption>Figure 4: Unit independent search query transformation</figcaption> </figure> diff --git a/.docs/system-services-storage.md b/.docs/api/storage-service.md similarity index 95% rename from .docs/system-services-storage.md rename to .docs/api/storage-service.md index f6b9ae28ee..2219c5fa57 100644 --- a/.docs/system-services-storage.md +++ b/.docs/api/storage-service.md @@ -2,8 +2,6 @@ author: Martin Weise --- -# Storage Service - ## tl;dr !!! debug "Debug Information" @@ -31,10 +29,6 @@ The default configuration creates two buckets `dbrepo-upload`, `dbrepo-download` * `dbrepo-upload` for CSV-file upload (for import of data, analysis, etc.) from the User Interface * `dbrepo-download` for CSV-file download (exporting data, metadata, etc.) -### Examples - -See the [usage page](../usage-storage). - ## Limitations * No support for multiple regions. diff --git a/.docs/system-other-ui.md b/.docs/api/ui.md similarity index 75% rename from .docs/system-other-ui.md rename to .docs/api/ui.md index cb8a133103..659b21ea90 100644 --- a/.docs/system-other-ui.md +++ b/.docs/api/ui.md @@ -2,38 +2,13 @@ author: Martin Weise --- -# User Interface - -## tl;dr - -!!! debug "Debug Information" - - Image: [`dbrepo/ui:__APPVERSION__`](https://hub.docker.com/r/dbrepo/ui) - - * Ports: 3000/tcp - * UI: `http://<hostname>/` - -## Overview - -It provides a graphical interface for a researcher to interact with the API (c.f. Figure 1). - -<figure markdown> -{ .img-border } -<figcaption>Figure 1: User Interface</figcaption> -</figure> - -For examples on how to use the User Interface, visit the [Usage Overview](../usage-overview/) to find out how to create -users, databases and how to import your data. - -### Settings - The User Interface is configured in the `runtimeConfig` section of the `nuxt.config.ts` file during build time. For the runtime, you need to override those values through environment variables or by mounting a `.env` file. As a small example, you can configure the logo :material-numeric-1-circle-outline: in Figure 2. Make sure you mount the logo as image as well, in this example we want to mount a custom logo `my_logo.png` into the container and specify the name. <figure markdown> -{ .img-border } +{ .img-border } <figcaption>Figure 2: Architecture of the UI microservice</figcaption> </figure> @@ -64,7 +39,7 @@ The server-client architecture of the User Interface is shown in [Figure 3](#fig User Interface on development. <figure id="fig3" markdown> - + <figcaption>Figure 3: Architecture of the User Interface</figcaption> </figure> diff --git a/.docs/system-services-upload.md b/.docs/api/upload-service.md similarity index 95% rename from .docs/system-services-upload.md rename to .docs/api/upload-service.md index 56cfb27ddc..88812d308b 100644 --- a/.docs/system-services-upload.md +++ b/.docs/api/upload-service.md @@ -2,8 +2,6 @@ author: Martin Weise --- -# Upload Service - ## tl;dr !!! debug "Debug Information" @@ -44,7 +42,7 @@ If your deployment is secured with SSL/TLS (recommended) set the `useSsl` variab The Upload Service communicates internally with the [Storage Service](../system-services-storage) (c.f. [Figure 1](#fig1)). <figure id="fig1" markdown> - + <figcaption>Figure 1: Architecture of the Upload Service</figcaption> </figure> diff --git a/.docs/concepts/authentication.md b/.docs/concepts/authentication.md new file mode 100644 index 0000000000..5919b25723 --- /dev/null +++ b/.docs/concepts/authentication.md @@ -0,0 +1,15 @@ +--- +author: Martin Weise +--- + +## Bearer Authentication + +TBD + +## Basic Authentication + +TBD + +## OpenID Connect (OIDC) + +TBD \ No newline at end of file diff --git a/.docs/concepts/databases.md b/.docs/concepts/databases.md new file mode 100644 index 0000000000..1076f775ef --- /dev/null +++ b/.docs/concepts/databases.md @@ -0,0 +1,33 @@ +--- +author: Martin Weise +--- + +## Relational Database + +TBD + +## Query + +TBD + +## System Versioning + +TBD + +## Data Ingest + +<figure markdown> + +<figcaption>Figure 1: Modes of data ingest</figcaption> +</figure> + +More [usage examples](../usage-overview/) include how to ingest datasets, data dumps, live data, etc. + +### Generation of Metadata in DBRepo + +You can generate metadata e.g. UI tbd + +!!! warning "Limitation" + + Only system-versioned tables are considered when generating metadata to tables. If your table is not system-versioned + e.g. a base table, it will not be visible in the UI. \ No newline at end of file diff --git a/.docs/concepts/index.md b/.docs/concepts/index.md new file mode 100644 index 0000000000..8aa7e58597 --- /dev/null +++ b/.docs/concepts/index.md @@ -0,0 +1,16 @@ +--- +author: Martin Weise +--- + +This is the full system description from a technical/developer view and continuously being updated as the development +progresses. + +The remainder of this Sec. is organized as follows: in [Authentication](../concepts/authentication) +we describe how to to accessing important parts of DBRepo. Sec. [DBMS](../concepts/dbms) describes database management +systems on a high-level, Sec. [Messaging](../concepts/messaging) shows how data streams can be connected with DBRepo for +e.g. continuous sensor measurements. Sec. [(Meta-)Data](../concepts/metadata) describes the data derived from the +datasets, Sec. [Persistent Identifier](../concepts/pid) introduces how data is precisely identified for e.g. citation +using the DOI system. Sec. [Search](../concepts/search) describes how anything in DBRepo can be searched, Sec. +[Storage](../concepts/storage) shows how datasets can be uploaded/transferred between the services and Sec. +[User Interface](../concepts/ui) introduces the graphical interface for human interaction as part of virtual research +environments. \ No newline at end of file diff --git a/.docs/concepts/messaging.md b/.docs/concepts/messaging.md new file mode 100644 index 0000000000..448c7a3f63 --- /dev/null +++ b/.docs/concepts/messaging.md @@ -0,0 +1,15 @@ +--- +author: Martin Weise +--- + +## Tuple + +TBD + +## AMQP + +TBD + +## MQTT + +TBD \ No newline at end of file diff --git a/.docs/concepts/monitoring.md b/.docs/concepts/monitoring.md new file mode 100644 index 0000000000..10a1b331eb --- /dev/null +++ b/.docs/concepts/monitoring.md @@ -0,0 +1,136 @@ +--- +author: Martin Weise +--- + +## Prometheus Metrics + +We expose Prometheus metrics on all endpoints of the REST API. [Prometheus](https://prometheus.io/) is a cloud-native +monitoring system using a time-series database. In the default deployment (Docker Compose / Kubernetes) no Prometheus +instance is started. + +You need can setup Prometheus in a few minutes using +a [Docker container](https://prometheus.io/docs/prometheus/latest/installation/). + +## Example + +## Analyse Service + +| **Metric** | **Description** | +|-----------------------------|---------------------------------------------| +| `dbrepo_analyse_datatypes` | Time needed to analyse datatypes of dataset | +| `dbrepo_analyse_keys` | Time needed to analyse keys of dataset | +| `dbrepo_analyse_table_stat` | Time needed to analyse table statistics | +| `dbrepo_analyse_table_stat` | Time needed to analyse table statistics | + +## Auth Service + +See [Keycloak documentation](https://www.keycloak.org/server/configuration-metrics). + +## Broker Service + +See [RabbitMQ documentation](https://www.rabbitmq.com/docs/prometheus). + +## Databases + +See [MariaDB Galera documentation](https://galeracluster.com/documentation/html_docs_20210213-1355-master/documentation/galera-manager-monitoring-clusters.html). + +The [Data Database Sidecar](#) metrics are: + +| **Metric** | **Description** | +|---------------------------------|---------------------------------------| +| `dbrepo_sidecar_import_dataset` | Time needed to import dataset from S3 | +| `dbrepo_sidecar_export_dataset` | Time needed to export dataset to S3 | + +## Data Service + +| **Metric** | **Description** | +|-----------------------------|-------------------------------------------| +| `dbrepo_message_receive` | Received AMQP message from Broker Service | +| `dbrepo_subset_create` | Create subset | +| `dbrepo_subset_data` | Retrieved subset data | +| `dbrepo_subset_find` | Find subset | +| `dbrepo_subset_list` | Find subsets | +| `dbrepo_subset_persist` | Persist subset | +| `dbrepo_table_data_create` | Create table data | +| `dbrepo_table_data_delete` | Delete table data | +| `dbrepo_table_data_export` | Export table data | +| `dbrepo_table_data_history` | Find table history | +| `dbrepo_table_data_import` | Import dataset | +| `dbrepo_table_data_list` | Retrieve table data | +| `dbrepo_table_data_update` | Update table data | +| `dbrepo_view_data` | Retrieve view data | +| `dbrepo_view_schema_list` | Find view schemas | + +## Metadata Service + +| **Metric** | **Description** | +|------------------------------------|-----------------------------------| +| `dbrepo_user_refresh_token` | Refresh user token | +| `dbrepo_identifier_save` | Save identifier | +| `dbrepo_oai_record_get` | Get the record | +| `dbrepo_access_give` | Give access to some database | +| `dbrepo_ontologies_find` | Find one ontology | +| `dbrepo_database_findall` | List databases | +| `dbrepo_tables_refresh` | Refresh database tables metadata | +| `dbrepo_license_findall` | Get all licenses | +| `dbrepo_user_modify` | Modify user information | +| `dbrepo_container_findall` | Find all containers | +| `dbrepo_maintenance_delete` | Delete maintenance message | +| `dbrepo_maintenance_update` | Update maintenance message | +| `dbrepo_ontologies_create` | Register a new ontology | +| `dbrepo_identifier_delete` | Delete some identifier | +| `dbrepo_oai_identify` | Identify the repository | +| `dbrepo_database_create` | Create database | +| `dbrepo_oai_metadataformats_list` | List the metadata formats | +| `dbrepo_user_password_modify` | Modify user password | +| `dbrepo_semantic_concepts_findall` | List semantic concepts | +| `dbrepo_identifier_retrieve` | Retrieve metadata from identifier | +| `dbrepo_identifier_list` | Find all identifiers | +| `dbrepo_views_findall` | Find all views | +| `dbrepo_identifier_create` | Draft identifier | +| `dbrepo_oai_identifiers_list` | List the identifiers | +| `dbrepo_image_findall` | Find all images | +| `dbrepo_database_visibility` | Update database visibility | +| `dbrepo_container_create` | Create container | +| `dbrepo_views_refresh` | Refresh database views metadata | +| `dbrepo_database_find` | Find some database | +| `dbrepo_access_get` | Check access to some database | +| `dbrepo_identifier_find` | Find some identifier | +| `dbrepo_maintenance_create` | Create maintenance message | +| `dbrepo_container_delete` | Delete some container | +| `dbrepo_ontologies_delete` | Delete an ontology | +| `dbrepo_ontologies_findall` | List all ontologies | +| `dbrepo_user_token` | Obtain user token | +| `dbrepo_view_find` | Find one view | +| `dbrepo_user_create` | Create user | +| `dbrepo_ontologies_update` | Update an ontology | +| `dbrepo_maintenance_findall` | Find maintenance messages | +| `dbrepo_users_list` | Find all users | +| `dbrepo_image_find` | Find some image | +| `dbrepo_user_find` | Get a user info | +| `dbrepo_image_delete` | Delete some image | +| `dbrepo_identifier_publish` | Publish identifier | +| `dbrepo_image_update` | Update some image | +| `dbrepo_view_create` | Create a view | +| `dbrepo_semantic_units_findall` | List semantic units | +| `dbrepo_image_create` | Create image | +| `dbrepo_database_image` | Update database image | +| `dbrepo_view_delete` | Delete one view | +| `dbrepo_database_transfer` | Update database owner | +| `dbrepo_maintenance_find` | Find one maintenance message | +| `dbrepo_access_modify` | Modify access to some database | +| `dbrepo_ontologies_entities_find` | Find entities | +| `dbrepo_access_delete` | Revoke access to some database | +| `dbrepo_container_find` | Find some container | + +## Search Service + +| **Metric** | **Description** | +|---------------------------------|---------------------------------------------------------| +| `dbrepo_search_index_list` | Time needed to list search index | +| `dbrepo_search_type_list` | Time needed to list search types | +| `dbrepo_search_fuzzy` | Time needed to search fuzzy | +| `dbrepo_search_type` | Time needed to search by type | +| `dbrepo_search_update_database` | Time needed to update a database in the search database | +| `dbrepo_search_delete_database` | Time needed to delete a database in the search database | + diff --git a/.docs/concepts/pid.md b/.docs/concepts/pid.md new file mode 100644 index 0000000000..c5d769192c --- /dev/null +++ b/.docs/concepts/pid.md @@ -0,0 +1,7 @@ +--- +author: Martin Weise +--- + +## tbd + +tbd diff --git a/.docs/concepts/search.md b/.docs/concepts/search.md new file mode 100644 index 0000000000..8ae41c80ba --- /dev/null +++ b/.docs/concepts/search.md @@ -0,0 +1,13 @@ +--- +author: Martin Weise +--- + +## Index + +TBD + +## Document + +TBD + +## Query \ No newline at end of file diff --git a/.docs/concepts/storage.md b/.docs/concepts/storage.md new file mode 100644 index 0000000000..fcc975fab2 --- /dev/null +++ b/.docs/concepts/storage.md @@ -0,0 +1,15 @@ +--- +author: Martin Weise +--- + +## S3 + +TBD + +## Sidecar + +TBD + +## Upload + +TBD \ No newline at end of file diff --git a/.docs/concepts/ui.md b/.docs/concepts/ui.md new file mode 100644 index 0000000000..ab6848b7ba --- /dev/null +++ b/.docs/concepts/ui.md @@ -0,0 +1,21 @@ +--- +author: Martin Weise +--- + +It provides a graphical interface for a researcher to interact with the API (c.f. Figure 1). + +<figure markdown> +{ .img-border } +<figcaption>Figure 1: User Interface</figcaption> +</figure> + +For examples on how to use the User Interface, visit the [API](../api/) page to find out how to create +users, databases and how to import your data. + +## Server / Client + +TBD + +## Cache + +TBD \ No newline at end of file diff --git a/.docs/dev-guide-app.md b/.docs/contributing.md similarity index 91% rename from .docs/dev-guide-app.md rename to .docs/contributing.md index 6d20ae5065..259fcae55b 100644 --- a/.docs/dev-guide-app.md +++ b/.docs/contributing.md @@ -1,4 +1,8 @@ -# Application Developer Guide +--- +author: Martin Weise +--- + +We welcome contributions to DBRepo! ## Dependencies @@ -104,4 +108,11 @@ repository. ## Documentation -For consistency reasons across the documentation, the resolution needs to be 1280x800 (16:10 ratio) \ No newline at end of file +For consistency reasons across the documentation, the resolution needs to be 1280x800 (16:10 ratio) + +## Roadmap + +- [x] Q1: Python library, versioning in every component, bumping frontend versions, i18n +- [ ] Q2: Kubernetes deployment guidelines for OpenShift +- [ ] Q3: Frontend tests, database dashboards +- [ ] Q4: Release of 2.0.0 diff --git a/.docs/deployment-helm.md b/.docs/deployment-helm.md index 59835476e7..745ad87b94 100644 --- a/.docs/deployment-helm.md +++ b/.docs/deployment-helm.md @@ -2,6 +2,8 @@ author: Martin Weise --- +[](https://artifacthub.io/packages/helm/dbrepo/dbrepo){ tabindex=-1 } + ## TL;DR To install DBRepo in your existing cluster, download the diff --git a/.docs/dev-guide-infra.md b/.docs/dev-guide-infra.md deleted file mode 100644 index cb01a76473..0000000000 --- a/.docs/dev-guide-infra.md +++ /dev/null @@ -1,78 +0,0 @@ -# Infrastructure Developer Guide - -## tl;dr - -```shell -make cluster-start cluster-image-pull cluster-install -``` - -## Dependencies - -Local development depends on the following packages for Debian 12: - -```shell -apt install -y make -``` - -Required tools with their own installing guides: - -* [Docker Engine](https://docs.docker.com/engine/install/) 24+ -* [Minikube](https://minikube.sigs.k8s.io/docs/start/) 1.32.0 - -## Getting Started - -Start the local development cluster with the Docker driver (takes at least 8 vCPUs and 12GB RAM). It installs a Minikube -single-node Kubernetes cluster with enabled Ingress and Dashboard - -```shell -make cluster-start -``` - -Build the local images with `make build-docker` and copy them to the cluster image cache: - -```shell -make cluster-image-pull -``` - -Build and install the Helm chart: - -```shell -make cluster-install -``` - -## Debug - -Open the Minikube (Kubernetes) Dashboard: - -```shell -make cluster-dashboard -``` - -<figure markdown> - -<figcaption>Figure 1: Minikube Dashboard</figcaption> -</figure> - -Optionally enable the Prometheus metrics addon with: - -```shell -minikube addons enable metrics-server -``` - -## Test - -Test if the Helm chart raises errors on start (the script aborts after 5 minutes automatically if some pods are not -starting or erroneous). - -```shell -make cluster-test -``` - -## Uninstall - -To uninstall DBRepo from the local Minikube cluster, removing all data: - -```shell -make cluster-uninstall -``` - diff --git a/.docs/dev-overview.md b/.docs/dev-overview.md deleted file mode 100644 index e7c0e808b9..0000000000 --- a/.docs/dev-overview.md +++ /dev/null @@ -1,21 +0,0 @@ -# Overview - -## Guides - -* The [application developer guide](../dev-guide-app) guides you through the steps on how to build DBRepo from - scratch and customize the application. -* The [infrastructure developer guide](../dev-guide-infra) guides you through the steps on how to build and customize - the operation environment. - -## Organization - -* Monthly sprints with patch-releases (i.e. `1.4.2` in February, `1.4.3` in March, ...). -* Branching from `dev` for feature development, one release branch per patch (i.e. `release-1.4.2` for release version - `1.4.2`). - -## Roadmap - -- [x] Q1: Python library, versioning in every component, bumping frontend versions, i18n -- [ ] Q2: Kubernetes deployment guidelines for OpenShift -- [ ] Q3: Frontend tests, database dashboards -- [ ] Q4: Release of 2.0.0 \ No newline at end of file diff --git a/.docs/examples/covid19.md b/.docs/examples/covid19.md new file mode 100644 index 0000000000..e5db773195 --- /dev/null +++ b/.docs/examples/covid19.md @@ -0,0 +1,21 @@ +--- +author: Martin Weise +--- + +## tl;dr + +tbd + +## Description + +TBD + +## Solution + +TBD + +## DBRepo Features + +- [x] Large Dataset ≈15GiB +- [x] Subset Citation using PID +- [x] External access from Grafana Dashboard \ No newline at end of file diff --git a/.docs/examples/influenza.md b/.docs/examples/influenza.md new file mode 100644 index 0000000000..074c413d31 --- /dev/null +++ b/.docs/examples/influenza.md @@ -0,0 +1,21 @@ +--- +author: Martin Weise +--- + +## tl;dr + +tbd + +## Description + +TBD + +## Solution + +TBD + +## DBRepo Features + +- [x] Import through CSV-dataset upload +- [x] Data views implementing embargo period (24 hours) +- [x] External access from Grafana Dashboard diff --git a/.docs/examples/manufacturing.md b/.docs/examples/manufacturing.md new file mode 100644 index 0000000000..f3eb32600f --- /dev/null +++ b/.docs/examples/manufacturing.md @@ -0,0 +1,19 @@ +--- +author: Martin Weise +--- + +## tl;dr + +tbd + +## Description + +TBD + +## Solution + +TBD + +## DBRepo Features + +- [x] TBD diff --git a/.docs/examples/power.md b/.docs/examples/power.md new file mode 100644 index 0000000000..ea16727536 --- /dev/null +++ b/.docs/examples/power.md @@ -0,0 +1,21 @@ +--- +author: Martin Weise +--- + +## tl;dr + +tbd + +## Description + +TBD + +## Solution + +TBD + +## DBRepo Features + +- [x] High-throughput real-time data import (MQTT) +- [x] Private database +- [x] Public embargoed data view diff --git a/.docs/examples/transportation.md b/.docs/examples/transportation.md new file mode 100644 index 0000000000..0aedca2e37 --- /dev/null +++ b/.docs/examples/transportation.md @@ -0,0 +1,11 @@ +--- +author: Martin Weise +--- + +## Description + +TBD + +## Solution + +TBD \ No newline at end of file diff --git a/.docs/help.md b/.docs/help.md new file mode 100644 index 0000000000..eaecbe6b04 --- /dev/null +++ b/.docs/help.md @@ -0,0 +1,11 @@ +--- +author: Martin Weise +--- + +## Concepts Documentation + +The [concepts documentation](../concepts/) is the most complete guide on how to use DBRepo. + +## API Documentation + +The [API documentation](../api/) present reference docs for all APIs. diff --git a/.docs/images/logos.png b/.docs/images/logos.png new file mode 100644 index 0000000000000000000000000000000000000000..79a5217434fc65a287962c83f6376550b9c2a6a6 GIT binary patch literal 32796 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 B_pbl| literal 0 HcmV?d00001 diff --git a/.docs/images/logos.psd b/.docs/images/logos.psd index f6448014226ff1f39204b9e737fd5748f05128da..c91a87138faa69baf7b66a934035d97438b4c12d 100644 GIT binary patch delta 277857 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	Aa6ORA;_h00Gxx>ce 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 delta 210960 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�@y9MGQ8SOxH& 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 Ii-Jas0MVQ>o&W#< diff --git a/.docs/index.md b/.docs/index.md index 4eb23f9e8a..aa65b7d939 100644 --- a/.docs/index.md +++ b/.docs/index.md @@ -1,55 +1,36 @@ --- author: Martin Weise -hide: -- navigation -social: - cards_layout_options: - title: Documentation that simply works --- -## Problem Statement +[](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services){ tabindex=-1 } +[](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services){ tabindex=-1 } +[](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services){ tabindex=-1 } +[](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services){ tabindex=-1 } -Digital repositories see themselves more frequently encountered with the problem of making databases accessible in their -collection. Challenges revolve around organizing, searching and retrieving content stored within databases and -constitute a major technical burden as their internal representation greatly differs from static documents most digital -repositories are designed for. +Documentation for version: [v1.4.4](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). -## Application Areas +DBRepo is a repository for data in databases that are used from the beginning until the end of a research +project supporting data evolution, -citation and -versioning. It implements the query store of the +[RDA WGDC](https://doi.org/10.1162/99608f92.be565013) on precisely identifying arbitrary subsets of data. -We present a database repository system that allows researchers to ingest data into a central, versioned repository -through common interfaces, provides efficient access to arbitrary subsets of data even when the underlying data store is -evolving, allows reproducing of query results and supports findable-, accessible-, interoperable- and reusable data. +## Why use DBRepo? -## Features +* **Built-in search** makes your dataset searchable without extra effort: most metadata is generated + automatically for data in your databases. +* **Citable datasets** adopting the recommendations of the RDA-WGDC, arbitrary subsets can be precisely, persistently + identified using system-versioned tables of MariaDB and the DataCite schema for minting DOIs. +* **Powerful API for Data Scientists** with our strongly typed Python Library, Data Scientists can import, export and + work with data from Jupyter Notebook or Python script, optionally using Pandas DataFrames. +* **Cloud Native** our lightweight Helm chart allows for installations on any cloud provider or private-cloud setting + that has an underlying PV storage provider. -### Built-in search +Installing DBRepo is very easy or +[give it a try online](https://test.dbrepo.tuwien.ac.at){ target="_blank" }. -DBRepo makes your dataset searchable without extra effort: most metadata is generated automatically for data in your -databases. The fast and powerful OpenSearch database allows a fast retrieval of any information. Adding semantic mapping -through a suggestion-feature, allows machines to properly understand the context of your data. [Learn more.](../system-services-search/) +## Who is using DBRepo? -### Citable datasets + -Adopting the recommendations of the RDA-WGDC, arbitrary subsets can be precisely, persistently identified using -system-versioned tables of MariaDB and the DataCite schema for minting DOIs. External systems i.e. metadata harvesters -(OpenAIRE, Google Datasets) can access these datasets through OAI-PMH, JSON-LD and FAIR Signposting protocols. -[Learn more.](../system-services-metadata/) +## How can I try DBRepo -### Powerful API for Data Scientists - -With our strongly typed Python Library, Data Scientists can import, export and work with data from Jupyter Notebook or -Python script, optionally using Pandas DataFrames. For example: the AMQP API Client can collect continuous data from -edge devices like sensors and store them asynchronous in DBRepo. [Learn more.](../usage-python/) - -### Cloud Native - -Our lightweight Helm chart allows for installations on any cloud provider or private-cloud setting that has an -underlying PV storage provider. DBRepo can be installed from the Artifacthub repository. Databases are managed as -MariaDB Galera Cluster with high degree of availability ensuring your data is always accessible. -[Learn more.](../deployment-helm/) - -## More Information - -- Demonstration instance [https://dbrepo1.ec.tuwien.ac.at](https://dbrepo1.ec.tuwien.ac.at) -- Test instance [https://test.dbrepo.tuwien.ac.at](https://test.dbrepo.tuwien.ac.at) -- System description [https://doi.org/10.2218/ijdc.v17i1.825](https://doi.org/10.2218/ijdc.v17i1.825) +[:fontawesome-solid-flask: Demonstration Instance](https://test.dbrepo.tuwien.ac.at){ .md-button .md-button--primary target="_blank" } \ No newline at end of file diff --git a/.docs/migration.md b/.docs/migration.md new file mode 100644 index 0000000000..e56b88ab8b --- /dev/null +++ b/.docs/migration.md @@ -0,0 +1,5 @@ +--- +author: Martin Weise +--- + +TBD \ No newline at end of file diff --git a/.docs/operation-actuator.md b/.docs/operation-actuator.md deleted file mode 100644 index 581027daf1..0000000000 --- a/.docs/operation-actuator.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -author: Martin Weise ---- - -# Actuators - -## Usage - -TBD documentation of all Healthiness endpoints \ No newline at end of file diff --git a/.docs/operation-prometheus.md b/.docs/operation-prometheus.md deleted file mode 100644 index 8c31d0e94e..0000000000 --- a/.docs/operation-prometheus.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -author: Martin Weise ---- - -# Prometheus - -## Usage - -TBD documentation of all prometheus metrics diff --git a/.docs/stylesheets/.sass-cache/10990fa183107f4149f38216a4d00fe324a8131e/extra.scssc b/.docs/stylesheets/.sass-cache/10990fa183107f4149f38216a4d00fe324a8131e/extra.scssc index af6f91ae62d67828dfbb9235363407bea6d6dd0a..c66d9e0bfba4de127388de9e8ad6f4212c1f5d36 100644 GIT binary patch literal 10506 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 HU>*VhYQy*s delta 3451 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 diff --git a/.docs/stylesheets/extra.css b/.docs/stylesheets/extra.css index fbdf67bf13..d46da35109 100644 --- a/.docs/stylesheets/extra.css +++ b/.docs/stylesheets/extra.css @@ -1,26 +1,29 @@ :root, [data-md-color-accent=indigo] { --md-primary-fg-color: #006699; - --md-accent-fg-color: #005c8a /* darken 10% */ ; - --md-primary-fg-color--dark: #00537c /* darken 10% */ ; } + --md-accent-fg-color: #005c8a; + /* darken 10% */ + --md-primary-fg-color--dark: #00537c; + /* darken 10% */ } img.img-border { border: 1px solid #b3b3b3; } -.md-typeset .md-button.md-button--secondary { - background: #ffffff; } - .md-typeset .md-button.md-button--secondary:focus, .md-typeset .md-button.md-button--secondary:hover { - color: var(--md-primary-fg-color); - background: #e5e5e5; } +.md-typeset .md-button.md-button--primary { + color: white !important; } + +.md-typeset .md-button.md-button--secondary:focus, .md-typeset .md-button.md-button--secondary:hover { + color: var(--md-primary-fg-color--dark); + background: #e5e5e5; } .md-main .md-content a:not(.action-button):not([tabindex]), .md-main .md-content a:not(.action-button):not([tabindex]) { - color: var(--md-typeset-color); + color: var(--md-primary-fg-color); border-bottom: 2px solid var(--md-primary-fg-color); } .md-main .md-content a:not(.action-button):not([tabindex]):focus, .md-main .md-content a:not(.action-button):not([tabindex]):hover, .md-main .md-content a:not(.action-button):not([tabindex]):focus, .md-main .md-content a:not(.action-button):not([tabindex]):hover { - color: var(--md-typeset-color); + color: var(--md-primary-fg-color--dark); border-bottom: 2px solid var(--md-primary-fg-color--dark); } .md-banner { diff --git a/.docs/stylesheets/extra.css.map b/.docs/stylesheets/extra.css.map index d6ff724b3c..89ef3df537 100644 --- a/.docs/stylesheets/extra.css.map +++ b/.docs/stylesheets/extra.css.map @@ -1,6 +1,6 @@ { "version": 3, -"mappings": "AAAA;6BAC8B;EAC5B,qBAAqB,CAAC,QAAQ;EAC9B,oBAAoB,CAAC,0BACvB;EACE,2BAA2B,CAAC,0BAC9B;;AAGA,cAAe;EACb,MAAM,EAAE,iBAAiB;;AAG3B,2CAA4C;EAC1C,UAAU,EAAE,OAAO;EAEnB,oGACQ;IACN,KAAK,EAAE,0BAA0B;IACjC,UAAU,EAAE,OAAO;;AAKvB;0DAC2D;EACzD,KAAK,EAAE,uBAAuB;EAC9B,aAAa,EAAE,oCAAoC;EAEnD;;kEACQ;IACN,KAAK,EAAE,uBAAuB;IAC9B,aAAa,EAAE,0CAA0C;;AAK7D,UAAW;EACT,gBAAgB,EAAE,gCAAgC", +"mappings": "AAAA;6BAC8B;EAC5B,qBAAqB,CAAC,QAAQ;EAC9B,oBAAoB,CAAC,QAAQ;EAAE,gBAAgB;EAC/C,2BAA2B,CAAC,QAAQ;EAAE,gBAAgB;;AAGxD,cAAe;EACb,MAAM,EAAE,iBAAiB;;AAG3B,yCAA0C;EACxC,KAAK,EAAE,gBAAgB;;AAIvB,oGACQ;EACN,KAAK,EAAE,gCAAgC;EACvC,UAAU,EAAE,OAAO;;AAIvB;0DAC2D;EACzD,KAAK,EAAE,0BAA0B;EACjC,aAAa,EAAE,oCAAoC;EAEnD;;kEACQ;IACN,KAAK,EAAE,gCAAgC;IACvC,aAAa,EAAE,0CAA0C;;AAK7D,UAAW;EACT,gBAAgB,EAAE,gCAAgC", "sources": ["extra.scss"], "names": [], "file": "extra.css" diff --git a/.docs/stylesheets/extra.scss b/.docs/stylesheets/extra.scss index 59fee68b6e..1262644f00 100644 --- a/.docs/stylesheets/extra.scss +++ b/.docs/stylesheets/extra.scss @@ -1,35 +1,34 @@ :root, [data-md-color-accent=indigo] { --md-primary-fg-color: #006699; - --md-accent-fg-color: #005c8a /* darken 10% */ -; - --md-primary-fg-color--dark: #00537c /* darken 10% */ -; + --md-accent-fg-color: #005c8a; /* darken 10% */ + --md-primary-fg-color--dark: #00537c; /* darken 10% */ } img.img-border { border: 1px solid #b3b3b3; } -.md-typeset .md-button.md-button--secondary { - background: #ffffff; +.md-typeset .md-button.md-button--primary { + color: white !important; +} +.md-typeset .md-button.md-button--secondary { &:focus, &:hover { - color: var(--md-primary-fg-color); + color: var(--md-primary-fg-color--dark); background: #e5e5e5 /* darken 10% */ - ; } } .md-main .md-content a:not(.action-button):not([tabindex]), .md-main .md-content a:not(.action-button):not([tabindex]) { - color: var(--md-typeset-color); + color: var(--md-primary-fg-color); border-bottom: 2px solid var(--md-primary-fg-color); &:focus, &:hover { - color: var(--md-typeset-color); + color: var(--md-primary-fg-color--dark); border-bottom: 2px solid var(--md-primary-fg-color--dark); } } diff --git a/.docs/system-databases-authentication.md b/.docs/system-databases-authentication.md deleted file mode 100644 index 42b729403f..0000000000 --- a/.docs/system-databases-authentication.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -author: Martin Weise ---- - -# Authentication Database - -## tl;dr - -!!! debug "Debug Information" - - Image: [`bitnami/mariadb:11.2.2-debian-11-r0`](https://hub.docker.com/r/bitnami/mariadb) - - * Ports: 3306/tcp - * JDBC: `jdbc://mariadb:<hostname>:3306` - -## Overview - -This is the database in which the [Authentication Service](../system-services-authentication) writes into. In the -default configuration, only MariaDB is supported. - -## Limitations - -* No support for MariaDB Galera at the moment. - -!!! question "Do you miss functionality? Do these limitations affect you?" - - We strongly encourage you to help us implement it as we are welcoming contributors to open-source software and get - in [contact](../contact) with us, we happily answer requests for collaboration with attached CV and your programming - experience! - -## Security - -(none) diff --git a/.docs/system-databases-metadata.md b/.docs/system-databases-metadata.md deleted file mode 100644 index 4ff9980f25..0000000000 --- a/.docs/system-databases-metadata.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -author: Martin Weise ---- - -# Metadata Database - -## tl;dr - -!!! debug "Debug Information" - - Image: [`dbrepo/metadata-db:__APPVERSION__`](https://hub.docker.com/r/dbrepo/metadata-db) - - * Ports: 3306/tcp - * JDBC: `jdbc://mariadb:<hostname>:3306` - -It is the core component of the project. It is a relational database that contains metadata about all researcher -database created in the database repository like column names, check expressions, value enumerations or key/value -constraints and relevant data for citing data sets. Additionally, the concept, e.g. URI of units of measurements of -numerical columns is stored in the Metadata Database in order to provide semantic knowledge context. We use MariaDB for -its rich capabilities in the reference implementation. - -The default credentials are `root:dbrepo` for the database `fda`. Connect to the database via the JDBC connector on -port `3306`. - -## Limitations - -(none) - -!!! question "Do you miss functionality? Do these limitations affect you?" - - We strongly encourage you to help us implement it as we are welcoming contributors to open-source software and get - in [contact](../contact) with us, we happily answer requests for collaboration with attached CV and your programming - experience! - -## Security - -(none) diff --git a/.docs/system-databases-search.md b/.docs/system-databases-search.md deleted file mode 100644 index 130347215b..0000000000 --- a/.docs/system-databases-search.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -author: Martin Weise ---- - -# Search Database - -## tl;dr - -!!! debug "Debug Information" - - Image: [`dbrepo/search-db:__APPVERSION__`](https://hub.docker.com/r/dbrepo/search-db) - - * Ports: 9200/tcp - -## Overview - -It processes search requests from the Gateway Service for full-text lookups in -the [Metadata Database](../system-databases-metadata). We use [OpenSearch](https://opensearch.org/) in the default -configuration and create a searchable index on all databases that is updated regularly by -the [Mirror Service](../system-services-mirror). - -All requests need to be authenticated, by default the credentials `admin:admin` are used. - -Please see the [Search Database Dashboard](../system-other-search-dashboard) for information how to inspect the Search -Database more efficient. - -## Limitations - -(none) - -!!! question "Do you miss functionality? Do these limitations affect you?" - - We strongly encourage you to help us implement it as we are welcoming contributors to open-source software and get - in [contact](../contact) with us, we happily answer requests for collaboration with attached CV and your programming - experience! - -## Security - -1. Change the default credentials in the [Search Database Dashboard](../system-other-search-dashboard) with the default - credentials `admin:admin` and navigate to your username on the top right and click "Reset password". - -<figure markdown> - { .img-border } - <figcaption>Reset the admin password in Opensearch Dashboards</figcaption> -</figure> diff --git a/.docs/system-other-search-dashboard.md b/.docs/system-other-search-dashboard.md deleted file mode 100644 index dd23d56c67..0000000000 --- a/.docs/system-other-search-dashboard.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -author: Martin Weise ---- - -# Search Database Dashboard - -## tl;dr - -!!! debug "Debug Information" - - Image: [`opensearchproject/opensearch-dashboards:2.10.0`](https://hub.docker.com/r/opensearchproject/opensearch-dashboards) - - * Ports: 5601/tcp - * UI: `http://<hostname>/admin/dashboard/` - -## Overview - -It provides a *graphical user interface* (GUI) for an administrator to interact with -the [Search Database](../system-databases-search). - -<figure markdown> - { .img-border } - <figcaption>Opensearch Dashboards on first start</figcaption> -</figure> - -## Limitations - -(none) - -!!! question "Do you miss functionality? Do these limitations affect you?" - - We strongly encourage you to help us implement it as we are welcoming contributors to open-source software and get - in [contact](../contact) with us, we happily answer requests for collaboration with attached CV and your programming - experience! - -## Security - -(none) diff --git a/.docs/system-overview.md b/.docs/system-overview.md deleted file mode 100644 index 12b6553820..0000000000 --- a/.docs/system-overview.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -author: Martin Weise ---- - -# System - -!!! abstract "Abstract" - - This is the full system description from a technical/developer view and continously being updated as the development - progresses. - -## Usage - -<figure markdown> - -<figcaption>Figure 1: Modes of data ingest</figcaption> -</figure> - -More [usage examples](../usage-overview/) include how to ingest datasets, data dumps, live data, etc. - -## Limitations - -!!! question "Do you miss functionality? Do these limitations affect you?" - - We strongly encourage you to help us implement it as we are welcoming contributors to open-source software and get - in [contact](../contact) with us, we happily answer requests for collaboration with attached CV and your programming - experience! \ No newline at end of file diff --git a/.docs/why.md b/.docs/why.md new file mode 100644 index 0000000000..1e6e52cc7f --- /dev/null +++ b/.docs/why.md @@ -0,0 +1,50 @@ +--- +author: Martin Weise +--- + +## Why use DBRepo? + +Digital repositories see themselves more frequently encountered with the problem of making databases accessible in their +collection. Challenges revolve around organizing, searching and retrieving content stored within databases and +constitute a major technical burden as their internal representation greatly differs from static documents most digital +repositories are designed for. + +## Application Areas + +We present a database repository system that allows researchers to ingest data into a central, versioned repository +through common interfaces, provides efficient access to arbitrary subsets of data even when the underlying data store is +evolving, allows reproducing of query results and supports findable-, accessible-, interoperable- and reusable data. + +## Features + +### Built-in search + +DBRepo makes your dataset searchable without extra effort: most metadata is generated automatically for data in your +databases. The fast and powerful OpenSearch database allows a fast retrieval of any information. Adding semantic mapping +through a suggestion-feature, allows machines to properly understand the context of your data. [Learn more.](../system-services-search/) + +### Citable datasets + +Adopting the recommendations of the RDA-WGDC, arbitrary subsets can be precisely, persistently identified using +system-versioned tables of MariaDB and the DataCite schema for minting DOIs. External systems i.e. metadata harvesters +(OpenAIRE, Google Datasets) can access these datasets through OAI-PMH, JSON-LD and FAIR Signposting protocols. +[Learn more.](../system-services-metadata/) + +### Powerful API for Data Scientists + +With our strongly typed Python Library, Data Scientists can import, export and work with data from Jupyter Notebook or +Python script, optionally using Pandas DataFrames. For example: the AMQP API Client can collect continuous data from +edge devices like sensors and store them asynchronous in DBRepo. [Learn more.](../usage-python/) + +### Cloud Native + +Our lightweight Helm chart allows for installations on any cloud provider or private-cloud setting that has an +underlying PV storage provider. DBRepo can be installed from +the [Artifact Hub](https://artifacthub.io/packages/helm/dbrepo/dbrepo) repository. Databases are managed as MariaDB +Galera Cluster with high degree of availability ensuring your data is always accessible. +[Learn more.](../deployment-helm/) + +## Demo Site + +We run a small demonstration instance so you can see the latest version of DBRepo in action. The demonstration instance +is updated with new releases and should be considered ephemeral. \ No newline at end of file diff --git a/.gitignore b/.gitignore index 9cf181a38e..908da84c1e 100644 --- a/.gitignore +++ b/.gitignore @@ -9,8 +9,9 @@ ready schema.xsd final/ build/ -swagger/ *.tar +tmp.yaml +.docs/.swagger/api-* # docs .docs/.swagger/dist/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 10377b3fcc..a3230d4e7c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -267,7 +267,7 @@ scan-analyse-service: - master allow_failure: true script: - - trivy image --insecure --exit-code 0 --format template --template "@.trivy/gitlab.tpl" -o ./.trivy/trivy-analyse-service-report.json dbrepo-analyse-service:latest + - trivy image --insecure --exit-code 0 --format template --template "@.gitlab/gitlab.tpl" -o ./.trivy/trivy-analyse-service-report.json dbrepo-analyse-service:latest - trivy image --insecure --exit-code 0 dbrepo-analyse-service:latest - trivy image --insecure --exit-code 1 --severity CRITICAL dbrepo-analyse-service:latest cache: @@ -287,7 +287,7 @@ scan-auth-service: - master allow_failure: true script: - - trivy image --insecure --exit-code 0 --format template --template "@.trivy/gitlab.tpl" -o ./.trivy/trivy-authentication-service-report.json dbrepo-auth-service:latest + - trivy image --insecure --exit-code 0 --format template --template "@.gitlab/gitlab.tpl" -o ./.trivy/trivy-authentication-service-report.json dbrepo-auth-service:latest - trivy image --insecure --exit-code 0 dbrepo-auth-service:latest - trivy image --insecure --exit-code 1 --severity CRITICAL dbrepo-auth-service:latest cache: @@ -307,7 +307,7 @@ scan-broker-service: - master allow_failure: true script: - - trivy image --insecure --exit-code 0 --format template --template "@.trivy/gitlab.tpl" -o ./.trivy/trivy-broker-service-report.json dbrepo-broker-service:latest + - trivy image --insecure --exit-code 0 --format template --template "@.gitlab/gitlab.tpl" -o ./.trivy/trivy-broker-service-report.json dbrepo-broker-service:latest - trivy image --insecure --exit-code 0 dbrepo-broker-service:latest - trivy image --insecure --exit-code 1 --severity CRITICAL dbrepo-broker-service:latest cache: @@ -327,7 +327,7 @@ scan-data-db-sidecar: - master allow_failure: true script: - - trivy image --insecure --exit-code 0 --format template --template "@.trivy/gitlab.tpl" -o ./.trivy/trivy-data-db-sidecar-report.json dbrepo-data-db-sidecar:latest + - trivy image --insecure --exit-code 0 --format template --template "@.gitlab/gitlab.tpl" -o ./.trivy/trivy-data-db-sidecar-report.json dbrepo-data-db-sidecar:latest - trivy image --insecure --exit-code 0 data-db-sidecar:latest - trivy image --insecure --exit-code 1 --severity CRITICAL data-db-sidecar:latest cache: @@ -347,7 +347,7 @@ scan-gateway-service: - master allow_failure: true script: - - trivy image --insecure --exit-code 0 --format template --template "@.trivy/gitlab.tpl" -o ./.trivy/trivy-gateway-service-report.json docker.io/nginx:1.25.0-alpine-slim + - trivy image --insecure --exit-code 0 --format template --template "@.gitlab/gitlab.tpl" -o ./.trivy/trivy-gateway-service-report.json docker.io/nginx:1.25.0-alpine-slim - trivy image --insecure --exit-code 0 docker.io/nginx:1.25.0-alpine-slim - trivy image --insecure --exit-code 1 --severity CRITICAL docker.io/nginx:1.25.0-alpine-slim cache: @@ -367,7 +367,7 @@ scan-metadata-service: - master allow_failure: true script: - - trivy image --insecure --exit-code 0 --format template --template "@.trivy/gitlab.tpl" -o ./.trivy/trivy-metadata-service-report.json dbrepo-metadata-service:latest + - trivy image --insecure --exit-code 0 --format template --template "@.gitlab/gitlab.tpl" -o ./.trivy/trivy-metadata-service-report.json dbrepo-metadata-service:latest - trivy image --insecure --exit-code 0 dbrepo-metadata-service:latest - trivy image --insecure --exit-code 1 --severity CRITICAL dbrepo-metadata-service:latest cache: @@ -387,7 +387,7 @@ scan-data-service: - master allow_failure: true script: - - trivy image --insecure --exit-code 0 --format template --template "@.trivy/gitlab.tpl" -o ./.trivy/trivy-data-service-report.json dbrepo-data-service:latest + - trivy image --insecure --exit-code 0 --format template --template "@.gitlab/gitlab.tpl" -o ./.trivy/trivy-data-service-report.json dbrepo-data-service:latest - trivy image --insecure --exit-code 0 dbrepo-data-service:latest - trivy image --insecure --exit-code 1 --severity CRITICAL dbrepo-data-service:latest cache: @@ -407,7 +407,7 @@ scan-search-db: - master allow_failure: true script: - - trivy image --insecure --exit-code 0 --format template --template "@.trivy/gitlab.tpl" -o ./.trivy/trivy-search-db-report.json dbrepo-search-db:latest + - trivy image --insecure --exit-code 0 --format template --template "@.gitlab/gitlab.tpl" -o ./.trivy/trivy-search-db-report.json dbrepo-search-db:latest - trivy image --insecure --exit-code 0 dbrepo-search-db:latest - trivy image --insecure --exit-code 1 --severity CRITICAL dbrepo-search-db:latest cache: @@ -427,7 +427,7 @@ scan-search-service-init: - master allow_failure: true script: - - trivy image --insecure --exit-code 0 --format template --template "@.trivy/gitlab.tpl" -o ./.trivy/trivy-search-service-init-report.json dbrepo-search-service-init:latest + - trivy image --insecure --exit-code 0 --format template --template "@.gitlab/gitlab.tpl" -o ./.trivy/trivy-search-service-init-report.json dbrepo-search-service-init:latest - trivy image --insecure --exit-code 0 dbrepo-search-service-init:latest - trivy image --insecure --exit-code 1 --severity CRITICAL dbrepo-search-service-init:latest cache: @@ -447,7 +447,7 @@ scan-data-db: - master allow_failure: true script: - - trivy image --insecure --exit-code 0 --format template --template "@.trivy/gitlab.tpl" -o ./.trivy/trivy-data-db-report.json docker.io/bitnami/mariadb:11.2.2-debian-11-r0 + - trivy image --insecure --exit-code 0 --format template --template "@.gitlab/gitlab.tpl" -o ./.trivy/trivy-data-db-report.json docker.io/bitnami/mariadb:11.2.2-debian-11-r0 - trivy image --insecure --exit-code 0 docker.io/bitnami/mariadb:11.2.2-debian-11-r0 - trivy image --insecure --exit-code 1 --severity CRITICAL docker.io/bitnami/mariadb:11.2.2-debian-11-r0 cache: @@ -467,7 +467,7 @@ scan-metadata-db: - master allow_failure: true script: - - trivy image --insecure --exit-code 0 --format template --template "@.trivy/gitlab.tpl" -o ./.trivy/trivy-metadata-db-report.json dbrepo-metadata-db:latest + - trivy image --insecure --exit-code 0 --format template --template "@.gitlab/gitlab.tpl" -o ./.trivy/trivy-metadata-db-report.json dbrepo-metadata-db:latest - trivy image --insecure --exit-code 0 dbrepo-metadata-db:latest - trivy image --insecure --exit-code 1 --severity CRITICAL dbrepo-metadata-db:latest cache: @@ -487,7 +487,7 @@ scan-ui: - master allow_failure: true script: - - trivy image --insecure --exit-code 0 --format template --template "@.trivy/gitlab.tpl" -o ./.trivy/trivy-ui-report.json dbrepo-ui:latest + - trivy image --insecure --exit-code 0 --format template --template "@.gitlab/gitlab.tpl" -o ./.trivy/trivy-ui-report.json dbrepo-ui:latest - trivy image --insecure --exit-code 0 dbrepo-ui:latest - trivy image --insecure --exit-code 1 --severity CRITICAL dbrepo-ui:latest cache: @@ -507,7 +507,7 @@ scan-search-service: - master allow_failure: true script: - - trivy image --insecure --exit-code 0 --format template --template "@.trivy/gitlab.tpl" -o ./.trivy/trivy-ui-report.json dbrepo-search-service:latest + - trivy image --insecure --exit-code 0 --format template --template "@.gitlab/gitlab.tpl" -o ./.trivy/trivy-ui-report.json dbrepo-search-service:latest - trivy image --insecure --exit-code 0 dbrepo-search-service:latest - trivy image --insecure --exit-code 1 --severity CRITICAL dbrepo-search-service:latest cache: @@ -527,7 +527,7 @@ scan-storage-service: - master allow_failure: true script: - - trivy image --insecure --exit-code 0 --format template --template "@.trivy/gitlab.tpl" -o ./.trivy/trivy-storage-service-report.json docker.io/chrislusf/seaweedfs:3.59 + - trivy image --insecure --exit-code 0 --format template --template "@.gitlab/gitlab.tpl" -o ./.trivy/trivy-storage-service-report.json docker.io/chrislusf/seaweedfs:3.59 - trivy image --insecure --exit-code 0 docker.io/chrislusf/seaweedfs:3.59 - trivy image --insecure --exit-code 1 --severity CRITICAL docker.io/chrislusf/seaweedfs:3.59 cache: @@ -547,7 +547,7 @@ scan-storage-service-init: - master allow_failure: true script: - - trivy image --insecure --exit-code 0 --format template --template "@.trivy/gitlab.tpl" -o ./.trivy/trivy-storage-service-init-report.json dbrepo-storage-service-init:latest + - trivy image --insecure --exit-code 0 --format template --template "@.gitlab/gitlab.tpl" -o ./.trivy/trivy-storage-service-init-report.json dbrepo-storage-service-init:latest - trivy image --insecure --exit-code 0 dbrepo-storage-service-init:latest - trivy image --insecure --exit-code 1 --severity CRITICAL dbrepo-storage-service-init:latest cache: @@ -609,13 +609,23 @@ release-chart: release-docs: stage: release image: docker.io/python:3.11-alpine + variables: + VERSION: "${CI_COMMIT_BRANCH:8:8}" only: refs: - /^release-.*/ before_script: + - "wget https://github.com/mikefarah/yq/releases/download/v4.2.0/yq_linux_amd64 -O /usr/bin/yq" + - "chmod +x /usr/bin/yq" - "apt-get update && apt-get install -y git make sed wget ssh" - script: - - make docs + - "mkdir -p ./final/${VERSION}/swagger" + script: + - "make gen-swagger-doc gen-lib-doc gen-docs-doc" + - "cp -r ./lib/python/docs/build/html ./final/${VERSION}/sphinx" # sphinx + - "cp .docs/.swagger/api.yaml ./final/${VERSION}/swagger/api.yaml" # swagger + - "cp .docs/.swagger/swagger-ui.html ./final/${VERSION}/swagger/index.html" # swagger + - "cp .docs/.swagger/custom.css ./final/${VERSION}/swagger/custom.css" # swagger + - "cp -r ./site ./final/${VERSION}" # mkdocs - eval $(ssh-agent -s) - echo "$CI_KEY_PRIVATE" > /root/.ssh/id_rsa && chmod 0600 /root/.ssh/id_rsa - echo "$CI_KEY_PUBLIC" > /root/.ssh/id_rsa.pub diff --git a/.trivy/gitlab.tpl b/.gitlab/gitlab.tpl similarity index 100% rename from .trivy/gitlab.tpl rename to .gitlab/gitlab.tpl diff --git a/bin/teardown.sh b/bin/teardown.sh deleted file mode 100755 index 9b7926d521..0000000000 --- a/bin/teardown.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -echo "=== [ Stopping dbrepo-* ] ===" -docker container stop $(docker container ls -aq -f name=^/dbrepo-.*) || true -echo "=== [ Removing dbrepo-* ] ===" -docker container rm $(docker container ls -aq -f name=^/dbrepo-.*) || true -docker volume rm $(docker volume ls -q -f name=^dbrepo-.*) || true -docker network rm $(docker network ls -q -f name=^dbrepo-.*) || true -echo "=== [ Stopping * ] ===" -docker container stop $(docker container ls -aq -f name=.*-service) || true -docker container stop ui ui-proxy metadata-db || true -echo "=== [ Removing * ] ===" -docker container rm $(docker container ls -aq -f name=.*-service) || true -docker container rm ui ui-proxy metadata-db || true -docker volume rm $(docker volume ls -q) || true -echo "=== [ Stopping fda-* ] ===" -docker container stop $(docker container ls -aq -f name=^/fda-.*) || true -echo "=== [ Removing fda-* ] ===" -docker container rm $(docker container ls -aq -f name=^/fda-.*) || true -docker volume rm $(docker volume ls -q -f name=^fda-.*) || true -docker network rm $(docker network ls -q -f name=^fda-.*) || true -echo "=== [ Stopping tuw-* ] ===" -docker container stop $(docker container ls -aq -f name=^/tuw-.*) || true -echo "=== [ Removing tuw-* ] ===" -docker container rm $(docker container ls -aq -f name=^/tuw-.*) || true -docker volume rm $(docker volume ls -q -f name=^tuw-.*) || true -docker network rm $(docker network ls -q -f name=^tuw-.*) || true \ No newline at end of file diff --git a/dbrepo-analyse-service/Pipfile b/dbrepo-analyse-service/Pipfile index f9dc9086d5..98166931a4 100644 --- a/dbrepo-analyse-service/Pipfile +++ b/dbrepo-analyse-service/Pipfile @@ -21,7 +21,7 @@ numpy = "*" pandas = "*" minio = "*" pydantic = "*" -dbrepo = {path = "./lib/dbrepo-1.4.3.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.4.4.tar.gz"} opensearch-py = "*" [dev-packages] diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock index 93479ce06f..d1f47348f8 100644 --- a/dbrepo-analyse-service/Pipfile.lock +++ b/dbrepo-analyse-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "928e32d569e15d302ad2f00c83df5481e4bf1c54e502d2428e0da86865bcc11a" + "sha256": "f862bcd0c3285ad0a48d0d0f738bddf0f3c1d2c5d263af9e07994463e39e5610" }, "pipfile-spec": 6, "requires": { @@ -108,11 +108,11 @@ }, "annotated-types": { "hashes": [ - "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43", - "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d" + "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", + "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89" ], "markers": "python_version >= '3.8'", - "version": "==0.6.0" + "version": "==0.7.0" }, "argon2-cffi": { "hashes": [ @@ -167,19 +167,19 @@ }, "boto3": { "hashes": [ - "sha256:5b37c8f4ea6f408147994a6e230c49ca755da57f5964ccea8b8fd4ff5f11759e", - "sha256:bec91a3bca63320e5f68a25b5eaa7bab65e35bb9253a544875c2e03679f1d5fb" + "sha256:009cd143509f2ff4c37582c3f45d50f28c95eed68e8a5c36641206bdb597a9ea", + "sha256:7e59f0a848be477a4c98a90e7a18a0e284adfb643f7879d2b303c5f493661b7a" ], "index": "pypi", - "version": "==1.34.104" + "version": "==1.34.113" }, "botocore": { "hashes": [ - "sha256:b68ed482e9b4c313129c9948af5a91d0e84840558e6d232a1a27ab0b9733e5b9", - "sha256:fe36dd3cea4160fbbe27dc1cf89cb7018234350555a26933b2977947052a346a" + "sha256:449912ba3c4ded64f21d09d428146dd9c05337b2a112e15511bf2c4888faae79", + "sha256:8ca87776450ef41dd25c327eb6e504294230a5756940d68bcfdedc4a7cdeca97" ], "markers": "python_version >= '3.8'", - "version": "==1.34.104" + "version": "==1.34.113" }, "certifi": { "hashes": [ @@ -391,10 +391,10 @@ }, "dbrepo": { "hashes": [ - "sha256:d3503b851d526b33cb795f247ec510911ae356e35efec7449863e9b6590283c1" + "sha256:ceab260cf76c050e118ce0f0589fec66059396751e03f2ec41fa489cfacc4e7b" ], - "path": "./lib/dbrepo-1.4.3.tar.gz", - "version": "==1.4.3" + "path": "./lib/dbrepo-1.4.4.tar.gz", + "version": "==1.4.4" }, "exceptiongroup": { "hashes": [ @@ -1224,11 +1224,11 @@ }, "requests": { "hashes": [ - "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", - "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" + "sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289", + "sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c" ], "index": "pypi", - "version": "==2.31.0" + "version": "==2.32.2" }, "rpds-py": { "hashes": [ @@ -1345,11 +1345,11 @@ }, "setuptools": { "hashes": [ - "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987", - "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32" + "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4", + "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0" ], "markers": "python_version >= '3.8'", - "version": "==69.5.1" + "version": "==70.0.0" }, "six": { "hashes": [ @@ -1377,11 +1377,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", - "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" + "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8", + "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594" ], "markers": "python_version >= '3.8'", - "version": "==4.11.0" + "version": "==4.12.0" }, "tzdata": { "hashes": [ @@ -1513,45 +1513,45 @@ }, "zope.interface": { "hashes": [ - "sha256:014bb94fe6bf1786da1aa044eadf65bc6437bcb81c451592987e5be91e70a91e", - "sha256:01a0b3dd012f584afcf03ed814bce0fc40ed10e47396578621509ac031be98bf", - "sha256:10cde8dc6b2fd6a1d0b5ca4be820063e46ddba417ab82bcf55afe2227337b130", - "sha256:187f7900b63845dcdef1be320a523dbbdba94d89cae570edc2781eb55f8c2f86", - "sha256:1b0c4c90e5eefca2c3e045d9f9ed9f1e2cdbe70eb906bff6b247e17119ad89a1", - "sha256:22e8a218e8e2d87d4d9342aa973b7915297a08efbebea5b25900c73e78ed468e", - "sha256:26c9a37fb395a703e39b11b00b9e921c48f82b6e32cc5851ad5d0618cd8876b5", - "sha256:2bb78c12c1ad3a20c0d981a043d133299117b6854f2e14893b156979ed4e1d2c", - "sha256:2c3cfb272bcb83650e6695d49ae0d14dd06dc694789a3d929f23758557a23d92", - "sha256:2f32010ffb87759c6a3ad1c65ed4d2e38e51f6b430a1ca11cee901ec2b42e021", - "sha256:3c8731596198198746f7ce2a4487a0edcbc9ea5e5918f0ab23c4859bce56055c", - "sha256:40aa8c8e964d47d713b226c5baf5f13cdf3a3169c7a2653163b17ff2e2334d10", - "sha256:4137025731e824eee8d263b20682b28a0bdc0508de9c11d6c6be54163e5b7c83", - "sha256:46034be614d1f75f06e7dcfefba21d609b16b38c21fc912b01a99cb29e58febb", - "sha256:483e118b1e075f1819b3c6ace082b9d7d3a6a5eb14b2b375f1b80a0868117920", - "sha256:4d6b229f5e1a6375f206455cc0a63a8e502ed190fe7eb15e94a312dc69d40299", - "sha256:567d54c06306f9c5b6826190628d66753b9f2b0422f4c02d7c6d2b97ebf0a24e", - "sha256:5683aa8f2639016fd2b421df44301f10820e28a9b96382a6e438e5c6427253af", - "sha256:600101f43a7582d5b9504a7c629a1185a849ce65e60fca0f6968dfc4b76b6d39", - "sha256:62e32f02b3f26204d9c02c3539c802afc3eefb19d601a0987836ed126efb1f21", - "sha256:69dedb790530c7ca5345899a1b4cb837cc53ba669051ea51e8c18f82f9389061", - "sha256:72d5efecad16c619a97744a4f0b67ce1bcc88115aa82fcf1dc5be9bb403bcc0b", - "sha256:8d407e0fd8015f6d5dfad481309638e1968d70e6644e0753f229154667dd6cd5", - "sha256:a058e6cf8d68a5a19cb5449f42a404f0d6c2778b897e6ce8fadda9cea308b1b0", - "sha256:a1adc14a2a9d5e95f76df625a9b39f4709267a483962a572e3f3001ef90ea6e6", - "sha256:a56fe1261230093bfeedc1c1a6cd6f3ec568f9b07f031c9a09f46b201f793a85", - "sha256:ad4524289d8dbd6fb5aa17aedb18f5643e7d48358f42c007a5ee51a2afc2a7c5", - "sha256:afa0491a9f154cf8519a02026dc85a416192f4cb1efbbf32db4a173ba28b289a", - "sha256:bf34840e102d1d0b2d39b1465918d90b312b1119552cebb61a242c42079817b9", - "sha256:c40df4aea777be321b7e68facb901bc67317e94b65d9ab20fb96e0eb3c0b60a1", - "sha256:d0e7321557c702bd92dac3c66a2f22b963155fdb4600133b6b29597f62b71b12", - "sha256:d165d7774d558ea971cb867739fb334faf68fc4756a784e689e11efa3becd59e", - "sha256:e78a183a3c2f555c2ad6aaa1ab572d1c435ba42f1dc3a7e8c82982306a19b785", - "sha256:e8fa0fb05083a1a4216b4b881fdefa71c5d9a106e9b094cd4399af6b52873e91", - "sha256:f83d6b4b22262d9a826c3bd4b2fbfafe1d0000f085ef8e44cd1328eea274ae6a", - "sha256:f95bebd0afe86b2adc074df29edb6848fc4d474ff24075e2c263d698774e108d" + "sha256:00b5c3e9744dcdc9e84c24ed6646d5cf0cf66551347b310b3ffd70f056535854", + "sha256:0e4fa5d34d7973e6b0efa46fe4405090f3b406f64b6290facbb19dcbf642ad6b", + "sha256:136cacdde1a2c5e5bc3d0b2a1beed733f97e2dad8c2ad3c2e17116f6590a3827", + "sha256:1730c93a38b5a18d24549bc81613223962a19d457cfda9bdc66e542f475a36f4", + "sha256:1a62fd6cd518693568e23e02f41816adedfca637f26716837681c90b36af3671", + "sha256:1c207e6f6dfd5749a26f5a5fd966602d6b824ec00d2df84a7e9a924e8933654e", + "sha256:2eccd5bef45883802848f821d940367c1d0ad588de71e5cabe3813175444202c", + "sha256:33ee982237cffaf946db365c3a6ebaa37855d8e3ca5800f6f48890209c1cfefc", + "sha256:3d136e5b8821073e1a09dde3eb076ea9988e7010c54ffe4d39701adf0c303438", + "sha256:47654177e675bafdf4e4738ce58cdc5c6d6ee2157ac0a78a3fa460942b9d64a8", + "sha256:47937cf2e7ed4e0e37f7851c76edeb8543ec9b0eae149b36ecd26176ff1ca874", + "sha256:4ac46298e0143d91e4644a27a769d1388d5d89e82ee0cf37bf2b0b001b9712a4", + "sha256:4c0b208a5d6c81434bdfa0f06d9b667e5de15af84d8cae5723c3a33ba6611b82", + "sha256:551db2fe892fcbefb38f6f81ffa62de11090c8119fd4e66a60f3adff70751ec7", + "sha256:599f3b07bde2627e163ce484d5497a54a0a8437779362395c6b25e68c6590ede", + "sha256:5ef8356f16b1a83609f7a992a6e33d792bb5eff2370712c9eaae0d02e1924341", + "sha256:5fe919027f29b12f7a2562ba0daf3e045cb388f844e022552a5674fcdf5d21f1", + "sha256:6f0a6be264afb094975b5ef55c911379d6989caa87c4e558814ec4f5125cfa2e", + "sha256:706efc19f9679a1b425d6fa2b4bc770d976d0984335eaea0869bd32f627591d2", + "sha256:73f9752cf3596771c7726f7eea5b9e634ad47c6d863043589a1c3bb31325c7eb", + "sha256:762e616199f6319bb98e7f4f27d254c84c5fb1c25c908c2a9d0f92b92fb27530", + "sha256:866a0f583be79f0def667a5d2c60b7b4cc68f0c0a470f227e1122691b443c934", + "sha256:86a94af4a88110ed4bb8961f5ac72edf782958e665d5bfceaab6bf388420a78b", + "sha256:8e0343a6e06d94f6b6ac52fbc75269b41dd3c57066541a6c76517f69fe67cb43", + "sha256:97e615eab34bd8477c3f34197a17ce08c648d38467489359cb9eb7394f1083f7", + "sha256:a96e6d4074db29b152222c34d7eec2e2db2f92638d2b2b2c704f9e8db3ae0edc", + "sha256:b912750b13d76af8aac45ddf4679535def304b2a48a07989ec736508d0bbfbde", + "sha256:bc2676312cc3468a25aac001ec727168994ea3b69b48914944a44c6a0b251e79", + "sha256:cebff2fe5dc82cb22122e4e1225e00a4a506b1a16fafa911142ee124febf2c9e", + "sha256:d22fce0b0f5715cdac082e35a9e735a1752dc8585f005d045abb1a7c20e197f9", + "sha256:d3f7e001328bd6466b3414215f66dde3c7c13d8025a9c160a75d7b2687090d15", + "sha256:d3fe667935e9562407c2511570dca14604a654988a13d8725667e95161d92e9b", + "sha256:dabb70a6e3d9c22df50e08dc55b14ca2a99da95a2d941954255ac76fd6982bc5", + "sha256:e2fb8e8158306567a3a9a41670c1ff99d0567d7fc96fa93b7abf8b519a46b250", + "sha256:e96ac6b3169940a8cd57b4f2b8edcad8f5213b60efcd197d59fbe52f0accd66e", + "sha256:fbf649bc77510ef2521cf797700b96167bb77838c40780da7ea3edd8b78044d1" ], "markers": "python_version >= '3.7'", - "version": "==6.3" + "version": "==6.4.post2" } }, "develop": { @@ -1754,69 +1754,69 @@ }, "coverage": { "hashes": [ - "sha256:0646599e9b139988b63704d704af8e8df7fa4cbc4a1f33df69d97f36cb0a38de", - "sha256:0cdcbc320b14c3e5877ee79e649677cb7d89ef588852e9583e6b24c2e5072661", - "sha256:0d0a0f5e06881ecedfe6f3dd2f56dcb057b6dbeb3327fd32d4b12854df36bf26", - "sha256:1434e088b41594baa71188a17533083eabf5609e8e72f16ce8c186001e6b8c41", - "sha256:16db7f26000a07efcf6aea00316f6ac57e7d9a96501e990a36f40c965ec7a95d", - "sha256:1cc0fe9b0b3a8364093c53b0b4c0c2dd4bb23acbec4c9240b5f284095ccf7981", - "sha256:1fc81d5878cd6274ce971e0a3a18a8803c3fe25457165314271cf78e3aae3aa2", - "sha256:2ec92012fefebee89a6b9c79bc39051a6cb3891d562b9270ab10ecfdadbc0c34", - "sha256:39afcd3d4339329c5f58de48a52f6e4e50f6578dd6099961cf22228feb25f38f", - "sha256:4a7b0ceee8147444347da6a66be737c9d78f3353b0681715b668b72e79203e4a", - "sha256:4a9ca3f2fae0088c3c71d743d85404cec8df9be818a005ea065495bedc33da35", - "sha256:4bf0655ab60d754491004a5efd7f9cccefcc1081a74c9ef2da4735d6ee4a6223", - "sha256:4cc37def103a2725bc672f84bd939a6fe4522310503207aae4d56351644682f1", - "sha256:4fc84a37bfd98db31beae3c2748811a3fa72bf2007ff7902f68746d9757f3746", - "sha256:5037f8fcc2a95b1f0e80585bd9d1ec31068a9bcb157d9750a172836e98bc7a90", - "sha256:54de9ef3a9da981f7af93eafde4ede199e0846cd819eb27c88e2b712aae9708c", - "sha256:556cf1a7cbc8028cb60e1ff0be806be2eded2daf8129b8811c63e2b9a6c43bca", - "sha256:57e0204b5b745594e5bc14b9b50006da722827f0b8c776949f1135677e88d0b8", - "sha256:5a5740d1fb60ddf268a3811bcd353de34eb56dc24e8f52a7f05ee513b2d4f596", - "sha256:5c3721c2c9e4c4953a41a26c14f4cef64330392a6d2d675c8b1db3b645e31f0e", - "sha256:5fa567e99765fe98f4e7d7394ce623e794d7cabb170f2ca2ac5a4174437e90dd", - "sha256:5fd215c0c7d7aab005221608a3c2b46f58c0285a819565887ee0b718c052aa4e", - "sha256:6175d1a0559986c6ee3f7fccfc4a90ecd12ba0a383dcc2da30c2b9918d67d8a3", - "sha256:61c4bf1ba021817de12b813338c9be9f0ad5b1e781b9b340a6d29fc13e7c1b5e", - "sha256:6537e7c10cc47c595828b8a8be04c72144725c383c4702703ff4e42e44577312", - "sha256:68f962d9b72ce69ea8621f57551b2fa9c70509af757ee3b8105d4f51b92b41a7", - "sha256:7352b9161b33fd0b643ccd1f21f3a3908daaddf414f1c6cb9d3a2fd618bf2572", - "sha256:796a79f63eca8814ca3317a1ea443645c9ff0d18b188de470ed7ccd45ae79428", - "sha256:79afb6197e2f7f60c4824dd4b2d4c2ec5801ceb6ba9ce5d2c3080e5660d51a4f", - "sha256:7a588d39e0925f6a2bff87154752481273cdb1736270642aeb3635cb9b4cad07", - "sha256:8748731ad392d736cc9ccac03c9845b13bb07d020a33423fa5b3a36521ac6e4e", - "sha256:8fe7502616b67b234482c3ce276ff26f39ffe88adca2acf0261df4b8454668b4", - "sha256:9314d5678dcc665330df5b69c1e726a0e49b27df0461c08ca12674bcc19ef136", - "sha256:9735317685ba6ec7e3754798c8871c2f49aa5e687cc794a0b1d284b2389d1bd5", - "sha256:9981706d300c18d8b220995ad22627647be11a4276721c10911e0e9fa44c83e8", - "sha256:9e78295f4144f9dacfed4f92935fbe1780021247c2fabf73a819b17f0ccfff8d", - "sha256:b016ea6b959d3b9556cb401c55a37547135a587db0115635a443b2ce8f1c7228", - "sha256:b6cf3764c030e5338e7f61f95bd21147963cf6aa16e09d2f74f1fa52013c1206", - "sha256:beccf7b8a10b09c4ae543582c1319c6df47d78fd732f854ac68d518ee1fb97fa", - "sha256:c0884920835a033b78d1c73b6d3bbcda8161a900f38a488829a83982925f6c2e", - "sha256:c3e757949f268364b96ca894b4c342b41dc6f8f8b66c37878aacef5930db61be", - "sha256:ca498687ca46a62ae590253fba634a1fe9836bc56f626852fb2720f334c9e4e5", - "sha256:d1d0d98d95dd18fe29dc66808e1accf59f037d5716f86a501fc0256455219668", - "sha256:d21918e9ef11edf36764b93101e2ae8cc82aa5efdc7c5a4e9c6c35a48496d601", - "sha256:d7fed867ee50edf1a0b4a11e8e5d0895150e572af1cd6d315d557758bfa9c057", - "sha256:db66fc317a046556a96b453a58eced5024af4582a8dbdc0c23ca4dbc0d5b3146", - "sha256:dde0070c40ea8bb3641e811c1cfbf18e265d024deff6de52c5950677a8fb1e0f", - "sha256:df4e745a81c110e7446b1cc8131bf986157770fa405fe90e15e850aaf7619bc8", - "sha256:e2213def81a50519d7cc56ed643c9e93e0247f5bbe0d1247d15fa520814a7cd7", - "sha256:ef48e2707fb320c8f139424a596f5b69955a85b178f15af261bab871873bb987", - "sha256:f152cbf5b88aaeb836127d920dd0f5e7edff5a66f10c079157306c4343d86c19", - "sha256:fc0b4d8bfeabd25ea75e94632f5b6e047eef8adaed0c2161ada1e922e7f7cece" + "sha256:06d96b9b19bbe7f049c2be3c4f9e06737ec6d8ef8933c7c3a4c557ef07936e46", + "sha256:13017a63b0e499c59b5ba94a8542fb62864ba3016127d1e4ef30d354fc2b00e9", + "sha256:1acc2e2ef098a1d4bf535758085f508097316d738101a97c3f996bccba963ea5", + "sha256:1aef719b6559b521ae913ddeb38f5048c6d1a3d366865e8b320270b7bc4693c2", + "sha256:1e4225990a87df898e40ca31c9e830c15c2c53b1d33df592bc8ef314d71f0281", + "sha256:1f11f98753800eb1ec872562a398081f6695f91cd01ce39819e36621003ec52a", + "sha256:1f29bf497d51a5077994b265e976d78b09d9d0dff6ca5763dbb4804534a5d380", + "sha256:1f96aa94739593ae0707eda9813ce363a0a0374a810ae0eced383340fc4a1f73", + "sha256:20e611fc36e1a0fc7bbf957ef9c635c8807d71fbe5643e51b2769b3cc0fb0b51", + "sha256:23f2f16958b16152b43a39a5ecf4705757ddd284b3b17a77da3a62aef9c057ef", + "sha256:24bb4c7859a3f757a116521d4d3a8a82befad56ea1bdacd17d6aafd113b0071e", + "sha256:26716a1118c6ce2188283b4b60a898c3be29b480acbd0a91446ced4fe4e780d8", + "sha256:29da75ce20cb0a26d60e22658dd3230713c6c05a3465dd8ad040ffc991aea318", + "sha256:2b144d142ec9987276aeff1326edbc0df8ba4afbd7232f0ca10ad57a115e95b6", + "sha256:2c79f058e7bec26b5295d53b8c39ecb623448c74ccc8378631f5cb5c16a7e02c", + "sha256:3bb5b92a0ab3d22dfdbfe845e2fef92717b067bdf41a5b68c7e3e857c0cff1a4", + "sha256:3d3f7744b8a8079d69af69d512e5abed4fb473057625588ce126088e50d05493", + "sha256:3d9c62cff2ffb4c2a95328488fd7aa96a7a4b34873150650fe76b19c08c9c792", + "sha256:3e12536446ad4527ac8ed91d8a607813085683bcce27af69e3b31cd72b3c5960", + "sha256:40dbb8e7727560fe8ab65efcddfec1ae25f30ef02e2f2e5d78cfb52a66781ec5", + "sha256:431a3917e32223fcdb90b79fe60185864a9109631ebc05f6c5aa03781a00b513", + "sha256:448ec61ea9ea7916d5579939362509145caaecf03161f6f13e366aebb692a631", + "sha256:482df956b055d3009d10fce81af6ffab28215d7ed6ad4a15e5c8e67cb7c5251c", + "sha256:4a00bd5ba8f1a4114720bef283cf31583d6cb1c510ce890a6da6c4268f0070b7", + "sha256:51b6cee539168a912b4b3b040e4042b9e2c9a7ad9c8546c09e4eaeff3eacba6b", + "sha256:554c7327bf0fd688050348e22db7c8e163fb7219f3ecdd4732d7ed606b417263", + "sha256:5662bf0f6fb6757f5c2d6279c541a5af55a39772c2362ed0920b27e3ce0e21f7", + "sha256:5997d418c219dcd4dcba64e50671cca849aaf0dac3d7a2eeeb7d651a5bd735b8", + "sha256:59a75e6aa5c25b50b5a1499f9718f2edff54257f545718c4fb100f48d570ead4", + "sha256:60b66b0363c5a2a79fba3d1cd7430c25bbd92c923d031cae906bdcb6e054d9a2", + "sha256:6e34680049eecb30b6498784c9637c1c74277dcb1db75649a152f8004fbd6646", + "sha256:74eeaa13e8200ad72fca9c5f37395fb310915cec6f1682b21375e84fd9770e84", + "sha256:7c5c5b7ae2763533152880d5b5b451acbc1089ade2336b710a24b2b0f5239d20", + "sha256:829fb55ad437d757c70d5b1c51cfda9377f31506a0a3f3ac282bc6a387d6a5f1", + "sha256:878243e1206828908a6b4a9ca7b1aa8bee9eb129bf7186fc381d2646f4524ce9", + "sha256:8809c0ea0e8454f756e3bd5c36d04dddf222989216788a25bfd6724bfcee342c", + "sha256:8941e35a0e991a7a20a1fa3e3182f82abe357211f2c335a9e6007067c3392fcf", + "sha256:894b1acded706f1407a662d08e026bfd0ff1e59e9bd32062fea9d862564cfb65", + "sha256:900532713115ac58bc3491b9d2b52704a05ed408ba0918d57fd72c94bc47fba1", + "sha256:976cd92d9420e6e2aa6ce6a9d61f2b490e07cb468968adf371546b33b829284b", + "sha256:97de509043d3f0f2b2cd171bdccf408f175c7f7a99d36d566b1ae4dd84107985", + "sha256:9a42970ce74c88bdf144df11c52c5cf4ad610d860de87c0883385a1c9d9fa4ab", + "sha256:9e41c94035e5cdb362beed681b58a707e8dc29ea446ea1713d92afeded9d1ddd", + "sha256:9f805481d5eff2a96bac4da1570ef662bf970f9a16580dc2c169c8c3183fa02b", + "sha256:a35c97af60a5492e9e89f8b7153fe24eadfd61cb3a2fb600df1a25b5dab34b7e", + "sha256:a7c6574225f34ce45466f04751d957b5c5e6b69fca9351db017c9249786172ce", + "sha256:c7ebf2a37e4f5fea3c1a11e1f47cea7d75d0f2d8ef69635ddbd5c927083211fc", + "sha256:d0305e02e40c7cfea5d08d6368576537a74c0eea62b77633179748d3519d6705", + "sha256:e1046aab24c48c694f0793f669ac49ea68acde6a0798ac5388abe0a5615b5ec8", + "sha256:e5d22eba19273b2069e4efeff88c897a26bdc64633cbe0357a198f92dca94268", + "sha256:ec27e93bbf5976f0465e8936f02eb5add99bbe4e4e7b233607e4d7622912d68d", + "sha256:fe76d6dee5e4febefa83998b17926df3a04e5089e3d2b1688c74a9157798d7a2" ], "index": "pypi", - "version": "==7.5.1" + "version": "==7.5.2" }, "docker": { "hashes": [ - "sha256:12ba681f2777a0ad28ffbcc846a69c31b4dfd9752b47eb425a274ee269c5e14b", - "sha256:323736fb92cd9418fc5e7133bc953e11a9da04f4483f828b527db553f1e7e5a3" + "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", + "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0" ], "markers": "python_version >= '3.8'", - "version": "==7.0.0" + "version": "==7.1.0" }, "idna": { "hashes": [ @@ -1914,11 +1914,11 @@ }, "pytest": { "hashes": [ - "sha256:1733f0620f6cda4095bbf0d9ff8022486e91892245bb9e7d5542c018f612f233", - "sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f" + "sha256:5046e5b46d8e4cac199c373041f26be56fdb81eb4e67dc11d4e10811fc3408fd", + "sha256:faccc5d332b8c3719f40283d0d44aa5cf101cec36f88cde9ed8f2bc0538612b1" ], "index": "pypi", - "version": "==8.2.0" + "version": "==8.2.1" }, "python-dateutil": { "hashes": [ @@ -1930,11 +1930,11 @@ }, "requests": { "hashes": [ - "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", - "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" + "sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289", + "sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c" ], "index": "pypi", - "version": "==2.31.0" + "version": "==2.32.2" }, "requests-mock": { "hashes": [ @@ -1975,11 +1975,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", - "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" + "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8", + "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594" ], "markers": "python_version >= '3.8'", - "version": "==4.11.0" + "version": "==4.12.0" }, "urllib3": { "hashes": [ diff --git a/dbrepo-analyse-service/app.py b/dbrepo-analyse-service/app.py index 0e3043113a..de1ca37a4d 100644 --- a/dbrepo-analyse-service/app.py +++ b/dbrepo-analyse-service/app.py @@ -132,11 +132,11 @@ app.config["AUTH_SERVICE_CLIENT"] = os.getenv("AUTH_SERVICE_CLIENT", "dbrepo") app.config["AUTH_SERVICE_CLIENT_SECRET"] = os.getenv("AUTH_SERVICE_CLIENT_SECRET", "MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG") app.config["ADMIN_USERNAME"] = os.getenv('ADMIN_USERNAME', 'admin') app.config["ADMIN_PASSWORD"] = os.getenv('ADMIN_PASSWORD', 'admin') -app.config["S3_ENDPOINT"] = os.getenv('S3_ENDPOINT', 'http://localhost:9000') app.config["S3_ACCESS_KEY_ID"] = os.getenv('S3_ACCESS_KEY_ID', 'seaweedfsadmin') -app.config["S3_SECRET_ACCESS_KEY"] = os.getenv('S3_SECRET_ACCESS_KEY', 'seaweedfsadmin') +app.config["S3_ENDPOINT"] = os.getenv('S3_ENDPOINT', 'http://localhost:9000') app.config["S3_EXPORT_BUCKET"] = os.getenv('S3_EXPORT_BUCKET', 'dbrepo-download') app.config["S3_IMPORT_BUCKET"] = os.getenv('S3_IMPORT_BUCKET', 'dbrepo-upload') +app.config["S3_SECRET_ACCESS_KEY"] = os.getenv('S3_SECRET_ACCESS_KEY', 'seaweedfsadmin') app.json_encoder = LazyJSONEncoder @@ -187,6 +187,7 @@ def get_health(): @app.route("/api/analyse/datatypes", methods=["GET"], endpoint="analyse_analyse_datatypes") +@metrics.gauge(name='dbrepo_analyse_datatypes', description='Time needed to analyse datatypes of dataset') @swag_from("as-yml/analyse_datatypes.yml") def analyse_datatypes(): filename: str = request.args.get('filename') @@ -212,6 +213,7 @@ def analyse_datatypes(): @app.route("/api/analyse/keys", methods=["GET"], endpoint="analyse_analyse_keys") +@metrics.gauge(name='dbrepo_analyse_keys', description='Time needed to analyse keys of dataset') @swag_from("as-yml/analyse_keys.yml") def analyse_keys(): filename: str = request.args.get("filename") @@ -234,6 +236,7 @@ def analyse_keys(): @app.route("/api/analyse/database/<database_id>/table/<table_id>/statistics", methods=["GET"], endpoint="analyse_analyse_table_stat") @auth.login_required(role=['admin', 'export-query-data', 'export-table-data']) +@metrics.gauge(name='dbrepo_analyse_table_stat', description='Time needed to analyse table statistics') @swag_from("as-yml/analyse_table_stat.yml") def analyse_table_stat(database_id: int = None, table_id: int = None): if database_id is None: diff --git a/dbrepo-analyse-service/clients/s3_client.py b/dbrepo-analyse-service/clients/s3_client.py index 22f21966b7..5e8f3bb437 100644 --- a/dbrepo-analyse-service/clients/s3_client.py +++ b/dbrepo-analyse-service/clients/s3_client.py @@ -20,7 +20,7 @@ class S3Client: self.bucket_exists_or_exit(current_app.config['S3_EXPORT_BUCKET']) self.bucket_exists_or_exit(current_app.config['S3_IMPORT_BUCKET']) - def upload_file(self, filename: str, path: str = "/tmp/", bucket: str = "dbrepo-upload") -> bool: + def upload_file(self, filename: str, path: str = "/tmp", bucket: str = "dbrepo-upload") -> bool: """ Uploads a file to the blob storage. Follows the official API https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-uploading-files.html. @@ -43,15 +43,16 @@ class S3Client: logging.warning(f"Failed to upload file with key {filename}") raise ConnectionRefusedError(f"Failed to upload file with key {filename}", e) - def download_file(self, filename: str, bucket: str): + def download_file(self, filename: str, path: str = "/tmp", bucket: str = "dbrepo-download"): """ Downloads a file from the blob storage. Follows the official API https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-example-download-file.html :param filename: The filename. + :param path: The path the file is located. :param bucket: The bucket to download the file from. """ self.file_exists(bucket, filename) - filepath = os.path.join("/tmp/", filename) + filepath = os.path.join(path, filename) self.client.download_file(bucket, filename, filepath) logging.info(f"Downloaded .csv with key {filename} into {filepath}") diff --git a/dbrepo-analyse-service/lib/dbrepo-1.4.3-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.4.3-py3-none-any.whl index bb0ce570729cffddbd0f77eb818fd40eb0a56195..2e19eddac149ac401c67a52ba56577132e32869a 100644 GIT binary patch delta 20837 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ʑd)B&FX?zRWxEZP)tee<<Hn5*~)wt}#8%sue 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%0D@+}nRxkHqa2I;Ik5NNgFEn=@ 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 HX&?ar33Q77 delta 20877 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 diff --git a/dbrepo-analyse-service/lib/dbrepo-1.4.3.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.4.3.tar.gz index 04043f0f56105d80e7f2aaa5fe1598077184ef64..ffb89654bab83c6f72a9381825e41f0dbe7d37c9 100644 GIT binary patch literal 37342 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 literal 37117 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 diff --git a/dbrepo-analyse-service/lib/dbrepo-1.4.4-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.4.4-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..11873004972bb08703994ba1fb0ddf18f96f6a2c GIT binary patch literal 27104 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 G;sF4l(3t=L literal 0 HcmV?d00001 diff --git a/dbrepo-analyse-service/lib/dbrepo-1.4.4.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.4.4.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..f7452a0e12c9a2d44f663bc1f338204b7579144b GIT binary patch literal 37351 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 A;s5{u literal 0 HcmV?d00001 diff --git a/dbrepo-analyse-service/metrics.md b/dbrepo-analyse-service/metrics.md new file mode 100644 index 0000000000..f0eaee535a --- /dev/null +++ b/dbrepo-analyse-service/metrics.md @@ -0,0 +1,6 @@ +| **Metric** | **Description** | +|-----------------------------|---------------------------------------------| +| `dbrepo_analyse_datatypes` | Time needed to analyse datatypes of dataset | +| `dbrepo_analyse_keys` | Time needed to analyse keys of dataset | +| `dbrepo_analyse_table_stat` | Time needed to analyse table statistics | +| `dbrepo_analyse_table_stat` | Time needed to analyse table statistics | \ No newline at end of file diff --git a/dbrepo-auth-service/dbrepo-realm.json b/dbrepo-auth-service/dbrepo-realm.json index 1abee7076b..f5ced37ff2 100644 --- a/dbrepo-auth-service/dbrepo-realm.json +++ b/dbrepo-auth-service/dbrepo-realm.json @@ -1091,7 +1091,7 @@ "otpPolicyLookAheadWindow" : 1, "otpPolicyPeriod" : 30, "otpPolicyCodeReusable" : false, - "otpSupportedApplications" : [ "totpAppMicrosoftAuthenticatorName", "totpAppFreeOTPName", "totpAppGoogleName" ], + "otpSupportedApplications" : [ "totpAppFreeOTPName", "totpAppGoogleName", "totpAppMicrosoftAuthenticatorName" ], "webAuthnPolicyRpEntityName" : "keycloak", "webAuthnPolicySignatureAlgorithms" : [ "ES256" ], "webAuthnPolicyRpId" : "", @@ -2110,7 +2110,7 @@ "subType" : "authenticated", "subComponents" : { }, "config" : { - "allowed-protocol-mapper-types" : [ "oidc-usermodel-property-mapper", "saml-role-list-mapper", "oidc-usermodel-attribute-mapper", "oidc-full-name-mapper", "saml-user-attribute-mapper", "oidc-address-mapper", "saml-user-property-mapper", "oidc-sha256-pairwise-sub-mapper" ] + "allowed-protocol-mapper-types" : [ "saml-user-property-mapper", "oidc-full-name-mapper", "saml-user-attribute-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-usermodel-property-mapper", "saml-role-list-mapper", "oidc-usermodel-attribute-mapper", "oidc-address-mapper" ] } }, { "id" : "3ab11d74-5e76-408a-b85a-26bf8950f979", @@ -2119,7 +2119,7 @@ "subType" : "anonymous", "subComponents" : { }, "config" : { - "allowed-protocol-mapper-types" : [ "oidc-usermodel-property-mapper", "saml-role-list-mapper", "saml-user-property-mapper", "oidc-full-name-mapper", "oidc-address-mapper", "oidc-usermodel-attribute-mapper", "oidc-sha256-pairwise-sub-mapper", "saml-user-attribute-mapper" ] + "allowed-protocol-mapper-types" : [ "oidc-usermodel-property-mapper", "oidc-address-mapper", "saml-user-property-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-full-name-mapper", "saml-role-list-mapper", "oidc-usermodel-attribute-mapper", "saml-user-attribute-mapper" ] } } ], "org.keycloak.keys.KeyProvider" : [ { @@ -2171,7 +2171,7 @@ "internationalizationEnabled" : false, "supportedLocales" : [ ], "authenticationFlows" : [ { - "id" : "81aad346-5dea-4764-a97d-70fa27c7d4a0", + "id" : "fbce9485-c780-438c-bbe9-135352504aa7", "alias" : "Account verification options", "description" : "Method with which to verity the existing account", "providerId" : "basic-flow", @@ -2193,7 +2193,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "1677aaa5-9086-4d75-8f07-c76e25f90167", + "id" : "dce6a1a5-7099-4366-a644-79b08fd399fd", "alias" : "Authentication Options", "description" : "Authentication options.", "providerId" : "basic-flow", @@ -2222,7 +2222,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "04270a38-4dd9-4820-bccd-0eeab6d5e60b", + "id" : "ac79c3e5-8aa3-499c-ae23-1656ab67972c", "alias" : "Browser - Conditional OTP", "description" : "Flow to determine if the OTP is required for the authentication", "providerId" : "basic-flow", @@ -2244,7 +2244,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "82af3fdb-f93f-40cd-9a1b-5aaac3c99fc4", + "id" : "ecafaa7c-4a1f-4842-b8cd-6661fea1da33", "alias" : "Direct Grant - Conditional OTP", "description" : "Flow to determine if the OTP is required for the authentication", "providerId" : "basic-flow", @@ -2266,7 +2266,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "9f7a2dee-a00b-4ed0-a28d-aebd5b04c098", + "id" : "55d29fb3-07a8-47b7-a051-9176e404ab55", "alias" : "First broker login - Conditional OTP", "description" : "Flow to determine if the OTP is required for the authentication", "providerId" : "basic-flow", @@ -2288,7 +2288,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "8bb2d6f7-095f-4be5-844e-aa7351be07a3", + "id" : "23a6b3f9-d7dc-41f0-b9b0-917e64aa62ed", "alias" : "Handle Existing Account", "description" : "Handle what to do if there is existing account with same email/username like authenticated identity provider", "providerId" : "basic-flow", @@ -2310,7 +2310,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "dc8b131c-6078-4730-9c89-0f6e523bd42e", + "id" : "ea03fe83-9a6c-47e0-85e9-94fb006bc504", "alias" : "Reset - Conditional OTP", "description" : "Flow to determine if the OTP should be reset or not. Set to REQUIRED to force.", "providerId" : "basic-flow", @@ -2332,7 +2332,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "f308ac01-8dfa-4593-b19f-562c26d95bbd", + "id" : "c2f4bb71-24a7-42a2-a870-d0485b6430f7", "alias" : "User creation or linking", "description" : "Flow for the existing/non-existing user alternatives", "providerId" : "basic-flow", @@ -2355,7 +2355,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "12fe4a00-c0ee-4a21-929f-c9e510f7edd4", + "id" : "08a0c43e-434c-4f9d-97d8-efcc697c0bdb", "alias" : "Verify Existing Account by Re-authentication", "description" : "Reauthentication of existing account", "providerId" : "basic-flow", @@ -2377,7 +2377,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "4add5b6a-55d9-4d95-8d24-00e508039883", + "id" : "9df5a633-532d-4da0-99ad-b60bac9a984b", "alias" : "browser", "description" : "browser based authentication", "providerId" : "basic-flow", @@ -2413,7 +2413,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "783c72d8-b771-45ff-9b94-facbc7fe7c33", + "id" : "cac0d15d-bba8-4731-a184-5711bfdc38d8", "alias" : "clients", "description" : "Base authentication for clients", "providerId" : "client-flow", @@ -2449,7 +2449,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "55bed153-d2e3-44fa-9a42-4fe971325112", + "id" : "5cb539c9-6124-4883-b058-e4b0062c8ed0", "alias" : "direct grant", "description" : "OpenID Connect Resource Owner Grant", "providerId" : "basic-flow", @@ -2478,7 +2478,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "8fc5834a-2853-47e5-9b0b-9af49ec8ae4f", + "id" : "610d7baf-f915-44e0-8617-8ae6309b1098", "alias" : "docker auth", "description" : "Used by Docker clients to authenticate against the IDP", "providerId" : "basic-flow", @@ -2493,7 +2493,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "34062276-646c-48d7-ab65-4f086c3575fb", + "id" : "d613df19-1185-4796-b1e9-9716f4b241c9", "alias" : "first broker login", "description" : "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account", "providerId" : "basic-flow", @@ -2516,7 +2516,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "47f8b7df-bc03-43cd-ab0b-be6ca3320f1c", + "id" : "7a475371-0966-4dff-9296-28790d5aa227", "alias" : "forms", "description" : "Username, password, otp and other auth forms.", "providerId" : "basic-flow", @@ -2538,7 +2538,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "e975f4cf-3cad-458a-b0c5-1f6c5bb14d1b", + "id" : "7d71011c-9828-495a-8fc6-82e88e308d26", "alias" : "http challenge", "description" : "An authentication flow based on challenge-response HTTP Authentication Schemes", "providerId" : "basic-flow", @@ -2560,7 +2560,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "5a570e5c-22aa-4cb9-ba03-9729876a0f14", + "id" : "0eb1b344-0a43-4ffa-8bf2-98560bd7471f", "alias" : "registration", "description" : "registration flow", "providerId" : "basic-flow", @@ -2576,7 +2576,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "2a50f240-7f9c-4663-b922-bf141d8cecea", + "id" : "fd2328ca-38ca-4dc9-b9e5-09790a3512c5", "alias" : "registration form", "description" : "registration form", "providerId" : "form-flow", @@ -2612,7 +2612,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "4136e336-cf46-444c-9aaa-77ec1b2eaec0", + "id" : "770cf19b-4bc2-4161-b156-161dc23eebaa", "alias" : "reset credentials", "description" : "Reset credentials for a user if they forgot their password or something", "providerId" : "basic-flow", @@ -2648,7 +2648,7 @@ "userSetupAllowed" : false } ] }, { - "id" : "d1ba354a-8203-42d5-bf16-d850182f7336", + "id" : "ab251c63-6c1b-4d93-9f26-2f5d18c81832", "alias" : "saml ecp", "description" : "SAML ECP Profile Authentication Flow", "providerId" : "basic-flow", @@ -2664,13 +2664,13 @@ } ] } ], "authenticatorConfig" : [ { - "id" : "cea49223-ea27-4324-816c-b6a890548097", + "id" : "709dcd0e-a60b-4ae5-ac66-d15374b1562c", "alias" : "create unique user config", "config" : { "require.password.update.after.registration" : "false" } }, { - "id" : "3627d68d-6f05-45b2-835d-8127ab90a6b3", + "id" : "f80268b2-6944-4acd-b622-426369f8c44d", "alias" : "review profile config", "config" : { "update.profile.on.first.login" : "missing" diff --git a/dbrepo-data-db/sidecar/app.py b/dbrepo-data-db/sidecar/app.py index ffca4d3753..f4342301df 100644 --- a/dbrepo-data-db/sidecar/app.py +++ b/dbrepo-data-db/sidecar/app.py @@ -121,14 +121,16 @@ app.config["AUTH_SERVICE_CLIENT"] = os.getenv("AUTH_SERVICE_CLIENT", "dbrepo-cli app.config["AUTH_SERVICE_CLIENT_SECRET"] = os.getenv("AUTH_SERVICE_CLIENT_SECRET", "MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG") app.config["ADMIN_USERNAME"] = os.getenv('ADMIN_USERNAME', 'admin') app.config["ADMIN_PASSWORD"] = os.getenv('ADMIN_PASSWORD', 'admin') -app.config["S3_ENDPOINT"] = os.getenv('S3_ENDPOINT', 'http://localhost:9000') app.config["S3_ACCESS_KEY_ID"] = os.getenv('S3_ACCESS_KEY_ID', 'seaweedfsadmin') -app.config["S3_SECRET_ACCESS_KEY"] = os.getenv('S3_SECRET_ACCESS_KEY', 'seaweedfsadmin') +app.config["S3_ENDPOINT"] = os.getenv('S3_ENDPOINT', 'http://localhost:9000') app.config["S3_EXPORT_BUCKET"] = os.getenv('S3_EXPORT_BUCKET', 'dbrepo-download') +app.config["S3_FILE_PATH"] = os.getenv('S3_FILE_PATH', '/tmp') +app.config["S3_SECRET_ACCESS_KEY"] = os.getenv('S3_SECRET_ACCESS_KEY', 'seaweedfsadmin') app.config["S3_IMPORT_BUCKET"] = os.getenv('S3_IMPORT_BUCKET', 'dbrepo-upload') app.json_encoder = LazyJSONEncoder + @token_auth.verify_token def verify_token(token: str): if token is None or token == "": @@ -176,25 +178,27 @@ def health(): @app.route("/sidecar/import/<string:filename>", methods=["POST"], endpoint="sidecar_import") +@metrics.gauge(name='dbrepo_sidecar_import_dataset', description='Time needed to import dataset from S3') @auth.login_required(role=['admin', 'import-database-data']) @swag_from("ds-yml/import.yml") def import_csv(filename): auth.current_user() logging.debug('endpoint import csv, filename=%s, body=%s', filename, request) s3_client = S3Client() - response = s3_client.download_file(filename) + response = s3_client.download_file(filename, app.config["S3_FILE_PATH"], app.config['S3_IMPORT_BUCKET']) if response is False: return Response(), 400 return Response(json.dumps(response)), 202 @app.route("/sidecar/export/<string:filename>", methods=["POST"], endpoint="sidecar_export") +@metrics.gauge(name='dbrepo_sidecar_export_dataset', description='Time needed to export dataset to S3') @auth.login_required(role=['admin', 'export-query-data', 'export-table-data']) @swag_from("ds-yml/export.yml") def import_csv(filename): logging.debug('endpoint export csv, filename=%s, body=%s', filename, request) s3_client = S3Client() - response = s3_client.upload_file(filename) + response = s3_client.upload_file(filename, app.config["S3_FILE_PATH"], app.config['S3_EXPORT_BUCKET']) if response is False: return Response(), 400 return Response(), 202 diff --git a/dbrepo-data-db/sidecar/clients/s3_client.py b/dbrepo-data-db/sidecar/clients/s3_client.py index 135654da70..547a1c3a30 100644 --- a/dbrepo-data-db/sidecar/clients/s3_client.py +++ b/dbrepo-data-db/sidecar/clients/s3_client.py @@ -20,32 +20,35 @@ class S3Client: self.bucket_exists_or_exit(current_app.config['S3_IMPORT_BUCKET']) self.bucket_exists_or_exit(current_app.config['S3_EXPORT_BUCKET']) - def upload_file(self, filename) -> bool: + def upload_file(self, filename, path, bucket) -> bool: """ Uploads a file to the blob storage. Follows the official API https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-uploading-files.html. :param filename: The filename. + :param path: The path. + :param bucket: The bucket. :return: True if the file was uploaded. """ - filepath = os.path.join("/tmp/", filename) + filepath = os.path.join(path, filename) try: - self.client.upload_file(filepath, current_app.config['S3_EXPORT_BUCKET'], filename) - logging.info(f"Uploaded .csv {filepath} with key {filename} into bucket dbrepo-download") + self.client.upload_file(filepath, bucket, filename) + logging.info(f"Uploaded .csv {filepath} with key {filename} into bucket {bucket}") return True except ClientError as e: logging.error(e) return False - def download_file(self, filename) -> bool: + def download_file(self, filename, path, bucket) -> bool: """ Downloads a file from the blob storage. Follows the official API https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-example-download-file.html :param filename: The filename. + :param path: The path. + :param bucket: The bucket. :return: True if the file was downloaded and saved. """ - self.file_exists(current_app.config['S3_IMPORT_BUCKET'], filename) - filepath = os.path.join("/tmp/", filename) - bucket = current_app.config['S3_IMPORT_BUCKET'] + self.file_exists(bucket, filename) + filepath = os.path.join(path, filename) try: self.client.download_file(bucket, filename, filepath) logging.info(f"Downloaded .csv with key {filename} into {filepath} from bucket {bucket}") diff --git a/dbrepo-data-db/sidecar/metrics.md b/dbrepo-data-db/sidecar/metrics.md new file mode 100644 index 0000000000..0aaa9e332b --- /dev/null +++ b/dbrepo-data-db/sidecar/metrics.md @@ -0,0 +1,4 @@ +| **Metric** | **Description** | +|---------------------------------|---------------------------------------| +| `dbrepo_sidecar_import_dataset` | Time needed to import dataset from S3 | +| `dbrepo_sidecar_export_dataset` | Time needed to export dataset to S3 | \ No newline at end of file diff --git a/dbrepo-data-service/metrics.md b/dbrepo-data-service/metrics.md new file mode 100644 index 0000000000..5e0773ad8c --- /dev/null +++ b/dbrepo-data-service/metrics.md @@ -0,0 +1,17 @@ +| **Metric** | **Description** | +|-----------------------------|-------------------------------------------| +| `dbrepo_message_receive` | Received AMQP message from Broker Service | +| `dbrepo_subset_create` | Create subset | +| `dbrepo_subset_data` | Retrieved subset data | +| `dbrepo_subset_find` | Find subset | +| `dbrepo_subset_list` | Find subsets | +| `dbrepo_subset_persist` | Persist subset | +| `dbrepo_table_data_create` | Create table data | +| `dbrepo_table_data_delete` | Delete table data | +| `dbrepo_table_data_export` | Export table data | +| `dbrepo_table_data_history` | Find table history | +| `dbrepo_table_data_import` | Import dataset | +| `dbrepo_table_data_list` | Retrieve table data | +| `dbrepo_table_data_update` | Update table data | +| `dbrepo_view_data` | Retrieve view data | +| `dbrepo_view_schema_list` | Find view schemas | diff --git a/dbrepo-data-service/pom.xml b/dbrepo-data-service/pom.xml index 811bd20576..98ad4d797c 100644 --- a/dbrepo-data-service/pom.xml +++ b/dbrepo-data-service/pom.xml @@ -11,7 +11,7 @@ <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> <name>dbrepo-data-service</name> - <version>1.4.3</version> + <version>1.4.4</version> <description>Service that manages the data</description> diff --git a/dbrepo-data-service/querystore/pom.xml b/dbrepo-data-service/querystore/pom.xml index e30f0c2956..4e08bccd72 100644 --- a/dbrepo-data-service/querystore/pom.xml +++ b/dbrepo-data-service/querystore/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.4.3</version> + <version>1.4.4</version> </parent> <artifactId>dbrepo-data-service-querystore</artifactId> <name>dbrepo-data-service-querystore</name> - <version>1.4.3</version> + <version>1.4.4</version> <dependencies/> diff --git a/dbrepo-data-service/report/pom.xml b/dbrepo-data-service/report/pom.xml index 8a52a9d2ce..9a46c8f2fb 100644 --- a/dbrepo-data-service/report/pom.xml +++ b/dbrepo-data-service/report/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.4.3</version> + <version>1.4.4</version> </parent> <artifactId>report</artifactId> <name>dbrepo-data-service-report</name> - <version>1.4.3</version> + <version>1.4.4</version> <description> This module is only intended for the pipeline coverage report. See the detailed report in the respective modules diff --git a/dbrepo-data-service/rest-service/pom.xml b/dbrepo-data-service/rest-service/pom.xml index 9175428c48..72f1a8f5d9 100644 --- a/dbrepo-data-service/rest-service/pom.xml +++ b/dbrepo-data-service/rest-service/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.4.3</version> + <version>1.4.4</version> </parent> <artifactId>rest-service</artifactId> <name>dbrepo-data-service-rest-service</name> - <version>1.4.3</version> + <version>1.4.4</version> <dependencies> <dependency> <groupId>at.tuwien</groupId> <artifactId>services</artifactId> - <version>1.4.3</version> + <version>1.4.4</version> </dependency> </dependencies> diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java index 452a1e6b46..ea7b1b3677 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java @@ -20,10 +20,8 @@ import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; -import java.security.Principal; import java.sql.SQLException; import java.util.UUID; @@ -43,36 +41,33 @@ public class AccessEndpoint { } @PostMapping("/{userId}") - @Transactional - @Observed(name = "dbrepo_database_access_create") @PreAuthorize("hasAuthority('admin')") @Operation(summary = "Give access to some database", security = {@SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", - description = "Granting access succeeded", - content = {@Content}), + description = "Granting access succeeded"), @ApiResponse(responseCode = "400", description = "Granting access query or database connection is malformed", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "403", - description = "Failed giving access", + description = "Not allowed to give access", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "404", - description = "Database or user not found", + description = "Failed to find database/user in metadata database", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "405", - description = "Granting access not permitted", + @ApiResponse(responseCode = "417", + description = "Failed to give access in the database", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "503", - description = "Access could not be created in the data service", + description = "Failed to establish connection to metadata service", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -99,40 +94,45 @@ public class AccessEndpoint { } @PutMapping("/{userId}") - @Transactional - @Observed(name = "dbrepo_database_access_update") @PreAuthorize("hasAuthority('admin')") - @Operation(summary = "Modify access to some database", security = {@SecurityRequirement(name = "basicAuth")}) + @Operation(summary = "Update access to some database", security = {@SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", - description = "Modify access succeeded", + description = "Update access succeeded", content = {@Content}), @ApiResponse(responseCode = "400", - description = "Modify access query or database connection is malformed", + description = "Update access query or database connection is malformed", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "403", - description = "Modify access not permitted when no access is granted in the first place", + description = "Not allowed to update access", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "404", - description = "Database or user not found", + description = "Failed to find database/user in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "417", + description = "Failed to update access in database", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "503", - description = "Access could not be updated in the data service", + description = "Failed to establish connection with metadata service", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<?> update(@NotBlank @PathVariable("databaseId") Long databaseId, @NotBlank @PathVariable("userId") UUID userId, - @Valid @RequestBody UpdateDatabaseAccessDto accessDto) throws NotAllowedException, QueryMalformedException, - DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException, DatabaseMalformedException { - log.debug("endpoint modify access to database, databaseId={}, userId={}, accessDto={}", databaseId, userId, accessDto); + @Valid @RequestBody UpdateDatabaseAccessDto access) throws NotAllowedException, + QueryMalformedException, DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException, + DatabaseMalformedException { + log.debug("endpoint modify access to database, databaseId={}, userId={}, access.type={}", databaseId, userId, + access.getType()); final PrivilegedDatabaseDto database = metadataServiceGateway.getDatabaseById(databaseId); final PrivilegedUserDto user = metadataServiceGateway.getUserById(userId); if (database.getAccesses().stream().noneMatch(a -> a.getUser().getId().equals(userId))) { @@ -140,7 +140,7 @@ public class AccessEndpoint { throw new NotAllowedException("Failed to update access to user with id " + userId + ": no access"); } try { - accessService.update(database, user, accessDto.getType()); + accessService.update(database, user, access.getType()); return ResponseEntity.accepted() .build(); } catch (SQLException e) { @@ -149,31 +149,33 @@ public class AccessEndpoint { } @DeleteMapping("/{userId}") - @Transactional - @Observed(name = "dbrepo_database_access_revoke") @PreAuthorize("hasAuthority('admin')") @Operation(summary = "Revoke access to some database", security = {@SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", - description = "Revoked access successfully", - content = {@Content}), + description = "Revoked access successfully"), @ApiResponse(responseCode = "400", - description = "Modify access query or database connection is malformed", + description = "Revoke access query or database connection is malformed", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "403", - description = "Revoke of access not permitted as no access was found", + description = "Not allowed to revoke access", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "404", - description = "User, database with access was not found", + description = "Failed to find database/user in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "417", + description = "Failed to revoke access in database", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "503", - description = "Access could not be revoked in the data service", + description = "Failed to establish connection with the metadata service", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java index 21014faf4c..f69019e717 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java @@ -13,7 +13,6 @@ import at.tuwien.mapper.MetadataMapper; import at.tuwien.service.AccessService; import at.tuwien.service.DatabaseService; import at.tuwien.service.SubsetService; -import io.micrometer.observation.annotation.Observed; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; @@ -27,7 +26,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.sql.SQLException; @@ -55,12 +53,11 @@ public class DatabaseEndpoint { } @PostMapping - @Transactional(rollbackFor = Exception.class) @PreAuthorize("hasAuthority('admin')") @Operation(summary = "Create database", security = {@SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "201", - description = "Created a new database", + description = "Created a database", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = DatabaseDto.class))}), @@ -69,10 +66,25 @@ public class DatabaseEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find container in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "417", + description = "Failed to create query store in database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to communicate with database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<DatabaseDto> create(@Valid @RequestBody CreateDatabaseDto data) throws DatabaseUnavailableException, - RemoteUnavailableException, ContainerNotFoundException, DatabaseMalformedException, - QueryStoreCreateException { + public ResponseEntity<DatabaseDto> create(@Valid @RequestBody CreateDatabaseDto data) + throws DatabaseUnavailableException, RemoteUnavailableException, ContainerNotFoundException, + DatabaseMalformedException, QueryStoreCreateException { log.debug("endpoint create database, data.containerId={}, data.internalName={}, data.username={}", data.getContainerId(), data.getInternalName(), data.getUsername()); final PrivilegedContainerDto container = metadataServiceGateway.getContainerById(data.getContainerId()); @@ -94,17 +106,23 @@ public class DatabaseEndpoint { } @PutMapping("/{databaseId}") - @Transactional(rollbackFor = Exception.class) @PreAuthorize("hasAuthority('admin')") @Operation(summary = "Update user password in database", security = {@SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", - description = "Created a new database", + description = "Updated user password in database"), + @ApiResponse(responseCode = "404", + description = "Failed to find database in metadata database", content = {@Content( mediaType = "application/json", - schema = @Schema(implementation = DatabaseDto.class))}), - @ApiResponse(responseCode = "400", - description = "Database create query is malformed or image is not supported", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "417", + description = "Failed to update user password in database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to communicate with database", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java index 32c30d481c..b9a9ae442d 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java @@ -6,6 +6,7 @@ import at.tuwien.api.database.query.ExecuteStatementDto; import at.tuwien.api.database.query.QueryDto; import at.tuwien.api.database.query.QueryPersistDto; import at.tuwien.api.database.query.QueryResultDto; +import at.tuwien.api.error.ApiErrorDto; import at.tuwien.exception.*; import at.tuwien.gateway.MetadataServiceGateway; import at.tuwien.service.SubsetService; @@ -25,6 +26,7 @@ import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.RandomStringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -62,10 +64,25 @@ public class SubsetEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = QueryDto[].class))}), + @ApiResponse(responseCode = "403", + description = "Not allowed to find subsets", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find database in metadata database or query in query store of the data database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to communicate with database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<List<QueryDto>> findAllById(@NotNull @PathVariable("databaseId") Long databaseId, - @RequestParam(name = "persisted", required = false) Boolean filterPersisted, - Principal principal) + public ResponseEntity<List<QueryDto>> list(@NotNull @PathVariable("databaseId") Long databaseId, + @RequestParam(name = "persisted", required = false) Boolean filterPersisted, + Principal principal) throws DatabaseUnavailableException, DatabaseNotFoundException, RemoteUnavailableException, QueryNotFoundException, NotAllowedException { log.debug("endpoint find subsets in database, databaseId={}, filterPersisted={}, principal.name={}", databaseId, @@ -94,7 +111,36 @@ public class SubsetEndpoint { @Operation(summary = "Find subset", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "200", - description = "Found subset") + description = "Found subset", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = QueryDto.class)), + @Content(mediaType = "text/csv")}), + @ApiResponse(responseCode = "400", + description = "Malformed select query", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "403", + description = "Not allowed to find subset", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find database in metadata database or query in query store of the data database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "406", + description = "Failed to find acceptable representation", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to communicate with database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<?> findById(@NotNull @PathVariable("databaseId") Long databaseId, @NotNull @PathVariable("subsetId") Long subsetId, @@ -165,6 +211,36 @@ public class SubsetEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = QueryResultDto.class))}), + @ApiResponse(responseCode = "400", + description = "Malformed select query", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "403", + description = "Not allowed to find subset", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find database in metadata database or query in query store of the data database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "417", + description = "Failed to insert query into query store of data database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "501", + description = "Failed to execute query as it contains non-supported keywords", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to communicate with database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<QueryResultDto> create(@NotNull @PathVariable("databaseId") Long databaseId, @Valid @RequestBody ExecuteStatementDto data, @@ -173,10 +249,10 @@ public class SubsetEndpoint { @RequestParam(required = false) Long size, @RequestParam(required = false) Instant timestamp) throws DatabaseUnavailableException, DatabaseNotFoundException, RemoteUnavailableException, - QueryNotFoundException, FormatNotAvailableException, StorageUnavailableException, QueryMalformedException, - SidecarExportException, StorageNotFoundException, QueryStoreInsertException, TableMalformedException, - PaginationException, QueryNotSupportedException, NotAllowedException, UserNotFoundException { - log.debug("endpoint find subset in database, databaseId={}, data.statement={}, principal.name={}, page={}, size={}, timestamp={}", + QueryNotFoundException, StorageUnavailableException, QueryMalformedException, SidecarExportException, + StorageNotFoundException, QueryStoreInsertException, TableMalformedException, PaginationException, + QueryNotSupportedException, NotAllowedException, UserNotFoundException { + log.debug("endpoint create subset in database, databaseId={}, data.statement={}, principal.name={}, page={}, size={}, timestamp={}", databaseId, data.getStatement(), principal.getName(), page, size, timestamp); /* check */ endpointValidator.validateDataParams(page, size); @@ -206,18 +282,39 @@ public class SubsetEndpoint { throw new DatabaseUnavailableException("Failed to establish connection to database: " + e.getMessage(), e); } log.info("Created subset with id {} in data database", queryResult.getId()); - return ResponseEntity.ok(queryResult); + return ResponseEntity.status(HttpStatus.CREATED) + .body(queryResult); } @RequestMapping(value = "/{subsetId}/data", method = {RequestMethod.GET, RequestMethod.HEAD}) @Observed(name = "dbrepo_subset_data") - @Operation(summary = "Re-execute some query", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) + @Operation(summary = "Retrieved subset data", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "200", - description = "Get subset data", + description = "Retrieved subset data", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = QueryResultDto.class))}), + @ApiResponse(responseCode = "400", + description = "Malformed select query", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "403", + description = "Not allowed to retrieve subset data", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find database in metadata database or query in query store of the data database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to communicate with database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<QueryResultDto> getData(@NotNull @PathVariable("databaseId") Long databaseId, @NotNull @PathVariable("subsetId") Long subsetId, @@ -273,13 +370,38 @@ public class SubsetEndpoint { @PutMapping("/{queryId}") @PreAuthorize("hasAuthority('persist-query')") @Observed(name = "dbrepo_subset_persist") - @Operation(summary = "Persist some query", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) + @Operation(summary = "Persist subset", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", - description = "Persist query successful", + description = "Persisted subset", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = QueryDto.class))}), + @ApiResponse(responseCode = "400", + description = "Malformed select query", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "403", + description = "Not allowed to persist subset", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find database in metadata database or query in query store of the data database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "417", + description = "Failed to persist subset", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to communicate with database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<QueryDto> persist(@NotNull @PathVariable("databaseId") Long databaseId, @NotNull @PathVariable("queryId") Long queryId, diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java index 1a32663870..d000896870 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java @@ -1,7 +1,6 @@ package at.tuwien.endpoints; import at.tuwien.ExportResourceDto; -import at.tuwien.api.database.AccessTypeDto; import at.tuwien.api.database.DatabaseAccessDto; import at.tuwien.api.database.DatabaseDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; @@ -10,6 +9,7 @@ import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.api.database.table.*; import at.tuwien.api.database.table.internal.PrivilegedTableDto; import at.tuwien.api.database.table.internal.TableCreateDto; +import at.tuwien.api.error.ApiErrorDto; import at.tuwien.exception.*; import at.tuwien.gateway.MetadataServiceGateway; import at.tuwien.service.AnalyseService; @@ -64,37 +64,71 @@ public class TableEndpoint { @PreAuthorize("hasAuthority('admin')") @Operation(summary = "Create table", security = {@SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { - @ApiResponse(responseCode = "202", - description = "Created a new table", + @ApiResponse(responseCode = "201", + description = "Created table", content = {@Content( mediaType = "application/json", - schema = @Schema(implementation = DatabaseDto.class))}), + schema = @Schema(implementation = TableDto.class))}), + @ApiResponse(responseCode = "400", + description = "Table schema or query is malformed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find database in metadata database or table in data database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "409", + description = "Table name already exists in database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to establish connection with the metadata service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<Void> create(@NotNull @PathVariable("databaseId") Long databaseId, - @Valid @RequestBody TableCreateDto data) - throws DatabaseNotFoundException, RemoteUnavailableException, TableMalformedException, - DatabaseUnavailableException, TableExistsException { + public ResponseEntity<TableDto> create(@NotNull @PathVariable("databaseId") Long databaseId, + @Valid @RequestBody TableCreateDto data) throws DatabaseNotFoundException, + RemoteUnavailableException, TableMalformedException, DatabaseUnavailableException, TableExistsException, + TableNotFoundException, QueryMalformedException { log.debug("endpoint create table, databaseId={}, data.name={}", databaseId, data.getName()); final PrivilegedDatabaseDto database = metadataServiceGateway.getDatabaseById(databaseId); try { - tableService.createTable(database, data); + return ResponseEntity.status(HttpStatus.CREATED) + .body(tableService.createTable(database, data)); } catch (SQLException e) { log.error("Failed to establish connection to database: {}", e.getMessage()); throw new DatabaseUnavailableException("Failed to establish connection to database: " + e.getMessage(), e); } - return ResponseEntity.status(HttpStatus.CREATED) - .build(); } @DeleteMapping("/{tableId}") @PreAuthorize("hasAuthority('admin')") - @Operation(summary = "Delete table in database", security = {@SecurityRequirement(name = "basicAuth")}) + @Operation(summary = "Delete table", security = {@SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { - @ApiResponse(responseCode = "201", + @ApiResponse(responseCode = "202", description = "Deleted table", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = DatabaseDto.class))}), + @ApiResponse(responseCode = "400", + description = "Deletion query is malformed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find table in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to establish connection with the metadata service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<Void> delete(@NotBlank @PathVariable("databaseId") Long databaseId, @NotBlank @PathVariable("tableId") Long tableId) @@ -114,13 +148,28 @@ public class TableEndpoint { @RequestMapping(value = "/{tableId}/data", method = {RequestMethod.GET, RequestMethod.HEAD}) @Observed(name = "dbrepo_table_data_list") - @Operation(summary = "Find table data", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")}) + @Operation(summary = "Retrieve table data", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "200", - description = "Found table data", + description = "Retrieved table data", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = QueryResultDto.class))}), + @ApiResponse(responseCode = "400", + description = "Request pagination or table data select query is malformed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find table in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to establish connection with the metadata service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<QueryResultDto> getData(@NotBlank @PathVariable("databaseId") Long databaseId, @NotBlank @PathVariable("tableId") Long tableId, @@ -128,7 +177,7 @@ public class TableEndpoint { @RequestParam(required = false) Long page, @RequestParam(required = false) Long size) throws DatabaseUnavailableException, RemoteUnavailableException, TableNotFoundException, - TableMalformedException, PaginationException, SQLException, QueryMalformedException { + TableMalformedException, PaginationException, QueryMalformedException { log.debug("endpoint find table data, databaseId={}, tableId={}, timestamp={}, page={}, size={}", databaseId, tableId, timestamp, page, size); endpointValidator.validateDataParams(page, size); @@ -147,11 +196,11 @@ public class TableEndpoint { } final PrivilegedTableDto table = metadataServiceGateway.getTableById(databaseId, tableId); final HttpHeaders headers = new HttpHeaders(); - headers.set("X-Count", "" + tableService.getCount(table, timestamp)); headers.set("Access-Control-Expose-Headers", "X-Count"); try { + headers.set("X-Count", "" + tableService.getCount(table, timestamp)); final QueryResultDto dto = tableService.getData(table, timestamp, page, size); - return ResponseEntity.status(HttpStatus.OK) + return ResponseEntity.ok() .headers(headers) .body(dto); } catch (SQLException e) { @@ -167,6 +216,26 @@ public class TableEndpoint { @ApiResponses(value = { @ApiResponse(responseCode = "201", description = "Created table data"), + @ApiResponse(responseCode = "400", + description = "Request pagination or table data select query is malformed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "403", + description = "Create table data not allowed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find table in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to establish connection with the metadata service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<Void> createTuple(@NotBlank @PathVariable("databaseId") Long databaseId, @NotBlank @PathVariable("tableId") Long tableId, @@ -197,6 +266,26 @@ public class TableEndpoint { @ApiResponses(value = { @ApiResponse(responseCode = "202", description = "Updated table data"), + @ApiResponse(responseCode = "400", + description = "Request pagination or table data select query is malformed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "403", + description = "Update table data not allowed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find table in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to establish connection with the metadata service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<Void> updateTuple(@NotBlank @PathVariable("databaseId") Long databaseId, @NotBlank @PathVariable("tableId") Long tableId, @@ -228,6 +317,26 @@ public class TableEndpoint { @ApiResponses(value = { @ApiResponse(responseCode = "202", description = "Deleted table data"), + @ApiResponse(responseCode = "400", + description = "Request pagination or table data select query is malformed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "403", + description = "Delete table data not allowed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find table in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to establish connection with the metadata service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<Void> deleteTuple(@NotBlank @PathVariable("databaseId") Long databaseId, @NotBlank @PathVariable("tableId") Long tableId, @@ -260,7 +369,22 @@ public class TableEndpoint { description = "Found table history", content = {@Content( mediaType = "application/json", - schema = @Schema(implementation = DatabaseDto.class))}), + schema = @Schema(implementation = TableHistoryDto[].class))}), + @ApiResponse(responseCode = "403", + description = "Find table history not allowed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find table history in data database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to establish connection with the metadata service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<List<TableHistoryDto>> getHistory(@NotBlank @PathVariable("databaseId") Long databaseId, @NotBlank @PathVariable("tableId") Long tableId, @@ -283,6 +407,54 @@ public class TableEndpoint { } } + @GetMapping + @PreAuthorize("isAuthenticated()") + @Operation(summary = "Find table schemas") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", + description = "Got table schemas", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = TableDto[].class))}), + @ApiResponse(responseCode = "400", + description = "Schema data malformed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "403", + description = "Find table schema not allowed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find database in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "417", + description = "Failed to parse table schema", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to establish connection with the metadata service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + }) + public ResponseEntity<List<TableDto>> getSchema(@NotBlank @PathVariable("databaseId") Long databaseId) + throws DatabaseUnavailableException, DatabaseNotFoundException, RemoteUnavailableException, + DatabaseMalformedException, TableNotFoundException, QueryMalformedException { + log.debug("endpoint inspect table schemas, databaseId={}", databaseId); + final PrivilegedDatabaseDto database = metadataServiceGateway.getDatabaseById(databaseId); + try { + return ResponseEntity.ok(tableService.getSchemas(database)); + } catch (SQLException e) { + log.error("Failed to establish connection to database: {}", e.getMessage()); + throw new DatabaseUnavailableException("Failed to establish connection to database: " + e.getMessage(), e); + } + } + @GetMapping("/{tableId}/export") @Observed(name = "dbrepo_table_data_export") @Operation(summary = "Export table data", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")}) @@ -291,7 +463,27 @@ public class TableEndpoint { description = "Exported table data", content = {@Content( mediaType = "application/json", - schema = @Schema(implementation = DatabaseDto.class))}), + schema = @Schema(implementation = InputStreamResource.class))}), + @ApiResponse(responseCode = "400", + description = "Request pagination or table data select query is malformed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "403", + description = "Export table data not allowed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find table in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to establish connection with the metadata service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<InputStreamResource> exportData(@NotBlank @PathVariable("databaseId") Long databaseId, @NotBlank @PathVariable("tableId") Long tableId, @@ -332,10 +524,30 @@ public class TableEndpoint { @PostMapping("/{tableId}/data/import") @Observed(name = "dbrepo_table_data_import") @PreAuthorize("hasAuthority('insert-table-data')") - @Operation(summary = "Insert data from csv", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")}) + @Operation(summary = "Import dataset", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", - description = "Import successfully"), + description = "Import dataset successfully"), + @ApiResponse(responseCode = "400", + description = "Import dataset query is malformed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "403", + description = "Import table dataset not allowed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find table in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to establish connection with the metadata service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<Void> importData(@NotBlank @PathVariable("databaseId") Long databaseId, @NotBlank @PathVariable("tableId") Long tableId, diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java index 7fc146bbe2..91e5f7390d 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java @@ -1,11 +1,11 @@ package at.tuwien.endpoints; -import at.tuwien.api.database.DatabaseAccessDto; -import at.tuwien.api.database.DatabaseDto; -import at.tuwien.api.database.ViewCreateDto; +import at.tuwien.api.database.*; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.internal.PrivilegedViewDto; import at.tuwien.api.database.query.QueryResultDto; +import at.tuwien.api.database.table.TableDto; +import at.tuwien.api.error.ApiErrorDto; import at.tuwien.exception.*; import at.tuwien.gateway.MetadataServiceGateway; import at.tuwien.service.ViewService; @@ -33,6 +33,7 @@ import org.springframework.web.bind.annotation.*; import java.security.Principal; import java.sql.SQLException; import java.time.Instant; +import java.util.List; @Log4j2 @RestController @@ -52,40 +53,125 @@ public class ViewEndpoint { this.metadataServiceGateway = metadataServiceGateway; } + @GetMapping + @PreAuthorize("isAuthenticated()") + @Observed(name = "dbrepo_view_schema_list") + @Operation(summary = "Find view schemas") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", + description = "Found view schemas", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ViewDto[].class))}), + @ApiResponse(responseCode = "400", + description = "Database schema is malformed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find database/view in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "409", + description = "View schema could not be mapped to known columns", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "417", + description = "View schema could not be retrieved", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to establish connection with the metadata service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + }) + public ResponseEntity<List<ViewDto>> getSchema(@NotBlank @PathVariable("databaseId") Long databaseId) + throws DatabaseUnavailableException, DatabaseNotFoundException, RemoteUnavailableException, + ViewMalformedException, ViewNotFoundException, DatabaseMalformedException, ViewSchemaException { + log.debug("endpoint inspect view schemas, databaseId={}", databaseId); + final PrivilegedDatabaseDto database = metadataServiceGateway.getDatabaseById(databaseId); + try { + return ResponseEntity.ok(viewService.getSchemas(database)); + } catch (SQLException e) { + log.error("Failed to establish connection to database: {}", e.getMessage()); + throw new DatabaseUnavailableException("Failed to establish connection to database: " + e.getMessage(), e); + } + } + @PostMapping @PreAuthorize("hasAuthority('admin')") @Operation(summary = "Create view", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", - description = "Created a new view", + description = "Created view", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ViewDto.class))}), + @ApiResponse(responseCode = "400", + description = "View schema is malformed", content = {@Content( mediaType = "application/json", - schema = @Schema(implementation = DatabaseDto.class))}), + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find database in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "409", + description = "View schema could not be mapped", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to establish connection with the metadata service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<Void> create(@NotNull @PathVariable("databaseId") Long databaseId, - @Valid @RequestBody ViewCreateDto data) throws DatabaseUnavailableException, + public ResponseEntity<ViewDto> create(@NotNull @PathVariable("databaseId") Long databaseId, + @Valid @RequestBody ViewCreateDto data) throws DatabaseUnavailableException, DatabaseNotFoundException, RemoteUnavailableException, ViewMalformedException { log.debug("endpoint create view, databaseId={}, data.name={}", databaseId, data.getName()); final PrivilegedDatabaseDto database = metadataServiceGateway.getDatabaseById(databaseId); try { - viewService.create(database, data); + return ResponseEntity.status(HttpStatus.CREATED) + .body(viewService.create(database, data)); } catch (SQLException e) { log.error("Failed to establish connection to database: {}", e.getMessage()); throw new DatabaseUnavailableException("Failed to establish connection to database: " + e.getMessage(), e); } - return ResponseEntity.status(HttpStatus.CREATED) - .build(); } @DeleteMapping("/{viewId}") @PreAuthorize("hasAuthority('admin')") - @Operation(summary = "Delete view in database", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")}) + @Operation(summary = "Delete view", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")}) @ApiResponses(value = { - @ApiResponse(responseCode = "201", - description = "Deleted table", + @ApiResponse(responseCode = "202", + description = "Deleted view"), + @ApiResponse(responseCode = "400", + description = "Database schema is malformed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find view in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "409", + description = "View schema could not be mapped", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to establish connection with the metadata service", content = {@Content( mediaType = "application/json", - schema = @Schema(implementation = DatabaseDto.class))}), + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<Void> delete(@NotBlank @PathVariable("databaseId") Long databaseId, @NotBlank @PathVariable("viewId") Long viewId) @@ -104,15 +190,39 @@ public class ViewEndpoint { } @RequestMapping(value = "/{viewId}/data", method = {RequestMethod.GET, RequestMethod.HEAD}) - @PreAuthorize("hasAuthority('view-database-view-data')") @Observed(name = "dbrepo_view_data") - @Operation(summary = "Get view data", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")}) + @Operation(summary = "Retrieve view data", security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "200", - description = "Returned view data", + description = "Retrieved view data", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = QueryResultDto.class))}), + @ApiResponse(responseCode = "400", + description = "Request pagination is malformed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "403", + description = "Not allowed to retrieve view data", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find view in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "409", + description = "View schema could not be mapped", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to establish connection with the metadata service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<QueryResultDto> getData(@NotBlank @PathVariable("databaseId") Long databaseId, @NotBlank @PathVariable("viewId") Long viewId, @@ -123,8 +233,8 @@ public class ViewEndpoint { Principal principal) throws DatabaseUnavailableException, RemoteUnavailableException, ViewNotFoundException, QueryMalformedException, ViewMalformedException, PaginationException, NotAllowedException { - log.debug("endpoint get view data, databaseId={}, viewId={}, page={}, size={}, timestamp={}", databaseId, viewId, - page, size, timestamp); + log.debug("endpoint get view data, databaseId={}, viewId={}, page={}, size={}, timestamp={}", databaseId, + viewId, page, size, timestamp); endpointValidator.validateDataParams(page, size); /* parameters */ if (page == null) { @@ -140,7 +250,9 @@ public class ViewEndpoint { timestamp = Instant.now(); } final PrivilegedViewDto view = metadataServiceGateway.getViewById(databaseId, viewId); - metadataServiceGateway.getAccess(databaseId, UserUtil.getId(principal)); + if (!view.getIsPublic()) { + metadataServiceGateway.getAccess(databaseId, UserUtil.getId(principal)); + } try { final Long count = viewService.count(view, timestamp); final HttpHeaders headers = new HttpHeaders(); diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java index c3c95682bd..18373423c5 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java @@ -25,7 +25,7 @@ public class ApiExceptionHandler extends ResponseEntityExceptionHandler { } @Hidden - @ResponseStatus(code = HttpStatus.BAD_REQUEST) + @ResponseStatus(code = HttpStatus.EXPECTATION_FAILED) @ExceptionHandler(DatabaseMalformedException.class) public ResponseEntity<ApiErrorDto> handle(DatabaseMalformedException e) { return generic_handle(e.getClass(), e.getLocalizedMessage()); @@ -88,7 +88,7 @@ public class ApiExceptionHandler extends ResponseEntityExceptionHandler { } @Hidden - @ResponseStatus(code = HttpStatus.BAD_REQUEST) + @ResponseStatus(code = HttpStatus.EXPECTATION_FAILED) @ExceptionHandler(QueryStoreCreateException.class) public ResponseEntity<ApiErrorDto> handle(QueryStoreCreateException e) { return generic_handle(e.getClass(), e.getLocalizedMessage()); @@ -102,14 +102,14 @@ public class ApiExceptionHandler extends ResponseEntityExceptionHandler { } @Hidden - @ResponseStatus(code = HttpStatus.BAD_REQUEST) + @ResponseStatus(code = HttpStatus.EXPECTATION_FAILED) @ExceptionHandler(QueryStoreInsertException.class) public ResponseEntity<ApiErrorDto> handle(QueryStoreInsertException e) { return generic_handle(e.getClass(), e.getLocalizedMessage()); } @Hidden - @ResponseStatus(code = HttpStatus.BAD_REQUEST) + @ResponseStatus(code = HttpStatus.EXPECTATION_FAILED) @ExceptionHandler(QueryStorePersistException.class) public ResponseEntity<ApiErrorDto> handle(QueryStorePersistException e) { return generic_handle(e.getClass(), e.getLocalizedMessage()); @@ -185,6 +185,13 @@ public class ApiExceptionHandler extends ResponseEntityExceptionHandler { return generic_handle(e.getClass(), e.getLocalizedMessage()); } + @Hidden + @ResponseStatus(code = HttpStatus.CONFLICT) + @ExceptionHandler(TableSchemaException.class) + public ResponseEntity<ApiErrorDto> handle(TableSchemaException e) { + return generic_handle(e.getClass(), e.getLocalizedMessage()); + } + @Hidden @ResponseStatus(code = HttpStatus.NOT_FOUND) @ExceptionHandler(UserNotFoundException.class) @@ -206,6 +213,13 @@ public class ApiExceptionHandler extends ResponseEntityExceptionHandler { return generic_handle(e.getClass(), e.getLocalizedMessage()); } + @Hidden + @ResponseStatus(code = HttpStatus.CONFLICT) + @ExceptionHandler(ViewSchemaException.class) + public ResponseEntity<ApiErrorDto> handle(ViewSchemaException e) { + return generic_handle(e.getClass(), e.getLocalizedMessage()); + } + private ResponseEntity<ApiErrorDto> generic_handle(Class<?> exceptionClass, String message) { final HttpHeaders headers = new HttpHeaders(); headers.set("Content-Type", "application/problem+json"); diff --git a/dbrepo-data-service/rest-service/src/main/resources/application-local.yml b/dbrepo-data-service/rest-service/src/main/resources/application-local.yml index 819f9d0f08..fda4447d0b 100644 --- a/dbrepo-data-service/rest-service/src/main/resources/application-local.yml +++ b/dbrepo-data-service/rest-service/src/main/resources/application-local.yml @@ -57,6 +57,7 @@ dbrepo: secretAccessKey: seaweedfsadmin importBucket: dbrepo-upload exportBucket: dbrepo-download + filePath: /tmp admin: username: admin password: admin @@ -67,3 +68,6 @@ dbrepo: password: fda client: dbrepo-client clientSecret: MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG + defaultDateFormatId: 1 + defaultTimeFormatId: 4 + defaultTimestampFormatId: 3 diff --git a/dbrepo-data-service/rest-service/src/main/resources/application.yml b/dbrepo-data-service/rest-service/src/main/resources/application.yml index 8bb8fe43f1..44daf91e46 100644 --- a/dbrepo-data-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-data-service/rest-service/src/main/resources/application.yml @@ -58,6 +58,7 @@ dbrepo: secretAccessKey: "${S3_SECRET_ACCESS_KEY:seaweedfsadmin}" importBucket: "${S3_IMPORT_BUCKET:dbrepo-upload}" exportBucket: "${S3_EXPORT_BUCKET:dbrepo-download}" + filePath: "${S3_FILE_PATH:/tmp}" admin: username: "${ADMIN_USERNAME:admin}" password: "${ADMIN_PASSWORD:admin}" @@ -80,4 +81,7 @@ dbrepo: queueName: "${BROKER_QUEUE_NAME:dbrepo}" exchangeName: "${BROKER_EXCHANGE_NAME:dbrepo}" routingKey: "${BROKER_ROUTING_KEY:#}" - connectionTimeout: ${CONNECTION_TIMEOUT:10000} \ No newline at end of file + connectionTimeout: ${CONNECTION_TIMEOUT:10000} + defaultDateFormatId: "${DEFAULT_DATE_FORMAT_ID:3}" + defaultTimeFormatId: "${DEFAULT_TIME_FORMAT_ID:4}" + defaultTimestampFormatId: "${DEFAULT_TIMESTAMP_FORMAT_ID:1}" diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java index 8792fc9fee..d212bb3064 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java @@ -504,7 +504,7 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest { } /* test */ - final ResponseEntity<List<QueryDto>> response = subsetEndpoint.findAllById(databaseId, null, principal); + final ResponseEntity<List<QueryDto>> response = subsetEndpoint.list(databaseId, null, principal); assertEquals(HttpStatus.OK, response.getStatusCode()); return response.getBody(); } diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java index 9041e7a3a6..fd93a3ae96 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java @@ -3,10 +3,7 @@ package at.tuwien.endpoint; import at.tuwien.ExportResourceDto; import at.tuwien.api.database.query.ImportCsvDto; import at.tuwien.api.database.query.QueryResultDto; -import at.tuwien.api.database.table.TableHistoryDto; -import at.tuwien.api.database.table.TupleDeleteDto; -import at.tuwien.api.database.table.TupleDto; -import at.tuwien.api.database.table.TupleUpdateDto; +import at.tuwien.api.database.table.*; import at.tuwien.endpoints.TableEndpoint; import at.tuwien.exception.*; import at.tuwien.gateway.MetadataServiceGateway; @@ -61,17 +58,17 @@ public class TableEndpointUnitTest extends AbstractUnitTest { @Test @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"admin"}) public void create_succeeds() throws DatabaseUnavailableException, TableMalformedException, - DatabaseNotFoundException, TableExistsException, RemoteUnavailableException, SQLException { + DatabaseNotFoundException, TableExistsException, RemoteUnavailableException, SQLException, + TableNotFoundException, QueryMalformedException { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) .thenReturn(DATABASE_1_PRIVILEGED_DTO); - doNothing() - .when(tableService) - .createTable(DATABASE_1_PRIVILEGED_DTO, TABLE_4_CREATE_INTERNAL_DTO); + when(tableService.createTable(DATABASE_1_PRIVILEGED_DTO, TABLE_4_CREATE_INTERNAL_DTO)) + .thenReturn(TABLE_4_DTO); /* test */ - final ResponseEntity<Void> response = tableEndpoint.create(DATABASE_1_ID, TABLE_4_CREATE_INTERNAL_DTO); + final ResponseEntity<TableDto> response = tableEndpoint.create(DATABASE_1_ID, TABLE_4_CREATE_INTERNAL_DTO); assertEquals(HttpStatus.CREATED, response.getStatusCode()); } @@ -434,9 +431,9 @@ public class TableEndpointUnitTest extends AbstractUnitTest { .thenReturn(DATABASE_3_USER_3_READ_ACCESS_DTO); /* test */ - assertThrows(NotAllowedException.class, () -> { - tableEndpoint.updateTuple(DATABASE_3_ID, TABLE_8_ID, request, USER_3_PRINCIPAL); - }); + assertThrows(NotAllowedException.class, () -> { + tableEndpoint.updateTuple(DATABASE_3_ID, TABLE_8_ID, request, USER_3_PRINCIPAL); + }); } @Test diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java index fa4549fda4..de98f501d0 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java @@ -1,5 +1,6 @@ package at.tuwien.endpoint; +import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.endpoints.ViewEndpoint; import at.tuwien.exception.*; @@ -16,6 +17,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -30,9 +32,6 @@ import static org.mockito.Mockito.*; @ExtendWith(SpringExtension.class) public class ViewEndpointUnitTest extends AbstractUnitTest { - @Autowired - private ViewEndpoint viewEndpoint; - @MockBean private ViewService viewService; @@ -42,6 +41,9 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { @MockBean private HttpServletRequest httpServletRequest; + @Autowired + private ViewEndpoint viewEndpoint; + @BeforeEach public void beforeEach() { genesis(); @@ -55,12 +57,11 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) .thenReturn(DATABASE_1_PRIVILEGED_DTO); - doNothing() - .when(viewService) - .create(DATABASE_1_PRIVILEGED_DTO, VIEW_1_CREATE_DTO); + when(viewService.create(DATABASE_1_PRIVILEGED_DTO, VIEW_1_CREATE_DTO)) + .thenReturn(VIEW_1_DTO); /* test */ - final ResponseEntity<Void> response = viewEndpoint.create(DATABASE_1_ID, VIEW_1_CREATE_DTO); + final ResponseEntity<ViewDto> response = viewEndpoint.create(DATABASE_1_ID, VIEW_1_CREATE_DTO); assertEquals(HttpStatus.CREATED, response.getStatusCode()); } @@ -72,9 +73,8 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { /* mock */ when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID)) .thenReturn(DATABASE_1_PRIVILEGED_DTO); - doNothing() - .when(viewService) - .create(DATABASE_1_PRIVILEGED_DTO, VIEW_1_CREATE_DTO); + when(viewService.create(DATABASE_1_PRIVILEGED_DTO, VIEW_1_CREATE_DTO)) + .thenReturn(VIEW_1_DTO); /* test */ assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { @@ -205,16 +205,6 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { assertNull(response.getBody()); } - @Test - @WithMockUser(username = USER_4_USERNAME) - public void getData_noRole_fails() { - - /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { - viewEndpoint.getData(DATABASE_1_ID, VIEW_1_ID, null, null, null, httpServletRequest, USER_4_PRINCIPAL); - }); - } - @Test @WithMockUser(username = USER_1_USERNAME, authorities = {"view-database-view-data"}) public void getData_viewNotFound_fails() throws RemoteUnavailableException, ViewNotFoundException { @@ -236,15 +226,15 @@ public class ViewEndpointUnitTest extends AbstractUnitTest { NotAllowedException { /* mock */ - when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_1_ID)) - .thenReturn(VIEW_1_PRIVILEGED_DTO); + when(metadataServiceGateway.getViewById(DATABASE_1_ID, VIEW_3_ID)) + .thenReturn(VIEW_3_PRIVILEGED_DTO); doThrow(NotAllowedException.class) .when(metadataServiceGateway) .getAccess(DATABASE_1_ID, USER_3_ID); /* test */ assertThrows(NotAllowedException.class, () -> { - viewEndpoint.getData(DATABASE_1_ID, VIEW_1_ID, null, null, null, httpServletRequest, USER_3_PRINCIPAL); + viewEndpoint.getData(DATABASE_1_ID, VIEW_3_ID, null, null, null, httpServletRequest, USER_3_PRINCIPAL); }); } diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/OpenApiEndpointMvcTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/OpenApiEndpointMvcTest.java index 5d478c6953..d1426cdf69 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/OpenApiEndpointMvcTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/OpenApiEndpointMvcTest.java @@ -3,6 +3,7 @@ package at.tuwien.mvc; import at.tuwien.api.error.ApiErrorDto; import at.tuwien.endpoints.*; import at.tuwien.test.AbstractUnitTest; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.responses.ApiResponse; import lombok.extern.log4j.Log4j2; @@ -69,9 +70,10 @@ public class OpenApiEndpointMvcTest extends AbstractUnitTest { private void generic_openApiDocs(Class<?> endpoint) { final List<Method> methods = Arrays.stream(endpoint.getMethods()) - .filter(m -> m.getDeclaringClass().equals(AccessEndpoint.class)) + .filter(m -> m.getDeclaringClass().equals(endpoint)) .toList(); methods.forEach(m -> { + assertNotNull(m.getDeclaredAnnotation(Operation.class).summary()); final List<Class<?>> exceptions = Arrays.stream(m.getExceptionTypes()) .toList(); final List<Class<?>> invalidExceptions = exceptions.stream() diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java index a3fc0ec14b..1b51d3072c 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java @@ -1,6 +1,5 @@ package at.tuwien.mvc; -import at.tuwien.api.database.DatabaseAccessDto; import at.tuwien.api.database.query.ExecuteStatementDto; import at.tuwien.api.database.query.ImportCsvDto; import at.tuwien.api.database.query.QueryPersistDto; @@ -11,7 +10,9 @@ import at.tuwien.config.MetricsConfig; import at.tuwien.endpoints.*; import at.tuwien.listener.DefaultListener; import at.tuwien.test.AbstractUnitTest; +import io.micrometer.observation.annotation.Observed; import io.micrometer.observation.tck.TestObservationRegistry; +import io.swagger.v3.oas.annotations.Operation; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.log4j.Log4j2; import org.apache.commons.io.FileUtils; @@ -26,7 +27,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; -import org.springframework.http.MediaType; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -34,15 +34,13 @@ import org.springframework.test.web.servlet.MockMvc; import java.io.File; import java.io.IOException; -import java.nio.charset.Charset; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.util.*; import static at.tuwien.utils.RabbitMqUtils.buildMessage; import static io.micrometer.observation.tck.TestObservationRegistryAssert.assertThat; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -68,10 +66,10 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { private HttpServletRequest httpServletRequest; @Autowired - private AccessEndpoint accessEndpoint; + private AccessEndpoint accessEndpoint; /* no metrics */ @Autowired - private DatabaseEndpoint databaseEndpoint; + private DatabaseEndpoint databaseEndpoint; /* no metrics */ @Autowired private SubsetEndpoint subsetEndpoint; @@ -82,7 +80,7 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { @Autowired private ViewEndpoint viewEndpoint; - private static final List<String> metrics = new LinkedList<>(); + private static final Map<String, String> metrics = new TreeMap<>(); /* sorted */ @TestConfiguration static class ObservationTestConfiguration { @@ -100,10 +98,7 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { @AfterAll public static void afterAll() throws IOException { - Collections.sort(metrics); - final StringBuilder content = new StringBuilder("# AUTOGENERATED FILE (DO NOT EDIT)\n") - .append(String.join("\n", metrics)); - FileUtils.writeStringToFile(new File("../metrics.txt"), content.toString(), Charset.defaultCharset()); + saveObservedMetrics(metrics); } @Test @@ -118,49 +113,17 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { @Test public void prometheusDefaultListener_succeeds() { - /* mock */ - defaultListener.onMessage(buildMessage("dbrepo.database", "{}", new HashMap<>())); - - /* test */ - metrics.add("dbrepo_message_receive"); - assertThat(registry) - .hasObservationWithNameEqualTo("dbrepo_message_receive"); - } - - @Test - @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"admin"}) - public void prometheusAccessEndpoint_succeeds() { - /* mock */ try { - accessEndpoint.create(DATABASE_1_ID, USER_1_ID, UPDATE_DATABASE_ACCESS_READ_DTO); - } catch (Exception e) { - /* ignore */ - } - try { - accessEndpoint.revoke(DATABASE_1_ID, USER_1_ID); - } catch (Exception e) { - /* ignore */ - } - try { - accessEndpoint.update(DATABASE_1_ID, USER_1_ID, UPDATE_DATABASE_ACCESS_READ_DTO); + defaultListener.onMessage(buildMessage("dbrepo.database", "{}", new HashMap<>())); } catch (Exception e) { /* ignore */ } /* test */ - for (String metric : List.of("dbrepo_database_access_create", "dbrepo_database_access_update", - "dbrepo_database_access_revoke")) { - metrics.add(metric); - assertThat(registry) - .hasObservationWithNameEqualTo(metric); - } - } - - @Test - @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"admin"}) - public void prometheusDatabaseEndpoint_succeeds() { - assertTrue(true); + assertThat(registry) + .hasObservationWithNameEqualTo("dbrepo_message_receive"); + generic_openApiDocs(DefaultListener.class); } @Test @@ -169,7 +132,7 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { /* mock */ try { - subsetEndpoint.findAllById(DATABASE_1_ID, null, USER_1_PRINCIPAL); + subsetEndpoint.list(DATABASE_1_ID, null, USER_1_PRINCIPAL); } catch (Exception e) { /* ignore */ } @@ -197,10 +160,10 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { /* test */ for (String metric : List.of("dbrepo_subset_list", "dbrepo_subset_create", "dbrepo_subset_data", "dbrepo_subset_persist", "dbrepo_subset_find")) { - metrics.add(metric); assertThat(registry) .hasObservationWithNameEqualTo(metric); } + generic_openApiDocs(SubsetEndpoint.class); } @Test @@ -253,10 +216,10 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { for (String metric : List.of("dbrepo_table_data_list", "dbrepo_table_data_create", "dbrepo_table_data_update", "dbrepo_table_data_delete", "dbrepo_table_data_history", "dbrepo_table_data_export", "dbrepo_table_data_import")) { - metrics.add(metric); assertThat(registry) .hasObservationWithNameEqualTo(metric); } + generic_openApiDocs(TableEndpoint.class); } @Test @@ -271,9 +234,23 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { } /* test */ - metrics.add("dbrepo_view_data"); assertThat(registry) .hasObservationWithNameEqualTo("dbrepo_view_data"); + generic_openApiDocs(ViewEndpoint.class); + } + + private static void generic_openApiDocs(Class<?> endpoint) { + final List<Method> methods = Arrays.stream(endpoint.getMethods()) + .filter(m -> m.getDeclaringClass().equals(endpoint)) + .toList(); + methods.forEach(m -> { + final Observed observed = m.getDeclaredAnnotation(Observed.class); + final Operation operation = m.getDeclaredAnnotation(Operation.class); + if (observed != null) { + assertNotNull(operation); + metrics.put(observed.name(), operation.summary()); + } + }); } } diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java new file mode 100644 index 0000000000..c9efad23f0 --- /dev/null +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java @@ -0,0 +1,143 @@ +package at.tuwien.service; + +import at.tuwien.api.database.ViewColumnDto; +import at.tuwien.api.database.ViewDto; +import at.tuwien.api.database.table.TableDto; +import at.tuwien.api.database.table.columns.ColumnDto; +import at.tuwien.api.database.table.columns.ColumnTypeDto; +import at.tuwien.api.database.table.constraints.ConstraintsDto; +import at.tuwien.api.database.table.constraints.primary.PrimaryKeyDto; +import at.tuwien.api.database.table.constraints.unique.UniqueDto; +import at.tuwien.config.MariaDbConfig; +import at.tuwien.config.MariaDbContainerConfig; +import at.tuwien.exception.*; +import at.tuwien.test.AbstractUnitTest; +import lombok.extern.log4j.Log4j2; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.testcontainers.containers.MariaDBContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +import java.sql.SQLException; +import java.util.List; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.*; + +@Log4j2 +@SpringBootTest +@ExtendWith(SpringExtension.class) +@Testcontainers +public class SchemaServiceIntegrationTest extends AbstractUnitTest { + + @Autowired + private SchemaService schemaService; + + @Container + private static MariaDBContainer<?> mariaDBContainer = MariaDbContainerConfig.getContainer(); + + @BeforeEach + public void beforeEach() throws SQLException { + genesis(); + /* metadata database */ + MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNALNAME); + MariaDbConfig.createInitDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_DTO); + } + + @Test + public void inspectTable_succeeds() throws TableNotFoundException, SQLException, QueryMalformedException { + + /* test */ + final TableDto response = schemaService.inspectTable(DATABASE_1_PRIVILEGED_DTO, "not_in_metadata_db"); + assertEquals("not_in_metadata_db", response.getInternalName()); + assertEquals("not_in_metadata_db", response.getName()); + assertEquals(DATABASE_1_ID, response.getTdbid()); + assertTrue(response.getIsVersioned()); + assertEquals(DATABASE_1_PUBLIC, response.getIsPublic()); + final List<ColumnDto> columns = response.getColumns(); + assertNotNull(columns); + assertEquals(5, columns.size()); + final ColumnDto column0 = columns.get(0); + assertEquals("id", column0.getName()); + assertEquals("id", column0.getInternalName()); + assertEquals(ColumnTypeDto.BIGINT, column0.getColumnType()); + assertFalse(column0.getIsNullAllowed()); + final ColumnDto column1 = columns.get(1); + assertEquals("given_name", column1.getName()); + assertEquals("given_name", column1.getInternalName()); + assertEquals(ColumnTypeDto.VARCHAR, column1.getColumnType()); + assertEquals(255, column1.getSize()); + assertFalse(column1.getIsNullAllowed()); + final ColumnDto column2 = columns.get(2); + assertEquals("middle_name", column2.getName()); + assertEquals("middle_name", column2.getInternalName()); + assertEquals(ColumnTypeDto.VARCHAR, column2.getColumnType()); + assertEquals(255, column2.getSize()); + assertTrue(column2.getIsNullAllowed()); + final ColumnDto column3 = columns.get(3); + assertEquals("family_name", column3.getName()); + assertEquals("family_name", column3.getInternalName()); + assertEquals(ColumnTypeDto.VARCHAR, column3.getColumnType()); + assertEquals(255, column3.getSize()); + assertFalse(column3.getIsNullAllowed()); + final ColumnDto column4 = columns.get(4); + assertEquals("age", column4.getName()); + assertEquals("age", column4.getInternalName()); + assertEquals(ColumnTypeDto.INT, column4.getColumnType()); + assertFalse(column4.getIsNullAllowed()); + final ConstraintsDto constraints = response.getConstraints(); + assertNotNull(constraints); + final Set<PrimaryKeyDto> primaryKey = constraints.getPrimaryKey(); + assertEquals(1, primaryKey.size()); + final Set<String> checks = constraints.getChecks(); + assertEquals(1, checks.size()); + assertEquals(Set.of("`age` > 0 and `age` < 120"), checks); + final List<UniqueDto> uniques = constraints.getUniques(); + assertEquals(1, uniques.size()); + assertEquals(2, uniques.get(0).getColumns().size()); + assertEquals("not_in_metadata_db", uniques.get(0).getTable().getInternalName()); + assertEquals("given_name", uniques.get(0).getColumns().get(0).getInternalName()); + assertEquals("family_name", uniques.get(0).getColumns().get(1).getInternalName()); + } + + @Test + public void inspectView_succeeds() throws ViewMalformedException, SQLException, ViewNotFoundException, + ViewSchemaException { + + /* test */ + final ViewDto response = schemaService.inspectView(DATABASE_1_PRIVILEGED_DTO, "not_in_metadata_db2"); + assertEquals("not_in_metadata_db2", response.getInternalName()); + assertEquals("not_in_metadata_db2", response.getName()); + assertEquals(DATABASE_1_ID, response.getVdbid()); + assertEquals(DATABASE_1_ID, response.getDatabase().getId()); + assertEquals(DATABASE_1_OWNER, response.getCreatedBy()); + assertEquals(DATABASE_1_OWNER, response.getCreator().getId()); + assertFalse(response.getIsInitialView()); + assertEquals(DATABASE_1_PUBLIC, response.getIsPublic()); + assertTrue(response.getQuery().length() >= 69); + assertNotNull(response.getQueryHash()); + assertEquals(4, response.getColumns().size()); + final ViewColumnDto column0 = response.getColumns().get(0); + assertNotNull(column0.getName()); + assertEquals("date", column0.getInternalName()); + assertEquals(DATABASE_1_ID, column0.getDatabaseId()); + final ViewColumnDto column1 = response.getColumns().get(1); + assertNotNull(column1.getName()); + assertEquals("location", column1.getInternalName()); + assertEquals(DATABASE_1_ID, column1.getDatabaseId()); + final ViewColumnDto column2 = response.getColumns().get(2); + assertNotNull(column2.getName()); + assertEquals("MinTemp", column2.getInternalName()); + assertEquals(DATABASE_1_ID, column2.getDatabaseId()); + final ViewColumnDto column3 = response.getColumns().get(3); + assertNotNull(column3.getName()); + assertEquals("Rainfall", column3.getInternalName()); + assertEquals(DATABASE_1_ID, column3.getDatabaseId()); + } + +} diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java index e688df1840..25144d827d 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java @@ -1,14 +1,21 @@ package at.tuwien.service; +import at.tuwien.api.database.table.TableDto; import at.tuwien.api.database.table.TupleDeleteDto; import at.tuwien.api.database.table.TupleDto; import at.tuwien.api.database.table.TupleUpdateDto; +import at.tuwien.api.database.table.columns.ColumnDto; +import at.tuwien.api.database.table.columns.ColumnTypeDto; +import at.tuwien.api.database.table.constraints.ConstraintsDto; +import at.tuwien.api.database.table.constraints.primary.PrimaryKeyDto; +import at.tuwien.api.database.table.constraints.unique.UniqueDto; import at.tuwien.config.MariaDbConfig; import at.tuwien.config.MariaDbContainerConfig; import at.tuwien.exception.*; import at.tuwien.gateway.MetadataServiceGateway; import at.tuwien.test.AbstractUnitTest; import lombok.extern.log4j.Log4j2; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -27,6 +34,7 @@ import java.util.Map; import java.util.Set; import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.when; @Log4j2 @@ -310,4 +318,62 @@ public class TableServiceIntegrationTest extends AbstractUnitTest { assertEquals(0, result.size()); } + @Test + public void getSchemas_succeeds() throws TableNotFoundException, SQLException, QueryMalformedException, + DatabaseMalformedException { + + /* test */ + final List<TableDto> response = tableService.getSchemas(DATABASE_1_PRIVILEGED_DTO); + final TableDto table0 = response.get(0); + Assertions.assertEquals("not_in_metadata_db", table0.getInternalName()); + Assertions.assertEquals("not_in_metadata_db", table0.getName()); + Assertions.assertEquals(DATABASE_1_ID, table0.getTdbid()); + assertTrue(table0.getIsVersioned()); + Assertions.assertEquals(DATABASE_1_PUBLIC, table0.getIsPublic()); + final List<ColumnDto> columns = table0.getColumns(); + assertNotNull(columns); + Assertions.assertEquals(5, columns.size()); + final ColumnDto column0 = columns.get(0); + Assertions.assertEquals("id", column0.getName()); + Assertions.assertEquals("id", column0.getInternalName()); + Assertions.assertEquals(ColumnTypeDto.BIGINT, column0.getColumnType()); + assertFalse(column0.getIsNullAllowed()); + final ColumnDto column1 = columns.get(1); + Assertions.assertEquals("given_name", column1.getName()); + Assertions.assertEquals("given_name", column1.getInternalName()); + Assertions.assertEquals(ColumnTypeDto.VARCHAR, column1.getColumnType()); + Assertions.assertEquals(255, column1.getSize()); + assertFalse(column1.getIsNullAllowed()); + final ColumnDto column2 = columns.get(2); + Assertions.assertEquals("middle_name", column2.getName()); + Assertions.assertEquals("middle_name", column2.getInternalName()); + Assertions.assertEquals(ColumnTypeDto.VARCHAR, column2.getColumnType()); + Assertions.assertEquals(255, column2.getSize()); + assertTrue(column2.getIsNullAllowed()); + final ColumnDto column3 = columns.get(3); + Assertions.assertEquals("family_name", column3.getName()); + Assertions.assertEquals("family_name", column3.getInternalName()); + Assertions.assertEquals(ColumnTypeDto.VARCHAR, column3.getColumnType()); + Assertions.assertEquals(255, column3.getSize()); + assertFalse(column3.getIsNullAllowed()); + final ColumnDto column4 = columns.get(4); + Assertions.assertEquals("age", column4.getName()); + Assertions.assertEquals("age", column4.getInternalName()); + Assertions.assertEquals(ColumnTypeDto.INT, column4.getColumnType()); + assertFalse(column4.getIsNullAllowed()); + final ConstraintsDto constraints = table0.getConstraints(); + assertNotNull(constraints); + final Set<PrimaryKeyDto> primaryKey = constraints.getPrimaryKey(); + Assertions.assertEquals(1, primaryKey.size()); + final Set<String> checks = constraints.getChecks(); + Assertions.assertEquals(1, checks.size()); + Assertions.assertEquals(Set.of("`age` > 0 and `age` < 120"), checks); + final List<UniqueDto> uniques = constraints.getUniques(); + Assertions.assertEquals(1, uniques.size()); + Assertions.assertEquals(2, uniques.get(0).getColumns().size()); + Assertions.assertEquals("not_in_metadata_db", uniques.get(0).getTable().getInternalName()); + Assertions.assertEquals("given_name", uniques.get(0).getColumns().get(0).getInternalName()); + Assertions.assertEquals("family_name", uniques.get(0).getColumns().get(1).getInternalName()); + } + } diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java index e30889840d..ba846f37cc 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java @@ -1,6 +1,9 @@ package at.tuwien.service; +import at.tuwien.api.database.ViewColumnDto; +import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.query.QueryResultDto; +import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.config.MariaDbConfig; import at.tuwien.config.MariaDbContainerConfig; import at.tuwien.exception.*; @@ -21,8 +24,8 @@ import java.time.Instant; import java.util.List; import java.util.Map; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertTrue; @Log4j2 @SpringBootTest @@ -68,24 +71,49 @@ public class ViewServiceIntegrationTest extends AbstractUnitTest { assertEquals(VIEW_2_ID, response.getId()); assertNotNull(response.getHeaders()); assertEquals(4, response.getHeaders().size()); - assertEquals(List.of(Map.of("date", 0), Map.of("location", 1), Map.of("rainfall", 2), Map.of("mintemp", 3)), response.getHeaders()); + assertEquals(List.of(Map.of("date", 0), Map.of("location", 1), Map.of("mintemp", 2), Map.of("location", 3)), response.getHeaders()); assertNotNull(response.getResult()); assertEquals(3, response.getResult().size()); /* row 0 */ assertEquals(Instant.ofEpochSecond(1228089600), response.getResult().get(0).get("date")); assertEquals("Albury", response.getResult().get(0).get("location")); assertEquals(13.4, response.getResult().get(0).get("mintemp")); - assertEquals(0.6, response.getResult().get(0).get("rainfall")); /* row 1 */ assertEquals(Instant.ofEpochSecond(1228176000), response.getResult().get(1).get("date")); assertEquals("Albury", response.getResult().get(1).get("location")); assertEquals(7.4, response.getResult().get(1).get("mintemp")); - assertEquals(0.0, response.getResult().get(1).get("rainfall")); /* row 2 */ assertEquals(Instant.ofEpochSecond(1228262400), response.getResult().get(2).get("date")); assertEquals("Albury", response.getResult().get(2).get("location")); assertEquals(12.9, response.getResult().get(2).get("mintemp")); - assertEquals(0.0, response.getResult().get(2).get("rainfall")); + } + + @Test + public void getSchemas_succeeds() throws ViewMalformedException, SQLException, ViewNotFoundException, + DatabaseMalformedException, ViewSchemaException { + + /* test */ + final List<ViewDto> response = viewService.getSchemas(DATABASE_1_PRIVILEGED_DTO); + final ViewDto view0 = response.get(0); + assertEquals("not_in_metadata_db2", view0.getName()); + assertEquals("not_in_metadata_db2", view0.getInternalName()); + assertEquals(DATABASE_1_ID, view0.getVdbid()); + assertEquals(DATABASE_1_ID, view0.getDatabase().getId()); + assertEquals(DATABASE_1_OWNER, view0.getCreatedBy()); + assertEquals(DATABASE_1_OWNER, view0.getCreator().getId()); + assertFalse(view0.getIsInitialView()); + assertEquals(DATABASE_1_PUBLIC, view0.getIsPublic()); + assertTrue(view0.getQuery().length() >= 69); + assertNotNull(view0.getQueryHash()); + assertEquals(4, view0.getColumns().size()); + final ViewColumnDto column0a = view0.getColumns().get(0); + assertEquals("date", column0a.getInternalName()); + final ViewColumnDto column1a = view0.getColumns().get(1); + assertEquals("location", column1a.getInternalName()); + final ViewColumnDto column2a = view0.getColumns().get(2); + assertEquals("MinTemp", column2a.getInternalName()); + final ViewColumnDto column3a = view0.getColumns().get(3); + assertEquals("Rainfall", column3a.getInternalName()); } } diff --git a/dbrepo-data-service/rest-service/src/test/resources/init/weather.sql b/dbrepo-data-service/rest-service/src/test/resources/init/weather.sql index 6c1b14187d..2eef31b475 100644 --- a/dbrepo-data-service/rest-service/src/test/resources/init/weather.sql +++ b/dbrepo-data-service/rest-service/src/test/resources/init/weather.sql @@ -55,11 +55,18 @@ select `date`, `location`, `mintemp`, `rainfall` from `weather_aus` where `location` = 'Albury'); -CREATE VIEW `hs_weather_aus` AS -SELECT * -FROM (SELECT `id`, ROW_START AS inserted_at, IF(ROW_END > NOW(), NULL, ROW_END) AS deleted_at, COUNT(*) as total - FROM `weather_aus` FOR SYSTEM_TIME ALL - GROUP BY inserted_at, deleted_at - ORDER BY deleted_at DESC - LIMIT 50) AS v -ORDER BY v.inserted_at, v.deleted_at ASC; +CREATE TABLE not_in_metadata_db +( + id BIGINT NOT NULL PRIMARY KEY, + given_name VARCHAR(255) NOT NULL, + middle_name VARCHAR(255) NULL, + family_name VARCHAR(255) NOT NULL, + age INT NOT NULL CHECK ( age > 0 AND age < 120 ), + UNIQUE (given_name, family_name) +) WITH SYSTEM VERSIONING; + +CREATE VIEW not_in_metadata_db2 AS +( +select `date`, `location`, `mintemp` as `MinTemp`, `rainfall` as `Rainfall` +from `weather_aus` +where `location` = 'Vienna'); \ No newline at end of file diff --git a/dbrepo-data-service/services/pom.xml b/dbrepo-data-service/services/pom.xml index 760173af8f..d5f6be25c8 100644 --- a/dbrepo-data-service/services/pom.xml +++ b/dbrepo-data-service/services/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.4.3</version> + <version>1.4.4</version> </parent> <artifactId>services</artifactId> <name>dbrepo-data-service-services</name> - <version>1.4.3</version> + <version>1.4.4</version> <dependencies> <dependency> @@ -22,7 +22,7 @@ <dependency> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service-querystore</artifactId> - <version>1.4.3</version> + <version>1.4.4</version> </dependency> </dependencies> diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/config/QueryConfig.java b/dbrepo-data-service/services/src/main/java/at/tuwien/config/QueryConfig.java index b636391170..55888bda1a 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/config/QueryConfig.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/config/QueryConfig.java @@ -13,4 +13,13 @@ public class QueryConfig { @Value("${dbrepo.sql.forbidden}") private String[] forbiddenKeywords; + @Value("${dbrepo.defaultDateFormatId}") + private Long defaultDateFormatId; + + @Value("${dbrepo.defaultTimeFormatId}") + private Long defaultTimeFormatId; + + @Value("${dbrepo.defaultTimestampFormatId}") + private Long defaultTimestampFormatId; + } diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/config/S3Config.java b/dbrepo-data-service/services/src/main/java/at/tuwien/config/S3Config.java index 763505b933..8adaf38d19 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/config/S3Config.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/config/S3Config.java @@ -33,6 +33,9 @@ public class S3Config { @Value("${dbrepo.s3.exportBucket}") private String s3ExportBucket; + @Value("${dbrepo.s3.filePath}") + private String s3FilePath; + @Bean public S3Client s3client() { final AwsCredentialsProvider credentialsProvider = StaticCredentialsProvider.create( diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/exception/DatabaseMalformedException.java b/dbrepo-data-service/services/src/main/java/at/tuwien/exception/DatabaseMalformedException.java index 5a0ff612f8..4bdc362256 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/exception/DatabaseMalformedException.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/exception/DatabaseMalformedException.java @@ -3,7 +3,7 @@ package at.tuwien.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; -@ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "error.database.invalid") +@ResponseStatus(code = HttpStatus.EXPECTATION_FAILED, reason = "error.database.invalid") public class DatabaseMalformedException extends Exception { public DatabaseMalformedException(String message) { diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/exception/QueryStoreCreateException.java b/dbrepo-data-service/services/src/main/java/at/tuwien/exception/QueryStoreCreateException.java index a7bcaf2a15..27ddb85e2c 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/exception/QueryStoreCreateException.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/exception/QueryStoreCreateException.java @@ -3,7 +3,7 @@ package at.tuwien.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; -@ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "error.store.invalid") +@ResponseStatus(code = HttpStatus.EXPECTATION_FAILED, reason = "error.store.invalid") public class QueryStoreCreateException extends Exception { public QueryStoreCreateException(String message) { diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/exception/QueryStoreInsertException.java b/dbrepo-data-service/services/src/main/java/at/tuwien/exception/QueryStoreInsertException.java index 4b10a9891c..564383c844 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/exception/QueryStoreInsertException.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/exception/QueryStoreInsertException.java @@ -3,7 +3,7 @@ package at.tuwien.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; -@ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "error.store.insert") +@ResponseStatus(code = HttpStatus.EXPECTATION_FAILED, reason = "error.store.insert") public class QueryStoreInsertException extends Exception { public QueryStoreInsertException(String message) { diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/exception/QueryStorePersistException.java b/dbrepo-data-service/services/src/main/java/at/tuwien/exception/QueryStorePersistException.java index 339bdc2f75..5b17442a3a 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/exception/QueryStorePersistException.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/exception/QueryStorePersistException.java @@ -3,7 +3,7 @@ package at.tuwien.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; -@ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "error.store.persist") +@ResponseStatus(code = HttpStatus.EXPECTATION_FAILED, reason = "error.store.persist") public class QueryStorePersistException extends Exception { public QueryStorePersistException(String message) { diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/exception/TableSchemaException.java b/dbrepo-data-service/services/src/main/java/at/tuwien/exception/TableSchemaException.java new file mode 100644 index 0000000000..539e39897e --- /dev/null +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/exception/TableSchemaException.java @@ -0,0 +1,21 @@ +package at.tuwien.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(code = HttpStatus.CONFLICT, reason = "error.schema.table") +public class TableSchemaException extends Exception { + + public TableSchemaException(String message) { + super(message); + } + + public TableSchemaException(String message, Throwable thr) { + super(message, thr); + } + + public TableSchemaException(Throwable thr) { + super(thr); + } + +} diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/exception/ViewSchemaException.java b/dbrepo-data-service/services/src/main/java/at/tuwien/exception/ViewSchemaException.java new file mode 100644 index 0000000000..4761b6e964 --- /dev/null +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/exception/ViewSchemaException.java @@ -0,0 +1,21 @@ +package at.tuwien.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(code = HttpStatus.CONFLICT, reason = "error.schema.view") +public class ViewSchemaException extends Exception { + + public ViewSchemaException(String message) { + super(message); + } + + public ViewSchemaException(String message, Throwable thr) { + super(message, thr); + } + + public ViewSchemaException(Throwable thr) { + super(thr); + } + +} diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/listener/DefaultListener.java b/dbrepo-data-service/services/src/main/java/at/tuwien/listener/DefaultListener.java index 47121c458e..c9e5bda270 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/listener/DefaultListener.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/listener/DefaultListener.java @@ -7,6 +7,7 @@ import at.tuwien.service.QueueService; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import io.micrometer.observation.annotation.Observed; +import io.swagger.v3.oas.annotations.Operation; import lombok.extern.log4j.Log4j2; import org.springframework.amqp.core.Message; import org.springframework.amqp.core.MessageListener; @@ -39,6 +40,7 @@ public class DefaultListener implements MessageListener { @Override @Observed(name = "dbrepo_message_receive") + @Operation(summary = "Received AMQP message from Broker Service") public void onMessage(Message message) { final MessageProperties properties = message.getMessageProperties(); final TypeReference<HashMap<String, Object>> typeRef = new TypeReference<>() { diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java index 2bac11bd4f..d1b033fe5b 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java @@ -2,6 +2,7 @@ package at.tuwien.mapper; import at.tuwien.api.container.image.ImageDateDto; import at.tuwien.api.database.DatabaseDto; +import at.tuwien.api.database.ViewColumnDto; import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.query.ImportCsvDto; import at.tuwien.api.database.query.QueryDto; @@ -11,11 +12,13 @@ import at.tuwien.api.database.table.columns.ColumnCreateDto; import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.database.table.columns.ColumnTypeDto; import at.tuwien.api.database.table.constraints.ConstraintsDto; +import at.tuwien.api.database.table.constraints.primary.PrimaryKeyDto; +import at.tuwien.api.database.table.constraints.unique.UniqueDto; import at.tuwien.api.database.table.internal.PrivilegedTableDto; -import at.tuwien.exception.QueryMalformedException; -import at.tuwien.exception.QueryNotFoundException; -import at.tuwien.exception.TableMalformedException; +import at.tuwien.config.QueryConfig; +import at.tuwien.exception.*; import com.github.dockerjava.zerodep.shaded.org.apache.commons.codec.binary.Hex; +import com.google.common.hash.Hashing; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.parser.CCJSqlParserManager; import net.sf.jsqlparser.schema.Column; @@ -26,6 +29,7 @@ import org.mapstruct.Named; import java.io.*; import java.math.BigInteger; +import java.nio.charset.StandardCharsets; import java.sql.*; import java.sql.Date; import java.text.Normalizer; @@ -37,7 +41,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; -@Mapper(componentModel = "spring") +@Mapper(componentModel = "spring", uses = {MetadataMapper.class}) public interface MariaDbMapper { org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(MariaDbMapper.class); @@ -102,6 +106,54 @@ public interface MariaDbMapper { .build(); } + default String databaseTablesSelectRawQuery() { + final String statement = "SELECT DISTINCT t.`TABLE_NAME` FROM information_schema.TABLES t WHERE t.`TABLE_SCHEMA` = ? AND t.`TABLE_TYPE` = 'SYSTEM VERSIONED' AND t.`TABLE_NAME` != 'qs_queries'"; + log.trace("mapped select tables statement: {}", statement); + return statement; + } + + default String databaseTableSelectRawQuery() { + final String statement = "SELECT t.`TABLE_NAME`, t.`TABLE_TYPE`, t.`TABLE_ROWS`, t.`AVG_ROW_LENGTH`, t.`DATA_LENGTH`, t.`MAX_DATA_LENGTH`, COALESCE(t.`CREATE_TIME`, NOW()) as `CREATE_TIME`, t.`UPDATE_TIME`, v.`VIEW_DEFINITION` FROM information_schema.TABLES t LEFT JOIN information_schema.VIEWS v ON t.`TABLE_NAME` = v.`TABLE_NAME` WHERE t.`TABLE_SCHEMA` = ? AND t.`TABLE_TYPE` = 'SYSTEM VERSIONED' AND t.`TABLE_NAME` != 'qs_queries' AND t.`TABLE_NAME` = ?"; + log.trace("mapped select table statement: {}", statement); + return statement; + } + + default String databaseViewSelectRawQuery() { + final String statement = "SELECT t.`TABLE_NAME`, t.`TABLE_TYPE`, t.`TABLE_ROWS`, t.`AVG_ROW_LENGTH`, t.`DATA_LENGTH`, t.`MAX_DATA_LENGTH`, COALESCE(t.`CREATE_TIME`, NOW()) as `CREATE_TIME`, t.`UPDATE_TIME`, v.`VIEW_DEFINITION` FROM information_schema.TABLES t LEFT JOIN information_schema.VIEWS v ON t.`TABLE_NAME` = v.`TABLE_NAME` WHERE t.`TABLE_SCHEMA` = ? AND t.`TABLE_TYPE` = 'VIEW' AND t.`TABLE_NAME` != 'qs_queries' AND t.`TABLE_NAME` = ?"; + log.trace("mapped select view statement: {}", statement); + return statement; + } + + default String columnsCheckConstraintSelectRawQuery() { + final String statement = "SELECT DISTINCT c.`CHECK_CLAUSE` FROM information_schema.COLUMNS k JOIN information_schema.CHECK_CONSTRAINTS c ON k.TABLE_NAME = c.TABLE_NAME WHERE k.TABLE_SCHEMA = ? AND k.TABLE_NAME = ?"; + log.trace("mapped select column constraint statement: {}", statement); + return statement; + } + + default String databaseTableColumnsSelectRawQuery() { + final String statement = "SELECT `ORDINAL_POSITION`, `COLUMN_DEFAULT`, `IS_NULLABLE`, `DATA_TYPE`, `CHARACTER_MAXIMUM_LENGTH`, `NUMERIC_PRECISION`, `NUMERIC_SCALE`, `COLUMN_TYPE`, `COLUMN_KEY`, `COLUMN_NAME`, `COLUMN_COMMENT` FROM `information_schema`.`COLUMNS` WHERE `TABLE_SCHEMA` = ? AND `TABLE_NAME` = ?;"; + log.trace("mapped select columns statement: {}", statement); + return statement; + } + + default String databaseTableConstraintsSelectRawQuery() { + final String statement = "SELECT k.`ORDINAL_POSITION`, c.`CONSTRAINT_TYPE`, k.`CONSTRAINT_NAME`, k.`COLUMN_NAME` FROM information_schema.TABLE_CONSTRAINTS c JOIN information_schema.KEY_COLUMN_USAGE k ON c.`TABLE_NAME` = k.`TABLE_NAME` AND c.`CONSTRAINT_NAME` = k.`CONSTRAINT_NAME`WHERE c.`CONSTRAINT_TYPE` = 'UNIQUE' AND LOWER(k.`COLUMN_NAME`) != 'row_end' AND c.`TABLE_SCHEMA` = ? AND c.`TABLE_NAME` = ? ORDER BY k.`ORDINAL_POSITION` ASC;"; + log.trace("mapped select table constraints statement: {}", statement); + return statement; + } + + default String viewCreateRawQuery(String viewName, String query) { + final String statement = "CREATE VIEW IF NOT EXISTS `" + viewName + "` AS (" + query + ")"; + log.trace("mapped create view statement: {}", statement); + return statement; + } + + default String databaseViewsSelectRawQuery() { + final String statement = "SELECT DISTINCT t.`TABLE_NAME` FROM information_schema.TABLES t WHERE t.`TABLE_SCHEMA` = ? AND t.`TABLE_TYPE` = 'VIEW'"; + log.trace("mapped select views statement: {}", statement); + return statement; + } + default String tableCreateDtoToCreateSequenceRawQuery(at.tuwien.api.database.table.internal.TableCreateDto data) { return "CREATE SEQUENCE IF NOT EXISTS `" + tableCreateDtoToSequenceName(data) + "` NOCACHE"; } @@ -174,7 +226,9 @@ public interface MariaDbMapper { /* null expressions */ .append(column.getNullAllowed() != null && column.getNullAllowed() ? " NULL" : " NOT NULL") /* default expressions */ - .append(data.getNeedSequence() && column.getName().equals("id") ? " DEFAULT NEXTVAL(`" + tableCreateDtoToSequenceName(data) + "`)" : ""); + .append(data.getNeedSequence() && column.getName().equals("id") ? " DEFAULT NEXTVAL(`" + tableCreateDtoToSequenceName(data) + "`)" : "") + /* comments */ + .append(!column.getDescription().isEmpty() ? (" COMMENT \"" + column.getDescription() + "\"") : ""); } /* create primary key index */ stringBuilder.append(", PRIMARY KEY (") @@ -228,6 +282,12 @@ public interface MariaDbMapper { .append(ck) .append(")")); } + if (!data.getDescription().isBlank()) { + /* create table comments */ + stringBuilder.append(" COMMENT \"") + .append(data.getDescription()) + .append("\""); + } } stringBuilder.append(") WITH SYSTEM VERSIONING;"); log.trace("mapped create table query: {}", stringBuilder); @@ -369,7 +429,7 @@ public interface MariaDbMapper { } default String tableOrViewToRawExportQuery(String databaseName, String tableOrView, List<ColumnDto> columns, - Instant timestamp, String filename) { + Instant timestamp, String filePath) { final StringBuilder statement = new StringBuilder("SELECT "); int[] idx = new int[]{0}; columns.forEach(column -> { @@ -399,30 +459,60 @@ public interface MariaDbMapper { .append(mariaDbFormatter.format(timestamp)) .append("'"); } - statement.append(" INTO OUTFILE '/tmp/") - .append(filename) + statement.append(" INTO OUTFILE '") + .append(filePath) .append("' CHARACTER SET utf8 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"';"); statement.append(";"); log.debug("mapped table/view export query: {}", statement); return statement.toString(); } - default String subsetToRawExportQuery(String query, Instant timestamp, String filename) { + default String subsetToRawExportQuery(String query, Instant timestamp, String filePath) { final StringBuilder statement = new StringBuilder(query.replaceAll(";", "")) .append(" FOR SYSTEM_TIME AS OF TIMESTAMP'") .append(mariaDbFormatter.format(timestamp)) .append("'") - .append(" INTO OUTFILE '/tmp/") - .append(filename) + .append(" INTO OUTFILE '") + .append(filePath) .append("' CHARACTER SET utf8 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"';"); log.debug("mapped export query: {}", statement); return statement.toString(); } - default TableDto resultSetToTable(DatabaseDto database, ResultSet resultSet) throws SQLException, - QueryMalformedException { + /** + * Map the inspected schema to either an existing view/table and append e.g. column or (if not existing) create a new view/table. + * @param database The database. + * @param resultSet The inspected schema. + * @return The database containing the updated view/table. + * @throws SQLException + */ + default ViewDto schemaResultSetToView(DatabaseDto database, ResultSet resultSet) throws SQLException { + return ViewDto.builder() + .name(resultSet.getString(1)) + .internalName(resultSet.getString(1)) + .vdbid(database.getId()) + .database(database) + .isInitialView(false) + .isPublic(database.getIsPublic()) + .query(resultSet.getString(9)) + .queryHash(Hashing.sha256() + .hashString(resultSet.getString(9), StandardCharsets.UTF_8) + .toString()) + .columns(new LinkedList<>()) + .identifiers(new LinkedList<>()) + .creator(database.getOwner()) + .createdBy(database.getOwner().getId()) + .build(); + } + + ViewColumnDto columnDtoToViewColumnDto(ColumnDto data); + + ColumnDto viewColumnDtoToColumnDto(ViewColumnDto data); + + default TableDto schemaResultSetToTable(DatabaseDto database, ResultSet resultSet) throws SQLException, + TableNotFoundException { if (!resultSet.next()) { - throw new QueryMalformedException("Failed to map table"); + throw new TableNotFoundException("Failed to find table in the information schema"); } final TableDto table = TableDto.builder() .name(resultSet.getString(1)) @@ -434,7 +524,9 @@ public interface MariaDbMapper { .maxDataLength(resultSet.getLong(6)) .tdbid(database.getId()) .queueName("dbrepo") - .routingKey("dbrepo." + database.getInternalName() + "." + resultSet.getString(1)) + .routingKey("dbrepo") + .columns(new LinkedList<>()) + .identifiers(new LinkedList<>()) .creator(database.getOwner()) .createdBy(database.getOwner().getId()) .owner(database.getOwner()) @@ -444,6 +536,7 @@ public interface MariaDbMapper { .uniques(new LinkedList<>()) .checks(new LinkedHashSet<>()) .build()) + .isPublic(database.getIsPublic()) .build(); if (resultSet.getString(7) != null && !resultSet.getString(7).isEmpty()) { table.setCreated(Timestamp.valueOf(resultSet.getString(7)) @@ -452,44 +545,123 @@ public interface MariaDbMapper { return table; } - default TableDto resultSetToTable(ResultSet resultSet, TableDto table, ImageDateDto defaultDateFormat, - ImageDateDto defaultTimestampFormat) throws SQLException { - /* columns */ - final List<ColumnDto> columns = new LinkedList<>(); - while (resultSet.next()) { - /* constraints */ - if (resultSet.getString(9) != null && resultSet.getString(9).equals("PRI")) { - table.getConstraints().getPrimaryKey().add(resultSet.getString(10)); - } - final ColumnDto column = ColumnDto.builder() - .ordinalPosition(resultSet.getInt(1) - 1) /* start at zero */ - .autoGenerated(resultSet.getString(2) != null && resultSet.getString(2).startsWith("nextval")) - .isNullAllowed(resultSet.getString(3).equals("YES")) - .columnType(ColumnTypeDto.valueOf(resultSet.getString(4).toUpperCase())) - .d(resultSet.getString(7) != null ? resultSet.getLong(7) : null) - .name(resultSet.getString(10)) - .internalName(resultSet.getString(10)) - .build(); - /* fix boolean and set size for others */ - if (resultSet.getString(8).equalsIgnoreCase("tinyint(1)")) { - column.setColumnType(ColumnTypeDto.BOOL); - } else if (resultSet.getString(5) != null) { - column.setSize(resultSet.getLong(5)); - } else if (resultSet.getString(6) != null) { - column.setSize(resultSet.getLong(6)); - } - if (column.getColumnType().equals(ColumnTypeDto.TIMESTAMP) || column.getColumnType().equals(ColumnTypeDto.DATETIME)) { - column.setDateFormat(defaultTimestampFormat); - } else if (column.getColumnType().equals(ColumnTypeDto.DATE)) { - column.setDateFormat(defaultDateFormat); + default TableDto resultSetToConstraint(ResultSet resultSet, TableDto table) throws SQLException { + final String type = resultSet.getString(2); + final String name = resultSet.getString(3); + final String columnName = resultSet.getString(4); + final Optional<ColumnDto> optional = table.getColumns().stream() + .filter(c -> c.getInternalName().equals(columnName)) + .findFirst(); + if (optional.isEmpty()) { + log.error("Failed to find table column: {}", columnName); + throw new IllegalArgumentException("Failed to find table column"); + } + final ColumnDto column = optional.get(); + if (type.equals("UNIQUE")) { + final Optional<UniqueDto> optional2 = table.getConstraints().getUniques().stream().filter(u -> u.getName().equals(name)).findFirst(); + if (optional2.isPresent()) { + optional2.get() + .getColumns() + .add(column); + return table; } - log.trace("mapped result set to column {}", column); - columns.add(column); + table.getConstraints() + .getUniques() + .add(UniqueDto.builder() + .name(name) + .columns(new LinkedList<>(List.of(column))) + .build()); + return table; + } + return table; + } + + TableBriefDto tableDtoToTableBriefDto(TableDto data); + + default TableDto resultSetToTable(ResultSet resultSet, TableDto table, QueryConfig queryConfig) throws SQLException { + final ColumnDto column = ColumnDto.builder() + .ordinalPosition(resultSet.getInt(1) - 1) /* start at zero */ + .autoGenerated(resultSet.getString(2) != null && resultSet.getString(2).startsWith("nextval")) + .isNullAllowed(resultSet.getString(3).equals("YES")) + .columnType(ColumnTypeDto.valueOf(resultSet.getString(4).toUpperCase())) + .d(resultSet.getString(7) != null ? resultSet.getLong(7) : null) + .name(resultSet.getString(10)) + .internalName(resultSet.getString(10)) + .table(table) + .tableId(table.getId()) + .databaseId(table.getTdbid()) + .description(resultSet.getString(11)) + .build(); + /* constraints */ + if (resultSet.getString(9) != null && resultSet.getString(9).equals("PRI")) { + table.getConstraints().getPrimaryKey().add(PrimaryKeyDto.builder() + .table(tableDtoToTableBriefDto(table)) + .column(column) + .build()); + } + /* fix boolean and set size for others */ + if (resultSet.getString(8).equalsIgnoreCase("tinyint(1)")) { + column.setColumnType(ColumnTypeDto.BOOL); + } else if (resultSet.getString(5) != null) { + column.setSize(resultSet.getLong(5)); + } else if (resultSet.getString(6) != null) { + column.setSize(resultSet.getLong(6)); + } + if (column.getColumnType().equals(ColumnTypeDto.TIMESTAMP) || column.getColumnType().equals(ColumnTypeDto.DATETIME)) { + column.setDateFormat(ImageDateDto.builder() + .id(queryConfig.getDefaultTimestampFormatId()) + .build()); + } else if (column.getColumnType().equals(ColumnTypeDto.DATE)) { + column.setDateFormat(ImageDateDto.builder() + .id(queryConfig.getDefaultDateFormatId()) + .build()); + } else if (column.getColumnType().equals(ColumnTypeDto.TIME)) { + column.setDateFormat(ImageDateDto.builder() + .id(queryConfig.getDefaultTimeFormatId()) + .build()); } - table.setColumns(columns); + table.getColumns() + .add(column); return table; } + default ViewDto resultSetToTable(ResultSet resultSet, ViewDto view, QueryConfig queryConfig) throws SQLException { + final ViewColumnDto column = ViewColumnDto.builder() + .ordinalPosition(resultSet.getInt(1) - 1) /* start at zero */ + .autoGenerated(resultSet.getString(2) != null && resultSet.getString(2).startsWith("nextval")) + .isNullAllowed(resultSet.getString(3).equals("YES")) + .columnType(ColumnTypeDto.valueOf(resultSet.getString(4).toUpperCase())) + .d(resultSet.getString(7) != null ? resultSet.getLong(7) : null) + .name(resultSet.getString(10)) + .internalName(resultSet.getString(10)) + .databaseId(view.getDatabase().getId()) + .build(); + /* fix boolean and set size for others */ + if (resultSet.getString(8).equalsIgnoreCase("tinyint(1)")) { + column.setColumnType(ColumnTypeDto.BOOL); + } else if (resultSet.getString(5) != null) { + column.setSize(resultSet.getLong(5)); + } else if (resultSet.getString(6) != null) { + column.setSize(resultSet.getLong(6)); + } + if (column.getColumnType().equals(ColumnTypeDto.TIMESTAMP) || column.getColumnType().equals(ColumnTypeDto.DATETIME)) { + column.setDateFormat(ImageDateDto.builder() + .id(queryConfig.getDefaultTimestampFormatId()) + .build()); + } else if (column.getColumnType().equals(ColumnTypeDto.DATE)) { + column.setDateFormat(ImageDateDto.builder() + .id(queryConfig.getDefaultDateFormatId()) + .build()); + } else if (column.getColumnType().equals(ColumnTypeDto.TIME)) { + column.setDateFormat(ImageDateDto.builder() + .id(queryConfig.getDefaultTimeFormatId()) + .build()); + } + view.getColumns() + .add(column); + return view; + } + default List<TableHistoryDto> resultSetToTableHistory(ResultSet resultSet) throws SQLException { /* columns */ final List<TableHistoryDto> history = new LinkedList<>(); @@ -507,7 +679,7 @@ public interface MariaDbMapper { } default String datasetToRawInsertQuery(String databaseName, PrivilegedTableDto table, ImportCsvDto data) { - final StringBuilder statement = new StringBuilder("LOAD DATA INFILE '/tmp/") + final StringBuilder statement = new StringBuilder("LOAD DATA INFILE '") .append(data.getLocation()) .append("' REPLACE INTO TABLE `") .append(databaseName) @@ -672,7 +844,7 @@ public interface MariaDbMapper { default void columnToDateSet(ImportCsvDto data, ColumnDto column, StringBuilder set) { log.trace("mapping column to date set"); - set.append(set.length() != 0 ? ", " : "") + set.append(!set.isEmpty() ? ", " : "") .append("`") .append(column.getInternalName()) .append("` = STR_TO_DATE("); @@ -702,7 +874,7 @@ public interface MariaDbMapper { default void columnToBoolSet(ImportCsvDto data, ColumnDto column, StringBuilder set) { log.trace("mapping column to bool set, data={}, column={}, set=(generated)", data, column); - set.append(set.length() != 0 ? ", " : "") + set.append(!set.isEmpty() ? ", " : "") .append("`") .append(column.getInternalName()) .append("` = "); @@ -1021,22 +1193,28 @@ public interface MariaDbMapper { throw new IllegalArgumentException("Column type not known"); } + /** + * Parse columns from a SQL statement of a known database. + * @param database The database. + * @param query The SQL statement. + * @return The list of columns. + * @throws JSQLParserException The table/view or column was not found in the database. + */ default List<ColumnDto> parseColumns(DatabaseDto database, String query) throws JSQLParserException { final List<ColumnDto> columns = new ArrayList<>(); final CCJSqlParserManager parserRealSql = new CCJSqlParserManager(); final net.sf.jsqlparser.statement.Statement statement = parserRealSql.parse(new StringReader(query)); - log.debug("parse columns from query: {}", query); + log.trace("parse columns from query: {}", query); /* bi-directional mapping */ database.getTables() .forEach(table -> table.getColumns() .forEach(column -> column.setTable(table))); /* check */ - if (!(statement instanceof Select)) { + if (!(statement instanceof Select selectStatement)) { log.error("Query attempts to update the dataset, not a SELECT statement"); throw new JSQLParserException("Query attempts to update the dataset"); } /* start parsing */ - final Select selectStatement = (Select) statement; final PlainSelect ps = (PlainSelect) selectStatement.getSelectBody(); final List<SelectItem> clauses = ps.getSelectItems(); log.trace("columns referenced in the from-clause: {}", clauses); @@ -1053,7 +1231,8 @@ public interface MariaDbMapper { final List<ColumnDto> allColumns = Stream.of(database.getViews() .stream() .map(ViewDto::getColumns) - .flatMap(List::stream), + .flatMap(List::stream) + .map(this::viewColumnDtoToColumnDto), database.getTables() .stream() .map(TableDto::getColumns) @@ -1061,8 +1240,6 @@ public interface MariaDbMapper { .flatMap(i -> i) .toList(); log.trace("columns referenced in the from-clause and join-clause(s): {}", clauses); - /* Checking if all tables or views exist */ - log.trace("table/view/join referenced in the statement: {}", fromItems.stream().map(this::fromItemToFromItems).flatMap(List::stream).collect(Collectors.toList())); /* Checking if all columns exist */ for (SelectItem clause : clauses) { final SelectExpressionItem item = (SelectExpressionItem) clause; @@ -1099,6 +1276,9 @@ public interface MariaDbMapper { if (item.getAlias() != null) { resultColumn.setAlias(item.getAlias().getName().replace("`", "")); } + resultColumn.setDatabaseId(database.getId()); + resultColumn.setTable(resultColumn.getTable()); + resultColumn.setTableId(resultColumn.getTable().getId()); log.trace("found column with internal name {} and alias {}", resultColumn.getInternalName(), resultColumn.getAlias()); columns.add(resultColumn); } @@ -1142,11 +1322,11 @@ public interface MariaDbMapper { return found; } - default List<FromItem> fromItemToFromItems(FromItem data) { + default List<FromItem> fromItemToFromItems(FromItem data) throws JSQLParserException { return fromItemToFromItems(data, 0); } - default List<FromItem> fromItemToFromItems(FromItem data, Integer level) { + default List<FromItem> fromItemToFromItems(FromItem data, Integer level) throws JSQLParserException { final List<FromItem> fromItems = new LinkedList<>(); if (data instanceof net.sf.jsqlparser.schema.Table table) { fromItems.add(data); @@ -1156,9 +1336,19 @@ public interface MariaDbMapper { if (data instanceof SubJoin subJoin) { log.trace("from-item is of type sub-join: level ~> {}", level); for (Join join : subJoin.getJoinList()) { - fromItems.addAll(fromItemToFromItems(join.getRightItem(), level + 1)); + final List<FromItem> tmp = fromItemToFromItems(join.getRightItem(), level + 1); + if (tmp == null) { + log.error("Failed to find right sub-join table: {}", join.getRightItem()); + throw new JSQLParserException("Failed to find right sub-join table"); + } + fromItems.addAll(tmp); + } + final List<FromItem> tmp = fromItemToFromItems(subJoin.getLeft(), level + 1); + if (tmp == null) { + log.error("Failed to find left sub-join table: {}", subJoin.getLeft()); + throw new JSQLParserException("Failed to find left sub-join table"); } - fromItems.addAll(fromItemToFromItems(((SubJoin) data).getLeft(), level + 1)); + fromItems.addAll(tmp); return fromItems; } log.warn("unknown from-item {}", data); diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java index c4de9ec6df..67633ba175 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java @@ -4,10 +4,13 @@ import at.tuwien.api.container.ContainerDto; import at.tuwien.api.container.image.ImageDto; import at.tuwien.api.container.internal.PrivilegedContainerDto; import at.tuwien.api.database.DatabaseDto; +import at.tuwien.api.database.ViewColumnDto; import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.internal.PrivilegedViewDto; +import at.tuwien.api.database.table.TableBriefDto; import at.tuwien.api.database.table.TableDto; +import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.database.table.internal.PrivilegedTableDto; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -24,6 +27,13 @@ public interface MetadataMapper { TableDto privilegedTableDtoToTableDto(PrivilegedTableDto data); + ColumnDto viewColumnDtoToColumnDto(ViewColumnDto data); + + ViewColumnDto columnDtoToViewColumnDto(ColumnDto data); + + /* keep */ + TableBriefDto tableDtoToTableBriefDto(TableDto data); + @Mappings({ @Mapping(target = "database", expression = "java(PrivilegedDatabaseDto.builder().container(PrivilegedContainerDto.builder().image(new ImageDto()).build()).build())") }) diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/DatabaseService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/DatabaseService.java index 92c46b64ce..6c99910e67 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/DatabaseService.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/DatabaseService.java @@ -1,10 +1,11 @@ package at.tuwien.service; import at.tuwien.api.container.internal.PrivilegedContainerDto; +import at.tuwien.api.database.DatabaseDto; import at.tuwien.api.database.internal.CreateDatabaseDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.user.internal.UpdateUserPasswordDto; -import at.tuwien.exception.DatabaseMalformedException; +import at.tuwien.exception.*; import java.sql.SQLException; diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/SchemaService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/SchemaService.java index eb5428b261..2319d16b39 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/SchemaService.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/SchemaService.java @@ -1,13 +1,16 @@ package at.tuwien.service; +import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.table.TableDto; -import at.tuwien.exception.QueryMalformedException; +import at.tuwien.exception.*; import java.sql.SQLException; public interface SchemaService { - TableDto obtainTableMetadata(PrivilegedDatabaseDto database, String tableName) throws SQLException, - QueryMalformedException; + TableDto inspectTable(PrivilegedDatabaseDto database, String tableName) throws SQLException, + QueryMalformedException, TableNotFoundException; + + ViewDto inspectView(PrivilegedDatabaseDto database, String viewName) throws SQLException, ViewMalformedException, ViewNotFoundException, ViewSchemaException; } diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java index 66bdd3fb1d..b8d2f39390 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java @@ -14,8 +14,13 @@ import java.time.Instant; import java.util.List; public interface TableService { - void createTable(PrivilegedDatabaseDto database, TableCreateDto data) throws SQLException, - TableMalformedException, TableExistsException; + + List<TableDto> getSchemas(PrivilegedDatabaseDto database) throws SQLException, TableNotFoundException, QueryMalformedException, DatabaseMalformedException; + + TableDto find(PrivilegedDatabaseDto database, String tableName) throws TableNotFoundException, SQLException, QueryMalformedException; + + TableDto createTable(PrivilegedDatabaseDto database, TableCreateDto data) throws SQLException, + TableMalformedException, TableExistsException, TableNotFoundException, QueryMalformedException; void delete(PrivilegedTableDto table) throws SQLException, QueryMalformedException; diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/ViewService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/ViewService.java index e8ac39f901..4dcd96ed53 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/ViewService.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/ViewService.java @@ -10,9 +10,23 @@ import at.tuwien.exception.*; import java.sql.SQLException; import java.time.Instant; +import java.util.List; public interface ViewService { + /** + * + * @param database + * @return The list of view metadata. + * @throws SQLException + * @throws DatabaseMalformedException + * @throws ViewMalformedException + * @throws ViewNotFoundException + * @throws ViewSchemaException + */ + List<ViewDto> getSchemas(PrivilegedDatabaseDto database) throws SQLException, DatabaseMalformedException, + ViewMalformedException, ViewNotFoundException, ViewSchemaException; + /** * Creates a view in the given data database. * @@ -21,7 +35,7 @@ public interface ViewService { * @throws SQLException The connection to the data database was unsuccessful. * @throws ViewMalformedException The query is malformed and was rejected by the data database. */ - void create(PrivilegedDatabaseDto database, ViewCreateDto data) throws SQLException, + ViewDto create(PrivilegedDatabaseDto database, ViewCreateDto data) throws SQLException, ViewMalformedException; /** diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java index 632015d025..7bd233371e 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java @@ -1,19 +1,27 @@ package at.tuwien.service.impl; import at.tuwien.api.container.internal.PrivilegedContainerDto; +import at.tuwien.api.database.DatabaseDto; +import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.internal.CreateDatabaseDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; +import at.tuwien.api.database.table.TableDto; import at.tuwien.api.user.UserDto; import at.tuwien.api.user.internal.UpdateUserPasswordDto; import at.tuwien.config.RabbitConfig; -import at.tuwien.exception.DatabaseMalformedException; +import at.tuwien.exception.*; +import at.tuwien.mapper.MariaDbMapper; +import at.tuwien.mapper.MetadataMapper; import at.tuwien.service.DatabaseService; +import at.tuwien.service.SchemaService; import com.mchange.v2.c3p0.ComboPooledDataSource; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.sql.SQLException; @Log4j2 diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/HibernateConnector.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/HibernateConnector.java index 83222dfe44..6a583b274a 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/HibernateConnector.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/HibernateConnector.java @@ -42,7 +42,6 @@ public abstract class HibernateConnector { .append("?currentSchema=") .append(databaseName); } - log.debug("connecting via jdbc, url={}", stringBuilder); return stringBuilder.toString(); } diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/QueueServiceRabbitMqImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/QueueServiceRabbitMqImpl.java index fe733a22aa..fd7966e0be 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/QueueServiceRabbitMqImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/QueueServiceRabbitMqImpl.java @@ -9,7 +9,6 @@ import com.mchange.v2.c3p0.ComboPooledDataSource; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.sql.Connection; import java.sql.PreparedStatement; @@ -31,7 +30,6 @@ public class QueueServiceRabbitMqImpl extends HibernateConnector implements Queu } @Override - @Transactional(readOnly = true) public void insert(PrivilegedTableDto table, Map<String, Object> data) throws SQLException { final ComboPooledDataSource dataSource = getPrivilegedDataSource(table.getDatabase()); final Connection connection = dataSource.getConnection(); diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java index 9cd87fafc8..c2c53c7830 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java @@ -1,8 +1,17 @@ package at.tuwien.service.impl; +import at.tuwien.api.database.DatabaseDto; +import at.tuwien.api.database.ViewColumnDto; +import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.table.TableDto; -import at.tuwien.exception.QueryMalformedException; +import at.tuwien.api.database.table.columns.ColumnDto; +import at.tuwien.api.database.table.constraints.unique.UniqueDto; +import at.tuwien.config.QueryConfig; +import at.tuwien.exception.TableNotFoundException; +import at.tuwien.exception.ViewMalformedException; +import at.tuwien.exception.ViewNotFoundException; +import at.tuwien.exception.ViewSchemaException; import at.tuwien.mapper.MariaDbMapper; import at.tuwien.mapper.MetadataMapper; import at.tuwien.service.SchemaService; @@ -13,45 +22,144 @@ import org.springframework.stereotype.Service; import java.sql.Connection; import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; @Log4j2 @Service public class SchemaServiceMariaDbImpl extends HibernateConnector implements SchemaService { + private final QueryConfig queryConfig; private final MariaDbMapper mariaDbMapper; private final MetadataMapper metadataMapper; @Autowired - public SchemaServiceMariaDbImpl(MariaDbMapper mariaDbMapper, MetadataMapper metadataMapper) { + public SchemaServiceMariaDbImpl(QueryConfig queryConfig, MariaDbMapper mariaDbMapper, + MetadataMapper metadataMapper) { + this.queryConfig = queryConfig; this.mariaDbMapper = mariaDbMapper; this.metadataMapper = metadataMapper; } @Override - public TableDto obtainTableMetadata(PrivilegedDatabaseDto database, String tableName) throws SQLException, - QueryMalformedException { + public TableDto inspectTable(PrivilegedDatabaseDto database, String tableName) throws SQLException, + TableNotFoundException { + log.trace("inspecting table: {}.{}", database.getInternalName(), tableName); final ComboPooledDataSource dataSource = getPrivilegedDataSource(database); final Connection connection = dataSource.getConnection(); - TableDto table; try { - /* obtain basic table metadata */ - connection.commit(); - final PreparedStatement basicMetadataStatement = connection.prepareStatement("SELECT t.`TABLE_NAME`, t.`TABLE_TYPE`, t.`TABLE_ROWS`, t.`AVG_ROW_LENGTH`, t.`DATA_LENGTH`, t.`MAX_DATA_LENGTH`, COALESCE(t.`CREATE_TIME`, NOW()) as `CREATE_TIME`, t.`UPDATE_TIME`, v.`VIEW_DEFINITION` FROM information_schema.TABLES t LEFT JOIN information_schema.VIEWS v ON t.`TABLE_NAME` = v.`TABLE_NAME` WHERE t.`TABLE_SCHEMA` = ? AND t.`TABLE_TYPE` IN ('BASE TABLE', 'SYSTEM VERSIONED', 'VIEW') AND t.`TABLE_NAME` = ?"); - basicMetadataStatement.setString(1, database.getInternalName()); - basicMetadataStatement.setString(2, tableName); - final TableDto tmp = mariaDbMapper.resultSetToTable(metadataMapper.privilegedDatabaseDtoToDatabaseDto(database), basicMetadataStatement.getResultSet()); - /* obtain table constraints metadata */ - final PreparedStatement constraintMetadataStatement = connection.prepareStatement("SELECT `ORDINAL_POSITION`, `COLUMN_DEFAULT`, `IS_NULLABLE`, `DATA_TYPE`, `CHARACTER_MAXIMUM_LENGTH`, `NUMERIC_PRECISION`, `NUMERIC_SCALE`, `COLUMN_TYPE`, `COLUMN_KEY`, `COLUMN_NAME` FROM `information_schema`.`COLUMNS` WHERE `TABLE_SCHEMA` = ? AND `TABLE_NAME` = ?;"); - constraintMetadataStatement.setString(1, database.getInternalName()); - constraintMetadataStatement.setString(2, tableName); - table = mariaDbMapper.resultSetToTable(constraintMetadataStatement.getResultSet(), tmp, - database.getContainer().getDefaultDateFormat(), database.getContainer().getDefaultTimestampFormat()); + /* obtain only table metadata */ + final PreparedStatement statement1 = connection.prepareStatement(mariaDbMapper.databaseTableSelectRawQuery()); + statement1.setString(1, database.getInternalName()); + statement1.setString(2, tableName); + log.trace("1={}, 2={}", database.getInternalName(), tableName); + TableDto table = mariaDbMapper.schemaResultSetToTable(metadataMapper.privilegedDatabaseDtoToDatabaseDto(database), statement1.executeQuery()); + /* obtain columns metadata */ + final PreparedStatement statement2 = connection.prepareStatement(mariaDbMapper.databaseTableColumnsSelectRawQuery()); + statement2.setString(1, database.getInternalName()); + statement2.setString(2, tableName); + log.trace("1={}, 2={}", database.getInternalName(), tableName); + final ResultSet resultSet2 = statement2.executeQuery(); + while (resultSet2.next()) { + table = mariaDbMapper.resultSetToTable(resultSet2, table, queryConfig); + } + /* obtain check constraints metadata */ + final PreparedStatement statement3 = connection.prepareStatement(mariaDbMapper.columnsCheckConstraintSelectRawQuery()); + statement3.setString(1, database.getInternalName()); + statement3.setString(2, tableName); + log.trace("1={}, 2={}", database.getInternalName(), tableName); + final ResultSet resultSet3 = statement3.executeQuery(); + while (resultSet3.next()) { + final String clause = resultSet3.getString(1); + table.getConstraints() + .getChecks() + .add(clause); + log.trace("found check clause: {}", clause); + } + /* obtain column constraints metadata */ + final PreparedStatement statement4 = connection.prepareStatement(mariaDbMapper.databaseTableConstraintsSelectRawQuery()); + statement4.setString(1, database.getInternalName()); + statement4.setString(2, tableName); + log.trace("1={}, 2={}", database.getInternalName(), tableName); + final ResultSet resultSet4 = statement4.executeQuery(); + while (resultSet4.next()) { + table = mariaDbMapper.resultSetToConstraint(resultSet4, table); + for (UniqueDto uk : table.getConstraints().getUniques()) { + uk.setTable(metadataMapper.tableDtoToTableBriefDto(table)); + final TableDto tmpTable = table; + uk.getColumns() + .forEach(column -> { + column.setTable(tmpTable); + column.setTableId(tmpTable.getId()); + column.setDatabaseId(database.getId()); + column.setIsPublic(database.getIsPublic()); + }); + } + } + table.setTdbid(database.getId()); + table.setCreator(database.getCreator()); + table.setCreatedBy(database.getCreator().getId()); + final TableDto tmpTable = table; + tmpTable.getColumns() + .forEach(column -> { + column.setTable(tmpTable); + column.setTableId(tmpTable.getId()); + column.setDatabaseId(database.getId()); + }); + log.debug("obtained metadata for table {}.{}", database.getInternalName(), tableName); + return tmpTable; + } finally { + dataSource.close(); + } + } + + @Override + public ViewDto inspectView(PrivilegedDatabaseDto privilegedDatabase, String viewName) throws SQLException, + ViewNotFoundException { + final ComboPooledDataSource dataSource = getPrivilegedDataSource(privilegedDatabase); + final Connection connection = dataSource.getConnection(); + final DatabaseDto database = metadataMapper.privilegedDatabaseDtoToDatabaseDto(privilegedDatabase); + try { + /* obtain only view metadata */ + final PreparedStatement statement1 = connection.prepareStatement(mariaDbMapper.databaseViewSelectRawQuery()); + statement1.setString(1, database.getInternalName()); + statement1.setString(2, viewName); + log.trace("1={}, 2={}", database.getInternalName(), viewName); + final ResultSet resultSet1 = statement1.executeQuery(); + if (!resultSet1.next()) { + throw new ViewNotFoundException("Failed to find view in the information schema"); + } + ViewDto view = mariaDbMapper.schemaResultSetToView(metadataMapper.privilegedDatabaseDtoToDatabaseDto(privilegedDatabase), resultSet1); + view.setDatabase(database); + view.setVdbid(database.getId()); + view.setCreator(database.getCreator()); + view.setCreatedBy(database.getCreator().getId()); + /* obtain view columns */ + final PreparedStatement statement2 = connection.prepareStatement(mariaDbMapper.databaseTableColumnsSelectRawQuery()); + statement2.setString(1, database.getInternalName()); + statement2.setString(2, viewName); + log.trace("1={}, 2={}", database.getInternalName(), viewName); + final ResultSet resultSet2 = statement2.executeQuery(); + TableDto tmp = TableDto.builder() + .columns(new LinkedList<>()) + .build(); + while (resultSet2.next()) { + tmp = mariaDbMapper.resultSetToTable(resultSet2, tmp, queryConfig); + } + view.setColumns(tmp.getColumns() + .stream() + .map(metadataMapper::columnDtoToViewColumnDto) + .toList()); + view.getColumns() + .forEach(column -> column.setDatabaseId(database.getId())); + log.debug("obtained metadata for view {}.{}", database.getInternalName(), viewName); + return view; } finally { dataSource.close(); } - log.info("Obtained table metadata for table {}{}", database.getInternalName(), tableName); - return table; } } diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java index 4df35be00b..57d7472dde 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java @@ -10,6 +10,7 @@ import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.api.identifier.IdentifierTypeDto; import at.tuwien.api.user.UserDto; +import at.tuwien.config.S3Config; import at.tuwien.exception.*; import at.tuwien.gateway.DataDatabaseSidecarGateway; import at.tuwien.gateway.MetadataServiceGateway; @@ -33,6 +34,7 @@ import java.util.UUID; @Service public class SubsetServiceMariaDbImpl extends HibernateConnector implements SubsetService { + private final S3Config s3Config; private final MariaDbMapper mariaDbMapper; private final MetadataMapper metadataMapper; private final StorageService storageService; @@ -40,9 +42,10 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs private final DataDatabaseSidecarGateway dataDatabaseSidecarGateway; @Autowired - public SubsetServiceMariaDbImpl(MariaDbMapper mariaDbMapper, MetadataMapper metadataMapper, + public SubsetServiceMariaDbImpl(S3Config s3Config, MariaDbMapper mariaDbMapper, MetadataMapper metadataMapper, StorageService storageService, MetadataServiceGateway metadataServiceGateway, DataDatabaseSidecarGateway dataDatabaseSidecarGateway) { + this.s3Config = s3Config; this.mariaDbMapper = mariaDbMapper; this.metadataMapper = metadataMapper; this.storageService = storageService; @@ -146,11 +149,12 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs public ExportResourceDto export(PrivilegedDatabaseDto database, QueryDto query, Instant timestamp, String filename) throws SQLException, QueryMalformedException, SidecarExportException, StorageNotFoundException, StorageUnavailableException { + final String filePath = s3Config.getS3FilePath() + "/" + filename; final ComboPooledDataSource dataSource = getPrivilegedDataSource(database); final Connection connection = dataSource.getConnection(); try { /* export to data database sidecar */ - connection.prepareStatement(mariaDbMapper.subsetToRawExportQuery(query.getQuery(), timestamp, filename)) + connection.prepareStatement(mariaDbMapper.subsetToRawExportQuery(query.getQuery(), timestamp, filePath)) .executeUpdate(); connection.commit(); } catch (SQLException e) { diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java index 32eaaf9533..92e369e0af 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java @@ -9,9 +9,11 @@ import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.database.table.columns.ColumnTypeDto; import at.tuwien.api.database.table.internal.PrivilegedTableDto; import at.tuwien.api.database.table.internal.TableCreateDto; +import at.tuwien.config.S3Config; import at.tuwien.exception.*; import at.tuwien.gateway.DataDatabaseSidecarGateway; import at.tuwien.mapper.MariaDbMapper; +import at.tuwien.service.SchemaService; import at.tuwien.service.StorageService; import at.tuwien.service.TableService; import com.mchange.v2.c3p0.ComboPooledDataSource; @@ -28,21 +30,64 @@ import java.util.*; @Service public class TableServiceMariaDbImpl extends HibernateConnector implements TableService { + private final S3Config s3Config; private final MariaDbMapper mariaDbMapper; + private final SchemaService schemaService; private final StorageService storageService; private final DataDatabaseSidecarGateway dataDatabaseSidecarGateway; @Autowired - public TableServiceMariaDbImpl(MariaDbMapper mariaDbMapper, StorageService storageService, + public TableServiceMariaDbImpl(S3Config s3Config, MariaDbMapper mariaDbMapper, SchemaService schemaService, + StorageService storageService, DataDatabaseSidecarGateway dataDatabaseSidecarGateway) { + this.s3Config = s3Config; this.mariaDbMapper = mariaDbMapper; + this.schemaService = schemaService; this.storageService = storageService; this.dataDatabaseSidecarGateway = dataDatabaseSidecarGateway; } @Override - public void createTable(PrivilegedDatabaseDto database, TableCreateDto data) throws SQLException, - TableMalformedException, TableExistsException { + public List<TableDto> getSchemas(PrivilegedDatabaseDto database) throws SQLException, TableNotFoundException, + QueryMalformedException, DatabaseMalformedException { + final ComboPooledDataSource dataSource = getPrivilegedDataSource(database); + final Connection connection = dataSource.getConnection(); + final List<TableDto> tables = new LinkedList<>(); + try { + /* inspect tables before views */ + final PreparedStatement statement = connection.prepareStatement(mariaDbMapper.databaseTablesSelectRawQuery()); + statement.setString(1, database.getInternalName()); + final ResultSet resultSet1 = statement.executeQuery(); + while (resultSet1.next()) { + final String tableName = resultSet1.getString(1); + if (database.getTables().stream().anyMatch(t -> t.getInternalName().equals(tableName))) { + log.trace("view {}.{} already known to metadata database, skip.", database.getInternalName(), tableName); + continue; + } + final TableDto table = schemaService.inspectTable(database, tableName); + if (database.getTables().stream().noneMatch(t -> t.getInternalName().equals(table.getInternalName()))) { + tables.add(table); + } + } + } catch (SQLException e) { + log.error("Failed to get table schemas: {}", e.getMessage()); + throw new DatabaseMalformedException("Failed to get table schemas: " + e.getMessage(), e); + } finally { + dataSource.close(); + } + log.info("Found {} table schema(s)", tables.size()); + return tables; + } + + @Override + public TableDto find(PrivilegedDatabaseDto database, String tableName) throws TableNotFoundException, SQLException, + QueryMalformedException { + return schemaService.inspectTable(database, tableName); + } + + @Override + public TableDto createTable(PrivilegedDatabaseDto database, TableCreateDto data) throws SQLException, + TableMalformedException, TableExistsException, TableNotFoundException, QueryMalformedException { final String tableName = mariaDbMapper.nameToInternalName(data.getName()); final ComboPooledDataSource dataSource = getPrivilegedDataSource(database); final Connection connection = dataSource.getConnection(); @@ -69,6 +114,7 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table dataSource.close(); } log.info("Created table with name {}", tableName); + return find(database, tableName); } @Override @@ -213,6 +259,7 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table final Connection connection = dataSource.getConnection(); try { /* import tuple */ + data.setLocation(s3Config.getS3FilePath() + "/" + data.getLocation()); connection.prepareStatement(mariaDbMapper.datasetToRawInsertQuery(table.getDatabase().getInternalName(), table, data)) .execute(); connection.commit(); @@ -331,13 +378,14 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table public ExportResourceDto exportDataset(PrivilegedTableDto table, Instant timestamp) throws SQLException, SidecarExportException, StorageNotFoundException, StorageUnavailableException, QueryMalformedException { - final String filename = RandomStringUtils.randomAlphabetic(40) + ".csv"; + final String fileName = RandomStringUtils.randomAlphabetic(40) + ".csv"; + final String filePath = s3Config.getS3FilePath() + "/" + fileName; final ComboPooledDataSource dataSource = getPrivilegedDataSource(table.getDatabase()); final Connection connection = dataSource.getConnection(); try { /* export to data database sidecar */ connection.prepareStatement(mariaDbMapper.tableOrViewToRawExportQuery(table.getDatabase().getInternalName(), - table.getInternalName(), table.getColumns(), timestamp, filename)) + table.getInternalName(), table.getColumns(), timestamp, filePath)) .executeUpdate(); connection.commit(); } catch (SQLException e) { @@ -347,8 +395,8 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table } finally { dataSource.close(); } - dataDatabaseSidecarGateway.exportFile(table.getDatabase().getContainer().getSidecarHost(), table.getDatabase().getContainer().getSidecarPort(), filename); - return storageService.getResource(filename); + dataDatabaseSidecarGateway.exportFile(table.getDatabase().getContainer().getSidecarHost(), table.getDatabase().getContainer().getSidecarPort(), fileName); + return storageService.getResource(fileName); } } diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java index b0a66dfe0f..b28e2a1dc4 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java @@ -6,9 +6,14 @@ import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.internal.PrivilegedViewDto; import at.tuwien.api.database.query.QueryResultDto; +import at.tuwien.api.database.table.columns.ColumnDto; +import at.tuwien.config.QueryConfig; +import at.tuwien.config.S3Config; import at.tuwien.exception.*; import at.tuwien.gateway.DataDatabaseSidecarGateway; import at.tuwien.mapper.MariaDbMapper; +import at.tuwien.mapper.MetadataMapper; +import at.tuwien.service.SchemaService; import at.tuwien.service.StorageService; import at.tuwien.service.ViewService; import com.mchange.v2.c3p0.ComboPooledDataSource; @@ -16,38 +21,103 @@ import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.RandomStringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.sql.Connection; +import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.time.Instant; +import java.util.LinkedList; +import java.util.List; @Log4j2 @Service public class ViewServiceMariaDbImpl extends HibernateConnector implements ViewService { + private final S3Config s3Config; + private final QueryConfig queryConfig; private final MariaDbMapper mariaDbMapper; + private final SchemaService schemaService; private final StorageService storageService; + private final MetadataMapper metadataMapper; private final DataDatabaseSidecarGateway dataDatabaseSidecarGateway; @Autowired - public ViewServiceMariaDbImpl(MariaDbMapper mariaDbMapper, StorageService storageService, + public ViewServiceMariaDbImpl(S3Config s3Config, QueryConfig queryConfig, MariaDbMapper mariaDbMapper, + SchemaService schemaService, StorageService storageService, + MetadataMapper metadataMapper, DataDatabaseSidecarGateway dataDatabaseSidecarGateway) { + this.s3Config = s3Config; + this.queryConfig = queryConfig; this.mariaDbMapper = mariaDbMapper; + this.schemaService = schemaService; this.storageService = storageService; + this.metadataMapper = metadataMapper; this.dataDatabaseSidecarGateway = dataDatabaseSidecarGateway; } @Override - public void create(PrivilegedDatabaseDto database, ViewCreateDto data) throws SQLException, + public List<ViewDto> getSchemas(PrivilegedDatabaseDto database) throws SQLException, DatabaseMalformedException, + ViewMalformedException, ViewNotFoundException, ViewSchemaException { + final ComboPooledDataSource dataSource = getPrivilegedDataSource(database); + final Connection connection = dataSource.getConnection(); + final List<ViewDto> views = new LinkedList<>(); + try { + /* inspect tables before views */ + final PreparedStatement statement = connection.prepareStatement(mariaDbMapper.databaseViewsSelectRawQuery()); + statement.setString(1, database.getInternalName()); + final ResultSet resultSet1 = statement.executeQuery(); + while (resultSet1.next()) { + final String viewName = resultSet1.getString(1); + if (database.getViews().stream().anyMatch(v -> v.getInternalName().equals(viewName))) { + log.trace("view {}.{} already known to metadata database, skip.", database.getInternalName(), viewName); + continue; + } + final ViewDto view; + view = schemaService.inspectView(database, viewName); + if (database.getTables().stream().noneMatch(t -> t.getInternalName().equals(view.getInternalName()))) { + views.add(view); + } + } + } catch (SQLException e) { + log.error("Failed to get view schemas: {}", e.getMessage()); + throw new DatabaseMalformedException("Failed to get view schemas: " + e.getMessage(), e); + } finally { + dataSource.close(); + } + log.info("Found {} view schema(s)", views.size()); + return views; + } + + @Override + public ViewDto create(PrivilegedDatabaseDto database, ViewCreateDto data) throws SQLException, ViewMalformedException { final ComboPooledDataSource dataSource = getPrivilegedDataSource(database); final Connection connection = dataSource.getConnection(); + ViewDto view = ViewDto.builder() + .name(data.getName()) + .internalName(data.getName()) + .isPublic(database.getIsPublic()) + .creator(database.getOwner()) + .createdBy(database.getOwner().getId()) + .identifiers(new LinkedList<>()) + .isInitialView(false) + .vdbid(database.getId()) + .database(metadataMapper.privilegedDatabaseDtoToDatabaseDto(database)) + .columns(new LinkedList<>()) + .build(); try { /* create view if not exists */ - connection.prepareStatement("CREATE VIEW IF NOT EXISTS `" + data.getName() + "` AS (" + data.getQuery() + ")") + connection.prepareStatement(mariaDbMapper.viewCreateRawQuery(data.getName(), data.getQuery())) .execute(); + /* select view columns */ + final PreparedStatement statement2 = connection.prepareStatement(mariaDbMapper.databaseTableColumnsSelectRawQuery()); + statement2.setString(1, database.getInternalName()); + statement2.setString(2, data.getName()); + final ResultSet resultSet2 = statement2.executeQuery(); + while (resultSet2.next()) { + view = mariaDbMapper.resultSetToTable(resultSet2, view, queryConfig); + } connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -56,7 +126,8 @@ public class ViewServiceMariaDbImpl extends HibernateConnector implements ViewSe } finally { dataSource.close(); } - log.info("Created view with name {}", data.getName()); + log.info("Created view with name {}", view.getName()); + return view; } @Override @@ -67,11 +138,15 @@ public class ViewServiceMariaDbImpl extends HibernateConnector implements ViewSe final QueryResultDto queryResult; try { /* find table data */ + final List<ColumnDto> mappedColumns = view.getColumns() + .stream() + .map(metadataMapper::viewColumnDtoToColumnDto) + .toList(); final ResultSet resultSet = connection.prepareStatement( - mariaDbMapper.selectDatasetRawQuery(view.getDatabase().getInternalName(), view.getInternalName(), - view.getColumns(), timestamp, size, page)) + mariaDbMapper.selectDatasetRawQuery(view.getDatabase().getInternalName(), + view.getInternalName(), mappedColumns, timestamp, size, page)) .executeQuery(); - queryResult = mariaDbMapper.resultListToQueryResultDto(view.getColumns(), resultSet); + queryResult = mariaDbMapper.resultListToQueryResultDto(mappedColumns, resultSet); queryResult.setId(view.getId()); connection.commit(); } catch (SQLException e) { @@ -105,7 +180,6 @@ public class ViewServiceMariaDbImpl extends HibernateConnector implements ViewSe @Override - @Transactional public Long count(PrivilegedViewDto view, Instant timestamp) throws SQLException, QueryMalformedException { final ComboPooledDataSource dataSource = getPrivilegedDataSource(view.getDatabase()); @@ -133,13 +207,18 @@ public class ViewServiceMariaDbImpl extends HibernateConnector implements ViewSe public ExportResourceDto exportDataset(PrivilegedDatabaseDto database, ViewDto view, Instant timestamp) throws SQLException, QueryMalformedException, SidecarExportException, StorageNotFoundException, StorageUnavailableException { - final String filename = RandomStringUtils.randomAlphabetic(40) + ".csv"; + final String fileName = RandomStringUtils.randomAlphabetic(40) + ".csv"; + final String filePath = s3Config.getS3FilePath() + "/" + fileName; final ComboPooledDataSource dataSource = getPrivilegedDataSource(database); final Connection connection = dataSource.getConnection(); try { /* export to data database sidecar */ + final List<ColumnDto> columns = view.getColumns() + .stream() + .map(metadataMapper::viewColumnDtoToColumnDto) + .toList(); connection.prepareStatement(mariaDbMapper.tableOrViewToRawExportQuery(database.getInternalName(), - view.getInternalName(), view.getColumns(), timestamp, filename)) + view.getInternalName(), columns, timestamp, filePath)) .executeUpdate(); connection.commit(); } catch (SQLException e) { @@ -149,8 +228,9 @@ public class ViewServiceMariaDbImpl extends HibernateConnector implements ViewSe } finally { dataSource.close(); } - dataDatabaseSidecarGateway.exportFile(database.getContainer().getSidecarHost(), database.getContainer().getSidecarPort(), filename); - return storageService.getResource(filename); + dataDatabaseSidecarGateway.exportFile(database.getContainer().getSidecarHost(), + database.getContainer().getSidecarPort(), fileName); + return storageService.getResource(fileName); } } diff --git a/dbrepo-metadata-db/setup-schema.sql b/dbrepo-metadata-db/setup-schema.sql index 85be688437..7a12ed5e82 100644 --- a/dbrepo-metadata-db/setup-schema.sql +++ b/dbrepo-metadata-db/setup-schema.sql @@ -120,13 +120,13 @@ CREATE TABLE IF NOT EXISTS `mdb_databases_subjects` CREATE TABLE IF NOT EXISTS `mdb_tables` ( - ID bigint NOT NULL AUTO_INCREMENT, - tDBID bigint NOT NULL, - internal_name character varying(255) NOT NULL, - queue_name character varying(255) NOT NULL, - routing_key character varying(255), - tName VARCHAR(50), - tDescription TEXT, + ID bigint NOT NULL AUTO_INCREMENT, + tDBID bigint NOT NULL, + tName VARCHAR(64) NOT NULL, + internal_name VARCHAR(64) NOT NULL, + queue_name VARCHAR(255) NOT NULL, + routing_key VARCHAR(255), + tDescription VARCHAR(2048), num_rows BIGINT, data_length BIGINT, max_data_length BIGINT, @@ -138,12 +138,13 @@ CREATE TABLE IF NOT EXISTS `mdb_tables` element_true VARCHAR(50), element_false VARCHAR(50), Version TEXT, - created timestamp NOT NULL DEFAULT NOW(), - versioned boolean not null default true, - created_by character varying(36) NOT NULL, - owned_by character varying(36) NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + versioned boolean not null default true, + created_by character varying(36) NOT NULL, + owned_by character varying(36) NOT NULL, last_modified timestamp, PRIMARY KEY (ID), + UNIQUE (tDBID, internal_name), FOREIGN KEY (tDBID) REFERENCES mdb_databases (id), FOREIGN KEY (created_by) REFERENCES mdb_users (id), FOREIGN KEY (owned_by) REFERENCES mdb_users (id) @@ -151,25 +152,26 @@ CREATE TABLE IF NOT EXISTS `mdb_tables` CREATE TABLE IF NOT EXISTS `mdb_columns` ( - ID BIGINT NOT NULL AUTO_INCREMENT, - tID BIGINT NOT NULL, + ID BIGINT NOT NULL AUTO_INCREMENT, + tID BIGINT NOT NULL, dfID BIGINT, - cName VARCHAR(100), - internal_name VARCHAR(100) NOT NULL, + cName VARCHAR(64), + internal_name VARCHAR(64) NOT NULL, Datatype ENUM ('CHAR','VARCHAR','BINARY','VARBINARY','TINYBLOB','TINYTEXT','TEXT','BLOB','MEDIUMTEXT','MEDIUMBLOB','LONGTEXT','LONGBLOB','ENUM','SET','BIT','TINYINT','BOOL','SMALLINT','MEDIUMINT','INT','BIGINT','FLOAT','DOUBLE','DECIMAL','DATE','DATETIME','TIMESTAMP','TIME','YEAR'), - length BIGINT NULL, - ordinal_position INTEGER NOT NULL, - index_length BIGINT NULL, + length BIGINT NULL, + ordinal_position INTEGER NOT NULL, + index_length BIGINT NULL, + description VARCHAR(2048), size BIGINT, d BIGINT, - auto_generated BOOLEAN DEFAULT false, - is_null_allowed BOOLEAN NOT NULL DEFAULT true, - val_min NUMERIC NULL, - val_max NUMERIC NULL, - mean NUMERIC NULL, - median NUMERIC NULL, - std_dev Numeric NULL, - created timestamp NOT NULL DEFAULT NOW(), + auto_generated BOOLEAN DEFAULT false, + is_null_allowed BOOLEAN NOT NULL DEFAULT true, + val_min NUMERIC NULL, + val_max NUMERIC NULL, + mean NUMERIC NULL, + median NUMERIC NULL, + std_dev Numeric NULL, + created timestamp NOT NULL DEFAULT NOW(), last_modified timestamp, FOREIGN KEY (tID) REFERENCES mdb_tables (ID) ON DELETE CASCADE, PRIMARY KEY (ID) @@ -326,8 +328,8 @@ CREATE TABLE IF NOT EXISTS `mdb_view` ( id bigint NOT NULL AUTO_INCREMENT, vdbid bigint NOT NULL, - vName VARCHAR(255) NOT NULL, - internal_name VARCHAR(255) NOT NULL, + vName VARCHAR(64) NOT NULL, + internal_name VARCHAR(64) NOT NULL, Query TEXT NOT NULL, query_hash VARCHAR(255) NOT NULL, Public BOOLEAN NOT NULL, @@ -369,14 +371,19 @@ CREATE TABLE IF NOT EXISTS `mdb_ontologies` CREATE TABLE IF NOT EXISTS `mdb_view_columns` ( - id BIGINT NOT NULL AUTO_INCREMENT, - cid BIGINT NOT NULL, - vid BIGINT NOT NULL, - alias VARCHAR(100), - ordinal_position INTEGER, + id BIGINT NOT NULL AUTO_INCREMENT, + view_id BIGINT NOT NULL, + dfID BIGINT, + name VARCHAR(64), + internal_name VARCHAR(64) NOT NULL, + column_type ENUM ('CHAR','VARCHAR','BINARY','VARBINARY','TINYBLOB','TINYTEXT','TEXT','BLOB','MEDIUMTEXT','MEDIUMBLOB','LONGTEXT','LONGBLOB','ENUM','SET','BIT','TINYINT','BOOL','SMALLINT','MEDIUMINT','INT','BIGINT','FLOAT','DOUBLE','DECIMAL','DATE','DATETIME','TIMESTAMP','TIME','YEAR'), + ordinal_position INTEGER NOT NULL, + size BIGINT, + d BIGINT, + auto_generated BOOLEAN DEFAULT false, + is_null_allowed BOOLEAN NOT NULL DEFAULT true, PRIMARY KEY (id), - FOREIGN KEY (vid) REFERENCES mdb_view (id), - FOREIGN KEY (cid) REFERENCES mdb_columns (ID) + FOREIGN KEY (view_id) REFERENCES mdb_view (id) ) WITH SYSTEM VERSIONING; CREATE TABLE IF NOT EXISTS `mdb_identifiers` @@ -485,18 +492,6 @@ CREATE TABLE IF NOT EXISTS `mdb_identifier_creators` FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) ) WITH SYSTEM VERSIONING; -CREATE TABLE IF NOT EXISTS `mdb_feed` -( - fDBID bigint, - fID bigint, - fUserId character varying(36) not null, - fDataID bigint REFERENCES mdb_data (ID), - created timestamp NOT NULL DEFAULT NOW(), - PRIMARY KEY (fDBID, fID, fUserId, fDataID), - FOREIGN KEY (fDBID, fID) REFERENCES mdb_tables (tDBID, ID), - FOREIGN KEY (fUserId) REFERENCES mdb_users (id) -) WITH SYSTEM VERSIONING; - CREATE TABLE IF NOT EXISTS `mdb_update` ( uUserID character varying(255) NOT NULL, diff --git a/dbrepo-metadata-service/api/pom.xml b/dbrepo-metadata-service/api/pom.xml index 8aebde719a..6815b5f9e6 100644 --- a/dbrepo-metadata-service/api/pom.xml +++ b/dbrepo-metadata-service/api/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.4.3</version> + <version>1.4.4</version> </parent> <artifactId>dbrepo-metadata-service-api</artifactId> <name>dbrepo-metadata-service-api</name> - <version>1.4.3</version> + <version>1.4.4</version> <dependencies/> diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/internal/PrivilegedContainerDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/internal/PrivilegedContainerDto.java index 8bfe382496..8de17a48f3 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/internal/PrivilegedContainerDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/internal/PrivilegedContainerDto.java @@ -66,10 +66,8 @@ public class PrivilegedContainerDto { @ToString.Exclude private String password; - @JsonProperty("default_timestamp_format") - private ImageDateDto defaultTimestampFormat; + private Long defaultTimestampFormatId; - @JsonProperty("default_date_format") - private ImageDateDto defaultDateFormat; + private Long defaultDateFormatId; } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseBriefDto.java new file mode 100644 index 0000000000..49c7c58e8a --- /dev/null +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseBriefDto.java @@ -0,0 +1,59 @@ +package at.tuwien.api.database; + +import at.tuwien.api.identifier.IdentifierDto; +import at.tuwien.api.user.UserBriefDto; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.*; +import lombok.extern.jackson.Jacksonized; + +import java.time.Instant; +import java.util.List; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Jacksonized +@ToString +public class DatabaseBriefDto { + + @NotNull + private Long id; + + @NotBlank + @Schema(example = "Air Quality") + private String name; + + @NotBlank + @JsonProperty("internal_name") + @Schema(example = "air_quality") + private String internalName; + + @Schema(example = "Air Quality") + private String description; + + @NotNull + @JsonProperty("is_public") + @Schema(example = "true") + private Boolean isPublic; + + private List<IdentifierDto> identifiers; + + @ToString.Exclude + @NotNull + private UserBriefDto contact; + + @NotNull + private UserBriefDto owner; + + @NotNull + @Schema(example = "2021-03-12T15:26:21Z") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") + private Instant created; + +} diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewColumnDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewColumnDto.java new file mode 100644 index 0000000000..35edfc6d84 --- /dev/null +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewColumnDto.java @@ -0,0 +1,89 @@ +package at.tuwien.api.database; + +import at.tuwien.api.container.image.ImageDateDto; +import at.tuwien.api.database.table.columns.ColumnTypeDto; +import at.tuwien.api.database.table.columns.concepts.ConceptDto; +import at.tuwien.api.database.table.columns.concepts.UnitDto; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.*; +import lombok.extern.jackson.Jacksonized; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Jacksonized +@ToString +public class ViewColumnDto { + + @NotNull + private Long id; + + @NotNull + @JsonProperty("database_id") + private Long databaseId; + + @NotNull + @Schema(example = "0") + @JsonProperty("ordinal_position") + private Integer ordinalPosition; + + @NotBlank + @Size(max = 64) + @Schema(example = "Date") + private String name; + + @NotBlank + @Size(max = 64) + @JsonProperty("internal_name") + @Schema(example = "mdb_date") + private String internalName; + + @Schema + private String alias; + + @JsonProperty("date_format") + private ImageDateDto dateFormat; + + @NotNull + @JsonProperty("auto_generated") + @Schema(example = "false") + private Boolean autoGenerated; + + @JsonProperty("index_length") + private Long indexLength; + + @JsonProperty("length") + private Long length; + + @NotNull + @JsonProperty("column_type") + @Schema(example = "string") + private ColumnTypeDto columnType; + + @Schema(example = "255") + private Long size; + + @Schema(example = "0") + private Long d; + + private ConceptDto concept; + + private UnitDto unit; + + @NotNull + @JsonProperty("is_public") + @Schema(example = "true") + private Boolean isPublic; + + @NotNull + @JsonProperty("is_null_allowed") + @Schema(example = "false") + private Boolean isNullAllowed; + +} diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewCreateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewCreateDto.java index ca02de1b42..583b5f0d81 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewCreateDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewCreateDto.java @@ -2,6 +2,7 @@ package at.tuwien.api.database; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Size; import lombok.*; import jakarta.validation.constraints.NotBlank; @@ -17,15 +18,16 @@ import lombok.extern.jackson.Jacksonized; @ToString public class ViewCreateDto { - @NotBlank(message = "name is required") + @NotBlank + @Size(min = 1, max = 64) @Schema(example = "Air Quality") private String name; - @NotBlank(message = "query is required") + @NotBlank @Schema(example = "SELECT `id` FROM `air_quality`") private String query; - @NotNull(message = "public attribute is required") + @NotNull @JsonProperty("is_public") @Schema(example = "true") private Boolean isPublic; diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java index 1aa92a11c0..30f16448d3 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java @@ -1,6 +1,5 @@ package at.tuwien.api.database; -import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.api.user.UserDto; import com.fasterxml.jackson.annotation.JsonFormat; @@ -12,7 +11,6 @@ import lombok.extern.jackson.Jacksonized; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; -import org.springframework.data.annotation.Id; import java.time.Instant; import java.util.List; @@ -35,6 +33,7 @@ public class ViewDto { private Long vdbid; @NotNull + @ToString.Exclude private DatabaseDto database; @NotBlank @@ -77,7 +76,7 @@ public class ViewDto { private UserDto creator; @NotNull - private List<ColumnDto> columns; + private List<ViewColumnDto> columns; @JsonProperty("last_modified") @Schema(example = "2021-03-12T15:26:21Z") diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedViewDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedViewDto.java index ff15b7b9e8..5053f8c5d6 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedViewDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedViewDto.java @@ -1,6 +1,7 @@ package at.tuwien.api.database.internal; import at.tuwien.api.database.DatabaseDto; +import at.tuwien.api.database.ViewColumnDto; import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.api.user.UserDto; @@ -78,7 +79,7 @@ public class PrivilegedViewDto { private UserDto creator; @NotNull(message = "columns are required") - private List<ColumnDto> columns; + private List<ViewColumnDto> columns; @JsonProperty("last_modified") @Schema(example = "2021-03-12T15:26:21Z") diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableBriefDto.java index db6179edf3..aa566a495c 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableBriefDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableBriefDto.java @@ -2,6 +2,7 @@ package at.tuwien.api.database.table; import at.tuwien.api.database.table.columns.ColumnBriefDto; import at.tuwien.api.user.UserBriefDto; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; @@ -21,18 +22,22 @@ import java.util.List; @ToString public class TableBriefDto { - @NotNull(message = "id is required") + @NotNull private Long id; - @NotBlank(message = "name is required") + @NotNull + @JsonProperty("database_id") + private Long databaseId; + + @NotBlank @Schema(example = "Air Quality") private String name; - @NotBlank(message = "description is required") + @NotBlank @Schema(example = "Air Quality in Austria") private String description; - @NotBlank(message = "internal name is required") + @NotBlank @JsonProperty("internal_name") @Schema(example = "air_quality") private String internalName; @@ -42,9 +47,11 @@ public class TableBriefDto { @Schema(example = "true") private Boolean isVersioned; - @NotNull(message = "owner is required") + @NotNull private UserBriefDto owner; - @NotNull(message = "columns are required") + @ToString.Exclude + @JsonIgnore + @NotNull private List<ColumnBriefDto> columns; } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java index eff91d877a..5764b311ca 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java @@ -7,6 +7,7 @@ import at.tuwien.api.user.UserDto; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Size; import lombok.*; import lombok.extern.jackson.Jacksonized; @@ -76,6 +77,7 @@ public class TableDto { @Schema(example = "dbrepo.1.2") private String routingKey; + @Size(max = 2048) @Schema(example = "Air Quality in Austria") private String description; diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnCreateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnCreateDto.java index 44f6ed8315..78fb7fb84e 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnCreateDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnCreateDto.java @@ -2,6 +2,7 @@ package at.tuwien.api.database.table.columns; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Size; import lombok.*; import jakarta.validation.constraints.NotBlank; @@ -36,6 +37,10 @@ public class ColumnCreateDto { @Schema(example = "0") private Long d; + @Size(max = 2048) + @Schema(example = "Formatted as YYYY-MM-dd") + private String description; + @NotNull @JsonProperty("null_allowed") @Schema(example = "true") 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 f03ee60d71..430bdba270 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 @@ -11,6 +11,7 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.*; import lombok.extern.jackson.Jacksonized; @@ -43,10 +44,12 @@ public class ColumnDto { private Integer ordinalPosition; @NotBlank + @Size(max = 64) @Schema(example = "Date") private String name; @NotBlank + @Size(max = 64) @JsonProperty("internal_name") @Schema(example = "mdb_date") private String internalName; @@ -113,10 +116,16 @@ public class ColumnDto { private UnitDto unit; + @Size(max = 2048) + @Schema(example = "Formatted as YYYY-MM-dd") + private String description; + @ToString.Exclude + @JsonIgnore private transient TableDto table; @ToString.Exclude + @JsonIgnore private transient List<ViewDto> views; @NotNull diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/ConstraintsCreateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/ConstraintsCreateDto.java index ccb00d23a0..a317b08b8a 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/ConstraintsCreateDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/ConstraintsCreateDto.java @@ -1,6 +1,6 @@ package at.tuwien.api.database.table.constraints; -import at.tuwien.api.database.table.constraints.foreignKey.ForeignKeyCreateDto; +import at.tuwien.api.database.table.constraints.foreign.ForeignKeyCreateDto; import com.fasterxml.jackson.annotation.JsonProperty; import jakarta.validation.constraints.NotNull; import lombok.*; diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/ConstraintsDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/ConstraintsDto.java index 409878292a..3cd36f6d68 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/ConstraintsDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/ConstraintsDto.java @@ -1,6 +1,7 @@ package at.tuwien.api.database.table.constraints; -import at.tuwien.api.database.table.constraints.foreignKey.ForeignKeyDto; +import at.tuwien.api.database.table.constraints.foreign.ForeignKeyDto; +import at.tuwien.api.database.table.constraints.primary.PrimaryKeyDto; import at.tuwien.api.database.table.constraints.unique.UniqueDto; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.*; @@ -26,5 +27,5 @@ public class ConstraintsDto { private Set<String> checks; @JsonProperty("primary_key") - private Set<String> primaryKey; + private Set<PrimaryKeyDto> primaryKey; } diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreignKey/ForeignKeyCreateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreign/ForeignKeyCreateDto.java similarity index 91% rename from dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreignKey/ForeignKeyCreateDto.java rename to dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreign/ForeignKeyCreateDto.java index e6758b36ef..8e2a110997 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreignKey/ForeignKeyCreateDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreign/ForeignKeyCreateDto.java @@ -1,4 +1,4 @@ -package at.tuwien.api.database.table.constraints.foreignKey; +package at.tuwien.api.database.table.constraints.foreign; import com.fasterxml.jackson.annotation.JsonProperty; import jakarta.validation.constraints.NotNull; diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreignKey/ForeignKeyDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreign/ForeignKeyDto.java similarity index 54% rename from dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreignKey/ForeignKeyDto.java rename to dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreign/ForeignKeyDto.java index 1c4acfc5ca..68ee2e56da 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreignKey/ForeignKeyDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreign/ForeignKeyDto.java @@ -1,8 +1,9 @@ -package at.tuwien.api.database.table.constraints.foreignKey; +package at.tuwien.api.database.table.constraints.foreign; -import at.tuwien.api.database.table.TableBriefDto; +import at.tuwien.api.database.table.TableDto; import at.tuwien.api.database.table.columns.ColumnDto; import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.constraints.NotNull; import lombok.*; import lombok.extern.jackson.Jacksonized; @@ -17,19 +18,25 @@ import java.util.List; @ToString public class ForeignKeyDto { - @NonNull + private Long id; + + @NotNull private String name; - @NonNull - private List<ColumnDto> columns; + @NotNull + private ColumnDto column; - @NonNull - @JsonProperty("referenced_table") - private TableBriefDto referencedTable; + @NotNull + private List<ForeignKeyReferenceDto> references; - @NonNull - @JsonProperty("referenced_columns") - private List<ColumnDto> referencedColumns; + @NotNull + @ToString.Exclude + private TableDto table; + + @NotNull + @ToString.Exclude + @JsonProperty("referenced_table") + private TableDto referencedTable; @JsonProperty("on_update") private ReferenceTypeDto onUpdate; diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreign/ForeignKeyReferenceDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreign/ForeignKeyReferenceDto.java new file mode 100644 index 0000000000..fb978671bc --- /dev/null +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreign/ForeignKeyReferenceDto.java @@ -0,0 +1,32 @@ +package at.tuwien.api.database.table.constraints.foreign; + +import at.tuwien.api.database.table.columns.ColumnDto; +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.constraints.NotNull; +import lombok.*; +import lombok.extern.jackson.Jacksonized; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Jacksonized +@ToString +public class ForeignKeyReferenceDto { + + private Long id; + + @NotNull + @JsonProperty("foreign_key") + private ForeignKeyDto foreignKey; + + @NotNull + @ToString.Exclude + private ColumnDto column; + + @NotNull + @ToString.Exclude + @JsonProperty("referenced_column") + private ColumnDto referencedColumn; +} diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreignKey/ReferenceTypeDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreign/ReferenceTypeDto.java similarity index 90% rename from dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreignKey/ReferenceTypeDto.java rename to dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreign/ReferenceTypeDto.java index cec40a76a8..ebd2d56887 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreignKey/ReferenceTypeDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/foreign/ReferenceTypeDto.java @@ -1,4 +1,4 @@ -package at.tuwien.api.database.table.constraints.foreignKey; +package at.tuwien.api.database.table.constraints.foreign; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/primary/PrimaryKeyDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/primary/PrimaryKeyDto.java new file mode 100644 index 0000000000..19c25371b2 --- /dev/null +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/primary/PrimaryKeyDto.java @@ -0,0 +1,27 @@ +package at.tuwien.api.database.table.constraints.primary; + +import at.tuwien.api.database.table.TableBriefDto; +import at.tuwien.api.database.table.columns.ColumnDto; +import jakarta.validation.constraints.NotNull; +import lombok.*; +import lombok.extern.jackson.Jacksonized; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Jacksonized +@ToString +public class PrimaryKeyDto { + + private Long pkid; + + @NotNull + @ToString.Exclude + private TableBriefDto table; + + @NotNull + @ToString.Exclude + private ColumnDto column; +} diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/unique/UniqueDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/unique/UniqueDto.java index 44b94f63f4..10f97e8390 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/unique/UniqueDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/constraints/unique/UniqueDto.java @@ -1,6 +1,7 @@ package at.tuwien.api.database.table.constraints.unique; +import at.tuwien.api.database.table.TableBriefDto; import at.tuwien.api.database.table.TableDto; import at.tuwien.api.database.table.columns.ColumnDto; import jakarta.validation.constraints.NotNull; @@ -23,8 +24,13 @@ public class UniqueDto { private Long uid; @NotNull - private TableDto table; + private String name; @NotNull + @ToString.Exclude + private TableBriefDto table; + + @NotNull + @ToString.Exclude private List<ColumnDto> columns; } diff --git a/dbrepo-metadata-service/entities/pom.xml b/dbrepo-metadata-service/entities/pom.xml index 2bac967130..62dec0e318 100644 --- a/dbrepo-metadata-service/entities/pom.xml +++ b/dbrepo-metadata-service/entities/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.4.3</version> + <version>1.4.4</version> </parent> <artifactId>dbrepo-metadata-service-entities</artifactId> <name>dbrepo-metadata-service-entity</name> - <version>1.4.3</version> + <version>1.4.4</version> <dependencies/> diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java index 937b9a3ba1..302046d035 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java @@ -22,10 +22,6 @@ import java.util.List; @EntityListeners(AuditingEntityListener.class) @EqualsAndHashCode(onlyExplicitlyIncluded = true) @Table(name = "mdb_containers") -@NamedQueries({ - @NamedQuery(name = "Container.findDefaultTimestampFormat", query = "select d from ContainerImageDate d where d.hasTime = true order by d.id limit 1"), - @NamedQuery(name = "Container.findDefaultDateFormat", query = "select d from ContainerImageDate d where d.hasTime = false order by d.id limit 1"), -}) public class Container { @Id @@ -69,7 +65,7 @@ public class Container { }) private List<Database> databases; - @ManyToOne(fetch = FetchType.LAZY, optional = false, cascade = {CascadeType.MERGE, CascadeType.PERSIST}) + @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}) @JoinColumns({ @JoinColumn(name = "image_id", referencedColumnName = "id") }) diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java index 40849fe4ef..b315c7e81d 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java @@ -53,7 +53,7 @@ public class ContainerImage { @Column(nullable = false) private Integer defaultPort; - @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.ALL}, mappedBy = "image") // ALL = cascade save + delete + @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "image") private List<ContainerImageDate> dateFormats; @ToString.Exclude diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageDate.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageDate.java index c40da7b077..5b370ecc06 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageDate.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImageDate.java @@ -7,6 +7,7 @@ import org.springframework.data.annotation.CreatedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import jakarta.persistence.*; + import java.time.Instant; @Data @@ -27,12 +28,15 @@ public class ContainerImageDate { @Column(updatable = false, nullable = false) private Long id; + @EqualsAndHashCode.Include @Column(name = "iid") private Long iid; @ToString.Exclude - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "iid", insertable = false, updatable = false) + @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) + @JoinColumns({ + @JoinColumn(name = "iid", insertable = false, updatable = false) + }) private ContainerImage image; @Column(name = "example", nullable = false) diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java index bf5904f4ad..f463370e4d 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java @@ -23,7 +23,7 @@ import java.util.UUID; @Data @Entity -@Builder +@Builder(toBuilder = true) @ToString @AllArgsConstructor @NoArgsConstructor diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java index f210486347..44ffab2959 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java @@ -10,7 +10,6 @@ import jakarta.persistence.NamedQuery; import jakarta.persistence.OrderBy; import jakarta.persistence.Table; import lombok.*; -import net.sf.jsqlparser.statement.select.FromItem; import org.hibernate.annotations.*; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; @@ -58,10 +57,10 @@ public class View { }) private User creator; - @Column(name = "vname", nullable = false) + @Column(name = "vname", nullable = false, columnDefinition = "VARCHAR(64)") private String name; - @Column(nullable = false) + @Column(nullable = false, columnDefinition = "VARCHAR(64)") private String internalName; @Column(name = "public", nullable = false) @@ -95,27 +94,9 @@ public class View { }) private Database database; - /** - * KEEP THIS FUNCTION HERE! IT WILL BREAK CODE! - * Custom equality function implementation. - * - * @param other The other view - * @return True if views are equal, false otherwise - */ - public boolean equals(FromItem other) { - if (other == null) { - return false; - } - final net.sf.jsqlparser.schema.Table table = (net.sf.jsqlparser.schema.Table) other; - return this.internalName.equals(table.getName().replace("`", "")); - } - @ToString.Exclude -// @OnDelete(action = OnDeleteAction.CASCADE) - @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}) - @JoinColumns({ - @JoinColumn(name = "vid", referencedColumnName = "id", updatable = false) - }) + @OnDelete(action = OnDeleteAction.CASCADE) + @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}, mappedBy = "view") @OrderColumn(name = "ordinalPosition") private List<ViewColumn> columns; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java index a74bde27fe..eb9b352095 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java @@ -1,6 +1,7 @@ package at.tuwien.entities.database; -import at.tuwien.entities.database.table.columns.TableColumn; +import at.tuwien.entities.container.image.ContainerImageDate; +import at.tuwien.entities.database.table.columns.TableColumnType; import lombok.*; import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @@ -15,7 +16,7 @@ import jakarta.persistence.*; @NoArgsConstructor @EntityListeners(AuditingEntityListener.class) @jakarta.persistence.Table(name = "mdb_view_columns", uniqueConstraints = { - @UniqueConstraint(columnNames = {"cid", "vid"}) + @UniqueConstraint(columnNames = {"view_id", "internalName"}) }) public class ViewColumn implements Comparable<ViewColumn> { @@ -26,28 +27,45 @@ public class ViewColumn implements Comparable<ViewColumn> { @Column(updatable = false, nullable = false) private Long id; - @Column(updatable = false) - private String alias; - - @Column(nullable = false) - private Integer ordinalPosition; + @ToString.Exclude + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "dfid", referencedColumnName = "id") + private ContainerImageDate dateFormat; @ToString.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumns({ - @JoinColumn(name = "vid", referencedColumnName = "id", updatable = false) + @JoinColumn(name = "view_id", referencedColumnName = "id", nullable = false) }) private View view; - @ToString.Exclude - @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) - @JoinColumns({ - @JoinColumn(name = "cid", referencedColumnName = "id", updatable = false) - }) - private TableColumn column; + @Column(nullable = false, columnDefinition = "VARCHAR(64)") + private String name; + + @Column(name = "auto_generated", columnDefinition = "BOOLEAN default false") + private Boolean autoGenerated; + + @Column(nullable = false, columnDefinition = "VARCHAR(64)") + private String internalName; + + @Column(nullable = false, columnDefinition = "ENUM('CHAR','VARCHAR','BINARY','VARBINARY','TINYBLOB','TINYTEXT','TEXT','BLOB','MEDIUMTEXT','MEDIUMBLOB','LONGTEXT','LONGBLOB','ENUM','SET','BIT','TINYINT','BOOL','SMALLINT','MEDIUMINT','INT','BIGINT','FLOAT','DOUBLE','DECIMAL','DATE','DATETIME','TIMESTAMP','TIME','YEAR')") + @Enumerated(EnumType.STRING) + private TableColumnType columnType; + + @Column(nullable = false, columnDefinition = "BOOLEAN default true") + private Boolean isNullAllowed; + + @Column(nullable = false) + private Integer ordinalPosition; + + @Column + private Long size; + + @Column + private Long d; @Override - public int compareTo(ViewColumn tableColumn) { - return Integer.compare(this.ordinalPosition, tableColumn.getOrdinalPosition()); + public int compareTo(ViewColumn viewColumn) { + return Integer.compare(this.ordinalPosition, viewColumn.getOrdinalPosition()); } } diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java index 3dc5b9bdea..57d9dbab1b 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java @@ -10,7 +10,6 @@ import jakarta.persistence.CascadeType; import jakarta.persistence.OrderBy; import lombok.*; import lombok.extern.log4j.Log4j2; -import net.sf.jsqlparser.statement.select.FromItem; import org.hibernate.annotations.*; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; @@ -29,8 +28,11 @@ import java.util.UUID; @ToString @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode(onlyExplicitlyIncluded = true) @EntityListeners(AuditingEntityListener.class) -@jakarta.persistence.Table(name = "mdb_tables") +@jakarta.persistence.Table(name = "mdb_tables", uniqueConstraints = { + @UniqueConstraint(columnNames = {"tdbid", "internalName"}) +}) public class Table { @Id @@ -48,7 +50,7 @@ public class Table { private UUID createdBy; @ToString.Exclude - @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) + @ManyToOne(fetch = FetchType.LAZY) @JoinColumns({ @JoinColumn(name = "created_by", referencedColumnName = "ID", insertable = false, updatable = false) }) @@ -60,27 +62,27 @@ public class Table { private UUID ownedBy; @ToString.Exclude - @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) + @ManyToOne(fetch = FetchType.LAZY) @JoinColumns({ @JoinColumn(name = "owned_by", referencedColumnName = "ID", insertable = false, updatable = false) }) private User owner; - @Column(name = "tname", nullable = false) + @Column(name = "tname", nullable = false, columnDefinition = "VARCHAR(64)") private String name; - @Column(nullable = false) + @Column(nullable = false, columnDefinition = "VARCHAR(64)") private String internalName; @Column(name = "queue_name", nullable = false, updatable = false) private String queueName; - @Column(name = "tdescription", columnDefinition = "TEXT") + @Column(name = "tdescription", columnDefinition = "VARCHAR(2048)") private String description; @ToString.Exclude @org.springframework.data.annotation.Transient - @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) + @ManyToOne(fetch = FetchType.LAZY) @JoinColumns({ @JoinColumn(name = "tdbid", referencedColumnName = "id", insertable = false, updatable = false) }) @@ -129,31 +131,5 @@ public class Table { @Column(columnDefinition = "TIMESTAMP") private Instant lastModified; - @Override - public boolean equals(Object o) { - if (o == this) { - return true; - } - if (!(o instanceof Table other)) { - return false; - } - return this.id.equals(other.getId()); - } - - /** - * KEEP THIS FUNCTION HERE! IT WILL BREAK CODE! - * Custom equality function implementation. - * - * @param other The other table - * @return True if tables are equal, false otherwise - */ - public boolean equals(FromItem other) { - if (other == null) { - return false; - } - final net.sf.jsqlparser.schema.Table table = (net.sf.jsqlparser.schema.Table) other; - return this.internalName.equals(table.getName().replace("`", "")); - } - } diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java index f5b955dd59..9a50f5c054 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java @@ -1,7 +1,6 @@ package at.tuwien.entities.database.table.columns; import at.tuwien.entities.container.image.ContainerImageDate; -import at.tuwien.entities.database.View; import at.tuwien.entities.database.table.Table; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.*; @@ -40,32 +39,29 @@ public class TableColumn implements Comparable<TableColumn> { private Long id; @ToString.Exclude - @OneToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) + @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "dfid", referencedColumnName = "id") private ContainerImageDate dateFormat; @ToString.Exclude - @org.springframework.data.annotation.Transient @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumns({ @JoinColumn(name = "tID", referencedColumnName = "id", nullable = false) }) private Table table; - @ToString.Exclude - @org.springframework.data.annotation.Transient - @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE, mappedBy = "columns") - private List<View> views; - - @Column(name = "cname", nullable = false) + @Column(name = "cname", nullable = false, columnDefinition = "VARCHAR(64)") private String name; @Column(name = "auto_generated", columnDefinition = "BOOLEAN default false") private Boolean autoGenerated; - @Column(nullable = false) + @Column(nullable = false, columnDefinition = "VARCHAR(64)") private String internalName; + @Column(columnDefinition = "VARCHAR(2048)") + private String description; + @Column private Long indexLength; @@ -90,13 +86,13 @@ public class TableColumn implements Comparable<TableColumn> { @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") private Instant created; - @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}) + @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}) @JoinTable(name = "mdb_columns_concepts", joinColumns = @JoinColumn(name = "cid", referencedColumnName = "id", nullable = false), inverseJoinColumns = @JoinColumn(name = "id", referencedColumnName = "id")) private TableColumnConcept concept; - @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}) + @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}) @JoinTable(name = "mdb_columns_units", joinColumns = @JoinColumn(name = "cid", referencedColumnName = "id", nullable = false), inverseJoinColumns = @JoinColumn(name = "id", referencedColumnName = "id")) diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java index 92050024e5..83e0d35656 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java @@ -30,7 +30,6 @@ public class ForeignKey { private String name; @ToString.Exclude - @org.springframework.data.annotation.Transient @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @JoinColumns({ @JoinColumn(name = "tid", referencedColumnName = "id", nullable = false) @@ -38,7 +37,6 @@ public class ForeignKey { private Table table; @ToString.Exclude - @org.springframework.data.annotation.Transient @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @JoinColumns({ @JoinColumn(name = "rtid", referencedColumnName = "id", nullable = false) diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java index 88a1ce77a1..89f52c6cb2 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java @@ -26,17 +26,17 @@ public class ForeignKeyReference { private Long id; @ToString.Exclude - @ManyToOne(fetch = FetchType.LAZY, optional = false) + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "fkid", referencedColumnName = "fkid", nullable = false) private ForeignKey foreignKey; - @ManyToOne(fetch = FetchType.LAZY, optional = false) + @ManyToOne(fetch = FetchType.LAZY) @JoinColumns({ @JoinColumn(name = "cid", referencedColumnName = "id", nullable = false) }) private TableColumn column; - @ManyToOne(fetch = FetchType.LAZY, optional = false) + @ManyToOne(fetch = FetchType.LAZY) @JoinColumns({ @JoinColumn(name = "rcid", referencedColumnName = "id", nullable = false) }) diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java index d373339f2d..269410a8c8 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java @@ -7,6 +7,7 @@ import org.hibernate.annotations.GenericGenerator; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import jakarta.persistence.*; + import java.util.List; @Data diff --git a/dbrepo-metadata-service/metrics.md b/dbrepo-metadata-service/metrics.md new file mode 100644 index 0000000000..976bacc4aa --- /dev/null +++ b/dbrepo-metadata-service/metrics.md @@ -0,0 +1,67 @@ +| **Metric** | **Description** | +|------------------------------------|----------------------------------------| +| `dbrepo_access_delete` | Revoke access to some database | +| `dbrepo_access_get` | Check access to some database | +| `dbrepo_access_give` | Give access to some database | +| `dbrepo_access_modify` | Modify access to some database | +| `dbrepo_container_create` | Create container | +| `dbrepo_container_delete` | Delete some container | +| `dbrepo_container_find` | Find some container | +| `dbrepo_container_findall` | Find all containers | +| `dbrepo_database_create` | Create database | +| `dbrepo_database_find` | Find some database | +| `dbrepo_database_findall` | List databases | +| `dbrepo_database_image` | Update database image | +| `dbrepo_database_transfer` | Update database owner | +| `dbrepo_database_visibility` | Update database visibility | +| `dbrepo_identifier_create` | Draft identifier | +| `dbrepo_identifier_delete` | Delete some identifier | +| `dbrepo_identifier_find` | Find some identifier | +| `dbrepo_identifier_list` | Find all identifiers | +| `dbrepo_identifier_publish` | Publish identifier | +| `dbrepo_identifier_retrieve` | Retrieve metadata from identifier | +| `dbrepo_identifier_save` | Save identifier | +| `dbrepo_image_create` | Create image | +| `dbrepo_image_delete` | Delete some image | +| `dbrepo_image_find` | Find some image | +| `dbrepo_image_findall` | Find all images | +| `dbrepo_image_update` | Update some image | +| `dbrepo_license_findall` | Get all licenses | +| `dbrepo_maintenance_create` | Create maintenance message | +| `dbrepo_maintenance_delete` | Delete maintenance message | +| `dbrepo_maintenance_find` | Find one maintenance message | +| `dbrepo_maintenance_findall` | Find maintenance messages | +| `dbrepo_maintenance_update` | Update maintenance message | +| `dbrepo_oai_identifiers_list` | List the identifiers | +| `dbrepo_oai_identify` | Identify the repository | +| `dbrepo_oai_metadataformats_list` | List the metadata formats | +| `dbrepo_oai_record_get` | Get the record | +| `dbrepo_ontologies_create` | Register a new ontology | +| `dbrepo_ontologies_delete` | Delete an ontology | +| `dbrepo_ontologies_entities_find` | Find entities | +| `dbrepo_ontologies_find` | Find one ontology | +| `dbrepo_ontologies_findall` | List all ontologies | +| `dbrepo_ontologies_update` | Update an ontology | +| `dbrepo_semantic_column_analyse` | Suggest table column semantics | +| `dbrepo_semantic_concepts_findall` | List semantic concepts | +| `dbrepo_semantic_table_analyse` | Suggest table semantics | +| `dbrepo_semantic_units_findall` | List semantic units | +| `dbrepo_semantics_column_save` | Update a table column semantic mapping | +| `dbrepo_statistic_table_update` | Update table statistics | +| `dbrepo_table_create` | Create a table | +| `dbrepo_table_delete` | Delete a table | +| `dbrepo_tables_find` | Get information about table | +| `dbrepo_tables_findall` | List all tables | +| `dbrepo_tables_refresh` | Refresh database tables metadata | +| `dbrepo_user_create` | Create user | +| `dbrepo_user_find` | Get a user info | +| `dbrepo_user_modify` | Modify user information | +| `dbrepo_user_password_modify` | Modify user password | +| `dbrepo_user_refresh_token` | Refresh user token | +| `dbrepo_user_token` | Obtain user token | +| `dbrepo_users_list` | Find all users | +| `dbrepo_view_create` | Create a view | +| `dbrepo_view_delete` | Delete one view | +| `dbrepo_view_find` | Find one view | +| `dbrepo_views_findall` | Find all views | +| `dbrepo_views_refresh` | Refresh database views metadata | diff --git a/dbrepo-metadata-service/oai/pom.xml b/dbrepo-metadata-service/oai/pom.xml index 591462a4e8..e432736721 100644 --- a/dbrepo-metadata-service/oai/pom.xml +++ b/dbrepo-metadata-service/oai/pom.xml @@ -6,33 +6,13 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.4.3</version> + <version>1.4.4</version> </parent> <artifactId>dbrepo-metadata-service-oai</artifactId> <name>dbrepo-metadata-service-oai</name> - <version>1.4.3</version> + <version>1.4.4</version> <dependencies/> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - <configuration> - <source>${java.version}</source> - <target>${java.version}</target> - <annotationProcessorPaths> - <path> - <groupId>org.projectlombok</groupId> - <artifactId>lombok</artifactId> - <version>${lombok.version}</version> - </path> - </annotationProcessorPaths> - </configuration> - </plugin> - </plugins> - </build> - </project> \ No newline at end of file diff --git a/dbrepo-metadata-service/pom.xml b/dbrepo-metadata-service/pom.xml index e770adf57f..2e6651d9cf 100644 --- a/dbrepo-metadata-service/pom.xml +++ b/dbrepo-metadata-service/pom.xml @@ -11,7 +11,7 @@ <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> <name>dbrepo-metadata-service</name> - <version>1.4.3</version> + <version>1.4.4</version> <description>Service that manages the metadata</description> @@ -72,7 +72,6 @@ <apache-jena.version>4.10.0</apache-jena.version> <opencsv.version>5.7.1</opencsv.version> <super-csv.version>2.4.0</super-csv.version> - <jsql.version>4.6</jsql.version> <keycloak.version>21.0.2</keycloak.version> <springdoc-openapi.version>2.3.0</springdoc-openapi.version> <testcontainers.version>1.19.1</testcontainers.version> @@ -232,11 +231,6 @@ <version>${rabbitmq.version}</version> </dependency> <!-- Testing --> - <dependency> - <groupId>com.github.jsqlparser</groupId> - <artifactId>jsqlparser</artifactId> - <version>${jsql.version}</version> - </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> diff --git a/dbrepo-metadata-service/report/pom.xml b/dbrepo-metadata-service/report/pom.xml index 21d50f9082..9012f19379 100644 --- a/dbrepo-metadata-service/report/pom.xml +++ b/dbrepo-metadata-service/report/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.4.3</version> + <version>1.4.4</version> </parent> <artifactId>dbrepo-metadata-service-report</artifactId> <name>dbrepo-metadata-service-report</name> - <version>1.4.3</version> + <version>1.4.4</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/repositories/pom.xml b/dbrepo-metadata-service/repositories/pom.xml index 7bee38495a..1fa4ba34e7 100644 --- a/dbrepo-metadata-service/repositories/pom.xml +++ b/dbrepo-metadata-service/repositories/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.4.3</version> + <version>1.4.4</version> </parent> <artifactId>dbrepo-metadata-service-repositories</artifactId> <name>dbrepo-metadata-service-repositories</name> - <version>1.4.3</version> + <version>1.4.4</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/exception/CredentialsInvalidException.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/exception/CredentialsInvalidException.java index b7c6b8d03b..984c70f485 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/exception/CredentialsInvalidException.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/exception/CredentialsInvalidException.java @@ -3,7 +3,7 @@ package at.tuwien.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; -@ResponseStatus(code = HttpStatus.UNAUTHORIZED, reason = "error.user.credentials") +@ResponseStatus(code = HttpStatus.FORBIDDEN, reason = "error.user.credentials") public class CredentialsInvalidException extends Exception { public CredentialsInvalidException(String msg) { diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java index ce89fc93c6..c2428f5f2a 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/DatabaseMapper.java @@ -44,11 +44,15 @@ public interface DatabaseMapper { } @Mappings({ - @Mapping(target = "id", source = "id"), @Mapping(target = "created", source = "created", dateFormat = "dd-MM-yyyy HH:mm"), }) DatabaseDto databaseToDatabaseDto(Database data); + @Mappings({ + @Mapping(target = "created", source = "created", dateFormat = "dd-MM-yyyy HH:mm"), + }) + DatabaseBriefDto databaseToDatabaseBriefDto(Database data); + AccessType accessTypeDtoToAccessType(AccessTypeDto data); AccessTypeDto accessTypeToAccessTypeDto(AccessType data); diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java deleted file mode 100644 index f5b74f4b28..0000000000 --- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/QueryMapper.java +++ /dev/null @@ -1,196 +0,0 @@ -package at.tuwien.mapper; - -import at.tuwien.entities.database.Database; -import at.tuwien.entities.database.View; -import at.tuwien.entities.database.ViewColumn; -import at.tuwien.entities.database.table.Table; -import at.tuwien.entities.database.table.columns.TableColumn; -import at.tuwien.entities.database.table.columns.TableColumnType; -import net.sf.jsqlparser.JSQLParserException; -import net.sf.jsqlparser.parser.CCJSqlParserManager; -import net.sf.jsqlparser.schema.Column; -import net.sf.jsqlparser.statement.select.*; -import net.sf.jsqlparser.statement.select.PlainSelect; -import net.sf.jsqlparser.statement.select.Select; -import net.sf.jsqlparser.statement.select.SelectItem; -import org.mapstruct.Mapper; -import org.springframework.transaction.annotation.Transactional; - -import java.io.*; -import java.math.BigInteger; -import java.sql.*; -import java.time.*; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -@Mapper(componentModel = "spring", imports = {LinkedList.class}) -public interface QueryMapper { - - org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(QueryMapper.class); - - /** - * Parses the stored columns from a given query. - * - * @param query The query. - * @param database The database that contains the list of tables with list of columns. - * @return List of columns in the order they are referenced in the query. - * @throws JSQLParserException The columns could not be extracted from the query. - */ - @Transactional(readOnly = true) - default List<TableColumn> parseColumns(String query, Database database) throws JSQLParserException { - final List<TableColumn> columns = new ArrayList<>(); - final CCJSqlParserManager parserRealSql = new CCJSqlParserManager(); - final net.sf.jsqlparser.statement.Statement statement = parserRealSql.parse(new StringReader(query)); - log.debug("parse columns from query: {}", query); - /* check */ - if (!(statement instanceof Select)) { - log.error("Query attempts to update the dataset, not a SELECT statement"); - throw new JSQLParserException("Query attempts to update the dataset"); - } - /* start parsing */ - final Select selectStatement = (Select) statement; - final PlainSelect ps = (PlainSelect) selectStatement.getSelectBody(); - final List<SelectItem> clauses = ps.getSelectItems(); - log.trace("columns referenced in the from-clause: {}", clauses); - /* Parse all tables */ - final List<FromItem> fromItems = new ArrayList<>(fromItemToFromItems(ps.getFromItem())); - if (ps.getJoins() != null && !ps.getJoins().isEmpty()) { - log.trace("query contains join items: {}", ps.getJoins()); - for (net.sf.jsqlparser.statement.select.Join j : ps.getJoins()) { - if (j.getRightItem() != null) { - fromItems.add(j.getRightItem()); - } - } - } - final List<ViewColumn> allColumns = Stream.of(database.getViews() - .stream() - .map(View::getColumns) - .flatMap(List::stream), - database.getTables() - .stream() - .map(Table::getColumns) - .flatMap(List::stream) - .map(c -> ViewColumn.builder() - .column(c) - .alias(c.getAlias()) - .ordinalPosition(c.getOrdinalPosition()) - .build()) - ) - .flatMap(i -> i) - .toList(); - log.trace("columns referenced in the from-clause and join-clause(s): {}", clauses); - /* Checking if all tables or views exist */ - log.trace("table/view/join referenced in the statement: {}", fromItems.stream().map(this::fromItemToFromItems).flatMap(List::stream).collect(Collectors.toList())); - /* Checking if all columns exist */ - for (SelectItem clause : clauses) { - final SelectExpressionItem item = (SelectExpressionItem) clause; - final Column column = (Column) item.getExpression(); - final Optional<net.sf.jsqlparser.schema.Table> optional = fromItems.stream() - .map(t -> (net.sf.jsqlparser.schema.Table) t) - .filter(t -> { - if (column.getTable() == null) { - /* column does not reference a specific table, so there is only one table */ - final String tableName = ((net.sf.jsqlparser.schema.Table) fromItems.get(0)).getName().replace("`", ""); - return tableMatches(t, tableName); - } - final String tableName = column.getTable().getName().replace("`", ""); - return tableMatches(t, tableName); - }) - .findFirst(); - if (optional.isEmpty()) { - log.error("Failed to find table/view {} (with designator {})", column.getTable().getName(), column.getTable().getAlias()); - throw new JSQLParserException("Failed to find table/view " + column.getTable().getName() + " (with alias " + column.getTable().getAlias() + ")"); - } - final String columnName = column.getColumnName().replace("`", ""); - final String tableOrView = optional.get().getName().replace("`", ""); - final List<ViewColumn> filteredColumns = allColumns.stream() - .filter(c -> (c.getAlias() != null && c.getAlias().equals(columnName)) || c.getColumn().getInternalName().equals(columnName)) - .toList(); - final Optional<ViewColumn> optionalColumn = filteredColumns.stream() - .filter(c -> columnMatches(c, tableOrView)) - .findFirst(); - if (optionalColumn.isEmpty()) { - log.error("Failed to find column with name {} of table/view {} in {}", columnName, tableOrView, filteredColumns.stream().map(c -> c.getColumn().getTable().getInternalName() + "." + c.getColumn().getInternalName()).toList()); - throw new JSQLParserException("Failed to find column with name " + columnName + " of table/view " + tableOrView); - } - final ViewColumn resultColumn = optionalColumn.get(); - if (item.getAlias() != null) { - resultColumn.getColumn().setAlias(item.getAlias().getName().replace("`", "")); - } - log.trace("found column with internal name {} and alias {}", resultColumn.getColumn().getInternalName(), resultColumn.getAlias()); - columns.add(resultColumn.getColumn()); - } - return columns; - } - - default List<FromItem> fromItemToFromItems(FromItem data) { - return fromItemToFromItems(data, 0); - } - - default List<FromItem> fromItemToFromItems(FromItem data, Integer level) { - final List<FromItem> fromItems = new LinkedList<>(); - if (data instanceof net.sf.jsqlparser.schema.Table table) { - fromItems.add(data); - log.trace("from-item {} is of type table: level ~> {}", table.getName(), level); - return fromItems; - } - if (data instanceof SubJoin subJoin) { - log.trace("from-item is of type sub-join: level ~> {}", level); - for (Join join : subJoin.getJoinList()) { - fromItems.addAll(fromItemToFromItems(join.getRightItem(), level + 1)); - } - fromItems.addAll(fromItemToFromItems(((SubJoin) data).getLeft(), level + 1)); - return fromItems; - } - log.warn("unknown from-item {}", data); - return null; - } - - default boolean tableMatches(net.sf.jsqlparser.schema.Table table, String otherTableName) { - final String tableName = table.getName() - .trim() - .replace("`", ""); - if (table.getAlias() == null) { - /* table does not have designator */ - log.trace("table {} has no designator", tableName); - return tableName.equals(otherTableName); - } - /* has designator */ - final String designator = table.getAlias() - .getName() - .trim() - .replace("`", ""); - log.trace("table {} has designator {}", tableName, designator); - return designator.equals(otherTableName); - } - - @Transactional(readOnly = true) - default boolean columnMatches(ViewColumn column, String tableOrView) { - if (column.getView() != null && column.getView().getInternalName().equals(tableOrView)) { - log.trace("view {} found in column table", tableOrView); - return true; - } - if (column.getColumn().getTable().getInternalName().equals(tableOrView)) { - log.trace("table {} found in column table", tableOrView); - return true; - } - if (column.getColumn().getViews() == null) { - log.trace("table/view {} not found among column views: empty list", tableOrView); - return false; - } - /* maybe matches one of the other views */ - final boolean found = column.getColumn() - .getViews() - .stream() - .anyMatch(v -> v.getInternalName().equals(tableOrView)); - if (!found) { - log.trace("table/view {} not found among column views: {}", tableOrView, column.getColumn().getViews().stream().map(View::getInternalName).toList()); - } - return found; - } - - -} diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/TableMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/TableMapper.java index 62d05fcbba..a63bc5c945 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/TableMapper.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/TableMapper.java @@ -1,16 +1,16 @@ package at.tuwien.mapper; -import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.table.TableBriefDto; import at.tuwien.api.database.table.TableDto; import at.tuwien.api.database.table.columns.ColumnCreateDto; import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.database.table.constraints.ConstraintsCreateDto; import at.tuwien.api.database.table.constraints.ConstraintsDto; +import at.tuwien.api.database.table.constraints.foreign.ForeignKeyDto; +import at.tuwien.api.database.table.constraints.foreign.ForeignKeyReferenceDto; import at.tuwien.api.database.table.constraints.unique.UniqueDto; import at.tuwien.entities.container.image.ContainerImage; import at.tuwien.entities.database.Database; -import at.tuwien.entities.database.View; import at.tuwien.entities.database.table.Table; import at.tuwien.entities.database.table.columns.TableColumn; import at.tuwien.entities.database.table.constraints.Constraints; @@ -26,7 +26,7 @@ import java.util.*; import java.util.regex.Pattern; import java.util.stream.Collectors; -@Mapper(componentModel = "spring", uses = {IdentifierMapper.class, UserMapper.class}, imports = {Collectors.class}) +@Mapper(componentModel = "spring", uses = {IdentifierMapper.class, UserMapper.class}, imports = {Collectors.class, LinkedList.class}) public interface TableMapper { org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(TableMapper.class); @@ -38,25 +38,53 @@ public interface TableMapper { }) TableBriefDto tableToTableBriefDto(Table data); - @Mappings({ - @Mapping(target = "table.constraints", ignore = true), - }) - UniqueDto uniqueToUniqueDto(Unique data); + TableBriefDto tableDtoToTableBriefDto(TableDto data); + + /* keep */ + default UniqueDto uniqueToUniqueDto(Unique data) { + return UniqueDto.builder() + .uid(data.getUid()) + .name("uk") + .columns(data.getColumns().stream().map(this::tableColumnToColumnDto).toList()) + .table(tableToTableBriefDto(data.getTable())) + .build(); + } @Mappings({ @Mapping(target = "name", expression = "java(data.getName())"), @Mapping(target = "internalName", expression = "java(data.getInternalName())"), @Mapping(target = "queueName", expression = "java(data.getQueueName())"), @Mapping(target = "routingKey", expression = "java(\"dbrepo.\" + data.getTdbid() + \".\" + data.getId())"), - @Mapping(target = "isPublic", source = "database.isPublic") + @Mapping(target = "isPublic", source = "database.isPublic"), }) TableDto tableToTableDto(Table data); - /* keep */ @Mappings({ - @Mapping(target = "primaryKey", expression = "java(data.getPrimaryKey().stream().map(pk -> pk.getColumn().getInternalName()).collect(Collectors.toSet()))") + @Mapping(target = "table", ignore = true), + @Mapping(target = "referencedTable", ignore = true), + }) + ForeignKeyDto foreignKeyToForeignKeyDto(ForeignKey foreignKey); + + @Mappings({ + @Mapping(target = "foreignKey", ignore = true), }) - ConstraintsDto constraintsToConstraintsDto(Constraints data); + ForeignKeyReferenceDto foreignKeyReferenceToForeignKeyReferenceDto(ForeignKeyReference foreignKeyReference); + + @Mappings({ + @Mapping(target = "table", ignore = true) + }) + TableColumn columnDtoToTableColumn(ColumnDto columnDto); + + @Mappings({ + @Mapping(target = "table", ignore = true) + }) + Unique uniqueDtoToUnique(UniqueDto data); + + @Mappings({ + @Mapping(target = "constraints.primaryKey", expression = "java(new LinkedList<>())"), + @Mapping(target = "ownedBy", source = "owner.id"), + }) + Table tableDtoToTable(TableDto data); /* keep */ default Constraints constraintsCreateDtoToConstraints(ConstraintsCreateDto data, Database database, Table table) { @@ -151,13 +179,13 @@ public interface TableMapper { @Mapping(target = "tableId", source = "table.id"), @Mapping(target = "databaseId", source = "table.database.id"), @Mapping(target = "isPublic", source = "table.database.isPublic"), + @Mapping(target = "description", source = "description"), @Mapping(target = "table.columns", ignore = true), @Mapping(target = "table.constraints", ignore = true), @Mapping(target = "views", ignore = true) }) ColumnDto tableColumnToColumnDto(TableColumn data); - @Named("internalMapping") default String nameToInternalName(String data) { if (data == null || data.isEmpty()) { diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/ViewMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/ViewMapper.java index 7333639371..7d8f2416b1 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/ViewMapper.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/ViewMapper.java @@ -3,16 +3,12 @@ package at.tuwien.mapper; import at.tuwien.api.database.ViewBriefDto; import at.tuwien.api.database.ViewDto; import at.tuwien.entities.database.View; -import at.tuwien.entities.database.ViewColumn; -import at.tuwien.entities.database.table.columns.TableColumn; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; import org.mapstruct.Named; -import org.springframework.transaction.annotation.Transactional; import java.text.Normalizer; -import java.util.List; import java.util.Locale; import java.util.regex.Pattern; @@ -44,24 +40,9 @@ public interface ViewMapper { ViewBriefDto viewToViewBriefDto(View data); - @Transactional(readOnly = true) - default TableColumn viewColumnToTableColumn(ViewColumn data) { - return data.getColumn() - .toBuilder() - .alias(data.getAlias()) - .build(); - } - - default List<ViewColumn> tableColumnsToViewColumns(View view, List<TableColumn> data) { - final int[] idx = new int[]{0}; - return data.stream() - .map(c -> ViewColumn.builder() - .ordinalPosition(idx[0]++) - .column(c) - .view(view) - .alias(c.getAlias()) - .build()) - .toList(); - } + @Mappings({ + @Mapping(target = "createdBy", source = "creator.id"), + }) + View viewDtoToView(ViewDto data); } diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/repository/ContainerRepository.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/repository/ContainerRepository.java index 8155aef9cc..e1a1f209e3 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/repository/ContainerRepository.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/repository/ContainerRepository.java @@ -1,6 +1,7 @@ package at.tuwien.repository; import at.tuwien.entities.container.Container; +import at.tuwien.entities.container.image.ContainerImageDate; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/dbrepo-metadata-service/rest-service/pom.xml b/dbrepo-metadata-service/rest-service/pom.xml index ba715899b7..97e108fa0d 100644 --- a/dbrepo-metadata-service/rest-service/pom.xml +++ b/dbrepo-metadata-service/rest-service/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.4.3</version> + <version>1.4.4</version> </parent> <artifactId>dbrepo-metadata-service-rest-service</artifactId> <name>dbrepo-metadata-service-rest</name> - <version>1.4.3</version> + <version>1.4.4</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java index 3fe8d96df6..ea66257cc1 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/AccessEndpoint.java @@ -54,7 +54,7 @@ public class AccessEndpoint { @PostMapping("/{userId}") @Transactional - @Observed(name = "dbrepo_metadata_access_give") + @Observed(name = "dbrepo_access_give") @PreAuthorize("hasAuthority('create-database-access')") @Operation(summary = "Give access to some database", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @@ -120,7 +120,7 @@ public class AccessEndpoint { @PutMapping("/{userId}") @Transactional - @Observed(name = "dbrepo_metadata_access_modify") + @Observed(name = "dbrepo_access_modify") @PreAuthorize("hasAuthority('update-database-access')") @Operation(summary = "Modify access to some database", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @@ -175,7 +175,7 @@ public class AccessEndpoint { @RequestMapping(value = "/{userId}", method = {RequestMethod.GET, RequestMethod.HEAD}) @Transactional(readOnly = true) - @Observed(name = "dbrepo_metadata_access_get") + @Observed(name = "dbrepo_access_get") @PreAuthorize("hasAuthority('check-database-access') or hasAuthority('admin')") @Operation(summary = "Check access to some database", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @@ -218,7 +218,7 @@ public class AccessEndpoint { @DeleteMapping("/{userId}") @Transactional - @Observed(name = "dbrepo_metadata_access_delete") + @Observed(name = "dbrepo_access_delete") @PreAuthorize("hasAuthority('delete-database-access')") @Operation(summary = "Revoke access to some database", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ConceptEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ConceptEndpoint.java index 8cdc6f2513..2d002e8449 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ConceptEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ConceptEndpoint.java @@ -36,7 +36,7 @@ public class ConceptEndpoint { @GetMapping @Transactional(readOnly = true) - @Observed(name = "dbrepo_metadata_semantic_concepts_findall") + @Observed(name = "dbrepo_semantic_concepts_findall") @Operation(summary = "List semantic concepts") @ApiResponses(value = { @ApiResponse(responseCode = "200", diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java index 45c45a816f..02f5a00f2b 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java @@ -53,7 +53,7 @@ public class ContainerEndpoint { @GetMapping @Transactional(readOnly = true) - @Observed(name = "dbrepo_metadata_container_findall") + @Observed(name = "dbrepo_container_findall") @Operation(summary = "Find all containers") @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -75,7 +75,7 @@ public class ContainerEndpoint { @PostMapping @Transactional - @Observed(name = "dbrepo_metadata_container_create") + @Observed(name = "dbrepo_container_create") @PreAuthorize("hasAuthority('create-container')") @Operation(summary = "Create container", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @@ -107,7 +107,7 @@ public class ContainerEndpoint { @GetMapping("/{containerId}") @Transactional(readOnly = true) - @Observed(name = "dbrepo_metadata_container_find") + @Observed(name = "dbrepo_container_find") @Operation(summary = "Find some container") @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -135,6 +135,7 @@ public class ContainerEndpoint { log.trace("attach privileged credential information"); headers.set("X-Username", container.getPrivilegedUsername()); headers.set("X-Password", container.getPrivilegedPassword()); + headers.set("Access-Control-Expose-Headers", "X-Username X-Password"); } } return ResponseEntity.ok() @@ -144,7 +145,7 @@ public class ContainerEndpoint { @DeleteMapping("/{containerId}") @Transactional - @Observed(name = "dbrepo_metadata_container_delete") + @Observed(name = "dbrepo_container_delete") @PreAuthorize("hasAuthority('delete-container')") @Operation(summary = "Delete some container", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java index 1cbf313378..b364e2dcfc 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java @@ -1,7 +1,6 @@ package at.tuwien.endpoints; import at.tuwien.api.amqp.ExchangeDto; -import at.tuwien.api.auth.LoginRequestDto; import at.tuwien.api.database.*; import at.tuwien.api.error.ApiErrorDto; import at.tuwien.config.RabbitConfig; @@ -45,29 +44,27 @@ public class DatabaseEndpoint { private final UserService userService; private final RabbitConfig rabbitConfig; private final AccessService accessService; - private final BrokerService messageQueueService; + private final BrokerService brokerService; private final DatabaseMapper databaseMapper; private final StorageService storageService; private final DatabaseService databaseService; - private final AuthenticationService authenticationService; @Autowired public DatabaseEndpoint(UserService userService, RabbitConfig rabbitConfig, AccessService accessService, - BrokerService messageQueueService, DatabaseMapper databaseMapper, - StorageService storageService, DatabaseService databaseService, AuthenticationService authenticationService) { + BrokerService brokerService, DatabaseMapper databaseMapper, + StorageService storageService, DatabaseService databaseService) { this.userService = userService; this.rabbitConfig = rabbitConfig; this.accessService = accessService; - this.messageQueueService = messageQueueService; + this.brokerService = brokerService; this.databaseMapper = databaseMapper; this.storageService = storageService; this.databaseService = databaseService; - this.authenticationService = authenticationService; } @RequestMapping(method = {RequestMethod.GET, RequestMethod.HEAD}) @Transactional(readOnly = true) - @Observed(name = "dbrepo_metadata_database_findall") + @Observed(name = "dbrepo_database_findall") @Operation(summary = "List databases") @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -76,19 +73,19 @@ public class DatabaseEndpoint { mediaType = "application/json", array = @ArraySchema(schema = @Schema(implementation = DatabaseDto.class)))}), }) - public ResponseEntity<List<DatabaseDto>> list(@RequestParam(name = "internal_name", required = false) String internalName) { + public ResponseEntity<List<DatabaseBriefDto>> list(@RequestParam(name = "internal_name", required = false) String internalName) { log.debug("endpoint list databases, internalName={}", internalName); - List<DatabaseDto> dtos = new LinkedList<>(); + List<DatabaseBriefDto> dtos = new LinkedList<>(); if (internalName != null) { try { - dtos = List.of(databaseMapper.databaseToDatabaseDto(databaseService.findByInternalName(internalName))); + dtos = List.of(databaseMapper.databaseToDatabaseBriefDto(databaseService.findByInternalName(internalName))); } catch (DatabaseNotFoundException e) { /* ignore */ } } else { dtos = databaseService.findAll() .stream() - .map(databaseMapper::databaseToDatabaseDto) + .map(databaseMapper::databaseToDatabaseBriefDto) .toList(); } log.trace("list databases resulted in {} database(s)", dtos.size()); @@ -103,7 +100,7 @@ public class DatabaseEndpoint { @PostMapping @Transactional(rollbackFor = Exception.class) @PreAuthorize("hasAuthority('create-database')") - @Observed(name = "dbrepo_metadata_database_create") + @Observed(name = "dbrepo_database_create") @Operation(summary = "Create database", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "201", @@ -122,7 +119,7 @@ public class DatabaseEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "404", - description = "Container, user or database could not be found", + description = "Failed to fin container/user/database in metadata database", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -131,8 +128,13 @@ public class DatabaseEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "503", - description = "Connection to the database failed", + description = "Failed to save in search service", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -149,10 +151,107 @@ public class DatabaseEndpoint { .body(dto); } + @PutMapping("/{databaseId}/metadata/table") + @Transactional(rollbackFor = {SearchServiceException.class, SearchServiceConnectionException.class, DatabaseNotFoundException.class}) + @PreAuthorize("hasAuthority('find-database')") + @Observed(name = "dbrepo_tables_refresh") + @Operation(summary = "Refresh database tables metadata", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", + description = "Refreshed database tables metadata", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = DatabaseDto.class))}), + @ApiResponse(responseCode = "400", + description = "Failed to parse payload at search service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "403", + description = "Not allowed to refresh table metadata", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to fin user/database in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to save in search service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + }) + public ResponseEntity<DatabaseDto> refreshTableMetadata(@NotNull @PathVariable("databaseId") Long databaseId, + @NotNull Principal principal) throws ServiceException, + ServiceConnectionException, DatabaseNotFoundException, SearchServiceException, + SearchServiceConnectionException, NotAllowedException, QueryNotFoundException, MalformedException { + log.debug("endpoint refresh database metadata, databaseId={}", databaseId); + Database database = databaseService.findById(databaseId); + if (!database.getOwner().equals(principal)) { + log.error("Failed to refresh database tables metadata: not owner"); + throw new NotAllowedException("Failed to refresh tables metadata: not owner"); + } + final DatabaseDto dto = databaseMapper.databaseToDatabaseDto(databaseService.updateTableMetadata(database)); + return ResponseEntity.ok(dto); + } + + @PutMapping("/{databaseId}/metadata/view") + @Transactional(rollbackFor = {SearchServiceException.class, SearchServiceConnectionException.class, DatabaseNotFoundException.class}) + @PreAuthorize("hasAuthority('find-database')") + @Observed(name = "dbrepo_views_refresh") + @Operation(summary = "Refresh database views metadata", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", + description = "Refreshed database views metadata", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = DatabaseDto.class))}), + @ApiResponse(responseCode = "403", + description = "Refresh view metadata is not permitted", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find database in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to save in search service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + }) + public ResponseEntity<DatabaseDto> refreshViewMetadata(@NotNull @PathVariable("databaseId") Long databaseId, + @NotNull Principal principal) throws ServiceException, + ServiceConnectionException, DatabaseNotFoundException, SearchServiceException, + SearchServiceConnectionException, NotAllowedException, QueryNotFoundException { + log.debug("endpoint refresh database metadata, databaseId={}", databaseId); + Database database = databaseService.findById(databaseId); + if (!database.getOwner().equals(principal)) { + log.error("Failed to refresh database views metadata: not owner"); + throw new NotAllowedException("Failed to refresh database views metadata: not owner"); + } + final DatabaseDto dto = databaseMapper.databaseToDatabaseDto(databaseService.updateViewMetadata(database)); + return ResponseEntity.ok(dto); + } + @PutMapping("/{databaseId}/visibility") @Transactional @PreAuthorize("hasAuthority('modify-database-visibility')") - @Observed(name = "dbrepo_metadata_database_visibility") + @Observed(name = "dbrepo_database_visibility") @Operation(summary = "Update database visibility", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", @@ -160,13 +259,23 @@ public class DatabaseEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = DatabaseDto.class))}), + @ApiResponse(responseCode = "403", + description = "Visibility modification is not permitted", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "404", - description = "Database could not be found", + description = "Failed to find database in metadata database", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "403", - description = "Visibility modification is not permitted", + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to save in search service", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -189,7 +298,7 @@ public class DatabaseEndpoint { @PutMapping("/{databaseId}/owner") @Transactional @PreAuthorize("hasAuthority('modify-database-owner')") - @Observed(name = "dbrepo_metadata_database_transfer") + @Observed(name = "dbrepo_database_transfer") @Operation(summary = "Update database owner", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", @@ -207,6 +316,16 @@ public class DatabaseEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to save in search service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<DatabaseDto> transfer(@NotNull @PathVariable("databaseId") Long databaseId, @Valid @RequestBody DatabaseTransferDto data, @@ -229,7 +348,7 @@ public class DatabaseEndpoint { @PutMapping("/{databaseId}/image") @Transactional @PreAuthorize("hasAuthority('modify-database-image')") - @Observed(name = "dbrepo_metadata_database_image") + @Observed(name = "dbrepo_database_image") @Operation(summary = "Update database image", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", @@ -252,6 +371,16 @@ public class DatabaseEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to save in search service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<DatabaseDto> modifyImage(@NotNull @PathVariable("databaseId") Long databaseId, @Valid @RequestBody DatabaseModifyImageDto data, @@ -277,7 +406,7 @@ public class DatabaseEndpoint { @GetMapping("/{databaseId}") @Transactional(readOnly = true) - @Observed(name = "dbrepo_metadata_database_find") + @Observed(name = "dbrepo_database_find") @Operation(summary = "Find some database", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -290,11 +419,16 @@ public class DatabaseEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "503", + @ApiResponse(responseCode = "502", description = "Connection to the broker service could not be established", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to find queue information in broker service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<DatabaseDto> findById(@NotNull @PathVariable("databaseId") Long databaseId, Principal principal) throws ServiceException, @@ -314,7 +448,7 @@ public class DatabaseEndpoint { final HttpHeaders headers = new HttpHeaders(); if (principal != null) { /* extra effort only when having access */ - final ExchangeDto exchange = messageQueueService.findExchange(rabbitConfig.getExchangeName()); + final ExchangeDto exchange = brokerService.findExchange(rabbitConfig.getExchangeName()); dto.setExchangeType(exchange.getType()); final Authentication authentication = (Authentication) principal; if (authentication.isAuthenticated() && authentication.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("admin"))) { diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java index c5af4657ba..726d118f13 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java @@ -85,7 +85,7 @@ public class IdentifierEndpoint { @GetMapping(produces = {MediaType.APPLICATION_JSON_VALUE, "application/ld+json"}) @Transactional(readOnly = true) - @Observed(name = "dbrepo_metadata_identifier_list") + @Observed(name = "dbrepo_identifier_list") @Operation(summary = "Find all identifiers") @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -140,7 +140,7 @@ public class IdentifierEndpoint { MediaType.TEXT_XML_VALUE, "text/csv", "text/bibliography", "text/bibliography; style=apa", "text/bibliography; style=ieee", "text/bibliography; style=bibtex"}) @Transactional(readOnly = true) - @Observed(name = "dbrepo_metadata_identifier_find") + @Observed(name = "dbrepo_identifier_find") @Operation(summary = "Find some identifier") @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -158,37 +158,48 @@ public class IdentifierEndpoint { @ApiResponse(responseCode = "400", description = "Identifier could not be exported, the requested style is not known", content = {@Content( - mediaType = "text/bibliography", + mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "404", description = "Identifier could not be found", content = {@Content( - mediaType = "text/csv", + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "406", + description = "Failed to find acceptable representation", + content = {@Content( + mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "409", description = "Exported resource was not found", content = {@Content( - mediaType = "text/csv", + mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "410", description = "Failed to retrieve from S3 endpoint", content = {@Content( - mediaType = "text/csv", + mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "422", description = "Failed to retrieve from database sidecar", content = {@Content( - mediaType = "text/csv", + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to data service failed", + content = {@Content( + mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "503", - description = "Identifier could not exported from database as it is not reachable", + description = "Failed to find in data service", content = {@Content( - mediaType = "text/csv", + mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<?> find(@Valid @PathVariable("identifierId") Long identifierId, @RequestHeader(HttpHeaders.ACCEPT) String accept) throws IdentifierNotFoundException, - ServiceException, ServiceConnectionException, MalformedException, FormatNotAvailableException, QueryNotFoundException { + ServiceException, ServiceConnectionException, MalformedException, FormatNotAvailableException, + QueryNotFoundException { log.debug("endpoint find identifier, identifierId={}, accept={}", identifierId, accept); final Identifier identifier = identifierService.find(identifierId); log.info("Found persistent identifier with id {}", identifier.getId()); @@ -252,7 +263,7 @@ public class IdentifierEndpoint { @DeleteMapping("/{identifierId}") @Transactional - @Observed(name = "dbrepo_metadata_identifier_delete") + @Observed(name = "dbrepo_identifier_delete") @PreAuthorize("hasAuthority('delete-identifier')") @Operation(summary = "Delete some identifier", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @@ -267,7 +278,17 @@ public class IdentifierEndpoint { description = "Identifier or database could not be found", content = {@Content( mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}) + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to delete in search service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<?> delete(@NotNull @PathVariable("identifierId") Long identifierId) throws IdentifierNotFoundException, NotAllowedException, ServiceException, ServiceConnectionException, @@ -286,7 +307,7 @@ public class IdentifierEndpoint { @PutMapping("/{identifierId}/publish") @Transactional - @Observed(name = "dbrepo_metadata_identifier_publish") + @Observed(name = "dbrepo_identifier_publish") @PreAuthorize("hasAuthority('publish-identifier')") @Operation(summary = "Publish identifier", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @@ -315,8 +336,13 @@ public class IdentifierEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "503", - description = "DataCite system did not respond", + description = "Failed to save in search service", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -332,7 +358,7 @@ public class IdentifierEndpoint { @PutMapping("/{identifierId}") @Transactional(rollbackFor = {Exception.class}) - @Observed(name = "dbrepo_metadata_identifier_save") + @Observed(name = "dbrepo_identifier_save") @PreAuthorize("hasAuthority('create-identifier') or hasAuthority('create-foreign-identifier')") @Operation(summary = "Save identifier", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @@ -361,8 +387,13 @@ public class IdentifierEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "503", - description = "DataCite system did not respond", + description = "Failed to save in search service", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -452,7 +483,7 @@ public class IdentifierEndpoint { @PostMapping @Transactional(rollbackFor = {Exception.class}) - @Observed(name = "dbrepo_metadata_identifier_create") + @Observed(name = "dbrepo_identifier_create") @PreAuthorize("hasAuthority('create-identifier') or hasAuthority('create-foreign-identifier')") @Operation(summary = "Draft identifier", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @@ -481,8 +512,13 @@ public class IdentifierEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "503", - description = "DataCite system did not respond", + description = "Failed to save in search service", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -492,7 +528,7 @@ public class IdentifierEndpoint { UserNotFoundException, NotAllowedException, MalformedException, ServiceConnectionException, SearchServiceException, ServiceException, QueryNotFoundException, SearchServiceConnectionException, IdentifierNotFoundException, ViewNotFoundException { - log.debug("endpoint create identifier"); + log.debug("endpoint create identifier, data.databaseId={}", data.getDatabaseId()); final Database database = databaseService.findById(data.getDatabaseId()); final User user = userService.findByUsername(principal.getName()); /* check access */ @@ -512,7 +548,7 @@ public class IdentifierEndpoint { } @GetMapping("/retrieve") - @Observed(name = "dbrepo_metadata_identifier_retrieve") + @Observed(name = "dbrepo_identifier_retrieve") @Operation(summary = "Retrieve metadata from identifier") @ApiResponses(value = { @ApiResponse(responseCode = "200", diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ImageEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ImageEndpoint.java index 52428de24b..44b25250a8 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ImageEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ImageEndpoint.java @@ -51,7 +51,7 @@ public class ImageEndpoint { @GetMapping @Transactional(readOnly = true) - @Observed(name = "dbrepo_metadata_image_findall") + @Observed(name = "dbrepo_image_findall") @Operation(summary = "Find all images") @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -71,7 +71,7 @@ public class ImageEndpoint { @PostMapping @Transactional - @Observed(name = "dbrepo_metadata_image_create") + @Observed(name = "dbrepo_image_create") @PreAuthorize("hasAuthority('create-image')") @Operation(summary = "Create image", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @@ -108,7 +108,7 @@ public class ImageEndpoint { @GetMapping("/{imageId}") @Transactional(readOnly = true) - @Observed(name = "dbrepo_metadata_image_find") + @Observed(name = "dbrepo_image_find") @Operation(summary = "Find some image") @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -133,7 +133,7 @@ public class ImageEndpoint { @PutMapping("/{imageId}") @Transactional - @Observed(name = "dbrepo_metadata_image_update") + @Observed(name = "dbrepo_image_update") @PreAuthorize("hasAuthority('modify-image')") @Operation(summary = "Update some image", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @@ -162,7 +162,7 @@ public class ImageEndpoint { @DeleteMapping("/{imageId}") @Transactional - @Observed(name = "dbrepo_metadata_image_delete") + @Observed(name = "dbrepo_image_delete") @PreAuthorize("hasAuthority('delete-image')") @Operation(summary = "Delete some image", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/LicenseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/LicenseEndpoint.java index 3763e9943c..dd81274a29 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/LicenseEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/LicenseEndpoint.java @@ -40,7 +40,7 @@ public class LicenseEndpoint { @GetMapping @Transactional(readOnly = true) - @Observed(name = "dbrepo_metadata_license_findall") + @Observed(name = "dbrepo_license_findall") @Operation(summary = "Get all licenses") @ApiResponses(value = { @ApiResponse(responseCode = "200", diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MessageEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MessageEndpoint.java index ec7675b0d2..bcff92bc49 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MessageEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MessageEndpoint.java @@ -44,7 +44,7 @@ public class MessageEndpoint { } @GetMapping - @Observed(name = "dbrepo_metadata_maintenance_findall") + @Observed(name = "dbrepo_maintenance_findall") @Operation(summary = "Find maintenance messages") @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -72,7 +72,7 @@ public class MessageEndpoint { } @GetMapping("/message/{messageId}") - @Observed(name = "dbrepo_metadata_maintenance_find") + @Observed(name = "dbrepo_maintenance_find") @Operation(summary = "Find one maintenance message") @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -95,7 +95,7 @@ public class MessageEndpoint { } @PostMapping - @Observed(name = "dbrepo_metadata_maintenance_create") + @Observed(name = "dbrepo_maintenance_create") @Operation(summary = "Create maintenance message", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @PreAuthorize("hasAuthority('create-maintenance-message')") @ApiResponses(value = { @@ -114,7 +114,7 @@ public class MessageEndpoint { } @PutMapping("/{messageId}") - @Observed(name = "dbrepo_metadata_maintenance_update") + @Observed(name = "dbrepo_maintenance_update") @Operation(summary = "Update maintenance message", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @PreAuthorize("hasAuthority('update-maintenance-message')") @ApiResponses(value = { @@ -141,7 +141,7 @@ public class MessageEndpoint { } @DeleteMapping("/{messageId}") - @Observed(name = "dbrepo_metadata_maintenance_delete") + @Observed(name = "dbrepo_maintenance_delete") @Operation(summary = "Delete maintenance message", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @PreAuthorize("hasAuthority('delete-maintenance-message')") @ApiResponses(value = { diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java index c144511fda..18bf1c3e62 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java @@ -43,7 +43,7 @@ public class MetadataEndpoint { @ExampleObject(value = "GetRecord"), @ExampleObject(value = "ListMetadataFormats"), }) - @Observed(name = "dbrepo_metadata_oai_identify") + @Observed(name = "dbrepo_oai_identify") @Operation(summary = "Identify the repository") @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -56,7 +56,7 @@ public class MetadataEndpoint { } @GetMapping(params = "verb=Identify", produces = MediaType.TEXT_XML_VALUE) - @Observed(name = "dbrepo_metadata_oai_identify") + @Observed(name = "dbrepo_oai_identify") @Operation(summary = "Identify the repository") @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -71,7 +71,7 @@ public class MetadataEndpoint { } @GetMapping(params = "verb=ListIdentifiers", produces = MediaType.TEXT_XML_VALUE) - @Observed(name = "dbrepo_metadata_oai_identifiers_list") + @Observed(name = "dbrepo_oai_identifiers_list") @Operation(summary = "List the identifiers") public ResponseEntity<String> listIdentifiers(OaiListIdentifiersParameters parameters) { log.debug("endpoint list identifiers, verb=ListIdentifiers, parameters={}", parameters); @@ -81,7 +81,7 @@ public class MetadataEndpoint { } @GetMapping(params = "verb=GetRecord", produces = MediaType.TEXT_XML_VALUE) - @Observed(name = "dbrepo_metadata_oai_record_get") + @Observed(name = "dbrepo_oai_record_get") @Operation(summary = "Get the record") public ResponseEntity<String> getRecord(OaiRecordParameters parameters) { log.debug("endpoint get record, verb=GetRecord, parameters={}", parameters); @@ -116,7 +116,7 @@ public class MetadataEndpoint { } @GetMapping(params = "verb=ListMetadataFormats", produces = MediaType.TEXT_XML_VALUE) - @Observed(name = "dbrepo_metadata_oai_metadataformats_list") + @Observed(name = "dbrepo_oai_metadataformats_list") @Operation(summary = "List the metadata formats") public ResponseEntity<String> listMetadataFormats() { log.debug("endpoint list metadata formats, verb=ListMetadataFormats"); diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/OntologyEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/OntologyEndpoint.java index 80b646ed5f..d9a1b2c50b 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/OntologyEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/OntologyEndpoint.java @@ -45,7 +45,7 @@ public class OntologyEndpoint { } @GetMapping - @Observed(name = "dbrepo_metadata_ontologies_findall") + @Observed(name = "dbrepo_ontologies_findall") @Operation(summary = "List all ontologies") @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -65,7 +65,7 @@ public class OntologyEndpoint { } @GetMapping("/{ontologyId}") - @Observed(name = "dbrepo_metadata_ontologies_find") + @Observed(name = "dbrepo_ontologies_find") @Operation(summary = "Find one ontology") @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -79,7 +79,8 @@ public class OntologyEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<OntologyDto> find(@NotNull @PathVariable("ontologyId") Long ontologyId) throws OntologyNotFoundException { + public ResponseEntity<OntologyDto> find(@NotNull @PathVariable("ontologyId") Long ontologyId) + throws OntologyNotFoundException { log.debug("endpoint find all ontologies, ontologyId={}", ontologyId); final OntologyDto dto = ontologyMapper.ontologyToOntologyDto(ontologyService.find(ontologyId)); log.trace("create ontology resulted in dto {}", dto); @@ -88,7 +89,7 @@ public class OntologyEndpoint { @PostMapping @PreAuthorize("hasAuthority('create-ontology')") - @Observed(name = "dbrepo_metadata_ontologies_create") + @Observed(name = "dbrepo_ontologies_create") @Operation(summary = "Register a new ontology", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "201", @@ -108,7 +109,7 @@ public class OntologyEndpoint { @PutMapping("/{ontologyId}") @PreAuthorize("hasAuthority('update-ontology')") - @Observed(name = "dbrepo_metadata_ontologies_update") + @Observed(name = "dbrepo_ontologies_update") @Operation(summary = "Update an ontology", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", @@ -123,7 +124,8 @@ public class OntologyEndpoint { schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<OntologyDto> update(@NotNull @PathVariable("ontologyId") Long ontologyId, - @NotNull @Valid @RequestBody OntologyModifyDto data) throws OntologyNotFoundException { + @NotNull @Valid @RequestBody OntologyModifyDto data) + throws OntologyNotFoundException { log.debug("endpoint update ontology, data={}", data); final Ontology ontology = ontologyService.find(ontologyId); final OntologyDto dto = ontologyMapper.ontologyToOntologyDto(ontologyService.update(ontology, data)); @@ -134,7 +136,7 @@ public class OntologyEndpoint { @DeleteMapping("/{ontologyId}") @PreAuthorize("hasAuthority('delete-ontology')") - @Observed(name = "dbrepo_metadata_ontologies_delete") + @Observed(name = "dbrepo_ontologies_delete") @Operation(summary = "Delete an ontology", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", @@ -147,7 +149,8 @@ public class OntologyEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<?> delete(@NotNull @PathVariable("ontologyId") Long ontologyId) throws OntologyNotFoundException { + public ResponseEntity<?> delete(@NotNull @PathVariable("ontologyId") Long ontologyId) + throws OntologyNotFoundException { log.debug("endpoint delete ontology, ontologyId={}", ontologyId); final Ontology ontology = ontologyService.find(ontologyId); ontologyService.delete(ontology); @@ -157,7 +160,7 @@ public class OntologyEndpoint { @GetMapping("/{ontologyId}/entity") @PreAuthorize("hasAuthority('execute-semantic-query')") - @Observed(name = "dbrepo_metadata_ontologies_entities_find") + @Observed(name = "dbrepo_ontologies_entities_find") @Operation(summary = "Find entities", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "200", diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java index 687e986acd..6e008287ba 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java @@ -77,7 +77,7 @@ public class TableEndpoint { @GetMapping @Transactional(readOnly = true) - @Observed(name = "dbrepo_metadata_tables_findall") + @Observed(name = "dbrepo_tables_findall") @Operation(summary = "List all tables", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -114,7 +114,7 @@ public class TableEndpoint { @GetMapping("/{tableId}/suggest") @Transactional(readOnly = true) @PreAuthorize("hasAuthority('table-semantic-analyse')") - @Observed(name = "dbrepo_metadata_semantic_table_analyse") + @Observed(name = "dbrepo_semantic_table_analyse") @Operation(summary = "Suggest table semantics", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -122,8 +122,13 @@ public class TableEndpoint { content = {@Content( mediaType = "application/json", array = @ArraySchema(schema = @Schema(implementation = TableColumnEntityDto.class)))}), + @ApiResponse(responseCode = "400", + description = "Failed to parse statistic in search service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "404", - description = "Could not find the table", + description = "Failed to find database/table in metadata database", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -152,11 +157,31 @@ public class TableEndpoint { @PutMapping("/{tableId}") @Transactional @PreAuthorize("hasAuthority('admin')") - @Observed(name = "dbrepo_metadata_statistic_table_update") + @Observed(name = "dbrepo_statistic_table_update") @Operation(summary = "Update table statistics", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", description = "Updated table statistics successfully"), + @ApiResponse(responseCode = "400", + description = "Payload malformed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find database/table in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to save in search service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<Void> updateStatistic(@NotNull @PathVariable("databaseId") Long databaseId, @NotNull @PathVariable("tableId") Long tableId, @@ -174,7 +199,7 @@ public class TableEndpoint { @PutMapping("/{tableId}/column/{columnId}") @Transactional @PreAuthorize("hasAuthority('modify-table-column-semantics') or hasAuthority('modify-foreign-table-column-semantics')") - @Observed(name = "dbrepo_metadata_semantics_column_save") + @Observed(name = "dbrepo_semantics_column_save") @Operation(summary = "Update a table column semantic mapping", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", @@ -193,7 +218,17 @@ public class TableEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "404", - description = "Table or database could not be found", + description = "Failed to find user/table/database/ontology in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to save in search service", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -225,7 +260,7 @@ public class TableEndpoint { @GetMapping("/{tableId}/column/{columnId}/suggest") @Transactional(readOnly = true) @PreAuthorize("hasAuthority('table-semantic-analyse')") - @Observed(name = "dbrepo_metadata_semantic_column_analyse") + @Observed(name = "dbrepo_semantic_column_analyse") @Operation(summary = "Suggest table column semantics", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -233,13 +268,13 @@ public class TableEndpoint { content = {@Content( mediaType = "application/json", array = @ArraySchema(schema = @Schema(implementation = TableColumnEntityDto.class)))}), - @ApiResponse(responseCode = "404", - description = "Could not find the table column", + @ApiResponse(responseCode = "400", + description = "Generated query is malformed", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), - @ApiResponse(responseCode = "417", - description = "Generated query is malformed", + @ApiResponse(responseCode = "404", + description = "Failed to find database/table in metadata database", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -265,7 +300,7 @@ public class TableEndpoint { @PostMapping @Transactional(rollbackFor = {ServiceConnectionException.class, DatabaseNotFoundException.class, ServiceException.class}) @PreAuthorize("hasAuthority('create-table')") - @Observed(name = "dbrepo_metadata_table_create") + @Observed(name = "dbrepo_table_create") @Operation(summary = "Create a table", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "201", @@ -293,6 +328,16 @@ public class TableEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to save in search service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<TableDto> create(@NotNull @PathVariable("databaseId") Long databaseId, @NotNull @Valid @RequestBody TableCreateDto data, @@ -322,7 +367,7 @@ public class TableEndpoint { @GetMapping("/{tableId}") @Transactional(readOnly = true) - @Observed(name = "dbrepo_metadata_tables_find") + @Observed(name = "dbrepo_tables_find") @Operation(summary = "Get information about table", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -340,8 +385,13 @@ public class TableEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "503", - description = "Could not communicate with the broker service", + description = "Failed to save in search service", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -380,7 +430,7 @@ public class TableEndpoint { @DeleteMapping("/{tableId}") @Transactional @PreAuthorize("hasAuthority('delete-table') or hasAuthority('delete-foreign-table')") - @Observed(name = "dbrepo_metadata_table_delete") + @Observed(name = "dbrepo_table_delete") @Operation(summary = "Delete a table", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", @@ -400,7 +450,17 @@ public class TableEndpoint { description = "Table, database or container could not be found", content = {@Content( mediaType = "application/json", - schema = @Schema(implementation = ApiErrorDto.class))}) + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to save in search service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<?> delete(@NotNull @PathVariable("databaseId") Long databaseId, @NotNull @PathVariable("tableId") Long tableId, diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UnitEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UnitEndpoint.java index 79d0b4079b..7808b1b291 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UnitEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UnitEndpoint.java @@ -36,7 +36,7 @@ public class UnitEndpoint { @GetMapping @Transactional(readOnly = true) - @Observed(name = "dbrepo_metadata_semantic_units_findall") + @Observed(name = "dbrepo_semantic_units_findall") @Operation(summary = "List semantic units") @ApiResponses(value = { @ApiResponse(responseCode = "200", diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java index 102b4670bc..4d5ad8164b 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java @@ -59,7 +59,7 @@ public class UserEndpoint { @GetMapping @Transactional(readOnly = true) - @Observed(name = "dbrepo_metadata_users_list") + @Observed(name = "dbrepo_users_list") @Operation(summary = "Find all users") @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -81,7 +81,7 @@ public class UserEndpoint { @PostMapping @Transactional(rollbackFor = {ServiceException.class, ServiceConnectionException.class}) @PreAuthorize("!isAuthenticated()") - @Observed(name = "dbrepo_metadata_user_create") + @Observed(name = "dbrepo_user_create") @Operation(summary = "Create user") @ApiResponses(value = { @ApiResponse(responseCode = "201", @@ -107,6 +107,16 @@ public class UserEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Failed to create in auth service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to create in auth service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<UserBriefDto> create(@NotNull @Valid @RequestBody SignupRequestDto data) throws UserExistsException, EmailExistsException, ServiceException, ServiceConnectionException, @@ -124,7 +134,7 @@ public class UserEndpoint { } @PostMapping("/token") - @Observed(name = "dbrepo_metadata_user_token") + @Observed(name = "dbrepo_user_token") @Operation(summary = "Obtain user token") @ApiResponses(value = { @ApiResponse(responseCode = "202", @@ -132,6 +142,31 @@ public class UserEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = TokenDto.class))}), + @ApiResponse(responseCode = "403", + description = "Not allowed to get token", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find user in auth database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "428", + description = "Account is not fully setup in auth service (requires password change?)", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to auth service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to get user in auth service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<TokenDto> getToken(@NotNull @Valid @RequestBody LoginRequestDto data) throws ServiceException, ServiceConnectionException, UserNotFoundException, CredentialsInvalidException, @@ -157,7 +192,7 @@ public class UserEndpoint { } @PutMapping("/token") - @Observed(name = "dbrepo_metadata_user_refresh_token") + @Observed(name = "dbrepo_user_refresh_token") @Operation(summary = "Refresh user token") @ApiResponses(value = { @ApiResponse(responseCode = "202", @@ -165,6 +200,16 @@ public class UserEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = TokenDto.class))}), + @ApiResponse(responseCode = "403", + description = "Invalid refresh token", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to auth service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<TokenDto> refreshToken(@NotNull @Valid @RequestBody RefreshTokenRequestDto data) throws ServiceConnectionException, CredentialsInvalidException { @@ -178,7 +223,7 @@ public class UserEndpoint { @GetMapping("/{userId}") @Transactional(readOnly = true) @PreAuthorize("isAuthenticated()") - @Observed(name = "dbrepo_metadata_user_find") + @Observed(name = "dbrepo_user_find") @Operation(summary = "Get a user info", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -217,7 +262,7 @@ public class UserEndpoint { @PutMapping("/{userId}") @Transactional @PreAuthorize("hasAuthority('modify-user-information')") - @Observed(name = "dbrepo_metadata_user_modify") + @Observed(name = "dbrepo_user_modify") @Operation(summary = "Modify user information", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", @@ -230,11 +275,21 @@ public class UserEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "403", + description = "Not allowed to modify user metadata", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find database/user in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<UserDto> modify(@NotNull @PathVariable("userId") UUID userId, @NotNull @Valid @RequestBody UserUpdateDto data, - @NotNull Principal principal) throws ServiceException, - ServiceConnectionException, NotAllowedException, UserNotFoundException, DatabaseNotFoundException { + @NotNull Principal principal) throws NotAllowedException, + UserNotFoundException, DatabaseNotFoundException { log.debug("endpoint modify a user, userId={}, data={}", userId, data); User user = userService.findById(userId); if (!user.equals(principal)) { @@ -250,7 +305,7 @@ public class UserEndpoint { @PutMapping("/{userId}/password") @Transactional @PreAuthorize("isAuthenticated()") - @Observed(name = "dbrepo_metadata_user_password_modify") + @Observed(name = "dbrepo_user_password_modify") @Operation(summary = "Modify user password", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", @@ -258,6 +313,26 @@ public class UserEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = UserDto.class))}), + @ApiResponse(responseCode = "403", + description = "Not allowed to change foreign user password", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "404", + description = "Failed to find database/user in metadata database", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to auth service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "503", + description = "Failed to get user in auth service", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), }) public ResponseEntity<?> password(@NotNull @PathVariable("userId") UUID userId, @NotNull @Valid @RequestBody UserPasswordDto data, diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java index 767d6f74ea..a6627689aa 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java @@ -58,7 +58,7 @@ public class ViewEndpoint { @GetMapping @Transactional(readOnly = true) - @Observed(name = "dbrepo_metadata_views_findall") + @Observed(name = "dbrepo_views_findall") @Operation(summary = "Find all views", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -89,7 +89,7 @@ public class ViewEndpoint { @PostMapping @Transactional @PreAuthorize("hasAuthority('create-database-view')") - @Observed(name = "dbrepo_metadata_view_create") + @Observed(name = "dbrepo_view_create") @Operation(summary = "Create a view", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "201", @@ -113,7 +113,7 @@ public class ViewEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "404", - description = "Database or user could not be found", + description = "Failed to find database/user in metadata database.", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -127,8 +127,13 @@ public class ViewEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "503", - description = "Connection to the database failed", + description = "Failed to save in search service", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -155,7 +160,7 @@ public class ViewEndpoint { @GetMapping("/{viewId}") @Transactional(readOnly = true) - @Observed(name = "dbrepo_metadata_view_find") + @Observed(name = "dbrepo_view_find") @Operation(summary = "Find one view", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -202,7 +207,7 @@ public class ViewEndpoint { @DeleteMapping("/{viewId}") @Transactional @PreAuthorize("hasAuthority('delete-database-view')") - @Observed(name = "dbrepo_metadata_view_delete") + @Observed(name = "dbrepo_view_delete") @Operation(summary = "Delete one view", security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")}) @ApiResponses(value = { @ApiResponse(responseCode = "202", @@ -233,8 +238,13 @@ public class ViewEndpoint { content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "502", + description = "Connection to search service failed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "503", - description = "Connection to the database failed", + description = "Failed to save in search service", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java index e1cad8fbb6..bca87e510e 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/handlers/ApiExceptionHandler.java @@ -53,7 +53,7 @@ public class ApiExceptionHandler extends ResponseEntityExceptionHandler { } @Hidden - @ResponseStatus(code = HttpStatus.UNAUTHORIZED) + @ResponseStatus(code = HttpStatus.FORBIDDEN) @ExceptionHandler(CredentialsInvalidException.class) public ResponseEntity<ApiErrorDto> handle(CredentialsInvalidException e) { return generic_handle(e.getClass(), e.getLocalizedMessage()); diff --git a/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml b/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml index 3cf8b37d31..6f69d7737c 100644 --- a/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml +++ b/dbrepo-metadata-service/rest-service/src/main/resources/application-local.yml @@ -1,6 +1,6 @@ spring: datasource: - url: jdbc:mariadb://localhost:3306/fda + url: jdbc:mariadb://localhost:3306/dbrepo driver-class-name: org.mariadb.jdbc.Driver username: root password: dbrepo @@ -62,7 +62,7 @@ dbrepo: username: admin password: admin endpoints: - searchService: http://localhost:5000 + searchService: http://localhost:4000 dataService: http://localhost:9093 brokerService: http://localhost/admin/broker authService: http://localhost:8080 diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java index ac5963a125..08233dfd44 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java @@ -420,10 +420,10 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { } /* test */ - final ResponseEntity<List<DatabaseDto>> response = databaseEndpoint.list(internalName); + final ResponseEntity<List<DatabaseBriefDto>> response = databaseEndpoint.list(internalName); assertEquals(HttpStatus.OK, response.getStatusCode()); assertNotNull(response.getBody()); - final List<DatabaseDto> body = response.getBody(); + final List<DatabaseBriefDto> body = response.getBody(); assertEquals(databases.size(), body.size()); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/OpenApiEndpointMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/OpenApiEndpointMvcTest.java index 799fdee005..d685ca65cd 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/OpenApiEndpointMvcTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/OpenApiEndpointMvcTest.java @@ -3,6 +3,7 @@ package at.tuwien.mvc; import at.tuwien.api.error.ApiErrorDto; import at.tuwien.endpoints.*; import at.tuwien.test.AbstractUnitTest; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.responses.ApiResponse; import lombok.extern.log4j.Log4j2; @@ -11,7 +12,6 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; @@ -19,9 +19,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; import java.lang.reflect.Method; import java.util.Arrays; -import java.util.LinkedList; import java.util.List; -import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; @@ -116,7 +114,7 @@ public class OpenApiEndpointMvcTest extends AbstractUnitTest { private void generic_openApiDocs(Class<?> endpoint) { final List<Method> methods = Arrays.stream(endpoint.getMethods()) - .filter(m -> m.getDeclaringClass().equals(AccessEndpoint.class)) + .filter(m -> m.getDeclaringClass().equals(endpoint)) .toList(); methods.forEach(m -> { final List<Class<?>> exceptions = Arrays.stream(m.getExceptionTypes()) @@ -126,6 +124,7 @@ public class OpenApiEndpointMvcTest extends AbstractUnitTest { .toList(); assertTrue(invalidExceptions.isEmpty(), "method '" + m.getName() + "' throws exception(s) outside package scope at.tuwien: " + invalidExceptions.stream().map(Class::getName).toList()); exceptions.forEach(exception -> { + assertNotNull(m.getDeclaredAnnotation(Operation.class).summary()); final int status = exception.getAnnotation(ResponseStatus.class) .code() .value(); @@ -143,7 +142,7 @@ public class OpenApiEndpointMvcTest extends AbstractUnitTest { assertNotNull(response.content()); assertTrue(response.content().length > 0); final Content content0 = response.content()[0]; - assertEquals(MediaType.APPLICATION_JSON_VALUE, content0.mediaType()); + assertEquals(MediaType.APPLICATION_JSON_VALUE, content0.mediaType(), "method " + m.getName() + " and status " + status + " should return JSON"); assertEquals(ApiErrorDto.class, content0.schema().implementation()); }); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java index 8b479cabf3..76678a1fe3 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/PrometheusEndpointMvcTest.java @@ -2,15 +2,20 @@ package at.tuwien.mvc; import at.tuwien.api.auth.RefreshTokenRequestDto; import at.tuwien.api.database.table.TableStatisticDto; +import at.tuwien.api.database.table.columns.ColumnStatisticDto; +import at.tuwien.api.semantics.TableColumnEntityDto; import at.tuwien.test.AbstractUnitTest; import at.tuwien.api.container.ContainerCreateDto; import at.tuwien.api.database.*; import at.tuwien.api.database.table.columns.concepts.ColumnSemanticsUpdateDto; import at.tuwien.config.MetricsConfig; import at.tuwien.endpoints.*; +import io.micrometer.observation.annotation.Observed; import io.micrometer.observation.tck.TestObservationRegistry; +import io.swagger.v3.oas.annotations.Operation; import lombok.extern.log4j.Log4j2; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -30,11 +35,10 @@ import org.springframework.test.web.servlet.MockMvc; import java.io.File; import java.io.IOException; +import java.lang.reflect.Method; +import java.math.BigDecimal; import java.nio.charset.Charset; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; +import java.util.*; import static io.micrometer.observation.tck.TestObservationRegistryAssert.assertThat; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; @@ -80,7 +84,7 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { private LicenseEndpoint licenseEndpoint; @Autowired - private MessageEndpoint maintenanceEndpoint; + private MessageEndpoint messageEndpoint; @Autowired private MetadataEndpoint metadataEndpoint; @@ -97,7 +101,7 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { @Autowired private ViewEndpoint viewEndpoint; - private static final List<String> metrics = new LinkedList<>(); + private static final Map<String, String> metrics = new TreeMap<>(); /* sorted */ @TestConfiguration static class ObservationTestConfiguration { @@ -110,15 +114,12 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { @BeforeAll public static void beforeAll() { - FileUtils.deleteQuietly(new File("../metrics.txt")); + FileUtils.deleteQuietly(new File("../metrics.md")); } @AfterAll public static void afterAll() throws IOException { - Collections.sort(metrics); - final StringBuilder content = new StringBuilder("# AUTOGENERATED FILE (DO NOT EDIT)\n") - .append(String.join("\n", metrics)); - FileUtils.writeStringToFile(new File("../metrics.txt"), content.toString(), Charset.defaultCharset()); + saveObservedMetrics(metrics); } @Test @@ -157,11 +158,11 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { } /* test */ - for (String metric : List.of("dbrepo_metadata_access_give", "dbrepo_metadata_access_get", "dbrepo_metadata_access_modify", "dbrepo_metadata_access_get", "dbrepo_metadata_access_delete")) { - metrics.add(metric); + for (String metric : List.of("dbrepo_access_give", "dbrepo_access_get", "dbrepo_access_modify", "dbrepo_access_get", "dbrepo_access_delete")) { assertThat(registry) .hasObservationWithNameEqualTo(metric); } + generic_openApiDocs(AccessEndpoint.class); } @Test @@ -191,11 +192,11 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { } /* test */ - for (String metric : List.of("dbrepo_metadata_container_findall", "dbrepo_metadata_container_create", "dbrepo_metadata_container_find", "dbrepo_metadata_container_delete")) { - metrics.add(metric); + for (String metric : List.of("dbrepo_container_findall", "dbrepo_container_create", "dbrepo_container_find", "dbrepo_container_delete")) { assertThat(registry) .hasObservationWithNameEqualTo(metric); } + generic_openApiDocs(ContainerEndpoint.class); } @Test @@ -235,11 +236,11 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { } /* test */ - for (String metric : List.of("dbrepo_metadata_database_findall", "dbrepo_metadata_database_create", "dbrepo_metadata_database_visibility", "dbrepo_metadata_database_transfer", "dbrepo_metadata_database_find", "dbrepo_metadata_database_image")) { - metrics.add(metric); + for (String metric : List.of("dbrepo_database_findall", "dbrepo_database_create", "dbrepo_database_visibility", "dbrepo_database_transfer", "dbrepo_database_find", "dbrepo_database_image")) { assertThat(registry) .hasObservationWithNameEqualTo(metric); } + generic_openApiDocs(DatabaseEndpoint.class); } @Test @@ -279,13 +280,13 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { } /* test */ - for (String metric : List.of("dbrepo_metadata_identifier_create", "dbrepo_metadata_identifier_retrieve", - "dbrepo_metadata_identifier_list", "dbrepo_metadata_identifier_save", - "dbrepo_metadata_identifier_publish")) { - metrics.add(metric); + for (String metric : List.of("dbrepo_identifier_create", "dbrepo_identifier_retrieve", + "dbrepo_identifier_list", "dbrepo_identifier_save", + "dbrepo_identifier_publish")) { assertThat(registry) .hasObservationWithNameEqualTo(metric); } + generic_openApiDocs(IdentifierEndpoint.class); } @Test @@ -320,12 +321,12 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { } /* test */ - for (String metric : List.of("dbrepo_metadata_image_findall", "dbrepo_metadata_image_create", - "dbrepo_metadata_image_find", "dbrepo_metadata_image_update", "dbrepo_metadata_image_delete")) { - metrics.add(metric); + for (String metric : List.of("dbrepo_image_findall", "dbrepo_image_create", + "dbrepo_image_find", "dbrepo_image_update", "dbrepo_image_delete")) { assertThat(registry) .hasObservationWithNameEqualTo(metric); } + generic_openApiDocs(ImageEndpoint.class); } @Test @@ -340,9 +341,9 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { } /* test */ - metrics.add("dbrepo_metadata_license_findall"); assertThat(registry) - .hasObservationWithNameEqualTo("dbrepo_metadata_license_findall"); + .hasObservationWithNameEqualTo("dbrepo_license_findall"); + generic_openApiDocs(LicenseEndpoint.class); } @Test @@ -351,37 +352,37 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { /* mock */ try { - maintenanceEndpoint.list(""); + messageEndpoint.list(""); } catch (Exception e) { /* ignore */ } try { - maintenanceEndpoint.find(BANNER_MESSAGE_1_ID); + messageEndpoint.find(BANNER_MESSAGE_1_ID); } catch (Exception e) { /* ignore */ } try { - maintenanceEndpoint.create(BANNER_MESSAGE_1_CREATE_DTO); + messageEndpoint.create(BANNER_MESSAGE_1_CREATE_DTO); } catch (Exception e) { /* ignore */ } try { - maintenanceEndpoint.update(BANNER_MESSAGE_1_ID, BANNER_MESSAGE_1_UPDATE_DTO); + messageEndpoint.update(BANNER_MESSAGE_1_ID, BANNER_MESSAGE_1_UPDATE_DTO); } catch (Exception e) { /* ignore */ } try { - maintenanceEndpoint.delete(BANNER_MESSAGE_1_ID); + messageEndpoint.delete(BANNER_MESSAGE_1_ID); } catch (Exception e) { /* ignore */ } /* test */ - for (String metric : List.of("dbrepo_metadata_maintenance_findall", "dbrepo_metadata_maintenance_find", "dbrepo_metadata_maintenance_create", "dbrepo_metadata_maintenance_update", "dbrepo_metadata_maintenance_delete")) { - metrics.add(metric); + for (String metric : List.of("dbrepo_maintenance_findall", "dbrepo_maintenance_find", "dbrepo_maintenance_create", "dbrepo_maintenance_update", "dbrepo_maintenance_delete")) { assertThat(registry) .hasObservationWithNameEqualTo(metric); } + generic_openApiDocs(MessageEndpoint.class); } @Test @@ -411,11 +412,11 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { } /* test */ - for (String metric : List.of("dbrepo_metadata_oai_identify", "dbrepo_metadata_oai_identifiers_list", "dbrepo_metadata_oai_record_get", "dbrepo_metadata_oai_metadataformats_list")) { - metrics.add(metric); + for (String metric : List.of("dbrepo_oai_identify", "dbrepo_oai_identifiers_list", "dbrepo_oai_record_get", "dbrepo_oai_metadataformats_list")) { assertThat(registry) .hasObservationWithNameEqualTo(metric); } + generic_openApiDocs(MetadataEndpoint.class); } @Test @@ -455,105 +456,61 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { } /* test */ - for (String metric : List.of("dbrepo_metadata_ontologies_findall", "dbrepo_metadata_ontologies_find", "dbrepo_metadata_ontologies_create", "dbrepo_metadata_ontologies_update", "dbrepo_metadata_ontologies_delete", "dbrepo_metadata_ontologies_entities_find")) { - metrics.add(metric); + for (String metric : List.of("dbrepo_ontologies_findall", "dbrepo_ontologies_find", "dbrepo_ontologies_create", "dbrepo_ontologies_update", "dbrepo_ontologies_delete", "dbrepo_ontologies_entities_find")) { assertThat(registry) .hasObservationWithNameEqualTo(metric); } + generic_openApiDocs(OntologyEndpoint.class); } @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"modify-identifier-metadata", "delete-identifier"}) - public void prometheusPersistenceEndpoint_succeeds() { + @WithMockUser(username = USER_1_USERNAME, authorities = {"create-semantic-concept", "admin"}) + public void prometheusConceptEndpoint_succeeds() { /* mock */ try { - identifierEndpoint.find(IDENTIFIER_1_ID, null); - } catch (Exception e) { - /* ignore */ - } - try { - identifierEndpoint.delete(IDENTIFIER_1_ID); + conceptEndpoint.findAll(); } catch (Exception e) { /* ignore */ } /* test */ - for (String metric : List.of("dbrepo_metadata_identifier_find", "dbrepo_metadata_identifier_delete")) { - metrics.add(metric); + for (String metric : List.of("dbrepo_semantic_concepts_findall")) { assertThat(registry) .hasObservationWithNameEqualTo(metric); } + generic_openApiDocs(ConceptEndpoint.class); } @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"create-semantic-concept", "create-semantic-unit", "table-semantic-analyse", "admin"}) - public void prometheusSemanticsEndpoint_succeeds() { + @WithMockUser(username = USER_1_USERNAME, authorities = {"create-semantic-unit", "admin"}) + public void prometheusUnitEndpoint_succeeds() { /* mock */ - try { - conceptEndpoint.findAll(); - } catch (Exception e) { - /* ignore */ - } try { unitEndpoint.findAll(); } catch (Exception e) { /* ignore */ } - try { - tableEndpoint.analyseTable(DATABASE_1_ID, TABLE_1_ID); - } catch (Exception e) { - /* ignore */ - } - try { - tableEndpoint.updateStatistic(DATABASE_1_ID, TABLE_1_ID, TableStatisticDto.builder() - .columns(new HashMap<>()) - .build()); - } catch (Exception e) { - /* ignore */ - } - try { - tableEndpoint.analyseTableColumn(DATABASE_1_ID, TABLE_1_ID, TABLE_1_COLUMNS.get(0).getId()); - } catch (Exception e) { - /* ignore */ - } /* test */ - for (String metric : List.of("dbrepo_metadata_semantic_concepts_findall", - "dbrepo_metadata_statistic_table_update", "dbrepo_metadata_semantic_units_findall", - "dbrepo_metadata_semantic_table_analyse", "dbrepo_metadata_semantic_column_analyse")) { - metrics.add(metric); + for (String metric : List.of("dbrepo_semantic_units_findall")) { assertThat(registry) .hasObservationWithNameEqualTo(metric); } + generic_openApiDocs(UnitEndpoint.class); } @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"modify-table-column-semantics", "modify-foreign-table-column-semantics"}) - public void prometheusTableColumnEndpoint_succeeds() { + @WithMockUser(username = USER_1_USERNAME, authorities = {"create-table", "delete-table", + "modify-table-column-semantics", "modify-foreign-table-column-semantics", "admin", + "table-semantic-analyse"}) + public void prometheusTableEndpoint_succeeds() { final ColumnSemanticsUpdateDto request = ColumnSemanticsUpdateDto.builder() .unitUri(UNIT_1_URI) .conceptUri(CONCEPT_1_URI) .build(); - /* mock */ - try { - tableEndpoint.update(DATABASE_1_ID, TABLE_1_ID, TABLE_1_COLUMNS.get(3).getId(), request, USER_1_PRINCIPAL); - } catch (Exception e) { - /* ignore */ - } - - /* test */ - metrics.add("dbrepo_metadata_semantics_column_save"); - assertThat(registry) - .hasObservationWithNameEqualTo("dbrepo_metadata_semantics_column_save"); - } - - @Test - @WithMockUser(username = USER_1_USERNAME, authorities = {"create-table", "delete-table"}) - public void prometheusTableEndpoint_succeeds() { - /* mock */ try { tableEndpoint.list(DATABASE_1_ID, USER_1_PRINCIPAL); @@ -575,14 +532,35 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { } catch (Exception e) { /* ignore */ } + try { + tableEndpoint.analyseTable(DATABASE_1_ID, TABLE_1_ID); + } catch (Exception e) { + /* ignore */ + } + try { + tableEndpoint.updateStatistic(DATABASE_1_ID, TABLE_1_ID, TableStatisticDto.builder().build()); + } catch (Exception e) { + /* ignore */ + } + try { + tableEndpoint.analyseTableColumn(DATABASE_1_ID, TABLE_1_ID, TABLE_1_COLUMNS.get(0).getId()); + } catch (Exception e) { + /* ignore */ + } + try { + tableEndpoint.update(DATABASE_1_ID, TABLE_1_ID, TABLE_1_COLUMNS.get(3).getId(), request, USER_1_PRINCIPAL); + } catch (Exception e) { + /* ignore */ + } /* test */ - for (String metric : List.of("dbrepo_metadata_tables_findall", "dbrepo_metadata_table_create", - "dbrepo_metadata_tables_find", "dbrepo_metadata_table_delete")) { - metrics.add(metric); + for (String metric : List.of("dbrepo_tables_findall", "dbrepo_table_create", "dbrepo_tables_find", + "dbrepo_table_delete", "dbrepo_statistic_table_update", "dbrepo_semantic_table_analyse", + "dbrepo_semantic_column_analyse", "dbrepo_semantics_column_save")) { assertThat(registry) .hasObservationWithNameEqualTo(metric); } + generic_openApiDocs(TableEndpoint.class); } @Test @@ -617,12 +595,12 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { } /* test */ - for (String metric : List.of("dbrepo_metadata_user_refresh_token", "dbrepo_metadata_users_list", - "dbrepo_metadata_user_find", "dbrepo_metadata_user_modify", "dbrepo_metadata_user_password_modify")) { - metrics.add(metric); + for (String metric : List.of("dbrepo_user_refresh_token", "dbrepo_users_list", + "dbrepo_user_find", "dbrepo_user_modify", "dbrepo_user_password_modify")) { assertThat(registry) .hasObservationWithNameEqualTo(metric); } + generic_openApiDocs(UserEndpoint.class); } @Test @@ -642,11 +620,11 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { } /* test */ - for (String metric : List.of("dbrepo_metadata_user_create", "dbrepo_metadata_user_token")) { - metrics.add(metric); + for (String metric : List.of("dbrepo_user_create", "dbrepo_user_token")) { assertThat(registry) .hasObservationWithNameEqualTo(metric); } + // already done above } @Test @@ -676,12 +654,21 @@ public class PrometheusEndpointMvcTest extends AbstractUnitTest { } /* test */ - for (String metric : List.of("dbrepo_metadata_views_findall", "dbrepo_metadata_view_create", - "dbrepo_metadata_view_find", "dbrepo_metadata_view_delete")) { - metrics.add(metric); + for (String metric : List.of("dbrepo_views_findall", "dbrepo_view_create", + "dbrepo_view_find", "dbrepo_view_delete")) { assertThat(registry) .hasObservationWithNameEqualTo(metric); } + generic_openApiDocs(ViewEndpoint.class); + } + + private static void generic_openApiDocs(Class<?> endpoint) { + final List<Method> methods = Arrays.stream(endpoint.getMethods()) + .filter(m -> m.getDeclaringClass().equals(endpoint)) + .toList(); + methods.forEach(m -> { + metrics.put(m.getDeclaredAnnotation(Observed.class).name(), m.getDeclaredAnnotation(Operation.class).summary()); + }); } } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ConceptServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ConceptServiceUnitTest.java index 602c46fee5..d0323941df 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ConceptServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ConceptServiceUnitTest.java @@ -12,7 +12,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; @@ -27,7 +26,7 @@ import static org.mockito.Mockito.when; public class ConceptServiceUnitTest extends AbstractUnitTest { @MockBean - private ConceptRepository conceptRepository;; + private ConceptRepository conceptRepository; @Autowired private ConceptService conceptService; @@ -38,7 +37,6 @@ public class ConceptServiceUnitTest extends AbstractUnitTest { } @Test - @Transactional public void findAll_succeeds() { /* mock */ @@ -52,7 +50,6 @@ public class ConceptServiceUnitTest extends AbstractUnitTest { } @Test - @Transactional public void find_succeeds() throws ConceptNotFoundException { /* mock */ @@ -67,7 +64,6 @@ public class ConceptServiceUnitTest extends AbstractUnitTest { } @Test - @Transactional public void findConcept_fails() { /* mock */ diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java index 2968c6f80d..f28cc0b9b1 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java @@ -61,12 +61,6 @@ public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest { @Autowired private DatabaseRepository databaseRepository; - @Autowired - private ConceptRepository conceptRepository; - - @Autowired - private UnitRepository unitRepository; - private final ParameterizedTypeReference<DataCiteBody<DataCiteDoi>> dataCiteBodyParameterizedTypeReference = new ParameterizedTypeReference<>() { }; @@ -76,8 +70,6 @@ public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest { /* metadata database */ licenseRepository.save(LICENSE_1); containerRepository.save(CONTAINER_1); - conceptRepository.save(CONCEPT_1); - unitRepository.save(UNIT_1); userRepository.saveAll(List.of(USER_1, USER_2, USER_3, USER_4)); databaseRepository.save(DATABASE_1); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java index b9072ac7c7..ed5f21281d 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java @@ -2,6 +2,8 @@ package at.tuwien.service; import at.tuwien.entities.database.Database; import at.tuwien.exception.*; +import at.tuwien.gateway.DataServiceGateway; +import at.tuwien.gateway.SearchServiceGateway; import at.tuwien.repository.*; import at.tuwien.service.impl.DatabaseServiceImpl; import at.tuwien.test.AbstractUnitTest; @@ -12,21 +14,32 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.annotation.Transactional; import java.util.List; import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; @Log4j2 @SpringBootTest -@Disabled("keep failing on CI but works locally") +@Disabled("CI/CD") +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @ExtendWith(SpringExtension.class) public class DatabaseServicePersistenceTest extends AbstractUnitTest { + @MockBean + private DataServiceGateway dataServiceGateway; + + @MockBean + private SearchServiceGateway searchServiceGateway; + @Autowired - private DatabaseServiceImpl databaseService; + private DatabaseService databaseService; @Autowired private UserRepository userRepository; @@ -92,4 +105,20 @@ public class DatabaseServicePersistenceTest extends AbstractUnitTest { assertNotNull(response.getCreator().getAccesses()); } + @Test + public void updateTableMetadata_succeeds() throws SearchServiceException, MalformedException, ServiceException, + QueryNotFoundException, DatabaseNotFoundException, ServiceConnectionException, + SearchServiceConnectionException { + + /* mock */ + when(dataServiceGateway.getTableSchemas(DATABASE_1_ID)) + .thenReturn(List.of(TABLE_5_DTO)); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); /* ignored */ + + /* test */ + final Database response = databaseService.updateTableMetadata(DATABASE_1); + log.debug(""); + } + } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java index e50276d77d..6c6357aaf6 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java @@ -48,7 +48,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { private ContainerRepository containerRepository; @Autowired - private DatabaseServiceImpl databaseService; + private DatabaseService databaseService; @BeforeEach public void beforeEach() { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServicePersistenceTest.java similarity index 92% rename from dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java rename to dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServicePersistenceTest.java index cc79e0ca4c..50e0dc08f6 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceIntegrationTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServicePersistenceTest.java @@ -5,7 +5,6 @@ import at.tuwien.api.container.image.ImageCreateDto; import at.tuwien.exception.ImageAlreadyExistsException; import at.tuwien.repository.ContainerRepository; import at.tuwien.repository.ImageRepository; -import at.tuwien.service.impl.ImageServiceImpl; import lombok.extern.log4j.Log4j2; import org.apache.http.auth.BasicUserPrincipal; import org.junit.jupiter.api.BeforeEach; @@ -24,10 +23,10 @@ import static org.junit.jupiter.api.Assertions.*; @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @ExtendWith(SpringExtension.class) @SpringBootTest -public class ImageServiceIntegrationTest extends AbstractUnitTest { +public class ImageServicePersistenceTest extends AbstractUnitTest { @Autowired - private ImageServiceImpl imageService; + private ImageService imageService; @Autowired private ImageRepository imageRepository; diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java index f486f5db11..bce3c7bc12 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ImageServiceUnitTest.java @@ -31,7 +31,7 @@ public class ImageServiceUnitTest extends AbstractUnitTest { private ImageRepository imageRepository; @Autowired - private ImageServiceImpl imageService; + private ImageService imageService; @Test public void getAll_succeeds() { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java index 6db5522dcc..91b64ef93c 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java @@ -3,13 +3,10 @@ package at.tuwien.service; import at.tuwien.api.database.table.TableCreateDto; import at.tuwien.api.database.table.columns.ColumnCreateDto; import at.tuwien.api.database.table.columns.ColumnTypeDto; -import at.tuwien.api.database.table.columns.concepts.ColumnSemanticsUpdateDto; import at.tuwien.api.database.table.constraints.ConstraintsCreateDto; -import at.tuwien.api.database.table.constraints.foreignKey.ForeignKeyCreateDto; import at.tuwien.entities.database.Database; import at.tuwien.entities.database.table.Table; import at.tuwien.entities.database.table.columns.TableColumn; -import at.tuwien.entities.database.table.columns.TableColumnConcept; import at.tuwien.entities.database.table.columns.TableColumnType; import at.tuwien.entities.database.table.constraints.foreignKey.ForeignKey; import at.tuwien.entities.database.table.constraints.primaryKey.PrimaryKey; @@ -21,17 +18,17 @@ import at.tuwien.repository.*; import at.tuwien.test.AbstractUnitTest; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.annotation.Transactional; import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; @@ -40,6 +37,8 @@ import static org.mockito.Mockito.*; @Log4j2 @SpringBootTest +@Disabled("CI/CD") +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @ExtendWith(SpringExtension.class) public class TableServicePersistenceTest extends AbstractUnitTest { @@ -64,12 +63,6 @@ public class TableServicePersistenceTest extends AbstractUnitTest { @Autowired private DatabaseRepository databaseRepository; - @Autowired - private ConceptRepository conceptRepository; - - @Autowired - private UnitRepository unitRepository; - @Autowired private TableService tableService; @@ -80,8 +73,6 @@ public class TableServicePersistenceTest extends AbstractUnitTest { licenseRepository.save(LICENSE_1); containerRepository.save(CONTAINER_1); userRepository.saveAll(List.of(USER_1, USER_2, USER_3)); - conceptRepository.save(CONCEPT_1); - unitRepository.save(UNIT_1); databaseRepository.saveAll(List.of(DATABASE_1)); } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java index c57c7e5934..0e74c54947 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java @@ -4,11 +4,9 @@ import at.tuwien.api.database.table.TableCreateDto; import at.tuwien.api.database.table.columns.ColumnCreateDto; import at.tuwien.api.database.table.columns.ColumnTypeDto; import at.tuwien.api.database.table.constraints.ConstraintsCreateDto; -import at.tuwien.api.database.table.constraints.ConstraintsDto; -import at.tuwien.api.database.table.constraints.foreignKey.ForeignKeyCreateDto; +import at.tuwien.api.database.table.constraints.foreign.ForeignKeyCreateDto; import at.tuwien.entities.database.table.columns.TableColumnType; import at.tuwien.entities.database.table.constraints.Constraints; -import at.tuwien.repository.OntologyRepository; import at.tuwien.test.AbstractUnitTest; import at.tuwien.api.database.table.columns.concepts.ColumnSemanticsUpdateDto; import at.tuwien.entities.database.Database; diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceTest.java new file mode 100644 index 0000000000..f686a1c23a --- /dev/null +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServicePersistenceTest.java @@ -0,0 +1,68 @@ +package at.tuwien.service; + +import at.tuwien.entities.database.View; +import at.tuwien.exception.*; +import at.tuwien.repository.ContainerRepository; +import at.tuwien.repository.DatabaseRepository; +import at.tuwien.repository.LicenseRepository; +import at.tuwien.repository.UserRepository; +import at.tuwien.test.AbstractUnitTest; +import lombok.extern.log4j.Log4j2; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@Log4j2 +@SpringBootTest +@Disabled("CI/CD") +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) +@ExtendWith(SpringExtension.class) +public class ViewServicePersistenceTest extends AbstractUnitTest { + + @Autowired + private UserRepository userRepository; + + @Autowired + private LicenseRepository licenseRepository; + + @Autowired + private ContainerRepository containerRepository; + + @Autowired + private DatabaseRepository databaseRepository; + + @Autowired + private ViewService viewService; + + @BeforeEach + public void beforeEach() { + genesis(); + /* metadata database */ + licenseRepository.save(LICENSE_1); + containerRepository.save(CONTAINER_1); + userRepository.saveAll(List.of(USER_1, USER_2, USER_3)); + databaseRepository.save(DATABASE_1); + } + + @Test + public void findById_succeeds() throws ViewNotFoundException { + + /* test */ + final View response = viewService.findById(DATABASE_1, VIEW_1_ID); + assertEquals(VIEW_1_ID, response.getId()); + assertEquals(VIEW_1_NAME, response.getName()); + assertEquals(VIEW_1_INTERNAL_NAME, response.getInternalName()); + assertEquals(VIEW_1_QUERY, response.getQuery()); + assertEquals(VIEW_1_COLUMNS.size(), response.getColumns().size()); + } + +} diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceUnitTest.java index f3987fc93b..da345658ef 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ViewServiceUnitTest.java @@ -57,9 +57,8 @@ public class ViewServiceUnitTest extends AbstractUnitTest { .build(); /* mock */ - doNothing() - .when(dataServiceGateway) - .createView(DATABASE_1_ID, request); + when(dataServiceGateway.createView(DATABASE_1_ID, request)) + .thenReturn(VIEW_1_DTO); when(databaseRepository.save(any(Database.class))) .thenReturn(DATABASE_1); when(searchServiceGateway.update(any(Database.class))) diff --git a/dbrepo-metadata-service/rest-service/src/test/resources/init/weather.sql b/dbrepo-metadata-service/rest-service/src/test/resources/init/weather.sql index b6dd8cff4c..19033d2548 100644 --- a/dbrepo-metadata-service/rest-service/src/test/resources/init/weather.sql +++ b/dbrepo-metadata-service/rest-service/src/test/resources/init/weather.sql @@ -9,15 +9,7 @@ CREATE TABLE weather_location location VARCHAR(255) PRIMARY KEY, lat DOUBLE PRECISION NULL, lng DOUBLE PRECISION NULL -) WITH SYSTEM VERSIONING; - -CREATE VIEW `hs_weather_location` AS -SELECT * -FROM (SELECT ROW_START AS inserted_at, IF(ROW_END > NOW(), NULL, ROW_END) AS deleted_at, COUNT(*) as total - FROM `weather_location` FOR SYSTEM_TIME ALL - GROUP BY inserted_at, deleted_at - ORDER BY deleted_at DESC LIMIT 50) AS v -ORDER BY v.inserted_at, v.deleted_at ASC; +) WITH SYSTEM VERSIONING COMMENT 'Weather location'; CREATE TABLE weather_aus ( @@ -29,29 +21,19 @@ CREATE TABLE weather_aus FOREIGN KEY (location) REFERENCES weather_location (location), UNIQUE (`date`), CHECK (`mintemp` > 0) -) WITH SYSTEM VERSIONING; - -CREATE VIEW `hs_weather_aus` AS -SELECT * -FROM (SELECT ROW_START AS inserted_at, IF(ROW_END > NOW(), NULL, ROW_END) AS deleted_at, COUNT(*) as total - FROM `weather_aus` FOR SYSTEM_TIME ALL - GROUP BY inserted_at, deleted_at - ORDER BY deleted_at DESC LIMIT 50) AS v -ORDER BY v.inserted_at, v.deleted_at ASC; +) WITH SYSTEM VERSIONING COMMENT 'Weather in the world'; CREATE TABLE sensor ( `timestamp` TIMESTAMP NOT NULL PRIMARY KEY, `value` DECIMAL -) WITH SYSTEM VERSIONING; +) WITH SYSTEM VERSIONING COMMENT 'Some sensor data'; -CREATE VIEW `hs_sensor` AS -SELECT * -FROM (SELECT ROW_START AS inserted_at, IF(ROW_END > NOW(), NULL, ROW_END) AS deleted_at, COUNT(*) as total - FROM `sensor` FOR SYSTEM_TIME ALL - GROUP BY inserted_at, deleted_at - ORDER BY deleted_at DESC LIMIT 50) AS v -ORDER BY v.inserted_at, v.deleted_at ASC; +CREATE TABLE sensor_2 +( + `timestamp` TIMESTAMP NOT NULL PRIMARY KEY, + `value` DECIMAL +) WITH SYSTEM VERSIONING COMMENT 'Hello sensor'; -- sequence not in metadata on purpose CREATE SEQUENCE weather_aut_seq NOCACHE; @@ -69,8 +51,6 @@ CREATE TABLE weather_aut CHECK (`mintemp` > 0) ) WITH SYSTEM VERSIONING; --- no history view in data database on purpose - -- table not in metadata on purpose CREATE TABLE weather_aut_without_versioning ( @@ -84,8 +64,6 @@ CREATE TABLE weather_aut_without_versioning CHECK (`mintemp` > 0) ); --- no history view in data database on purpose - -- view not in metadata on purpose CREATE VIEW weather_aut_merge AS ( diff --git a/dbrepo-metadata-service/services/pom.xml b/dbrepo-metadata-service/services/pom.xml index 7451e00015..a66dfb7c87 100644 --- a/dbrepo-metadata-service/services/pom.xml +++ b/dbrepo-metadata-service/services/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.4.3</version> + <version>1.4.4</version> </parent> <artifactId>dbrepo-metadata-service-services</artifactId> <name>dbrepo-metadata-service-services</name> - <version>1.4.3</version> + <version>1.4.4</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/DataServiceGateway.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/DataServiceGateway.java index 77dd5588ad..d8ba8a490f 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/DataServiceGateway.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/DataServiceGateway.java @@ -4,12 +4,15 @@ import at.tuwien.ExportResourceDto; import at.tuwien.api.database.AccessTypeDto; import at.tuwien.api.database.DatabaseDto; import at.tuwien.api.database.ViewCreateDto; +import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.internal.CreateDatabaseDto; import at.tuwien.api.database.query.QueryDto; import at.tuwien.api.database.table.TableCreateDto; +import at.tuwien.api.database.table.TableDto; import at.tuwien.api.user.internal.UpdateUserPasswordDto; import at.tuwien.exception.*; +import java.util.List; import java.util.UUID; public interface DataServiceGateway { @@ -27,11 +30,15 @@ public interface DataServiceGateway { void deleteTable(Long databaseId, Long tableId) throws ServiceConnectionException, ServiceException, TableNotFoundException; - void createView(Long databaseId, ViewCreateDto data) throws ServiceConnectionException, ServiceException; + ViewDto createView(Long databaseId, ViewCreateDto data) throws ServiceConnectionException, ServiceException; void deleteView(Long databaseId, Long viewId) throws ServiceConnectionException, ServiceException, ViewNotFoundException; QueryDto findQuery(Long databaseId, Long queryId) throws ServiceConnectionException, ServiceException, QueryNotFoundException; ExportResourceDto exportQuery(Long databaseId, Long queryId) throws ServiceConnectionException, ServiceException, QueryNotFoundException; + + List<TableDto> getTableSchemas(Long databaseId) throws ServiceConnectionException, ServiceException, QueryNotFoundException; + + List<ViewDto> getViewSchemas(Long databaseId) throws ServiceConnectionException, ServiceException, QueryNotFoundException; } diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java index b8e4d48d8d..8ab7c8a730 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/BrokerServiceGatewayImpl.java @@ -126,8 +126,6 @@ public class BrokerServiceGatewayImpl implements BrokerServiceGateway { final String url = "/api/exchanges/" + rabbitConfig.getVirtualHost() + "/" + name; final HttpHeaders headers = new HttpHeaders(); headers.set("Accept", "application/json"); - log.trace("gateway broker find exchange, virtual host={}, exchange={}", rabbitConfig.getVirtualHost(), name); - log.debug("find exchange from url {}{}", gatewayConfig.getBrokerEndpoint(), url); final ResponseEntity<ExchangeDto> response; try { response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(null, headers), ExchangeDto.class); diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java index 4635ffbbb2..a278fc60b9 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java @@ -1,13 +1,11 @@ package at.tuwien.gateway.impl; import at.tuwien.ExportResourceDto; -import at.tuwien.api.database.AccessTypeDto; -import at.tuwien.api.database.DatabaseDto; -import at.tuwien.api.database.UpdateDatabaseAccessDto; -import at.tuwien.api.database.ViewCreateDto; +import at.tuwien.api.database.*; import at.tuwien.api.database.internal.CreateDatabaseDto; import at.tuwien.api.database.query.QueryDto; import at.tuwien.api.database.table.TableCreateDto; +import at.tuwien.api.database.table.TableDto; import at.tuwien.api.user.internal.UpdateUserPasswordDto; import at.tuwien.exception.*; import at.tuwien.gateway.DataServiceGateway; @@ -20,6 +18,7 @@ import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.client.ResourceAccessException; import org.springframework.web.client.RestTemplate; +import java.util.Arrays; import java.util.List; import java.util.UUID; @@ -211,12 +210,12 @@ public class DataServiceGatewayImpl implements DataServiceGateway { } @Override - public void createView(Long databaseId, ViewCreateDto data) throws ServiceConnectionException, ServiceException { - final ResponseEntity<Void> response; + public ViewDto createView(Long databaseId, ViewCreateDto data) throws ServiceConnectionException, ServiceException { + final ResponseEntity<ViewDto> response; final String url = "/api/database/" + databaseId + "/view"; log.debug("create view in data service"); try { - response = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(data), Void.class); + response = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(data), ViewDto.class); } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable | HttpServerErrorException.InternalServerError e) { log.error("Failed to create view: {}", e.getMessage()); @@ -229,6 +228,11 @@ public class DataServiceGatewayImpl implements DataServiceGateway { log.error("Failed to create view: wrong http code: {}", response.getStatusCode()); throw new ServiceException("Failed to create view: wrong http code: " + response.getStatusCode()); } + if (response.getBody() == null) { + log.error("Failed to create view: empty body: {}", response.getStatusCode()); + throw new ServiceException("Failed to create view: empty body: " + response.getStatusCode()); + } + return response.getBody(); } @Override @@ -267,7 +271,7 @@ public class DataServiceGatewayImpl implements DataServiceGateway { } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable | HttpServerErrorException.InternalServerError e) { log.error("Failed to find query: {}", e.getMessage()); - throw new ServiceConnectionException("Failed to delete table", e); + throw new ServiceConnectionException("Failed to find query", e); } catch (HttpClientErrorException.NotFound e) { log.error("Failed to find query: not found: {}", e.getMessage()); throw new QueryNotFoundException("Failed to find query: not found", e); @@ -296,7 +300,7 @@ public class DataServiceGatewayImpl implements DataServiceGateway { } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable | HttpServerErrorException.InternalServerError e) { log.error("Failed to export query: {}", e.getMessage()); - throw new ServiceConnectionException("Failed to delete table: " + e.getMessage(), e); + throw new ServiceConnectionException("Failed to export query: " + e.getMessage(), e); } catch (HttpClientErrorException.NotFound e) { log.error("Failed to export query: not found: {}", e.getMessage()); throw new QueryNotFoundException("Failed to export query: not found: " + e.getMessage(), e); @@ -311,4 +315,65 @@ public class DataServiceGatewayImpl implements DataServiceGateway { return response.getBody(); } + @Override + public List<TableDto> getTableSchemas(Long databaseId) throws ServiceConnectionException, ServiceException, QueryNotFoundException { + final ResponseEntity<TableDto[]> response; + final String url = "/api/database/" + databaseId + "/table"; + log.debug("retrieve table schema metadata in data service"); + try { + response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(null), TableDto[].class); + } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable | + HttpServerErrorException.InternalServerError e) { + log.error("Failed to get table schemas: {}", e.getMessage()); + throw new ServiceConnectionException("Failed to get table schemas: " + e.getMessage(), e); + } catch (HttpClientErrorException.NotFound e) { + log.error("Failed to get table schemas: not found: {}", e.getMessage()); + throw new QueryNotFoundException("Failed to get table schemas: not found: " + e.getMessage(), e); + } catch (HttpClientErrorException.Unauthorized e) { + log.error("Failed to get table schemas: {}", e.getMessage()); + throw new ServiceException("Failed to get table schemas: " + e.getMessage(), e); + } + if (!response.getStatusCode().equals(HttpStatus.OK)) { + log.error("Failed to get table schemas: wrong http code: {}", response.getStatusCode()); + throw new ServiceException("Failed to get table schemas: wrong http code: " + response.getStatusCode()); + } + if (response.getBody() == null) { + log.error("Failed to get table schemas: empty body: {}", response.getStatusCode()); + throw new ServiceException("Failed to get table schemas: empty body: " + response.getStatusCode()); + } + final List<TableDto> tables = Arrays.asList(response.getBody()); + log.debug("found {} table(s) in data service", tables.size()); + return tables; + } + + @Override + public List<ViewDto> getViewSchemas(Long databaseId) throws ServiceConnectionException, ServiceException, QueryNotFoundException { + final ResponseEntity<ViewDto[]> response; + final String url = "/api/database/" + databaseId + "/view"; + try { + response = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity<>(null), ViewDto[].class); + } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable | + HttpServerErrorException.InternalServerError e) { + log.error("Failed to get view schemas: {}", e.getMessage()); + throw new ServiceConnectionException("Failed to get view schemas: " + e.getMessage(), e); + } catch (HttpClientErrorException.NotFound e) { + log.error("Failed to get view schemas: not found: {}", e.getMessage()); + throw new QueryNotFoundException("Failed to get view schemas: not found: " + e.getMessage(), e); + } catch (HttpClientErrorException.Unauthorized e) { + log.error("Failed to get view schemas: {}", e.getMessage()); + throw new ServiceException("Failed to get view schemas: " + e.getMessage(), e); + } + if (!response.getStatusCode().equals(HttpStatus.OK)) { + log.error("Failed to get view schemas: wrong http code: {}", response.getStatusCode()); + throw new ServiceException("Failed to get view schemas: wrong http code: " + response.getStatusCode()); + } + if (response.getBody() == null) { + log.error("Failed to get view schemas: empty body: {}", response.getStatusCode()); + throw new ServiceException("Failed to get view schemas: empty body: " + response.getStatusCode()); + } + final List<ViewDto> views = Arrays.asList(response.getBody()); + log.debug("found {} view(s) in data service", views.size()); + return views; + } + } diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java index 8b87a1bfad..487e088062 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java @@ -1,10 +1,13 @@ package at.tuwien.gateway.impl; import at.tuwien.api.database.DatabaseDto; +import at.tuwien.api.database.table.constraints.unique.UniqueDto; import at.tuwien.entities.database.Database; +import at.tuwien.entities.database.View; import at.tuwien.exception.*; import at.tuwien.gateway.SearchServiceGateway; import at.tuwien.mapper.DatabaseMapper; +import at.tuwien.mapper.TableMapper; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -15,16 +18,22 @@ import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.client.ResourceAccessException; import org.springframework.web.client.RestTemplate; +import java.util.LinkedList; +import java.util.List; + @Log4j2 @Service public class SearchServiceGatewayImpl implements SearchServiceGateway { + private final TableMapper tableMapper; private final RestTemplate restTemplate; private final DatabaseMapper databaseMapper; @Autowired - public SearchServiceGatewayImpl(@Qualifier("searchServiceRestTemplate") RestTemplate restTemplate, + public SearchServiceGatewayImpl(TableMapper tableMapper, + @Qualifier("searchServiceRestTemplate") RestTemplate restTemplate, DatabaseMapper databaseMapper) { + this.tableMapper = tableMapper; this.restTemplate = restTemplate; this.databaseMapper = databaseMapper; } @@ -33,6 +42,31 @@ public class SearchServiceGatewayImpl implements SearchServiceGateway { public DatabaseDto update(Database database) throws SearchServiceConnectionException, SearchServiceException, DatabaseNotFoundException { final ResponseEntity<DatabaseDto> response; final DatabaseDto payload = databaseMapper.databaseToDatabaseDto(database); + payload.getTables() + .forEach(table -> { + table.setIsPublic(database.getIsPublic()); + table.getColumns() + .forEach(column -> { + column.setTable(table); + column.setTableId(table.getId()); + column.setDatabaseId(payload.getId()); + column.setIsPublic(payload.getIsPublic()); + }); + table.getConstraints() + .getUniques() + .forEach(uk -> { + uk.setTable(tableMapper.tableDtoToTableBriefDto(table)); + uk.getTable().setDatabaseId(database.getId()); + uk.setColumns(new LinkedList<>()); +// uk.getColumns() +// .forEach(column -> { +// column.setTable(table); +// column.setTableId(table.getId()); +// column.setDatabaseId(database.getId()); +// column.setIsPublic(database.getIsPublic()); +// }); + }); + }); final HttpHeaders headers = new HttpHeaders(); headers.set("Accept", "application/json"); headers.set("Content-Type", "application/json"); @@ -48,8 +82,8 @@ public class SearchServiceGatewayImpl implements SearchServiceGateway { log.error("Failed to update database: not found"); throw new DatabaseNotFoundException("Failed to update database: not found", e); } catch (HttpClientErrorException.BadRequest | HttpClientErrorException.Unauthorized e) { - log.error("Failed to update database: body is null"); - throw new SearchServiceException("Failed to update database: body is null", e); + log.error("Failed to update database: malformed payload: {}", e.getMessage()); + throw new SearchServiceException("Failed to update database: malformed payload", e); } if (!response.getStatusCode().equals(HttpStatus.ACCEPTED)) { log.error("Failed to update database: response code is not 202"); diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java index 8faa87017f..32291c8755 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/DatabaseService.java @@ -7,6 +7,8 @@ import at.tuwien.entities.database.Database; import at.tuwien.entities.user.User; import at.tuwien.exception.*; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; import java.security.Principal; import java.util.List; @@ -99,5 +101,11 @@ public interface DatabaseService { */ Database modifyImage(Database database, byte[] image) throws DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException; + Database updateTableMetadata(Database database) throws DatabaseNotFoundException, ServiceException, + SearchServiceException, SearchServiceConnectionException, QueryNotFoundException, + ServiceConnectionException, MalformedException; + Database updateViewMetadata(Database database) throws DatabaseNotFoundException, ServiceException, + SearchServiceException, SearchServiceConnectionException, QueryNotFoundException, + ServiceConnectionException; } diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java index 7d92eb7ff6..f695267a4a 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java @@ -3,17 +3,24 @@ package at.tuwien.service.impl; import at.tuwien.api.database.DatabaseCreateDto; import at.tuwien.api.database.DatabaseDto; import at.tuwien.api.database.DatabaseModifyVisibilityDto; +import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.internal.CreateDatabaseDto; +import at.tuwien.api.database.table.TableDto; +import at.tuwien.api.database.table.columns.ColumnDto; +import at.tuwien.api.database.table.constraints.primary.PrimaryKeyDto; import at.tuwien.api.user.internal.UpdateUserPasswordDto; import at.tuwien.entities.container.Container; -import at.tuwien.entities.database.AccessType; -import at.tuwien.entities.database.Database; -import at.tuwien.entities.database.DatabaseAccess; +import at.tuwien.entities.database.*; +import at.tuwien.entities.database.table.Table; +import at.tuwien.entities.database.table.columns.TableColumn; +import at.tuwien.entities.database.table.constraints.primaryKey.PrimaryKey; import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.gateway.DataServiceGateway; import at.tuwien.gateway.SearchServiceGateway; import at.tuwien.mapper.DatabaseMapper; +import at.tuwien.mapper.TableMapper; +import at.tuwien.mapper.ViewMapper; import at.tuwien.repository.DatabaseRepository; import at.tuwien.service.*; import lombok.extern.log4j.Log4j2; @@ -28,6 +35,8 @@ import java.util.*; @Service public class DatabaseServiceImpl implements DatabaseService { + private final ViewMapper viewMapper; + private final TableMapper tableMapper; private final DatabaseMapper databaseMapper; private final ContainerService containerService; private final DatabaseRepository databaseRepository; @@ -35,9 +44,11 @@ public class DatabaseServiceImpl implements DatabaseService { private final SearchServiceGateway searchServiceGateway; @Autowired - public DatabaseServiceImpl(DatabaseMapper databaseMapper, ContainerService containerService, - DatabaseRepository databaseRepository, DataServiceGateway dataServiceGateway, - SearchServiceGateway searchServiceGateway) { + public DatabaseServiceImpl(ViewMapper viewMapper, TableMapper tableMapper, DatabaseMapper databaseMapper, + ContainerService containerService, DatabaseRepository databaseRepository, + DataServiceGateway dataServiceGateway, SearchServiceGateway searchServiceGateway) { + this.viewMapper = viewMapper; + this.tableMapper = tableMapper; this.databaseMapper = databaseMapper; this.containerService = containerService; this.databaseRepository = databaseRepository; @@ -184,4 +195,92 @@ public class DatabaseServiceImpl implements DatabaseService { return database; } + @Override + @Transactional(rollbackFor = {SearchServiceException.class, SearchServiceConnectionException.class, DatabaseNotFoundException.class}) + public Database updateTableMetadata(Database database) throws DatabaseNotFoundException, ServiceException, + SearchServiceException, SearchServiceConnectionException, QueryNotFoundException, + ServiceConnectionException, MalformedException { + for (TableDto table : dataServiceGateway.getTableSchemas(database.getId())) { + if (database.getTables().stream().anyMatch(t -> t.getInternalName().equals(table.getInternalName()))) { + log.debug("fetched known table from data service: {}.{}", database.getInternalName(), table.getInternalName()); + continue; + } + log.debug("fetched unknown table from data service: {}.{}", database.getInternalName(), table.getInternalName()); + final Table tableEntity = tableMapper.tableDtoToTable(table); + tableEntity.setDatabase(database); + tableEntity.getColumns() + .forEach(column -> { + column.setTable(tableEntity); + }); + /* map unique constraint(s) */ + tableEntity.getConstraints() + .getUniques() + .forEach(uk -> { + uk.setTable(tableEntity); + uk.getColumns() + .forEach(column -> { + column.setTable(tableEntity); + }); + }); + /* map foreign key constraint(s) */ + tableEntity.getConstraints() + .getForeignKeys() + .forEach(fk -> { + fk.setTable(tableEntity); + }); + /* map primary key constraint */ + for (PrimaryKeyDto key : table.getConstraints().getPrimaryKey()) { + final Optional<TableColumn> optional = tableEntity.getColumns() + .stream() + .filter(c -> c.getInternalName().equals(key.getColumn().getInternalName())) + .findFirst(); + if (optional.isEmpty()) { + log.error("Failed to find primary key column {} in table {}.{}", key.getColumn().getInternalName(), database.getInternalName(), table.getInternalName()); + throw new MalformedException("Failed to find primary key column: " + key.getColumn().getInternalName()); + } + tableEntity.getConstraints() + .getPrimaryKey() + .add(PrimaryKey.builder() + .table(tableEntity) + .column(optional.get()) + .build()); + } + database.getTables() + .add(tableEntity); + } + /* update in metadata database */ + database = databaseRepository.save(database); + /* save in search service */ + searchServiceGateway.update(database); + log.info("Updated table metadata of database with id {} & search database", database.getId()); + return database; + } + + @Override + @Transactional(rollbackFor = {SearchServiceException.class, SearchServiceConnectionException.class, DatabaseNotFoundException.class}) + public Database updateViewMetadata(Database database) throws DatabaseNotFoundException, ServiceException, + SearchServiceException, SearchServiceConnectionException, QueryNotFoundException, + ServiceConnectionException { + for (ViewDto view : dataServiceGateway.getViewSchemas(database.getId())) { + if (database.getViews().stream().anyMatch(v -> v.getInternalName().equals(view.getInternalName()))) { + log.debug("fetched known view from data service: {}.{}", database.getInternalName(), view.getInternalName()); + continue; + } + log.debug("fetched unknown view from data service: {}.{}", database.getInternalName(), view.getInternalName()); + final View viewEntity = viewMapper.viewDtoToView(view); + viewEntity.setDatabase(database); + for (ViewColumn column : viewEntity.getColumns()) { + column.setView(viewEntity); + } + database.getViews() + .add(viewEntity); + } + /* update in metadata database */ + database = databaseRepository.save(database); + /* save in search service */ + searchServiceGateway.update(database); + log.info("Updated view metadata of database with id {} & search database", database.getId()); + return database; + } + } diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java index 54705186fa..ec26939199 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java @@ -1,19 +1,18 @@ package at.tuwien.service.impl; import at.tuwien.api.database.ViewCreateDto; +import at.tuwien.api.database.ViewDto; import at.tuwien.entities.database.Database; import at.tuwien.entities.database.View; import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.gateway.DataServiceGateway; import at.tuwien.gateway.SearchServiceGateway; -import at.tuwien.mapper.QueryMapper; import at.tuwien.mapper.ViewMapper; import at.tuwien.repository.DatabaseRepository; import at.tuwien.service.ViewService; import com.google.common.hash.Hashing; import lombok.extern.log4j.Log4j2; -import net.sf.jsqlparser.JSQLParserException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,16 +27,14 @@ import java.util.Optional; public class ViewServiceImpl implements ViewService { private final ViewMapper viewMapper; - private final QueryMapper queryMapper; private final DataServiceGateway dataServiceGateway; private final DatabaseRepository databaseRepository; private final SearchServiceGateway searchServiceGateway; @Autowired - public ViewServiceImpl(ViewMapper viewMapper, QueryMapper queryMapper, DataServiceGateway dataServiceGateway, + public ViewServiceImpl(ViewMapper viewMapper, DataServiceGateway dataServiceGateway, DatabaseRepository databaseRepository, SearchServiceGateway searchServiceGateway) { this.viewMapper = viewMapper; - this.queryMapper = queryMapper; this.dataServiceGateway = dataServiceGateway; this.databaseRepository = databaseRepository; this.searchServiceGateway = searchServiceGateway; @@ -102,17 +99,13 @@ public class ViewServiceImpl implements ViewService { .queryHash(Hashing.sha256() .hashString(data.getQuery(), StandardCharsets.UTF_8) .toString()) + .columns(new LinkedList<>()) .isInitialView(false) .isPublic(data.getIsPublic()) .build(); /* create in data service */ data.setName(view.getInternalName()); - dataServiceGateway.createView(database.getId(), data); - try { - view.setColumns(viewMapper.tableColumnsToViewColumns(view, queryMapper.parseColumns(data.getQuery(), database))); - } catch (JSQLParserException e) { - throw new MalformedException("Failed to parse columns from view: " + e.getMessage(), e); - } + final ViewDto dto = dataServiceGateway.createView(database.getId(), data); database.getViews() .add(view); database = databaseRepository.save(database); diff --git a/dbrepo-metadata-service/test/pom.xml b/dbrepo-metadata-service/test/pom.xml index 303ea6133e..902e9efdda 100644 --- a/dbrepo-metadata-service/test/pom.xml +++ b/dbrepo-metadata-service/test/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.4.3</version> + <version>1.4.4</version> </parent> <artifactId>dbrepo-metadata-service-test</artifactId> <name>dbrepo-metadata-service-test</name> - <version>1.4.3</version> + <version>1.4.4</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java index 326437195d..a780819631 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java @@ -24,6 +24,7 @@ public abstract class AbstractUnitTest extends BaseTest { DATABASE_1_PRIVILEGED_DTO.setAccesses(new LinkedList<>(List.of(DATABASE_1_USER_1_READ_ACCESS_DTO, DATABASE_1_USER_2_WRITE_OWN_ACCESS_DTO, DATABASE_1_USER_3_WRITE_ALL_ACCESS_DTO))); TABLE_1.setDatabase(DATABASE_1); TABLE_1.setColumns(new LinkedList<>(TABLE_1_COLUMNS)); + TABLE_1.setConstraints(TABLE_1_CONSTRAINTS); TABLE_1_PRIVILEGED_DTO.setColumns(new LinkedList<>(TABLE_1_COLUMNS_DTO)); TABLE_1_PRIVILEGED_DTO.setDatabase(DATABASE_1_PRIVILEGED_DTO); DATABASE_1.setIdentifiers(new LinkedList<>(List.of(IDENTIFIER_1, IDENTIFIER_2, IDENTIFIER_3, IDENTIFIER_4))); @@ -33,16 +34,24 @@ public abstract class AbstractUnitTest extends BaseTest { DATABASE_1_PRIVILEGED_DTO.setTables(new LinkedList<>(List.of(TABLE_1_DTO, TABLE_2_DTO, TABLE_3_DTO, TABLE_4_DTO))); DATABASE_1_PRIVILEGED_DTO.setViews(new LinkedList<>(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO))); TABLE_1_DTO.setColumns(TABLE_1_COLUMNS_DTO); + TABLE_1_DTO.setConstraints(TABLE_1_CONSTRAINTS_DTO); TABLE_2.setDatabase(DATABASE_1); TABLE_2.setColumns(new LinkedList<>(TABLE_2_COLUMNS)); + TABLE_2_CONSTRAINTS.getForeignKeys().get(0).getReferences().get(0).setForeignKey(TABLE_2_CONSTRAINTS.getForeignKeys().get(0)); + TABLE_2.setConstraints(TABLE_2_CONSTRAINTS); TABLE_2_PRIVILEGED_DTO.setColumns(new LinkedList<>(TABLE_2_COLUMNS_DTO)); TABLE_2_DTO.setColumns(TABLE_2_COLUMNS_DTO); + TABLE_2_DTO.setConstraints(TABLE_2_CONSTRAINTS_DTO); TABLE_3.setDatabase(DATABASE_1); TABLE_3.setColumns(new LinkedList<>(TABLE_3_COLUMNS)); + TABLE_3.setConstraints(TABLE_3_CONSTRAINTS); TABLE_3_DTO.setColumns(TABLE_3_COLUMNS_DTO); + TABLE_3_DTO.setConstraints(TABLE_3_CONSTRAINTS_DTO); TABLE_4.setDatabase(DATABASE_1); TABLE_4.setColumns(new LinkedList<>(TABLE_4_COLUMNS)); + TABLE_4.setConstraints(TABLE_4_CONSTRAINTS); TABLE_4_DTO.setColumns(TABLE_4_COLUMNS_DTO); + TABLE_4_DTO.setConstraints(TABLE_4_CONSTRAINTS_DTO); VIEW_1.setDatabase(DATABASE_1); VIEW_1.setColumns(VIEW_1_COLUMNS); VIEW_1.setIdentifiers(new LinkedList<>(List.of(IDENTIFIER_3))); @@ -52,6 +61,7 @@ public abstract class AbstractUnitTest extends BaseTest { VIEW_2_PRIVILEGED_DTO.setDatabase(DATABASE_1_PRIVILEGED_DTO); VIEW_3.setDatabase(DATABASE_1); VIEW_3.setColumns(VIEW_3_COLUMNS); + VIEW_3_PRIVILEGED_DTO.setDatabase(DATABASE_1_PRIVILEGED_DTO); IDENTIFIER_1.setDatabase(DATABASE_1); IDENTIFIER_2.setDatabase(DATABASE_1); IDENTIFIER_3.setDatabase(DATABASE_1); @@ -63,13 +73,22 @@ public abstract class AbstractUnitTest extends BaseTest { DATABASE_2.setIdentifiers(new LinkedList<>(List.of(IDENTIFIER_5))); TABLE_5.setDatabase(DATABASE_2); TABLE_5.setColumns(new LinkedList<>(TABLE_5_COLUMNS)); + TABLE_5.setConstraints(TABLE_5_CONSTRAINTS); TABLE_5_DTO.setColumns(TABLE_5_COLUMNS_DTO); + TABLE_5_DTO.setConstraints(TABLE_5_CONSTRAINTS_DTO); TABLE_6.setDatabase(DATABASE_2); TABLE_6.setColumns(new LinkedList<>(TABLE_6_COLUMNS)); + TABLE_6.setConstraints(TABLE_6_CONSTRAINTS); TABLE_7.setDatabase(DATABASE_2); TABLE_7.setColumns(new LinkedList<>(TABLE_7_COLUMNS)); + TABLE_7.setConstraints(TABLE_7_CONSTRAINTS); + TABLE_7_CONSTRAINTS.getForeignKeys().get(0).getReferences().get(0).setForeignKey(TABLE_7_CONSTRAINTS.getForeignKeys().get(0)); + TABLE_7_CONSTRAINTS.getForeignKeys().get(1).getReferences().get(0).setForeignKey(TABLE_7_CONSTRAINTS.getForeignKeys().get(1)); + TABLE_7_DTO.setColumns(TABLE_7_COLUMNS_DTO); + TABLE_7_DTO.setConstraints(TABLE_7_CONSTRAINTS_DTO); + TABLE_7_CONSTRAINTS_DTO.getForeignKeys().get(0).getReferences().get(0).setForeignKey(TABLE_7_CONSTRAINTS_DTO.getForeignKeys().get(0)); + TABLE_7_CONSTRAINTS_DTO.getForeignKeys().get(1).getReferences().get(0).setForeignKey(TABLE_7_CONSTRAINTS_DTO.getForeignKeys().get(1)); VIEW_4.setDatabase(DATABASE_2); - VIEW_4.setColumns(VIEW_4_COLUMNS); IDENTIFIER_5.setDatabase(DATABASE_2); /* DATABASE 3 */ DATABASE_3.setAccesses(new LinkedList<>(List.of(DATABASE_3_USER_1_WRITE_ALL_ACCESS))); @@ -78,8 +97,11 @@ public abstract class AbstractUnitTest extends BaseTest { DATABASE_3.setIdentifiers(new LinkedList<>(List.of(IDENTIFIER_6))); TABLE_8.setDatabase(DATABASE_3); TABLE_8.setColumns(new LinkedList<>(TABLE_8_COLUMNS)); + TABLE_8.setConstraints(TABLE_8_CONSTRAINTS); TABLE_8_DTO.setColumns(new LinkedList<>(TABLE_8_COLUMNS_DTO)); + TABLE_8_DTO.setConstraints(TABLE_8_CONSTRAINTS_DTO); TABLE_8_PRIVILEGED_DTO.setColumns(new LinkedList<>(TABLE_8_COLUMNS_DTO)); + TABLE_8_PRIVILEGED_DTO.setConstraints(TABLE_8_CONSTRAINTS_DTO); VIEW_5.setDatabase(DATABASE_3); VIEW_5.setColumns(VIEW_5_COLUMNS); IDENTIFIER_6.setDatabase(DATABASE_3); diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java index 251191c5fb..e0275f5d6e 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java @@ -25,12 +25,17 @@ import at.tuwien.api.database.table.columns.ColumnTypeDto; import at.tuwien.api.database.table.columns.concepts.*; import at.tuwien.api.database.table.constraints.ConstraintsCreateDto; import at.tuwien.api.database.table.constraints.ConstraintsDto; -import at.tuwien.api.database.table.constraints.foreignKey.ForeignKeyCreateDto; +import at.tuwien.api.database.table.constraints.foreign.ForeignKeyCreateDto; +import at.tuwien.api.database.table.constraints.foreign.ForeignKeyDto; +import at.tuwien.api.database.table.constraints.foreign.ForeignKeyReferenceDto; +import at.tuwien.api.database.table.constraints.foreign.ReferenceTypeDto; +import at.tuwien.api.database.table.constraints.primary.PrimaryKeyDto; import at.tuwien.api.database.table.constraints.unique.UniqueDto; import at.tuwien.api.database.table.internal.PrivilegedTableDto; import at.tuwien.api.datacite.DataCiteBody; import at.tuwien.api.datacite.DataCiteData; import at.tuwien.api.datacite.doi.DataCiteDoi; +import at.tuwien.api.error.ApiErrorDto; import at.tuwien.api.identifier.*; import at.tuwien.api.keycloak.CredentialDto; import at.tuwien.api.keycloak.CredentialTypeDto; @@ -63,19 +68,36 @@ import at.tuwien.entities.database.table.columns.TableColumn; import at.tuwien.entities.database.table.columns.TableColumnConcept; import at.tuwien.entities.database.table.columns.TableColumnType; import at.tuwien.entities.database.table.columns.TableColumnUnit; +import at.tuwien.entities.database.table.constraints.Constraints; +import at.tuwien.entities.database.table.constraints.foreignKey.ForeignKey; +import at.tuwien.entities.database.table.constraints.foreignKey.ForeignKeyReference; +import at.tuwien.entities.database.table.constraints.foreignKey.ReferenceType; +import at.tuwien.entities.database.table.constraints.primaryKey.PrimaryKey; +import at.tuwien.entities.database.table.constraints.unique.Unique; import at.tuwien.entities.identifier.*; import at.tuwien.entities.maintenance.BannerMessage; import at.tuwien.entities.maintenance.BannerMessageType; import at.tuwien.entities.semantics.Ontology; import at.tuwien.entities.user.User; import at.tuwien.test.utils.ArrayUtils; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.MediaType; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.web.bind.annotation.ResponseStatus; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Method; import java.math.BigDecimal; import java.math.BigInteger; +import java.nio.charset.Charset; import java.security.Principal; import java.time.Instant; import java.util.*; @@ -995,7 +1017,7 @@ public abstract class BaseTest { .jdbcMethod(IMAGE_1_JDBC) .driverClass(IMAGE_1_DRIVER) .defaultPort(IMAGE_1_PORT) - .dateFormats(List.of(IMAGE_DATE_1, IMAGE_DATE_2, IMAGE_DATE_3, IMAGE_DATE_4)) + .dateFormats(new LinkedList<>(List.of(IMAGE_DATE_1, IMAGE_DATE_2, IMAGE_DATE_3, IMAGE_DATE_4))) .build(); public final static ImageDto IMAGE_1_DTO = ImageDto.builder() @@ -1498,13 +1520,6 @@ public abstract class BaseTest { public final static Instant TABLE_1_CREATED = Instant.ofEpochSecond(1677399975L) /* 2023-02-26 08:26:15 (UTC) */; public final static Instant TABLE_1_LAST_MODIFIED = Instant.ofEpochSecond(1677399975L) /* 2023-02-26 08:26:15 (UTC) */; - public final static ConstraintsDto TABLE_1_CONSTRAINT_DTO = ConstraintsDto.builder() - .checks(new LinkedHashSet<>()) - .primaryKey(new LinkedHashSet<>(Set.of("id"))) - .foreignKeys(new LinkedList<>()) - .uniques(new LinkedList<>()) - .build(); - public final static PrivilegedTableDto TABLE_1_PRIVILEGED_DTO = PrivilegedTableDto.builder() .id(TABLE_1_ID) .tdbid(DATABASE_1_ID) @@ -1518,7 +1533,7 @@ public abstract class BaseTest { .routingKey(TABLE_1_ROUTING_KEY) .identifiers(new LinkedList<>()) .columns(new LinkedList<>() /* TABLE_1_COLUMNS_DTO */) - .constraints(TABLE_1_CONSTRAINT_DTO) + .constraints(null) /* TABLE_1_CONSTRAINTS_DTO */ .createdBy(USER_1_ID) .owner(USER_1_DTO) .isPublic(DATABASE_1_PUBLIC) @@ -1536,6 +1551,7 @@ public abstract class BaseTest { .queueName(TABLE_1_QUEUE_NAME) .identifiers(new LinkedList<>()) .columns(new LinkedList<>() /* TABLE_1_COLUMNS */) + .constraints(null) /* TABLE_1_CONSTRAINTS */ .createdBy(USER_1_ID) .creator(USER_1) .ownedBy(USER_1_ID) @@ -1555,7 +1571,7 @@ public abstract class BaseTest { .routingKey(TABLE_1_ROUTING_KEY) .identifiers(new LinkedList<>()) .columns(new LinkedList<>() /* TABLE_1_COLUMNS_DTO */) - .constraints(TABLE_1_CONSTRAINT_DTO) + .constraints(null) /* TABLE_1_CONSTRAINT_DTO */ .createdBy(USER_1_ID) .owner(USER_1_DTO) .build(); @@ -1650,13 +1666,6 @@ public abstract class BaseTest { public final static Instant TABLE_2_CREATED = Instant.ofEpochSecond(1677400007L) /* 2023-02-26 08:26:47 (UTC) */; public final static Instant TABLE_2_LAST_MODIFIED = Instant.ofEpochSecond(1677400007L) /* 2023-02-26 08:26:47 (UTC) */; - public final static ConstraintsDto TABLE_2_CONSTRAINT_DTO = ConstraintsDto.builder() - .checks(new LinkedHashSet<>()) - .primaryKey(new LinkedHashSet<>(Set.of("location"))) - .foreignKeys(new LinkedList<>()) - .uniques(new LinkedList<>()) - .build(); - public final static Table TABLE_2 = Table.builder() .id(TABLE_2_ID) .tdbid(DATABASE_1_ID) @@ -1669,6 +1678,7 @@ public abstract class BaseTest { .lastModified(TABLE_2_LAST_MODIFIED) .queueName(TABLE_2_QUEUE_NAME) .columns(new LinkedList<>() /* TABLE_2_COLUMNS */) + .constraints(null) /* TABLE_2_CONSTRAINTS */ .createdBy(USER_2_ID) .ownedBy(USER_2_ID) .owner(USER_2) @@ -1687,7 +1697,7 @@ public abstract class BaseTest { .routingKey(TABLE_2_ROUTING_KEY) .identifiers(new LinkedList<>()) .columns(new LinkedList<>() /* TABLE_2_COLUMNS_DTO */) - .constraints(TABLE_2_CONSTRAINT_DTO) + .constraints(null) /* TABLE_2_CONSTRAINTS_DTO */ .createdBy(USER_1_ID) .owner(USER_1_DTO) .build(); @@ -1703,7 +1713,7 @@ public abstract class BaseTest { .queueName(TABLE_2_QUEUE_NAME) .routingKey(TABLE_2_ROUTING_KEY) .columns(new LinkedList<>() /* TABLE_2_COLUMNS_DTO */) - .constraints(ConstraintsDto.builder().build()) + .constraints(null) /* TABLE_2_CONSTRAINTS_DTO */ .createdBy(USER_2_ID) .owner(USER_2_DTO) .build(); @@ -1741,6 +1751,7 @@ public abstract class BaseTest { .lastModified(TABLE_3_LAST_MODIFIED) .queueName(TABLE_3_QUEUE_NAME) .columns(new LinkedList<>() /* TABLE_3_COLUMNS */) + .constraints(null) /* TABLE_3_CONSTRAINTS */ .createdBy(USER_3_ID) .ownedBy(USER_3_ID) .owner(USER_3) @@ -1757,7 +1768,7 @@ public abstract class BaseTest { .queueName(TABLE_3_QUEUE_NAME) .routingKey(TABLE_3_ROUTING_KEY) .columns(new LinkedList<>() /* TABLE_3_COLUMNS_DTO */) - .constraints(ConstraintsDto.builder().build()) + .constraints(null) /* TABLE_3_CONSTRAINTS_DTO */ .createdBy(USER_3_ID) .owner(USER_3_DTO) .build(); @@ -1822,7 +1833,8 @@ public abstract class BaseTest { .name(TABLE_5_NAME) .lastModified(TABLE_5_LAST_MODIFIED) .queueName(TABLE_5_QUEUE_NAME) - .columns(new LinkedList<>() /* needs to be set in the junit tests */) + .columns(new LinkedList<>()) /* TABLE_5_COLUMNS */ + .constraints(null) /* TABLE_5_CONSTRAINTS */ .createdBy(USER_1_ID) .ownedBy(USER_1_ID) .owner(USER_1) @@ -1838,12 +1850,22 @@ public abstract class BaseTest { .name(TABLE_5_NAME) .queueName(TABLE_5_QUEUE_NAME) .routingKey(TABLE_5_ROUTING_KEY) - .columns(new LinkedList<>() /* TABLE_5_COLUMNS_DTO */) - .constraints(ConstraintsDto.builder().build()) + .columns(new LinkedList<>()) /* TABLE_5_COLUMNS_DTO */ + .constraints(null) /* TABLE_5_CONSTRAINTS_DTO */ .createdBy(USER_1_ID) .owner(USER_1_DTO) .build(); + public final static TableBriefDto TABLE_5_BRIEF_DTO = TableBriefDto.builder() + .id(TABLE_5_ID) + .internalName(TABLE_5_INTERNALNAME) + .isVersioned(TABLE_5_VERSIONED) + .description(TABLE_5_DESCRIPTION) + .name(TABLE_5_NAME) + .columns(new LinkedList<>() /* TABLE_5_COLUMNS_DTO */) + .owner(USER_1_BRIEF_DTO) + .build(); + public final static Long TABLE_6_ID = 6L; public final static String TABLE_6_NAME = "names"; public final static String TABLE_6_INTERNALNAME = "names"; @@ -1865,7 +1887,8 @@ public abstract class BaseTest { .name(TABLE_6_NAME) .lastModified(TABLE_6_LAST_MODIFIED) .queueName(TABLE_6_QUEUE_NAME) - .columns(new LinkedList<>() /* needs to be set in the junit tests */) + .columns(new LinkedList<>()) /* TABLE_6_COLUMNS */ + .constraints(null) /* TABLE_6_CONSTRAINTS */ .createdBy(USER_1_ID) .ownedBy(USER_1_ID) .owner(USER_1) @@ -1882,13 +1905,23 @@ public abstract class BaseTest { .name(TABLE_6_NAME) .queueName(TABLE_6_QUEUE_NAME) .routingKey(TABLE_6_ROUTING_KEY) - .columns(new LinkedList<>() /* TABLE_6_COLUMNS_DTO */) - .constraints(ConstraintsDto.builder().build()) + .columns(new LinkedList<>()) /* TABLE_6_COLUMNS_DTO */ + .constraints(null) /* TABLE_6_CONSTRAINTS_DTO */ .createdBy(USER_1_ID) .owner(USER_1_DTO) .created(TABLE_6_CREATED) .build(); + public final static TableBriefDto TABLE_6_BRIEF_DTO = TableBriefDto.builder() + .id(TABLE_6_ID) + .internalName(TABLE_6_INTERNALNAME) + .isVersioned(TABLE_6_VERSIONED) + .description(TABLE_6_DESCRIPTION) + .name(TABLE_6_NAME) + .columns(new LinkedList<>()) /* TABLE_6_COLUMNS_DTO */ + .owner(USER_1_BRIEF_DTO) + .build(); + public final static Long TABLE_7_ID = 7L; public final static String TABLE_7_NAME = "likes"; public final static String TABLE_7_INTERNAL_NAME = "likes"; @@ -1910,7 +1943,8 @@ public abstract class BaseTest { .name(TABLE_7_NAME) .lastModified(TABLE_7_LAST_MODIFIED) .queueName(TABLE_7_QUEUE_NAME) - .columns(new LinkedList<>() /* TABLE_7_COLUMNS */) + .columns(new LinkedList<>()) /* TABLE_7_COLUMNS */ + .constraints(null) /* TABLE_7_CONSTRAINTS */ .createdBy(USER_1_ID) .ownedBy(USER_1_ID) .owner(USER_1) @@ -1927,16 +1961,26 @@ public abstract class BaseTest { .name(TABLE_7_NAME) .queueName(TABLE_7_QUEUE_NAME) .routingKey(TABLE_7_ROUTING_KEY) - .columns(new LinkedList<>() /* TABLE_7_COLUMNS_DTO */) - .constraints(ConstraintsDto.builder().build()) + .columns(new LinkedList<>()) /* TABLE_7_COLUMNS_DTO */ + .constraints(null) /* TABLE_7_CONSTRAINTS_DTO */ .createdBy(USER_1_ID) .owner(USER_1_DTO) .created(TABLE_7_CREATED) .build(); + public final static TableBriefDto TABLE_7_BRIEF_DTO = TableBriefDto.builder() + .id(TABLE_7_ID) + .internalName(TABLE_7_INTERNAL_NAME) + .isVersioned(TABLE_7_VERSIONED) + .description(TABLE_7_DESCRIPTION) + .name(TABLE_7_NAME) + .columns(new LinkedList<>()) /* TABLE_7_COLUMNS_DTO */ + .owner(USER_1_BRIEF_DTO) + .build(); + public final static Long TABLE_4_ID = 4L; - public final static String TABLE_4_NAME = "Sensor"; - public final static String TABLE_4_INTERNAL_NAME = "sensor"; + public final static String TABLE_4_NAME = "Sensor 2"; + public final static String TABLE_4_INTERNAL_NAME = "sensor_2"; public final static Boolean TABLE_4_VERSIONED = true; public final static Boolean TABLE_4_PROCESSED_CONSTRAINTS = true; public final static String TABLE_4_DESCRIPTION = "Hello sensor"; @@ -1953,7 +1997,8 @@ public abstract class BaseTest { .database(null /* DATABASE_1 */) .name(TABLE_4_NAME) .queueName(TABLE_4_QUEUE_NAME) - .columns(new LinkedList<>() /* TABLE_4_COLUMNS */) + .columns(new LinkedList<>()) /* TABLE_4_COLUMNS */ + .constraints(null) /* TABLE_4_CONSTRAINTS */ .isVersioned(TABLE_4_VERSIONED) .createdBy(USER_1_ID) .ownedBy(USER_1_ID) @@ -1970,8 +2015,8 @@ public abstract class BaseTest { .name(TABLE_4_NAME) .queueName(TABLE_4_QUEUE_NAME) .routingKey(TABLE_4_ROUTING_KEY) - .columns(new LinkedList<>() /* TABLE_4_COLUMNS_DTO */) - .constraints(ConstraintsDto.builder().build()) + .columns(new LinkedList<>()) /* TABLE_4_COLUMNS_DTO */ + .constraints(null) /* TABLE_4_CONSTRAINTS_DTO */ .isVersioned(TABLE_4_VERSIONED) .createdBy(USER_1_ID) .owner(USER_1_DTO) @@ -2089,7 +2134,8 @@ public abstract class BaseTest { .database(null /* DATABASE_1 */) .name(TABLE_8_NAME) .queueName(TABLE_8_QUEUE_NAME) - .columns(new LinkedList<>() /* TABLE_8_COLUMNS */) + .columns(new LinkedList<>()) /* TABLE_8_COLUMNS */ + .constraints(null) /* TABLE_8_CONSTRAINTS */ .createdBy(USER_1_ID) .ownedBy(USER_1_ID) .owner(USER_1) @@ -2105,13 +2151,24 @@ public abstract class BaseTest { .isVersioned(TABLE_8_VERSIONED) .name(TABLE_8_NAME) .queueName(TABLE_8_QUEUE_NAME) - .columns(new LinkedList<>() /* TABLE_8_COLUMNS */) + .columns(new LinkedList<>()) /* TABLE_8_COLUMNS_DTO */ + .constraints(null) /* TABLE_8_CONSTRAINTS_DTO */ .createdBy(USER_1_ID) .creator(USER_1_DTO) .owner(USER_1_DTO) .created(TABLE_8_CREATED) .build(); + public final static TableBriefDto TABLE_8_BRIEF_DTO = TableBriefDto.builder() + .id(TABLE_8_ID) + .internalName(TABLE_8_INTERNAL_NAME) + .description(TABLE_8_DESCRIPTION) + .isVersioned(TABLE_8_VERSIONED) + .name(TABLE_8_NAME) + .columns(new LinkedList<>()) /* TABLE_8_COLUMNS_DTO */ + .owner(USER_1_BRIEF_DTO) + .build(); + public final static PrivilegedTableDto TABLE_8_PRIVILEGED_DTO = PrivilegedTableDto.builder() .id(TABLE_8_ID) .tdbid(TABLE_8_DATABASE_ID) @@ -2120,7 +2177,7 @@ public abstract class BaseTest { .isVersioned(TABLE_8_VERSIONED) .name(TABLE_8_NAME) .queueName(TABLE_8_QUEUE_NAME) - .columns(new LinkedList<>() /* TABLE_8_COLUMNS */) + .columns(new LinkedList<>()) /* TABLE_8_COLUMNS_DTO */ .createdBy(USER_1_ID) .creator(USER_1_DTO) .owner(USER_1_DTO) @@ -2248,509 +2305,6 @@ public abstract class BaseTest { .sparqlEndpoint(ONTOLOGY_5_SPARQL_ENDPOINT) .build(); - public final static Long COLUMN_4_1_ID = 45L; - public final static Integer COLUMN_4_1_ORDINALPOS = 0; - public final static Boolean COLUMN_4_1_PRIMARY = true; - public final static String COLUMN_4_1_NAME = "id"; - public final static String COLUMN_4_1_INTERNAL_NAME = "id"; - public final static TableColumnType COLUMN_4_1_TYPE = TableColumnType.BIGINT; - public final static ColumnTypeDto COLUMN_4_1_TYPE_DTO = ColumnTypeDto.BIGINT; - public final static Long COLUMN_4_1_DATE_FORMAT = null; - public final static Boolean COLUMN_4_1_NULL = false; - public final static Boolean COLUMN_4_1_AUTO_GENERATED = true; - public final static String COLUMN_4_1_FOREIGN_KEY = null; - public final static String COLUMN_4_1_CHECK = null; - public final static List<String> COLUMN_4_1_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_1_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_1_ENUM_VALUES = null; - public final static List<String> COLUMN_4_1_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_1_SET_VALUES = null; - public final static List<String> COLUMN_4_1_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_2_ID = 46L; - public final static Integer COLUMN_4_2_ORDINALPOS = 1; - public final static Boolean COLUMN_4_2_PRIMARY = false; - public final static String COLUMN_4_2_NAME = "Animal Name"; - public final static String COLUMN_4_2_INTERNAL_NAME = "animal_name"; - public final static TableColumnType COLUMN_4_2_TYPE = TableColumnType.VARCHAR; - public final static ColumnTypeDto COLUMN_4_2_TYPE_DTO = ColumnTypeDto.VARCHAR; - public final static Long COLUMN_4_2_DATE_FORMAT = null; - public final static Boolean COLUMN_4_2_NULL = true; - public final static Boolean COLUMN_4_2_AUTO_GENERATED = false; - public final static String COLUMN_4_2_FOREIGN_KEY = null; - public final static String COLUMN_4_2_CHECK = null; - public final static List<String> COLUMN_4_2_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_2_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_2_ENUM_VALUES = null; - public final static List<String> COLUMN_4_2_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_2_SET_VALUES = null; - public final static List<String> COLUMN_4_2_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_3_ID = 47L; - public final static Integer COLUMN_4_3_ORDINALPOS = 2; - public final static Boolean COLUMN_4_3_PRIMARY = false; - public final static String COLUMN_4_3_NAME = "Hair"; - public final static String COLUMN_4_3_INTERNAL_NAME = "hair"; - public final static TableColumnType COLUMN_4_3_TYPE = TableColumnType.BOOL; - public final static ColumnTypeDto COLUMN_4_3_TYPE_DTO = ColumnTypeDto.BOOL; - public final static Long COLUMN_4_3_DATE_FORMAT = null; - public final static Boolean COLUMN_4_3_NULL = true; - public final static Boolean COLUMN_4_3_AUTO_GENERATED = false; - public final static String COLUMN_4_3_FOREIGN_KEY = null; - public final static String COLUMN_4_3_CHECK = null; - public final static List<String> COLUMN_4_3_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_3_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_3_ENUM_VALUES = null; - public final static List<String> COLUMN_4_3_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_3_SET_VALUES = null; - public final static List<String> COLUMN_4_3_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_4_ID = 48L; - public final static Integer COLUMN_4_4_ORDINALPOS = 3; - public final static Boolean COLUMN_4_4_PRIMARY = false; - public final static String COLUMN_4_4_NAME = "Feathers"; - public final static String COLUMN_4_4_INTERNAL_NAME = "feathers"; - public final static TableColumnType COLUMN_4_4_TYPE = TableColumnType.BOOL; - public final static ColumnTypeDto COLUMN_4_4_TYPE_DTO = ColumnTypeDto.BOOL; - public final static Long COLUMN_4_4_DATE_FORMAT = null; - public final static Boolean COLUMN_4_4_NULL = true; - public final static Boolean COLUMN_4_4_AUTO_GENERATED = false; - public final static String COLUMN_4_4_FOREIGN_KEY = null; - public final static String COLUMN_4_4_CHECK = null; - public final static List<String> COLUMN_4_4_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_4_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_4_ENUM_VALUES = null; - public final static List<String> COLUMN_4_4_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_4_SET_VALUES = null; - public final static List<String> COLUMN_4_4_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_5_ID = 49L; - public final static Integer COLUMN_4_5_ORDINALPOS = 4; - public final static Boolean COLUMN_4_5_PRIMARY = false; - public final static String COLUMN_4_5_NAME = "Bread"; - public final static String COLUMN_4_5_INTERNAL_NAME = "bread"; - public final static TableColumnType COLUMN_4_5_TYPE = TableColumnType.BOOL; - public final static ColumnTypeDto COLUMN_4_5_TYPE_DTO = ColumnTypeDto.BOOL; - public final static Long COLUMN_4_5_DATE_FORMAT = null; - public final static Boolean COLUMN_4_5_NULL = true; - public final static Boolean COLUMN_4_5_AUTO_GENERATED = false; - public final static String COLUMN_4_5_FOREIGN_KEY = null; - public final static String COLUMN_4_5_CHECK = null; - public final static List<String> COLUMN_4_5_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_5_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_5_ENUM_VALUES = null; - public final static List<String> COLUMN_4_5_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_5_SET_VALUES = null; - public final static List<String> COLUMN_4_5_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_6_ID = 50L; - public final static Integer COLUMN_4_6_ORDINALPOS = 5; - public final static Boolean COLUMN_4_6_PRIMARY = false; - public final static String COLUMN_4_6_NAME = "Eggs"; - public final static String COLUMN_4_6_INTERNAL_NAME = "eggs"; - public final static TableColumnType COLUMN_4_6_TYPE = TableColumnType.BOOL; - public final static ColumnTypeDto COLUMN_4_6_TYPE_DTO = ColumnTypeDto.BOOL; - public final static Long COLUMN_4_6_DATE_FORMAT = null; - public final static Boolean COLUMN_4_6_NULL = true; - public final static Boolean COLUMN_4_6_AUTO_GENERATED = false; - public final static String COLUMN_4_6_FOREIGN_KEY = null; - public final static String COLUMN_4_6_CHECK = null; - public final static List<String> COLUMN_4_6_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_6_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_6_ENUM_VALUES = null; - public final static List<String> COLUMN_4_6_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_6_SET_VALUES = null; - public final static List<String> COLUMN_4_6_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_7_ID = 51L; - public final static Integer COLUMN_4_7_ORDINALPOS = 6; - public final static Boolean COLUMN_4_7_PRIMARY = false; - public final static String COLUMN_4_7_NAME = "Milk"; - public final static String COLUMN_4_7_INTERNAL_NAME = "milk"; - public final static TableColumnType COLUMN_4_7_TYPE = TableColumnType.BOOL; - public final static ColumnTypeDto COLUMN_4_7_TYPE_DTO = ColumnTypeDto.BOOL; - public final static Long COLUMN_4_7_DATE_FORMAT = null; - public final static Boolean COLUMN_4_7_NULL = true; - public final static Boolean COLUMN_4_7_AUTO_GENERATED = false; - public final static String COLUMN_4_7_FOREIGN_KEY = null; - public final static String COLUMN_4_7_CHECK = null; - public final static List<String> COLUMN_4_7_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_7_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_7_ENUM_VALUES = null; - public final static List<String> COLUMN_4_7_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_7_SET_VALUES = null; - public final static List<String> COLUMN_4_7_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_8_ID = 52L; - public final static Integer COLUMN_4_8_ORDINALPOS = 7; - public final static Boolean COLUMN_4_8_PRIMARY = false; - public final static String COLUMN_4_8_NAME = "Water"; - public final static String COLUMN_4_8_INTERNAL_NAME = "water"; - public final static TableColumnType COLUMN_4_8_TYPE = TableColumnType.BOOL; - public final static ColumnTypeDto COLUMN_4_8_TYPE_DTO = ColumnTypeDto.BOOL; - public final static Long COLUMN_4_8_DATE_FORMAT = null; - public final static Boolean COLUMN_4_8_NULL = true; - public final static Boolean COLUMN_4_8_AUTO_GENERATED = false; - public final static String COLUMN_4_8_FOREIGN_KEY = null; - public final static String COLUMN_4_8_CHECK = null; - public final static List<String> COLUMN_4_8_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_8_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_8_ENUM_VALUES = null; - public final static List<String> COLUMN_4_8_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_8_SET_VALUES = null; - public final static List<String> COLUMN_4_8_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_9_ID = 53L; - public final static Integer COLUMN_4_9_ORDINALPOS = 8; - public final static Boolean COLUMN_4_9_PRIMARY = false; - public final static String COLUMN_4_9_NAME = "Airborne"; - public final static String COLUMN_4_9_INTERNAL_NAME = "airborne"; - public final static TableColumnType COLUMN_4_9_TYPE = TableColumnType.BOOL; - public final static ColumnTypeDto COLUMN_4_9_TYPE_DTO = ColumnTypeDto.BOOL; - public final static Long COLUMN_4_9_DATE_FORMAT = null; - public final static Boolean COLUMN_4_9_NULL = true; - public final static Boolean COLUMN_4_9_AUTO_GENERATED = false; - public final static String COLUMN_4_9_FOREIGN_KEY = null; - public final static String COLUMN_4_9_CHECK = null; - public final static List<String> COLUMN_4_9_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_9_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_9_ENUM_VALUES = null; - public final static List<String> COLUMN_4_9_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_9_SET_VALUES = null; - public final static List<String> COLUMN_4_9_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_10_ID = 54L; - public final static Integer COLUMN_4_10_ORDINALPOS = 9; - public final static Boolean COLUMN_4_10_PRIMARY = false; - public final static String COLUMN_4_10_NAME = "Waterborne"; - public final static String COLUMN_4_10_INTERNAL_NAME = "waterborne"; - public final static TableColumnType COLUMN_4_10_TYPE = TableColumnType.BOOL; - public final static ColumnTypeDto COLUMN_4_10_TYPE_DTO = ColumnTypeDto.BOOL; - public final static Long COLUMN_4_10_DATE_FORMAT = null; - public final static Boolean COLUMN_4_10_NULL = true; - public final static Boolean COLUMN_4_10_AUTO_GENERATED = false; - public final static String COLUMN_4_10_FOREIGN_KEY = null; - public final static String COLUMN_4_10_CHECK = null; - public final static List<String> COLUMN_4_10_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_10_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_10_ENUM_VALUES = null; - public final static List<String> COLUMN_4_10_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_10_SET_VALUES = null; - public final static List<String> COLUMN_4_10_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_11_ID = 55L; - public final static Integer COLUMN_4_11_ORDINALPOS = 10; - public final static Boolean COLUMN_4_11_PRIMARY = false; - public final static String COLUMN_4_11_NAME = "Aquantic"; - public final static String COLUMN_4_11_INTERNAL_NAME = "aquatic"; - public final static TableColumnType COLUMN_4_11_TYPE = TableColumnType.BOOL; - public final static ColumnTypeDto COLUMN_4_11_TYPE_DTO = ColumnTypeDto.BOOL; - public final static Long COLUMN_4_11_DATE_FORMAT = null; - public final static Boolean COLUMN_4_11_NULL = true; - public final static Boolean COLUMN_4_11_AUTO_GENERATED = false; - public final static String COLUMN_4_11_FOREIGN_KEY = null; - public final static String COLUMN_4_11_CHECK = null; - public final static List<String> COLUMN_4_11_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_11_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_11_ENUM_VALUES = null; - public final static List<String> COLUMN_4_11_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_11_SET_VALUES = null; - public final static List<String> COLUMN_4_11_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_12_ID = 56L; - public final static Integer COLUMN_4_12_ORDINALPOS = 11; - public final static Boolean COLUMN_4_12_PRIMARY = false; - public final static String COLUMN_4_12_NAME = "Predator"; - public final static String COLUMN_4_12_INTERNAL_NAME = "predator"; - public final static TableColumnType COLUMN_4_12_TYPE = TableColumnType.BOOL; - public final static ColumnTypeDto COLUMN_4_12_TYPE_DTO = ColumnTypeDto.BOOL; - public final static Long COLUMN_4_12_DATE_FORMAT = null; - public final static Boolean COLUMN_4_12_NULL = true; - public final static Boolean COLUMN_4_12_AUTO_GENERATED = false; - public final static String COLUMN_4_12_FOREIGN_KEY = null; - public final static String COLUMN_4_12_CHECK = null; - public final static List<String> COLUMN_4_12_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_12_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_12_ENUM_VALUES = null; - public final static List<String> COLUMN_4_12_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_12_SET_VALUES = null; - public final static List<String> COLUMN_4_12_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_13_ID = 57L; - public final static Integer COLUMN_4_13_ORDINALPOS = 12; - public final static Boolean COLUMN_4_13_PRIMARY = false; - public final static String COLUMN_4_13_NAME = "Backbone"; - public final static String COLUMN_4_13_INTERNAL_NAME = "backbone"; - public final static TableColumnType COLUMN_4_13_TYPE = TableColumnType.BOOL; - public final static ColumnTypeDto COLUMN_4_13_TYPE_DTO = ColumnTypeDto.BOOL; - public final static Long COLUMN_4_13_DATE_FORMAT = null; - public final static Boolean COLUMN_4_13_NULL = true; - public final static Boolean COLUMN_4_13_AUTO_GENERATED = false; - public final static String COLUMN_4_13_FOREIGN_KEY = null; - public final static String COLUMN_4_13_CHECK = null; - public final static List<String> COLUMN_4_13_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_13_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_13_ENUM_VALUES = null; - public final static List<String> COLUMN_4_13_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_13_SET_VALUES = null; - public final static List<String> COLUMN_4_13_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_14_ID = 58L; - public final static Integer COLUMN_4_14_ORDINALPOS = 13; - public final static Boolean COLUMN_4_14_PRIMARY = false; - public final static String COLUMN_4_14_NAME = "Breathes"; - public final static String COLUMN_4_14_INTERNAL_NAME = "breathes"; - public final static TableColumnType COLUMN_4_14_TYPE = TableColumnType.BOOL; - public final static ColumnTypeDto COLUMN_4_14_TYPE_DTO = ColumnTypeDto.BOOL; - public final static Long COLUMN_4_14_DATE_FORMAT = null; - public final static Boolean COLUMN_4_14_NULL = true; - public final static Boolean COLUMN_4_14_AUTO_GENERATED = false; - public final static String COLUMN_4_14_FOREIGN_KEY = null; - public final static String COLUMN_4_14_CHECK = null; - public final static List<String> COLUMN_4_14_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_14_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_14_ENUM_VALUES = null; - public final static List<String> COLUMN_4_14_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_14_SET_VALUES = null; - public final static List<String> COLUMN_4_14_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_15_ID = 59L; - public final static Integer COLUMN_4_15_ORDINALPOS = 14; - public final static Boolean COLUMN_4_15_PRIMARY = false; - public final static String COLUMN_4_15_NAME = "Venomous"; - public final static String COLUMN_4_15_INTERNAL_NAME = "venomous"; - public final static TableColumnType COLUMN_4_15_TYPE = TableColumnType.BOOL; - public final static ColumnTypeDto COLUMN_4_15_TYPE_DTO = ColumnTypeDto.BOOL; - public final static Long COLUMN_4_15_DATE_FORMAT = null; - public final static Boolean COLUMN_4_15_NULL = true; - public final static Boolean COLUMN_4_15_AUTO_GENERATED = false; - public final static String COLUMN_4_15_FOREIGN_KEY = null; - public final static String COLUMN_4_15_CHECK = null; - public final static List<String> COLUMN_4_15_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_15_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_15_ENUM_VALUES = null; - public final static List<String> COLUMN_4_15_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_15_SET_VALUES = null; - public final static List<String> COLUMN_4_15_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_16_ID = 60L; - public final static Integer COLUMN_4_16_ORDINALPOS = 15; - public final static Boolean COLUMN_4_16_PRIMARY = false; - public final static String COLUMN_4_16_NAME = "Fin"; - public final static String COLUMN_4_16_INTERNAL_NAME = "fins"; - public final static TableColumnType COLUMN_4_16_TYPE = TableColumnType.BOOL; - public final static ColumnTypeDto COLUMN_4_16_TYPE_DTO = ColumnTypeDto.BOOL; - public final static Long COLUMN_4_16_DATE_FORMAT = null; - public final static Boolean COLUMN_4_16_NULL = true; - public final static Boolean COLUMN_4_16_AUTO_GENERATED = false; - public final static String COLUMN_4_16_FOREIGN_KEY = null; - public final static String COLUMN_4_16_CHECK = null; - public final static List<String> COLUMN_4_16_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_16_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_16_ENUM_VALUES = null; - public final static List<String> COLUMN_4_16_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_16_SET_VALUES = null; - public final static List<String> COLUMN_4_16_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_17_ID = 61L; - public final static Integer COLUMN_4_17_ORDINALPOS = 16; - public final static Boolean COLUMN_4_17_PRIMARY = false; - public final static String COLUMN_4_17_NAME = "Legs"; - public final static String COLUMN_4_17_INTERNAL_NAME = "legs"; - public final static TableColumnType COLUMN_4_17_TYPE = TableColumnType.INT; - public final static ColumnTypeDto COLUMN_4_17_TYPE_DTO = ColumnTypeDto.INT; - public final static Long COLUMN_4_17_DATE_FORMAT = null; - public final static Boolean COLUMN_4_17_NULL = true; - public final static Boolean COLUMN_4_17_AUTO_GENERATED = false; - public final static String COLUMN_4_17_FOREIGN_KEY = null; - public final static String COLUMN_4_17_CHECK = null; - public final static List<String> COLUMN_4_17_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_17_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_17_ENUM_VALUES = null; - public final static List<String> COLUMN_4_17_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_17_SET_VALUES = null; - public final static List<String> COLUMN_4_17_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_18_ID = 62L; - public final static Integer COLUMN_4_18_ORDINALPOS = 17; - public final static Boolean COLUMN_4_18_PRIMARY = false; - public final static String COLUMN_4_18_NAME = "Tail"; - public final static String COLUMN_4_18_INTERNAL_NAME = "tail"; - public final static TableColumnType COLUMN_4_18_TYPE = TableColumnType.DECIMAL; - public final static ColumnTypeDto COLUMN_4_18_TYPE_DTO = ColumnTypeDto.DECIMAL; - public final static Long COLUMN_4_18_DATE_FORMAT = null; - public final static Boolean COLUMN_4_18_NULL = true; - public final static Boolean COLUMN_4_18_AUTO_GENERATED = false; - public final static String COLUMN_4_18_FOREIGN_KEY = null; - public final static String COLUMN_4_18_CHECK = null; - public final static List<String> COLUMN_4_18_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_18_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_18_ENUM_VALUES = null; - public final static List<String> COLUMN_4_18_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_18_SET_VALUES = null; - public final static List<String> COLUMN_4_18_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_19_ID = 63L; - public final static Integer COLUMN_4_19_ORDINALPOS = 18; - public final static Boolean COLUMN_4_19_PRIMARY = false; - public final static String COLUMN_4_19_NAME = "Domestic"; - public final static String COLUMN_4_19_INTERNAL_NAME = "domestic"; - public final static TableColumnType COLUMN_4_19_TYPE = TableColumnType.BOOL; - public final static ColumnTypeDto COLUMN_4_19_TYPE_DTO = ColumnTypeDto.BOOL; - public final static Long COLUMN_4_19_DATE_FORMAT = null; - public final static Boolean COLUMN_4_19_NULL = true; - public final static Boolean COLUMN_4_19_AUTO_GENERATED = false; - public final static String COLUMN_4_19_FOREIGN_KEY = null; - public final static String COLUMN_4_19_CHECK = null; - public final static List<String> COLUMN_4_19_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_19_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_19_ENUM_VALUES = null; - public final static List<String> COLUMN_4_19_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_19_SET_VALUES = null; - public final static List<String> COLUMN_4_19_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_20_ID = 64L; - public final static Integer COLUMN_4_20_ORDINALPOS = 19; - public final static Boolean COLUMN_4_20_PRIMARY = false; - public final static String COLUMN_4_20_NAME = "Cat Size"; - public final static String COLUMN_4_20_INTERNAL_NAME = "catsize"; - public final static TableColumnType COLUMN_4_20_TYPE = TableColumnType.BOOL; - public final static ColumnTypeDto COLUMN_4_20_TYPE_DTO = ColumnTypeDto.BOOL; - public final static Long COLUMN_4_20_DATE_FORMAT = null; - public final static Boolean COLUMN_4_20_NULL = true; - public final static Boolean COLUMN_4_20_AUTO_GENERATED = false; - public final static String COLUMN_4_20_FOREIGN_KEY = null; - public final static String COLUMN_4_20_CHECK = null; - public final static List<String> COLUMN_4_20_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_20_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_20_ENUM_VALUES = null; - public final static List<String> COLUMN_4_20_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_20_SET_VALUES = null; - public final static List<String> COLUMN_4_20_SET_VALUES_DTO = null; - - public final static Long COLUMN_4_21_ID = 65L; - public final static Integer COLUMN_4_21_ORDINALPOS = 20; - public final static Boolean COLUMN_4_21_PRIMARY = false; - public final static String COLUMN_4_21_NAME = "Class Type"; - public final static String COLUMN_4_21_INTERNAL_NAME = "class_type"; - public final static TableColumnType COLUMN_4_21_TYPE = TableColumnType.DECIMAL; - public final static ColumnTypeDto COLUMN_4_21_TYPE_DTO = ColumnTypeDto.DECIMAL; - public final static Long COLUMN_4_21_DATE_FORMAT = null; - public final static Boolean COLUMN_4_21_NULL = true; - public final static Boolean COLUMN_4_21_AUTO_GENERATED = false; - public final static String COLUMN_4_21_FOREIGN_KEY = null; - public final static String COLUMN_4_21_CHECK = null; - public final static List<String> COLUMN_4_21_ENUM_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_21_SET_VALUES_ARR = new LinkedList<>(); - public final static List<String> COLUMN_4_21_ENUM_VALUES = null; - public final static List<String> COLUMN_4_21_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_4_21_SET_VALUES = null; - public final static List<String> COLUMN_4_21_SET_VALUES_DTO = null; - - public final static Long COLUMN_5_1_ID = 66L; - public final static Integer COLUMN_5_1_ORDINALPOS = 0; - public final static Boolean COLUMN_5_1_PRIMARY = true; - public final static String COLUMN_5_1_NAME = "id"; - public final static String COLUMN_5_1_INTERNAL_NAME = "id"; - public final static TableColumnType COLUMN_5_1_TYPE = TableColumnType.BIGINT; - public final static ColumnTypeDto COLUMN_5_1_TYPE_DTO = ColumnTypeDto.BIGINT; - public final static Long COLUMN_5_1_DATE_FORMAT = null; - public final static Boolean COLUMN_5_1_NULL = false; - public final static Boolean COLUMN_5_1_AUTO_GENERATED = true; - public final static String COLUMN_5_1_FOREIGN_KEY = null; - public final static String COLUMN_5_1_CHECK = null; - public final static List<String> COLUMN_5_1_ENUM_VALUES = null; - public final static List<String> COLUMN_5_1_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_5_1_SET_VALUES = null; - public final static List<String> COLUMN_5_1_SET_VALUES_DTO = null; - - public final static Long COLUMN_5_2_ID = 67L; - public final static Integer COLUMN_5_2_ORDINALPOS = 1; - public final static Boolean COLUMN_5_2_PRIMARY = false; - public final static String COLUMN_5_2_NAME = "firstname"; - public final static String COLUMN_5_2_INTERNAL_NAME = "firstname"; - public final static TableColumnType COLUMN_5_2_TYPE = TableColumnType.VARCHAR; - public final static ColumnTypeDto COLUMN_5_2_TYPE_DTO = ColumnTypeDto.VARCHAR; - public final static Long COLUMN_5_2_SIZE = 20L; - public final static Long COLUMN_5_2_DATE_FORMAT = null; - public final static Boolean COLUMN_5_2_NULL = false; - public final static Boolean COLUMN_5_2_AUTO_GENERATED = false; - public final static String COLUMN_5_2_FOREIGN_KEY = null; - public final static String COLUMN_5_2_CHECK = null; - public final static List<String> COLUMN_5_2_ENUM_VALUES = null; - public final static List<String> COLUMN_5_2_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_5_2_SET_VALUES = null; - public final static List<String> COLUMN_5_2_SET_VALUES_DTO = null; - - public final static Long COLUMN_5_3_ID = 68L; - public final static Integer COLUMN_5_3_ORDINALPOS = 2; - public final static Boolean COLUMN_5_3_PRIMARY = false; - public final static String COLUMN_5_3_NAME = "lastname"; - public final static String COLUMN_5_3_INTERNAL_NAME = "lastname"; - public final static TableColumnType COLUMN_5_3_TYPE = TableColumnType.VARCHAR; - public final static ColumnTypeDto COLUMN_5_3_TYPE_DTO = ColumnTypeDto.VARCHAR; - public final static Long COLUMN_5_3_SIZE = 40L; - public final static Long COLUMN_5_3_DATE_FORMAT = null; - public final static Boolean COLUMN_5_3_NULL = false; - public final static Boolean COLUMN_5_3_AUTO_GENERATED = false; - public final static String COLUMN_5_3_FOREIGN_KEY = null; - public final static String COLUMN_5_3_CHECK = null; - public final static List<String> COLUMN_5_3_ENUM_VALUES = null; - public final static List<String> COLUMN_5_3_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_5_3_SET_VALUES = null; - public final static List<String> COLUMN_5_3_SET_VALUES_DTO = null; - - public final static Long COLUMN_5_4_ID = 69L; - public final static Integer COLUMN_5_4_ORDINALPOS = 3; - public final static Boolean COLUMN_5_4_PRIMARY = false; - public final static String COLUMN_5_4_NAME = "birth"; - public final static String COLUMN_5_4_INTERNAL_NAME = "birth"; - public final static TableColumnType COLUMN_5_4_TYPE = TableColumnType.YEAR; - public final static ColumnTypeDto COLUMN_5_4_TYPE_DTO = ColumnTypeDto.YEAR; - public final static Long COLUMN_5_4_DATE_FORMAT = null; - public final static Boolean COLUMN_5_4_NULL = true; - public final static Boolean COLUMN_5_4_AUTO_GENERATED = false; - public final static String COLUMN_5_4_FOREIGN_KEY = null; - public final static String COLUMN_5_4_CHECK = null; - public final static List<String> COLUMN_5_4_ENUM_VALUES = null; - public final static List<String> COLUMN_5_4_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_5_4_SET_VALUES = null; - public final static List<String> COLUMN_5_4_SET_VALUES_DTO = null; - - public final static Long COLUMN_5_5_ID = 70L; - public final static Integer COLUMN_5_5_ORDINALPOS = 4; - public final static Boolean COLUMN_5_5_PRIMARY = false; - public final static String COLUMN_5_5_NAME = "reminder"; - public final static String COLUMN_5_5_INTERNAL_NAME = "reminder"; - public final static TableColumnType COLUMN_5_5_TYPE = TableColumnType.TIME; - public final static ColumnTypeDto COLUMN_5_5_TYPE_DTO = ColumnTypeDto.TIME; - public final static Long COLUMN_5_5_DATE_FORMAT = IMAGE_DATE_4_ID; - public final static Boolean COLUMN_5_5_NULL = true; - public final static Boolean COLUMN_5_5_AUTO_GENERATED = false; - public final static String COLUMN_5_5_FOREIGN_KEY = null; - public final static String COLUMN_5_5_CHECK = null; - public final static List<String> COLUMN_5_5_ENUM_VALUES = null; - public final static List<String> COLUMN_5_5_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_5_5_SET_VALUES = null; - public final static List<String> COLUMN_5_5_SET_VALUES_DTO = null; - - public final static Long COLUMN_5_6_ID = 71L; - public final static Integer COLUMN_5_6_ORDINALPOS = 5; - public final static Boolean COLUMN_5_6_PRIMARY = false; - public final static String COLUMN_5_6_NAME = "ref_id"; - public final static String COLUMN_5_6_INTERNAL_NAME = "ref_id"; - public final static TableColumnType COLUMN_5_6_TYPE = TableColumnType.BIGINT; - public final static ColumnTypeDto COLUMN_5_6_TYPE_DTO = ColumnTypeDto.BIGINT; - public final static Long COLUMN_5_6_DATE_FORMAT = null; - public final static Boolean COLUMN_5_6_NULL = true; - public final static Boolean COLUMN_5_6_AUTO_GENERATED = false; - public final static String COLUMN_5_6_FOREIGN_KEY = null; - public final static String COLUMN_5_6_CHECK = null; - public final static List<String> COLUMN_5_6_ENUM_VALUES = null; - public final static List<String> COLUMN_5_6_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_5_6_SET_VALUES = null; - public final static List<String> COLUMN_5_6_SET_VALUES_DTO = null; - public final static Long COLUMN_8_1_ID = 72L; public final static Integer COLUMN_8_1_ORDINALPOS = 0; public final static Boolean COLUMN_8_1_PRIMARY = true; @@ -4169,474 +3723,426 @@ public abstract class BaseTest { .sets(new LinkedList<>()) .build()); - public final static ConstraintsDto TABLE_3_CONSTRAINTS_DTO = ConstraintsDto.builder() - .uniques(List.of(UniqueDto.builder().columns(List.of(TABLE_3_COLUMNS_DTO.get(0))).build())) - .foreignKeys(new LinkedList<>()) - .checks(Set.of()) - .build(); - public final static List<TableColumn> TABLE_5_COLUMNS = List.of(TableColumn.builder() - .id(COLUMN_4_1_ID) - .ordinalPosition(COLUMN_4_1_ORDINALPOS) + .id(45L) + .ordinalPosition(0) .table(TABLE_5) - .name(COLUMN_4_1_NAME) - .internalName(COLUMN_4_1_INTERNAL_NAME) - .columnType(COLUMN_4_1_TYPE) - .isNullAllowed(COLUMN_4_1_NULL) - .autoGenerated(COLUMN_4_1_AUTO_GENERATED) - .enums(COLUMN_4_1_ENUM_VALUES) - .sets(COLUMN_4_1_SET_VALUES) + .name("id") + .internalName("id") + .columnType(TableColumnType.BIGINT) + .isNullAllowed(false) + .autoGenerated(true) .build(), TableColumn.builder() - .id(COLUMN_4_2_ID) - .ordinalPosition(COLUMN_4_2_ORDINALPOS) + .id(46L) + .ordinalPosition(1) .table(TABLE_5) - .name(COLUMN_4_2_NAME) - .internalName(COLUMN_4_2_INTERNAL_NAME) - .columnType(COLUMN_4_2_TYPE) - .isNullAllowed(COLUMN_4_2_NULL) - .autoGenerated(COLUMN_4_2_AUTO_GENERATED) - .enums(COLUMN_4_2_ENUM_VALUES) - .sets(COLUMN_4_2_SET_VALUES) + .name("Animal Name") + .internalName("animal_name") + .columnType(TableColumnType.VARCHAR) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_3_ID) - .ordinalPosition(COLUMN_4_3_ORDINALPOS) + .id(47L) + .ordinalPosition(2) .table(TABLE_5) - .name(COLUMN_4_3_NAME) - .internalName(COLUMN_4_3_INTERNAL_NAME) - .columnType(COLUMN_4_3_TYPE) - .isNullAllowed(COLUMN_4_3_NULL) - .autoGenerated(COLUMN_4_3_AUTO_GENERATED) - .enums(COLUMN_4_3_ENUM_VALUES) - .sets(COLUMN_4_3_SET_VALUES) + .name("Hair") + .internalName("hair") + .columnType(TableColumnType.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_4_ID) - .ordinalPosition(COLUMN_4_4_ORDINALPOS) + .id(48L) + .ordinalPosition(3) .table(TABLE_5) - .name(COLUMN_4_4_NAME) - .internalName(COLUMN_4_4_INTERNAL_NAME) - .columnType(COLUMN_4_4_TYPE) - .isNullAllowed(COLUMN_4_4_NULL) - .autoGenerated(COLUMN_4_4_AUTO_GENERATED) - .enums(COLUMN_4_4_ENUM_VALUES) - .sets(COLUMN_4_4_SET_VALUES) + .name("Feathers") + .internalName("feathers") + .columnType(TableColumnType.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_5_ID) - .ordinalPosition(COLUMN_4_5_ORDINALPOS) + .id(49L) + .ordinalPosition(4) .table(TABLE_5) - .name(COLUMN_4_5_NAME) - .internalName(COLUMN_4_5_INTERNAL_NAME) - .columnType(COLUMN_4_5_TYPE) - .isNullAllowed(COLUMN_4_5_NULL) - .autoGenerated(COLUMN_4_5_AUTO_GENERATED) - .enums(COLUMN_4_5_ENUM_VALUES) - .sets(COLUMN_4_5_SET_VALUES) + .name("Bread") + .internalName("bread") + .columnType(TableColumnType.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_6_ID) - .ordinalPosition(COLUMN_4_6_ORDINALPOS) + .id(50L) + .ordinalPosition(5) .table(TABLE_5) - .name(COLUMN_4_6_NAME) - .internalName(COLUMN_4_6_INTERNAL_NAME) - .columnType(COLUMN_4_6_TYPE) - .isNullAllowed(COLUMN_4_6_NULL) - .autoGenerated(COLUMN_4_6_AUTO_GENERATED) - .enums(COLUMN_4_6_ENUM_VALUES) - .sets(COLUMN_4_6_SET_VALUES) + .name("Eggs") + .internalName("eggs") + .columnType(TableColumnType.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_7_ID) - .ordinalPosition(COLUMN_4_7_ORDINALPOS) + .id(51L) + .ordinalPosition(6) .table(TABLE_5) - .name(COLUMN_4_7_NAME) - .internalName(COLUMN_4_7_INTERNAL_NAME) - .columnType(COLUMN_4_7_TYPE) - .isNullAllowed(COLUMN_4_7_NULL) - .autoGenerated(COLUMN_4_7_AUTO_GENERATED) - .enums(COLUMN_4_7_ENUM_VALUES) - .sets(COLUMN_4_7_SET_VALUES) + .name("Milk") + .internalName("milk") + .columnType(TableColumnType.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_8_ID) - .ordinalPosition(COLUMN_4_8_ORDINALPOS) + .id(52L) + .ordinalPosition(7) .table(TABLE_5) - .name(COLUMN_4_8_NAME) - .internalName(COLUMN_4_8_INTERNAL_NAME) - .columnType(COLUMN_4_8_TYPE) - .isNullAllowed(COLUMN_4_8_NULL) - .autoGenerated(COLUMN_4_8_AUTO_GENERATED) - .enums(COLUMN_4_8_ENUM_VALUES) - .sets(COLUMN_4_8_SET_VALUES) + .name("Water") + .internalName("water") + .columnType(TableColumnType.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_9_ID) - .ordinalPosition(COLUMN_4_9_ORDINALPOS) + .id(53L) + .ordinalPosition(8) .table(TABLE_5) - .name(COLUMN_4_9_NAME) - .internalName(COLUMN_4_9_INTERNAL_NAME) - .columnType(COLUMN_4_9_TYPE) - .isNullAllowed(COLUMN_4_9_NULL) - .autoGenerated(COLUMN_4_9_AUTO_GENERATED) - .enums(COLUMN_4_9_ENUM_VALUES) - .sets(COLUMN_4_9_SET_VALUES) + .name("Airborne") + .internalName("airborne") + .columnType(TableColumnType.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_10_ID) - .ordinalPosition(COLUMN_4_10_ORDINALPOS) + .id(54L) + .ordinalPosition(9) .table(TABLE_5) - .name(COLUMN_4_10_NAME) - .internalName(COLUMN_4_10_INTERNAL_NAME) - .columnType(COLUMN_4_10_TYPE) - .isNullAllowed(COLUMN_4_10_NULL) - .autoGenerated(COLUMN_4_10_AUTO_GENERATED) - .enums(COLUMN_4_10_ENUM_VALUES) - .sets(COLUMN_4_10_SET_VALUES) + .name("Waterborne") + .internalName("waterborne") + .columnType(TableColumnType.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_11_ID) - .ordinalPosition(COLUMN_4_11_ORDINALPOS) + .id(55L) + .ordinalPosition(10) .table(TABLE_5) - .name(COLUMN_4_11_NAME) - .internalName(COLUMN_4_11_INTERNAL_NAME) - .columnType(COLUMN_4_11_TYPE) - .isNullAllowed(COLUMN_4_11_NULL) - .autoGenerated(COLUMN_4_11_AUTO_GENERATED) - .enums(COLUMN_4_11_ENUM_VALUES) - .sets(COLUMN_4_11_SET_VALUES) + .name("Aquantic") + .internalName("aquantic") + .columnType(TableColumnType.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_12_ID) - .ordinalPosition(COLUMN_4_12_ORDINALPOS) + .id(56L) + .ordinalPosition(11) .table(TABLE_5) - .name(COLUMN_4_12_NAME) - .internalName(COLUMN_4_12_INTERNAL_NAME) - .columnType(COLUMN_4_12_TYPE) - .isNullAllowed(COLUMN_4_12_NULL) - .autoGenerated(COLUMN_4_12_AUTO_GENERATED) - .enums(COLUMN_4_12_ENUM_VALUES) - .sets(COLUMN_4_12_SET_VALUES) + .name("Predator") + .internalName("predator") + .columnType(TableColumnType.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_13_ID) - .ordinalPosition(COLUMN_4_13_ORDINALPOS) + .id(57L) + .ordinalPosition(12) .table(TABLE_5) - .name(COLUMN_4_13_NAME) - .internalName(COLUMN_4_13_INTERNAL_NAME) - .columnType(COLUMN_4_13_TYPE) - .isNullAllowed(COLUMN_4_13_NULL) - .autoGenerated(COLUMN_4_13_AUTO_GENERATED) - .enums(COLUMN_4_13_ENUM_VALUES) - .sets(COLUMN_4_13_SET_VALUES) + .name("Backbone") + .internalName("backbone") + .columnType(TableColumnType.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_14_ID) - .ordinalPosition(COLUMN_4_14_ORDINALPOS) + .id(58L) + .ordinalPosition(13) .table(TABLE_5) - .name(COLUMN_4_14_NAME) - .internalName(COLUMN_4_14_INTERNAL_NAME) - .columnType(COLUMN_4_14_TYPE) - .isNullAllowed(COLUMN_4_14_NULL) - .autoGenerated(COLUMN_4_14_AUTO_GENERATED) - .enums(COLUMN_4_14_ENUM_VALUES) - .sets(COLUMN_4_14_SET_VALUES) + .name("Breathes") + .internalName("breathes") + .columnType(TableColumnType.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_15_ID) - .ordinalPosition(COLUMN_4_15_ORDINALPOS) + .id(59L) + .ordinalPosition(14) .table(TABLE_5) - .name(COLUMN_4_15_NAME) - .internalName(COLUMN_4_15_INTERNAL_NAME) - .columnType(COLUMN_4_15_TYPE) - .isNullAllowed(COLUMN_4_15_NULL) - .autoGenerated(COLUMN_4_15_AUTO_GENERATED) - .enums(COLUMN_4_15_ENUM_VALUES) - .sets(COLUMN_4_15_SET_VALUES) + .name("Venomous") + .internalName("venomous") + .columnType(TableColumnType.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_16_ID) - .ordinalPosition(COLUMN_4_16_ORDINALPOS) + .id(60L) + .ordinalPosition(15) .table(TABLE_5) - .name(COLUMN_4_16_NAME) - .internalName(COLUMN_4_16_INTERNAL_NAME) - .columnType(COLUMN_4_16_TYPE) - .isNullAllowed(COLUMN_4_16_NULL) - .autoGenerated(COLUMN_4_16_AUTO_GENERATED) - .enums(COLUMN_4_16_ENUM_VALUES) - .sets(COLUMN_4_16_SET_VALUES) + .name("Fin") + .internalName("fin") + .columnType(TableColumnType.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_17_ID) - .ordinalPosition(COLUMN_4_17_ORDINALPOS) + .id(61L) + .ordinalPosition(16) .table(TABLE_5) - .name(COLUMN_4_17_NAME) - .internalName(COLUMN_4_17_INTERNAL_NAME) - .columnType(COLUMN_4_17_TYPE) - .isNullAllowed(COLUMN_4_17_NULL) - .autoGenerated(COLUMN_4_17_AUTO_GENERATED) - .enums(COLUMN_4_17_ENUM_VALUES) - .sets(COLUMN_4_17_SET_VALUES) + .name("Legs") + .internalName("legs") + .columnType(TableColumnType.INT) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_18_ID) - .ordinalPosition(COLUMN_4_18_ORDINALPOS) + .id(62L) + .ordinalPosition(17) .table(TABLE_5) - .name(COLUMN_4_18_NAME) - .internalName(COLUMN_4_18_INTERNAL_NAME) - .columnType(COLUMN_4_18_TYPE) - .isNullAllowed(COLUMN_4_18_NULL) - .autoGenerated(COLUMN_4_18_AUTO_GENERATED) - .enums(COLUMN_4_18_ENUM_VALUES) - .sets(COLUMN_4_18_SET_VALUES) + .name("Tail") + .internalName("tail") + .columnType(TableColumnType.DECIMAL) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_19_ID) - .ordinalPosition(COLUMN_4_19_ORDINALPOS) + .id(63L) + .ordinalPosition(18) .table(TABLE_5) - .name(COLUMN_4_19_NAME) - .internalName(COLUMN_4_19_INTERNAL_NAME) - .columnType(COLUMN_4_19_TYPE) - .isNullAllowed(COLUMN_4_19_NULL) - .autoGenerated(COLUMN_4_19_AUTO_GENERATED) - .enums(COLUMN_4_19_ENUM_VALUES) - .sets(COLUMN_4_19_SET_VALUES) + .name("Domestic") + .internalName("domestic") + .columnType(TableColumnType.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_20_ID) - .ordinalPosition(COLUMN_4_20_ORDINALPOS) + .id(64L) + .ordinalPosition(19) .table(TABLE_5) - .name(COLUMN_4_20_NAME) - .internalName(COLUMN_4_20_INTERNAL_NAME) - .columnType(COLUMN_4_20_TYPE) - .isNullAllowed(COLUMN_4_20_NULL) - .autoGenerated(COLUMN_4_20_AUTO_GENERATED) - .enums(COLUMN_4_20_ENUM_VALUES) - .sets(COLUMN_4_20_SET_VALUES) + .name("Catsize") + .internalName("catsize") + .columnType(TableColumnType.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_4_21_ID) - .ordinalPosition(COLUMN_4_21_ORDINALPOS) + .id(64L) + .ordinalPosition(20) .table(TABLE_5) - .name(COLUMN_4_21_NAME) - .internalName(COLUMN_4_21_INTERNAL_NAME) - .columnType(COLUMN_4_21_TYPE) - .isNullAllowed(COLUMN_4_21_NULL) - .autoGenerated(COLUMN_4_21_AUTO_GENERATED) - .enums(COLUMN_4_21_ENUM_VALUES) - .sets(COLUMN_4_21_SET_VALUES) + .name("Class Type") + .internalName("class_type") + .columnType(TableColumnType.DECIMAL) + .isNullAllowed(true) + .autoGenerated(false) .build()); public final static List<ColumnDto> TABLE_5_COLUMNS_DTO = List.of(ColumnDto.builder() - .id(COLUMN_4_1_ID) - .name(COLUMN_4_1_NAME) - .internalName(COLUMN_4_1_INTERNAL_NAME) - .columnType(COLUMN_4_1_TYPE_DTO) - .isNullAllowed(COLUMN_4_1_NULL) - .autoGenerated(COLUMN_4_1_AUTO_GENERATED) - .enums(COLUMN_4_1_ENUM_VALUES) - .sets(COLUMN_4_1_SET_VALUES) + .id(45L) + .ordinalPosition(0) + .table(TABLE_5_DTO) + .name("id") + .internalName("id") + .columnType(ColumnTypeDto.BIGINT) + .isNullAllowed(false) + .autoGenerated(true) .build(), ColumnDto.builder() - .id(COLUMN_4_2_ID) - .name(COLUMN_4_2_NAME) - .internalName(COLUMN_4_2_INTERNAL_NAME) - .columnType(COLUMN_4_2_TYPE_DTO) - .isNullAllowed(COLUMN_4_2_NULL) - .autoGenerated(COLUMN_4_2_AUTO_GENERATED) - .enums(COLUMN_4_2_ENUM_VALUES) - .sets(COLUMN_4_2_SET_VALUES) + .id(46L) + .ordinalPosition(1) + .table(TABLE_5_DTO) + .name("Animal Name") + .internalName("animal_name") + .columnType(ColumnTypeDto.VARCHAR) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_3_ID) - .name(COLUMN_4_3_NAME) - .internalName(COLUMN_4_3_INTERNAL_NAME) - .columnType(COLUMN_4_3_TYPE_DTO) - .isNullAllowed(COLUMN_4_3_NULL) - .autoGenerated(COLUMN_4_3_AUTO_GENERATED) - .enums(COLUMN_4_3_ENUM_VALUES) - .sets(COLUMN_4_3_SET_VALUES) + .id(47L) + .ordinalPosition(2) + .table(TABLE_5_DTO) + .name("Hair") + .internalName("hair") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_4_ID) - .name(COLUMN_4_4_NAME) - .internalName(COLUMN_4_4_INTERNAL_NAME) - .columnType(COLUMN_4_4_TYPE_DTO) - .isNullAllowed(COLUMN_4_4_NULL) - .autoGenerated(COLUMN_4_4_AUTO_GENERATED) - .enums(COLUMN_4_4_ENUM_VALUES) - .sets(COLUMN_4_4_SET_VALUES) + .id(48L) + .ordinalPosition(3) + .table(TABLE_5_DTO) + .name("Feathers") + .internalName("feathers") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_5_ID) - .name(COLUMN_4_5_NAME) - .internalName(COLUMN_4_5_INTERNAL_NAME) - .columnType(COLUMN_4_5_TYPE_DTO) - .isNullAllowed(COLUMN_4_5_NULL) - .autoGenerated(COLUMN_4_5_AUTO_GENERATED) - .enums(COLUMN_4_5_ENUM_VALUES) - .sets(COLUMN_4_5_SET_VALUES) + .id(49L) + .ordinalPosition(4) + .table(TABLE_5_DTO) + .name("Bread") + .internalName("bread") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_6_ID) - .name(COLUMN_4_6_NAME) - .internalName(COLUMN_4_6_INTERNAL_NAME) - .columnType(COLUMN_4_6_TYPE_DTO) - .isNullAllowed(COLUMN_4_6_NULL) - .autoGenerated(COLUMN_4_6_AUTO_GENERATED) - .enums(COLUMN_4_6_ENUM_VALUES) - .sets(COLUMN_4_6_SET_VALUES) + .id(50L) + .ordinalPosition(5) + .table(TABLE_5_DTO) + .name("Eggs") + .internalName("eggs") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_7_ID) - .name(COLUMN_4_7_NAME) - .internalName(COLUMN_4_7_INTERNAL_NAME) - .columnType(COLUMN_4_7_TYPE_DTO) - .isNullAllowed(COLUMN_4_7_NULL) - .autoGenerated(COLUMN_4_7_AUTO_GENERATED) - .enums(COLUMN_4_7_ENUM_VALUES) - .sets(COLUMN_4_7_SET_VALUES) + .id(51L) + .ordinalPosition(6) + .table(TABLE_5_DTO) + .name("Milk") + .internalName("milk") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_8_ID) - .name(COLUMN_4_8_NAME) - .internalName(COLUMN_4_8_INTERNAL_NAME) - .columnType(COLUMN_4_8_TYPE_DTO) - .isNullAllowed(COLUMN_4_8_NULL) - .autoGenerated(COLUMN_4_8_AUTO_GENERATED) - .enums(COLUMN_4_8_ENUM_VALUES) - .sets(COLUMN_4_8_SET_VALUES) + .id(52L) + .ordinalPosition(7) + .table(TABLE_5_DTO) + .name("Water") + .internalName("water") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_9_ID) - .name(COLUMN_4_9_NAME) - .internalName(COLUMN_4_9_INTERNAL_NAME) - .columnType(COLUMN_4_9_TYPE_DTO) - .isNullAllowed(COLUMN_4_9_NULL) - .autoGenerated(COLUMN_4_9_AUTO_GENERATED) - .enums(COLUMN_4_9_ENUM_VALUES) - .sets(COLUMN_4_9_SET_VALUES) + .id(53L) + .ordinalPosition(8) + .table(TABLE_5_DTO) + .name("Airborne") + .internalName("airborne") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_10_ID) - .name(COLUMN_4_10_NAME) - .internalName(COLUMN_4_10_INTERNAL_NAME) - .columnType(COLUMN_4_10_TYPE_DTO) - .isNullAllowed(COLUMN_4_10_NULL) - .autoGenerated(COLUMN_4_10_AUTO_GENERATED) - .enums(COLUMN_4_10_ENUM_VALUES) - .sets(COLUMN_4_10_SET_VALUES) + .id(54L) + .ordinalPosition(9) + .table(TABLE_5_DTO) + .name("Waterborne") + .internalName("waterborne") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_11_ID) - .name(COLUMN_4_11_NAME) - .internalName(COLUMN_4_11_INTERNAL_NAME) - .columnType(COLUMN_4_11_TYPE_DTO) - .isNullAllowed(COLUMN_4_11_NULL) - .autoGenerated(COLUMN_4_11_AUTO_GENERATED) - .enums(COLUMN_4_11_ENUM_VALUES) - .sets(COLUMN_4_11_SET_VALUES) + .id(55L) + .ordinalPosition(10) + .table(TABLE_5_DTO) + .name("Aquantic") + .internalName("aquantic") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_12_ID) - .name(COLUMN_4_12_NAME) - .internalName(COLUMN_4_12_INTERNAL_NAME) - .columnType(COLUMN_4_12_TYPE_DTO) - .isNullAllowed(COLUMN_4_12_NULL) - .autoGenerated(COLUMN_4_12_AUTO_GENERATED) - .enums(COLUMN_4_12_ENUM_VALUES) - .sets(COLUMN_4_12_SET_VALUES) + .id(56L) + .ordinalPosition(11) + .table(TABLE_5_DTO) + .name("Predator") + .internalName("predator") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_13_ID) - .name(COLUMN_4_13_NAME) - .internalName(COLUMN_4_13_INTERNAL_NAME) - .columnType(COLUMN_4_13_TYPE_DTO) - .isNullAllowed(COLUMN_4_13_NULL) - .autoGenerated(COLUMN_4_13_AUTO_GENERATED) - .enums(COLUMN_4_13_ENUM_VALUES) - .sets(COLUMN_4_13_SET_VALUES) + .id(57L) + .ordinalPosition(12) + .table(TABLE_5_DTO) + .name("Backbone") + .internalName("backbone") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_14_ID) - .name(COLUMN_4_14_NAME) - .internalName(COLUMN_4_14_INTERNAL_NAME) - .columnType(COLUMN_4_14_TYPE_DTO) - .isNullAllowed(COLUMN_4_14_NULL) - .autoGenerated(COLUMN_4_14_AUTO_GENERATED) - .enums(COLUMN_4_14_ENUM_VALUES) - .sets(COLUMN_4_14_SET_VALUES) + .id(58L) + .ordinalPosition(13) + .table(TABLE_5_DTO) + .name("Breathes") + .internalName("breathes") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_15_ID) - .name(COLUMN_4_15_NAME) - .internalName(COLUMN_4_15_INTERNAL_NAME) - .columnType(COLUMN_4_15_TYPE_DTO) - .isNullAllowed(COLUMN_4_15_NULL) - .autoGenerated(COLUMN_4_15_AUTO_GENERATED) - .enums(COLUMN_4_15_ENUM_VALUES) - .sets(COLUMN_4_15_SET_VALUES) + .id(59L) + .ordinalPosition(14) + .table(TABLE_5_DTO) + .name("Venomous") + .internalName("venomous") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_16_ID) - .name(COLUMN_4_16_NAME) - .internalName(COLUMN_4_16_INTERNAL_NAME) - .columnType(COLUMN_4_16_TYPE_DTO) - .isNullAllowed(COLUMN_4_16_NULL) - .autoGenerated(COLUMN_4_16_AUTO_GENERATED) - .enums(COLUMN_4_16_ENUM_VALUES) - .sets(COLUMN_4_16_SET_VALUES) + .id(60L) + .ordinalPosition(15) + .table(TABLE_5_DTO) + .name("Fin") + .internalName("fin") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_17_ID) - .name(COLUMN_4_17_NAME) - .internalName(COLUMN_4_17_INTERNAL_NAME) - .columnType(COLUMN_4_17_TYPE_DTO) - .isNullAllowed(COLUMN_4_17_NULL) - .autoGenerated(COLUMN_4_17_AUTO_GENERATED) - .enums(COLUMN_4_17_ENUM_VALUES) - .sets(COLUMN_4_17_SET_VALUES) + .id(61L) + .ordinalPosition(16) + .table(TABLE_5_DTO) + .name("Legs") + .internalName("legs") + .columnType(ColumnTypeDto.INT) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_18_ID) - .name(COLUMN_4_18_NAME) - .internalName(COLUMN_4_18_INTERNAL_NAME) - .columnType(COLUMN_4_18_TYPE_DTO) - .isNullAllowed(COLUMN_4_18_NULL) - .autoGenerated(COLUMN_4_18_AUTO_GENERATED) - .enums(COLUMN_4_18_ENUM_VALUES) - .sets(COLUMN_4_18_SET_VALUES) + .id(62L) + .ordinalPosition(17) + .table(TABLE_5_DTO) + .name("Tail") + .internalName("tail") + .columnType(ColumnTypeDto.DECIMAL) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_19_ID) - .name(COLUMN_4_19_NAME) - .internalName(COLUMN_4_19_INTERNAL_NAME) - .columnType(COLUMN_4_19_TYPE_DTO) - .isNullAllowed(COLUMN_4_19_NULL) - .autoGenerated(COLUMN_4_19_AUTO_GENERATED) - .enums(COLUMN_4_19_ENUM_VALUES) - .sets(COLUMN_4_19_SET_VALUES) + .id(63L) + .ordinalPosition(18) + .table(TABLE_5_DTO) + .name("Domestic") + .internalName("domestic") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_20_ID) - .name(COLUMN_4_20_NAME) - .internalName(COLUMN_4_20_INTERNAL_NAME) - .columnType(COLUMN_4_20_TYPE_DTO) - .isNullAllowed(COLUMN_4_20_NULL) - .autoGenerated(COLUMN_4_20_AUTO_GENERATED) - .enums(COLUMN_4_20_ENUM_VALUES) - .sets(COLUMN_4_20_SET_VALUES) + .id(64L) + .ordinalPosition(19) + .table(TABLE_5_DTO) + .name("Catsize") + .internalName("catsize") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), ColumnDto.builder() - .id(COLUMN_4_21_ID) - .name(COLUMN_4_21_NAME) - .internalName(COLUMN_4_21_INTERNAL_NAME) - .columnType(COLUMN_4_21_TYPE_DTO) - .isNullAllowed(COLUMN_4_21_NULL) - .autoGenerated(COLUMN_4_21_AUTO_GENERATED) - .enums(COLUMN_4_21_ENUM_VALUES) - .sets(COLUMN_4_21_SET_VALUES) + .id(64L) + .ordinalPosition(20) + .table(TABLE_5_DTO) + .name("Class Type") + .internalName("class_type") + .columnType(ColumnTypeDto.DECIMAL) + .isNullAllowed(true) + .autoGenerated(false) .build()); public final static List<ForeignKeyCreateDto> TABLE_5_FOREIGN_KEYS_INVALID_CREATE = List.of(ForeignKeyCreateDto.builder() @@ -4649,54 +4155,115 @@ public abstract class BaseTest { .foreignKeys(TABLE_5_FOREIGN_KEYS_INVALID_CREATE) .build(); - public final static List<ColumnCreateDto> TABLE_5_COLUMNS_INVALID_CREATE = List.of(ColumnCreateDto.builder() - .name(COLUMN_4_2_NAME) - .type(COLUMN_4_2_TYPE_DTO) - .nullAllowed(COLUMN_4_2_NULL) - .enums(COLUMN_4_2_ENUM_VALUES_ARR) - .build()); - public final static List<ColumnCreateDto> TABLE_5_COLUMNS_CREATE = List.of(ColumnCreateDto.builder() - .name(COLUMN_5_1_NAME) - .type(COLUMN_5_1_TYPE_DTO) - .nullAllowed(COLUMN_5_1_NULL) - .enums(COLUMN_5_1_ENUM_VALUES_DTO) + .name("id") + .type(ColumnTypeDto.BIGINT) + .nullAllowed(false) + .build(), + ColumnCreateDto.builder() + .name("Animal Name") + .type(ColumnTypeDto.VARCHAR) + .nullAllowed(true) + .build(), + ColumnCreateDto.builder() + .name("Hair") + .type(ColumnTypeDto.BOOL) + .nullAllowed(true) + .build(), + ColumnCreateDto.builder() + .name("Feathers") + .type(ColumnTypeDto.BOOL) + .nullAllowed(true) + .build(), + ColumnCreateDto.builder() + .name("Bread") + .type(ColumnTypeDto.BOOL) + .nullAllowed(true) + .build(), + ColumnCreateDto.builder() + .name("Eggs") + .type(ColumnTypeDto.BOOL) + .nullAllowed(true) + .build(), + ColumnCreateDto.builder() + .name("Milk") + .type(ColumnTypeDto.BOOL) + .nullAllowed(true) + .build(), + ColumnCreateDto.builder() + .name("Water") + .type(ColumnTypeDto.BOOL) + .nullAllowed(true) + .build(), + ColumnCreateDto.builder() + .name("Airborne") + .type(ColumnTypeDto.BOOL) + .nullAllowed(true) + .build(), + ColumnCreateDto.builder() + .name("Waterborne") + .type(ColumnTypeDto.BOOL) + .nullAllowed(true) + .build(), + ColumnCreateDto.builder() + .name("Aquantic") + .type(ColumnTypeDto.BOOL) + .nullAllowed(true) + .build(), + ColumnCreateDto.builder() + .name("Predator") + .type(ColumnTypeDto.BOOL) + .nullAllowed(true) + .build(), + ColumnCreateDto.builder() + .name("Backbone") + .type(ColumnTypeDto.BOOL) + .nullAllowed(true) + .build(), + ColumnCreateDto.builder() + .name("Breathes") + .type(ColumnTypeDto.BOOL) + .nullAllowed(true) + .build(), + ColumnCreateDto.builder() + .name("Venomous") + .type(ColumnTypeDto.BOOL) + .nullAllowed(true) + .build(), + ColumnCreateDto.builder() + .name("Fin") + .type(ColumnTypeDto.BOOL) + .nullAllowed(true) .build(), ColumnCreateDto.builder() - .name(COLUMN_5_2_NAME) - .type(COLUMN_5_2_TYPE_DTO) - .nullAllowed(COLUMN_5_2_NULL) - .enums(COLUMN_5_2_ENUM_VALUES_DTO) + .name("Legs") + .type(ColumnTypeDto.INT) + .nullAllowed(true) .build(), ColumnCreateDto.builder() - .name(COLUMN_5_3_NAME) - .type(COLUMN_5_3_TYPE_DTO) - .nullAllowed(COLUMN_5_3_NULL) - .enums(COLUMN_5_3_ENUM_VALUES_DTO) + .name("Tail") + .type(ColumnTypeDto.DECIMAL) + .nullAllowed(true) .build(), ColumnCreateDto.builder() - .name(COLUMN_5_4_NAME) - .type(COLUMN_5_4_TYPE_DTO) - .nullAllowed(COLUMN_5_4_NULL) - .enums(COLUMN_5_4_ENUM_VALUES_DTO) + .name("Domestic") + .type(ColumnTypeDto.BOOL) + .nullAllowed(true) .build(), ColumnCreateDto.builder() - .name(COLUMN_5_5_NAME) - .type(COLUMN_5_5_TYPE_DTO) - .dfid(COLUMN_5_5_DATE_FORMAT) - .nullAllowed(COLUMN_5_5_NULL) - .enums(COLUMN_5_5_ENUM_VALUES_DTO) + .name("Catsize") + .type(ColumnTypeDto.BOOL) + .nullAllowed(true) .build(), ColumnCreateDto.builder() - .name(COLUMN_5_6_NAME) - .type(COLUMN_5_6_TYPE_DTO) - .nullAllowed(COLUMN_5_6_NULL) - .enums(COLUMN_5_6_ENUM_VALUES_DTO) + .name("Class Type") + .type(ColumnTypeDto.DECIMAL) + .nullAllowed(true) .build()); public final static ConstraintsCreateDto TABLE_5_CREATE_CONSTRAINTS_DTO = ConstraintsCreateDto.builder() - .primaryKey(Set.of(COLUMN_5_1_NAME)) - .uniques(List.of(List.of(COLUMN_5_1_NAME))) + .primaryKey(Set.of("id")) + .uniques(List.of(List.of("id"))) .checks(new LinkedHashSet<>()) .foreignKeys(new LinkedList<>()) .build(); @@ -4716,90 +4283,139 @@ public abstract class BaseTest { .build(); public final static List<TableColumn> TABLE_6_COLUMNS = List.of(TableColumn.builder() - .id(COLUMN_5_1_ID) - .ordinalPosition(COLUMN_5_1_ORDINALPOS) + .id(66L) + .ordinalPosition(0) .table(TABLE_6) - .name(COLUMN_5_1_NAME) - .internalName(COLUMN_5_1_INTERNAL_NAME) - .columnType(COLUMN_5_1_TYPE) - .isNullAllowed(COLUMN_5_1_NULL) - .autoGenerated(COLUMN_5_1_AUTO_GENERATED) - .enums(COLUMN_5_1_ENUM_VALUES) - .sets(COLUMN_5_1_SET_VALUES) + .name("id") + .internalName("id") + .columnType(TableColumnType.BIGINT) + .isNullAllowed(false) + .autoGenerated(true) .build(), TableColumn.builder() - .id(COLUMN_5_2_ID) - .ordinalPosition(COLUMN_5_2_ORDINALPOS) + .id(67L) + .ordinalPosition(1) .table(TABLE_6) - .name(COLUMN_5_2_NAME) - .internalName(COLUMN_5_2_INTERNAL_NAME) - .columnType(COLUMN_5_2_TYPE) - .isNullAllowed(COLUMN_5_2_NULL) - .autoGenerated(COLUMN_5_2_AUTO_GENERATED) - .enums(COLUMN_5_2_ENUM_VALUES) - .sets(COLUMN_5_2_SET_VALUES) + .name("firstname") + .internalName("firstname") + .columnType(TableColumnType.VARCHAR) + .isNullAllowed(false) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_5_3_ID) - .ordinalPosition(COLUMN_5_3_ORDINALPOS) + .id(68L) + .ordinalPosition(2) .table(TABLE_6) - .name(COLUMN_5_3_NAME) - .internalName(COLUMN_5_3_INTERNAL_NAME) - .columnType(COLUMN_5_3_TYPE) - .isNullAllowed(COLUMN_5_3_NULL) - .autoGenerated(COLUMN_5_3_AUTO_GENERATED) - .enums(COLUMN_5_3_ENUM_VALUES) - .sets(COLUMN_5_3_SET_VALUES) + .name("lastname") + .internalName("lastname") + .columnType(TableColumnType.VARCHAR) + .isNullAllowed(false) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_5_4_ID) - .ordinalPosition(COLUMN_5_4_ORDINALPOS) + .id(69L) + .ordinalPosition(3) .table(TABLE_6) - .name(COLUMN_5_4_NAME) - .internalName(COLUMN_5_4_INTERNAL_NAME) - .columnType(COLUMN_5_4_TYPE) - .isNullAllowed(COLUMN_5_4_NULL) - .autoGenerated(COLUMN_5_4_AUTO_GENERATED) - .enums(COLUMN_5_4_ENUM_VALUES) - .sets(COLUMN_5_4_SET_VALUES) + .name("birth") + .internalName("birth") + .columnType(TableColumnType.YEAR) + .isNullAllowed(false) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_5_5_ID) - .ordinalPosition(COLUMN_5_5_ORDINALPOS) + .id(70L) + .ordinalPosition(4) .table(TABLE_6) - .name(COLUMN_5_5_NAME) - .internalName(COLUMN_5_5_INTERNAL_NAME) - .columnType(COLUMN_5_5_TYPE) - .isNullAllowed(COLUMN_5_5_NULL) - .autoGenerated(COLUMN_5_5_AUTO_GENERATED) - .enums(COLUMN_5_5_ENUM_VALUES) - .sets(COLUMN_5_5_SET_VALUES) + .name("reminder") + .internalName("reminder") + .columnType(TableColumnType.TIME) + .dateFormat(IMAGE_DATE_4) + .isNullAllowed(false) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_5_6_ID) - .ordinalPosition(COLUMN_5_6_ORDINALPOS) + .id(71L) + .ordinalPosition(5) .table(TABLE_6) - .name(COLUMN_5_6_NAME) - .internalName(COLUMN_5_6_INTERNAL_NAME) - .columnType(COLUMN_5_6_TYPE) - .isNullAllowed(COLUMN_5_6_NULL) - .autoGenerated(COLUMN_5_6_AUTO_GENERATED) - .enums(COLUMN_5_6_ENUM_VALUES) - .sets(COLUMN_5_6_SET_VALUES) + .name("ref_id") + .internalName("ref_id") + .columnType(TableColumnType.BIGINT) + .isNullAllowed(true) + .autoGenerated(false) + .build()); + + public final static List<ColumnDto> TABLE_6_COLUMNS_DTO = List.of(ColumnDto.builder() + .id(66L) + .ordinalPosition(0) + .table(TABLE_6_DTO) + .name("id") + .internalName("id") + .columnType(ColumnTypeDto.BIGINT) + .isNullAllowed(false) + .autoGenerated(true) + .build(), + ColumnDto.builder() + .id(67L) + .ordinalPosition(1) + .table(TABLE_6_DTO) + .name("firstname") + .internalName("firstname") + .columnType(ColumnTypeDto.VARCHAR) + .isNullAllowed(false) + .autoGenerated(false) + .build(), + ColumnDto.builder() + .id(68L) + .ordinalPosition(2) + .table(TABLE_6_DTO) + .name("lastname") + .internalName("lastname") + .columnType(ColumnTypeDto.VARCHAR) + .isNullAllowed(false) + .autoGenerated(false) + .build(), + ColumnDto.builder() + .id(69L) + .ordinalPosition(3) + .table(TABLE_6_DTO) + .name("birth") + .internalName("birth") + .columnType(ColumnTypeDto.YEAR) + .isNullAllowed(false) + .autoGenerated(false) + .build(), + ColumnDto.builder() + .id(70L) + .ordinalPosition(4) + .table(TABLE_6_DTO) + .name("reminder") + .internalName("reminder") + .columnType(ColumnTypeDto.TIME) + .dateFormat(IMAGE_DATE_4_DTO) + .isNullAllowed(false) + .autoGenerated(false) + .build(), + ColumnDto.builder() + .id(71L) + .ordinalPosition(5) + .table(TABLE_6_DTO) + .name("ref_id") + .internalName("ref_id") + .columnType(ColumnTypeDto.BIGINT) + .isNullAllowed(true) + .autoGenerated(false) .build()); public final static List<List<String>> TABLE_6_UNIQUES_CREATE = List.of( - List.of(COLUMN_5_1_NAME), - List.of(COLUMN_5_2_NAME, COLUMN_5_3_NAME)); + List.of("firstname", "lastname")); public final static List<ForeignKeyCreateDto> TABLE_6_FOREIGN_KEYS_CREATE = List.of(ForeignKeyCreateDto.builder() - .columns(List.of(COLUMN_5_6_NAME)) - .referencedTable(TABLE_5_NAME) - .referencedColumns(List.of(COLUMN_4_1_NAME)) + .columns(List.of("ref_id")) + .referencedTable("zoo") + .referencedColumns(List.of("id")) .build()); - public final static Set<String> TABLE_6_CHECKS_CREATE = Set.of( - COLUMN_5_2_NAME + " != " + COLUMN_5_3_NAME); + public final static Set<String> TABLE_6_CHECKS_CREATE = Set.of("firstname != lastname"); public final static ConstraintsCreateDto TABLE_6_CONSTRAINTS_CREATE = ConstraintsCreateDto.builder() .uniques(TABLE_6_UNIQUES_CREATE) @@ -4808,52 +4424,17 @@ public abstract class BaseTest { .primaryKey(Set.of("id")) .build(); - public final static Long COLUMN_6_1_ID = 26L; - public final static Integer COLUMN_6_1_ORDINALPOS = 0; - public final static Boolean COLUMN_6_1_PRIMARY = true; - public final static String COLUMN_6_1_NAME = "name_id"; - public final static String COLUMN_6_1_INTERNAL_NAME = "name_id"; - public final static TableColumnType COLUMN_6_1_TYPE = TableColumnType.BIGINT; - public final static ColumnTypeDto COLUMN_6_1_TYPE_DTO = ColumnTypeDto.BIGINT; - public final static Long COLUMN_6_1_DATE_FORMAT = null; - public final static Boolean COLUMN_6_1_NULL = false; - public final static Boolean COLUMN_6_1_AUTO_GENERATED = false; - public final static String COLUMN_6_1_FOREIGN_KEY = null; - public final static String COLUMN_6_1_CHECK = null; - public final static List<String> COLUMN_6_1_ENUM_VALUES = null; - public final static List<String> COLUMN_6_1_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_6_1_SET_VALUES = null; - public final static List<String> COLUMN_6_1_SET_VALUES_DTO = null; - - public final static Long COLUMN_6_2_ID = 27L; - public final static Integer COLUMN_6_2_ORDINALPOS = 1; - public final static Boolean COLUMN_6_2_PRIMARY = true; - public final static String COLUMN_6_2_NAME = "zoo_id"; - public final static String COLUMN_6_2_INTERNAL_NAME = "zoo_id"; - public final static TableColumnType COLUMN_6_2_TYPE = TableColumnType.BIGINT; - public final static ColumnTypeDto COLUMN_6_2_TYPE_DTO = ColumnTypeDto.BIGINT; - public final static Long COLUMN_6_2_DATE_FORMAT = null; - public final static Long COLUMN_6_2_SIZE = 255L; - public final static Boolean COLUMN_6_2_NULL = false; - public final static Boolean COLUMN_6_2_AUTO_GENERATED = false; - public final static String COLUMN_6_2_FOREIGN_KEY = null; - public final static String COLUMN_6_2_CHECK = null; - public final static List<String> COLUMN_6_2_ENUM_VALUES = null; - public final static List<String> COLUMN_6_2_ENUM_VALUES_DTO = null; - public final static List<String> COLUMN_6_2_SET_VALUES = null; - public final static List<String> COLUMN_6_2_SET_VALUES_DTO = null; - public final static List<ColumnCreateDto> TABLE_6_COLUMNS_CREATE = List.of( ColumnCreateDto.builder() - .name(COLUMN_6_1_NAME) - .type(COLUMN_6_1_TYPE_DTO) - .nullAllowed(COLUMN_6_1_NULL) + .name("name_id") + .type(ColumnTypeDto.BIGINT) + .nullAllowed(false) .build(), ColumnCreateDto.builder() - .name(COLUMN_6_2_NAME) - .type(COLUMN_6_2_TYPE_DTO) - .size(COLUMN_6_2_SIZE) - .nullAllowed(COLUMN_6_2_NULL) + .name("zoo_id") + .type(ColumnTypeDto.BIGINT) + .size(255L) + .nullAllowed(false) .build()); public final static TableCreateDto TABLE_6_CREATE_DTO = TableCreateDto.builder() @@ -4864,28 +4445,45 @@ public abstract class BaseTest { .build(); public final static List<TableColumn> TABLE_7_COLUMNS = List.of(TableColumn.builder() - .id(COLUMN_6_1_ID) - .ordinalPosition(COLUMN_6_1_ORDINALPOS) + .id(26L) + .ordinalPosition(0) .table(TABLE_7) - .name(COLUMN_6_1_NAME) - .internalName(COLUMN_6_1_INTERNAL_NAME) - .columnType(COLUMN_6_1_TYPE) - .isNullAllowed(COLUMN_6_1_NULL) - .autoGenerated(COLUMN_6_1_AUTO_GENERATED) - .enums(COLUMN_6_1_ENUM_VALUES) - .sets(COLUMN_6_1_SET_VALUES) + .name("name_id") + .internalName("name_id") + .columnType(TableColumnType.BIGINT) + .isNullAllowed(false) + .autoGenerated(false) .build(), TableColumn.builder() - .id(COLUMN_6_2_ID) - .ordinalPosition(COLUMN_6_2_ORDINALPOS) + .id(27L) + .ordinalPosition(1) .table(TABLE_7) - .name(COLUMN_6_2_NAME) - .internalName(COLUMN_6_2_INTERNAL_NAME) - .columnType(COLUMN_6_2_TYPE) - .isNullAllowed(COLUMN_6_2_NULL) - .autoGenerated(COLUMN_6_2_AUTO_GENERATED) - .enums(COLUMN_6_2_ENUM_VALUES) - .sets(COLUMN_6_2_SET_VALUES) + .name("zoo_id") + .internalName("zoo_id") + .columnType(TableColumnType.BIGINT) + .isNullAllowed(false) + .autoGenerated(false) + .build()); + + public final static List<ColumnDto> TABLE_7_COLUMNS_DTO = List.of(ColumnDto.builder() + .id(26L) + .ordinalPosition(0) + .table(TABLE_7_DTO) + .name("name_id") + .internalName("name_id") + .columnType(ColumnTypeDto.BIGINT) + .isNullAllowed(false) + .autoGenerated(false) + .build(), + ColumnDto.builder() + .id(27L) + .ordinalPosition(1) + .table(TABLE_7_DTO) + .name("zoo_id") + .internalName("zoo_id") + .columnType(ColumnTypeDto.BIGINT) + .isNullAllowed(false) + .autoGenerated(false) .build()); public final static Long VIEW_1_ID = 1L; @@ -4898,10 +4496,39 @@ public abstract class BaseTest { public final static String VIEW_1_QUERY = "select `location`, `lat`, `lng` from `weather_location`"; public final static String VIEW_1_QUERY_HASH = "dc81a6877c7c51a6a6f406e1fc2a255e44a0d49a20548596e0d583c3eb849c23"; - public final static List<ColumnDto> VIEW_1_COLUMNS_DTO = List.of( - TABLE_2_COLUMNS_DTO.get(0), - TABLE_2_COLUMNS_DTO.get(1), - TABLE_2_COLUMNS_DTO.get(2) + public final static List<ViewColumnDto> VIEW_1_COLUMNS_DTO = List.of( + ViewColumnDto.builder() + .id(1L) + .name("location") + .internalName("location") + .ordinalPosition(0) + .columnType(ColumnTypeDto.VARCHAR) + .size(255L) + .isNullAllowed(false) + .autoGenerated(false) + .build(), + ViewColumnDto.builder() + .id(2L) + .name("lat") + .internalName("lat") + .ordinalPosition(1) + .columnType(ColumnTypeDto.DECIMAL) + .size(10L) + .d(0L) + .isNullAllowed(true) + .autoGenerated(false) + .build(), + ViewColumnDto.builder() + .id(3L) + .name("lng") + .internalName("lng") + .ordinalPosition(2) + .columnType(ColumnTypeDto.DECIMAL) + .size(10L) + .d(0L) + .isNullAllowed(true) + .autoGenerated(false) + .build() ); public final static View VIEW_1 = View.builder() @@ -4947,19 +4574,39 @@ public abstract class BaseTest { ViewColumn.builder() .id(1L) .ordinalPosition(0) - .column(TABLE_2_COLUMNS.get(0)) + .name("location") + .internalName("location") + .ordinalPosition(0) + .columnType(TableColumnType.VARCHAR) + .size(255L) + .isNullAllowed(false) + .autoGenerated(false) .view(VIEW_1) .build(), ViewColumn.builder() .id(2L) .ordinalPosition(1) - .column(TABLE_2_COLUMNS.get(1)) + .name("lat") + .internalName("lat") + .ordinalPosition(1) + .columnType(TableColumnType.DECIMAL) + .size(10L) + .d(0L) + .isNullAllowed(true) + .autoGenerated(false) .view(VIEW_1) .build(), ViewColumn.builder() .id(3L) .ordinalPosition(2) - .column(TABLE_2_COLUMNS.get(2)) + .name("lng") + .internalName("lng") + .ordinalPosition(2) + .columnType(TableColumnType.DECIMAL) + .size(10L) + .d(0L) + .isNullAllowed(true) + .autoGenerated(false) .view(VIEW_1) .build() ); @@ -5019,11 +4666,48 @@ public abstract class BaseTest { public final static String VIEW_2_QUERY = "select `date`, `location` as loc, `location`, `rainfall`, `mintemp` from `weather_aus` where `location` = 'Albury'"; public final static String VIEW_2_QUERY_HASH = "987fc946772ffb6d85060262dcb5df419692a1f6772ea995e3dedb53c191e984"; - public final static List<ColumnDto> VIEW_2_COLUMNS_DTO = List.of( - TABLE_1_COLUMNS_DTO.get(1), - TABLE_1_COLUMNS_DTO.get(2), - TABLE_1_COLUMNS_DTO.get(4), - TABLE_1_COLUMNS_DTO.get(3) + public final static List<ViewColumnDto> VIEW_2_COLUMNS_DTO = List.of( + ViewColumnDto.builder() + .id(4L) + .name("Date") + .internalName("date") + .ordinalPosition(1) + .columnType(ColumnTypeDto.DATE) + .dateFormat(IMAGE_DATE_1_DTO) + .isNullAllowed(true) + .autoGenerated(false) + .build(), + ViewColumnDto.builder() + .id(5L) + .name("Location") + .internalName("location") + .ordinalPosition(2) + .columnType(ColumnTypeDto.VARCHAR) + .size(255L) + .isNullAllowed(true) + .autoGenerated(false) + .build(), + ViewColumnDto.builder() + .id(6L) + .name("MinTemp") + .internalName("mintemp") + .ordinalPosition(3) + .columnType(ColumnTypeDto.DECIMAL) + .size(10L) + .d(0L) + .isNullAllowed(true) + .autoGenerated(false) + .build(), + ViewColumnDto.builder() + .id(7L) + .name("Location") + .internalName("location") + .ordinalPosition(2) + .columnType(ColumnTypeDto.VARCHAR) + .size(255L) + .isNullAllowed(true) + .autoGenerated(false) + .build() ); public final static View VIEW_2 = View.builder() @@ -5043,26 +4727,47 @@ public abstract class BaseTest { ViewColumn.builder() .id(4L) .ordinalPosition(0) - .column(TABLE_1_COLUMNS.get(1)) + .name("Date") + .internalName("date") + .columnType(TableColumnType.DATE) + .dateFormat(IMAGE_DATE_1) + .isNullAllowed(true) + .autoGenerated(false) .view(VIEW_2) .build(), ViewColumn.builder() .id(5L) .ordinalPosition(1) - .alias("loc") - .column(TABLE_1_COLUMNS.get(2)) + .name("Location") + .internalName("location") + .columnType(TableColumnType.VARCHAR) + .size(255L) + .isNullAllowed(true) + .autoGenerated(false) .view(VIEW_2) .build(), ViewColumn.builder() .id(6L) .ordinalPosition(2) - .column(TABLE_1_COLUMNS.get(4)) + .name("Rainfall") + .internalName("rainfall") + .columnType(TableColumnType.DECIMAL) + .size(10L) + .d(0L) + .isNullAllowed(true) + .autoGenerated(false) .view(VIEW_2) .build(), ViewColumn.builder() .id(7L) .ordinalPosition(3) - .column(TABLE_1_COLUMNS.get(3)) + .name("MinTemp") + .internalName("mintemp") + .columnType(TableColumnType.DECIMAL) + .size(10L) + .d(0L) + .isNullAllowed(true) + .autoGenerated(false) .view(VIEW_2) .build() ); @@ -5116,11 +4821,51 @@ public abstract class BaseTest { public final static String VIEW_3_QUERY = "select w.`mintemp`, w.`rainfall`, w.`location`, m.`date` from `weather_aus` w join `junit2` m on m.`location` = w.`location` and m.`date` = w.`date`"; public final static String VIEW_3_QUERY_HASH = "bbbaa56a5206b3dc3e6cf9301b0db9344eb6f19b100c7b88550ffb597a0bd255"; - public final static List<ColumnDto> VIEW_3_COLUMNS_DTO = List.of( - TABLE_1_COLUMNS_DTO.get(3), - TABLE_1_COLUMNS_DTO.get(4), - TABLE_1_COLUMNS_DTO.get(2), - TABLE_1_COLUMNS_DTO.get(1) + public final static List<ViewColumnDto> VIEW_3_COLUMNS_DTO = List.of( + ViewColumnDto.builder() + .id(8L) + .name("MinTemp") + .internalName("mintemp") + .ordinalPosition(0) + .columnType(ColumnTypeDto.DECIMAL) + .size(10L) + .d(0L) + .isNullAllowed(true) + .autoGenerated(false) + .build(), + ViewColumnDto.builder() + .id(9L) + .name("Rainfall") + .internalName("rainfall") + .ordinalPosition(1) + .columnType(ColumnTypeDto.DECIMAL) + .size(10L) + .d(0L) + .concept(CONCEPT_1_DTO) + .unit(UNIT_1_DTO) + .isNullAllowed(true) + .autoGenerated(false) + .build(), + ViewColumnDto.builder() + .id(10L) + .name("Location") + .internalName("location") + .ordinalPosition(2) + .columnType(ColumnTypeDto.VARCHAR) + .size(255L) + .isNullAllowed(true) + .autoGenerated(false) + .build(), + ViewColumnDto.builder() + .id(11L) + .name("Date") + .internalName("date") + .ordinalPosition(3) + .columnType(ColumnTypeDto.DATE) + .dateFormat(IMAGE_DATE_1_DTO) + .isNullAllowed(true) + .autoGenerated(false) + .build() ); public final static View VIEW_3 = View.builder() @@ -5136,29 +4881,65 @@ public abstract class BaseTest { .createdBy(USER_1_ID) .build(); + public final static PrivilegedViewDto VIEW_3_PRIVILEGED_DTO = PrivilegedViewDto.builder() + .id(VIEW_3_ID) + .isInitialView(VIEW_3_INITIAL_VIEW) + .database(null) /* DATABASE_1_PRIVILEGED_DTO */ + .name(VIEW_3_NAME) + .internalName(VIEW_3_INTERNAL_NAME) + .vdbid(VIEW_3_DATABASE_ID) + .isPublic(VIEW_3_PUBLIC) + .createdBy(USER_1_ID) + .query(VIEW_3_QUERY) + .queryHash(VIEW_3_QUERY_HASH) + .columns(VIEW_3_COLUMNS_DTO) + .build(); + public final static List<ViewColumn> VIEW_3_COLUMNS = List.of( ViewColumn.builder() .id(8L) .ordinalPosition(0) - .column(TABLE_1_COLUMNS.get(3)) + .name("MinTemp") + .internalName("mintemp") + .columnType(TableColumnType.DECIMAL) + .size(10L) + .d(0L) + .isNullAllowed(true) + .autoGenerated(false) .view(VIEW_3) .build(), ViewColumn.builder() .id(9L) .ordinalPosition(1) - .column(TABLE_1_COLUMNS.get(4)) + .name("Rainfall") + .internalName("rainfall") + .columnType(TableColumnType.DECIMAL) + .size(10L) + .d(0L) + .isNullAllowed(true) + .autoGenerated(false) .view(VIEW_3) .build(), ViewColumn.builder() .id(10L) .ordinalPosition(2) - .column(TABLE_1_COLUMNS.get(2)) + .name("Location") + .internalName("location") + .columnType(TableColumnType.VARCHAR) + .size(255L) + .isNullAllowed(true) + .autoGenerated(false) .view(VIEW_3) .build(), ViewColumn.builder() .id(11L) .ordinalPosition(3) - .column(TABLE_1_COLUMNS.get(1)) + .name("Date") + .internalName("date") + .columnType(TableColumnType.DATE) + .dateFormat(IMAGE_DATE_1) + .isNullAllowed(true) + .autoGenerated(false) .view(VIEW_3) .build() ); @@ -5200,143 +4981,173 @@ public abstract class BaseTest { public final static String VIEW_4_QUERY = "SELECT `animal_name`, `hair`, `feathers`, `eggs`, `milk`, `airborne`, `aquatic`, `predator`, `backbone`, `breathes`, `venomous`, `fins`, `legs`, `tail`, `domestic`, `catsize`, `class_type` FROM `zoo` WHERE `class_type` = 1"; public final static String VIEW_4_QUERY_HASH = "3561cd0bb0b0e94d6f15ae602134252a5760d09d660a71a4fb015b6991c8ba0b"; - public final static List<ColumnDto> VIEW_4_COLUMNS_DTO = List.of( - TABLE_5_COLUMNS_DTO.get(1), - TABLE_5_COLUMNS_DTO.get(2), - TABLE_5_COLUMNS_DTO.get(3), - TABLE_5_COLUMNS_DTO.get(5), - TABLE_5_COLUMNS_DTO.get(6), - TABLE_5_COLUMNS_DTO.get(8), - TABLE_5_COLUMNS_DTO.get(10), - TABLE_5_COLUMNS_DTO.get(11), - TABLE_5_COLUMNS_DTO.get(12), - TABLE_5_COLUMNS_DTO.get(13), - TABLE_5_COLUMNS_DTO.get(14), - TABLE_5_COLUMNS_DTO.get(15), - TABLE_5_COLUMNS_DTO.get(16), - TABLE_5_COLUMNS_DTO.get(17), - TABLE_5_COLUMNS_DTO.get(18), - TABLE_5_COLUMNS_DTO.get(19), - TABLE_5_COLUMNS_DTO.get(20) - ); - - public final static View VIEW_4 = View.builder() - .id(VIEW_4_ID) - .isInitialView(VIEW_4_INITIAL_VIEW) - .name(VIEW_4_NAME) - .internalName(VIEW_4_INTERNAL_NAME) - .vdbid(VIEW_4_DATABASE_ID) - .isPublic(VIEW_4_PUBLIC) - .query(VIEW_4_QUERY) - .queryHash(VIEW_4_QUERY_HASH) - .createdBy(USER_1_ID) - .columns(null) /* VIEW_4_COLUMNS */ - .build(); - - public final static List<ViewColumn> VIEW_4_COLUMNS = List.of( - ViewColumn.builder() + public final static List<ViewColumnDto> VIEW_4_COLUMNS_DTO = List.of( + ViewColumnDto.builder() .id(12L) .ordinalPosition(0) - .column(TABLE_5_COLUMNS.get(1)) - .view(VIEW_4) + .name("Animal Name") + .internalName("animal_name") + .columnType(ColumnTypeDto.VARCHAR) + .isNullAllowed(true) + .autoGenerated(false) .build(), - ViewColumn.builder() + ViewColumnDto.builder() .id(13L) .ordinalPosition(1) - .column(TABLE_5_COLUMNS.get(2)) - .view(VIEW_4) + .name("Hair") + .internalName("hair") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), - ViewColumn.builder() + ViewColumnDto.builder() .id(14L) .ordinalPosition(2) - .column(TABLE_5_COLUMNS.get(3)) - .view(VIEW_4) + .name("Feathers") + .internalName("feathers") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), - ViewColumn.builder() + ViewColumnDto.builder() .id(15L) .ordinalPosition(3) - .column(TABLE_5_COLUMNS.get(5)) - .view(VIEW_4) + .name("Eggs") + .internalName("eggs") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), - ViewColumn.builder() + ViewColumnDto.builder() .id(16L) .ordinalPosition(4) - .column(TABLE_5_COLUMNS.get(6)) - .view(VIEW_4) + .name("Milk") + .internalName("milk") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), - ViewColumn.builder() + ViewColumnDto.builder() .id(17L) .ordinalPosition(5) - .column(TABLE_5_COLUMNS.get(8)) - .view(VIEW_4) + .name("Airborne") + .internalName("airborne") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), - ViewColumn.builder() + ViewColumnDto.builder() .id(18L) .ordinalPosition(6) - .column(TABLE_5_COLUMNS.get(10)) - .view(VIEW_4) + .name("Aquantic") + .internalName("aquantic") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), - ViewColumn.builder() + ViewColumnDto.builder() .id(19L) .ordinalPosition(7) - .column(TABLE_5_COLUMNS.get(11)) - .view(VIEW_4) + .name("Predator") + .internalName("predator") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), - ViewColumn.builder() + ViewColumnDto.builder() .id(20L) .ordinalPosition(8) - .column(TABLE_5_COLUMNS.get(12)) - .view(VIEW_4) + .name("Backbone") + .internalName("backbone") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), - ViewColumn.builder() + ViewColumnDto.builder() .id(21L) .ordinalPosition(9) - .column(TABLE_5_COLUMNS.get(13)) - .view(VIEW_4) + .name("Breathes") + .internalName("breathes") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), - ViewColumn.builder() + ViewColumnDto.builder() .id(22L) .ordinalPosition(10) - .column(TABLE_5_COLUMNS.get(14)) - .view(VIEW_4) + .name("Venomous") + .internalName("venomous") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), - ViewColumn.builder() + ViewColumnDto.builder() .id(23L) .ordinalPosition(11) - .column(TABLE_5_COLUMNS.get(15)) - .view(VIEW_4) + .name("Fin") + .internalName("fin") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), - ViewColumn.builder() + ViewColumnDto.builder() .id(24L) .ordinalPosition(12) - .column(TABLE_5_COLUMNS.get(16)) - .view(VIEW_4) + .name("Legs") + .internalName("legs") + .columnType(ColumnTypeDto.INT) + .isNullAllowed(true) + .autoGenerated(false) .build(), - ViewColumn.builder() + ViewColumnDto.builder() .id(25L) .ordinalPosition(13) - .column(TABLE_5_COLUMNS.get(17)) - .view(VIEW_4) + .name("Tail") + .internalName("tail") + .columnType(ColumnTypeDto.DECIMAL) + .isNullAllowed(true) + .autoGenerated(false) .build(), - ViewColumn.builder() + ViewColumnDto.builder() .id(26L) .ordinalPosition(14) - .column(TABLE_5_COLUMNS.get(18)) - .view(VIEW_4) + .name("Domestic") + .internalName("domestic") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), - ViewColumn.builder() + ViewColumnDto.builder() .id(27L) .ordinalPosition(15) - .column(TABLE_5_COLUMNS.get(19)) - .view(VIEW_4) + .name("Catsize") + .internalName("catsize") + .columnType(ColumnTypeDto.BOOL) + .isNullAllowed(true) + .autoGenerated(false) .build(), - ViewColumn.builder() + ViewColumnDto.builder() .id(28L) .ordinalPosition(16) - .column(TABLE_5_COLUMNS.get(20)) - .view(VIEW_4) - .build() - ); + .name("Class Type") + .internalName("class_type") + .columnType(ColumnTypeDto.DECIMAL) + .isNullAllowed(true) + .autoGenerated(false) + .build()); + + public final static View VIEW_4 = View.builder() + .id(VIEW_4_ID) + .isInitialView(VIEW_4_INITIAL_VIEW) + .name(VIEW_4_NAME) + .internalName(VIEW_4_INTERNAL_NAME) + .vdbid(VIEW_4_DATABASE_ID) + .isPublic(VIEW_4_PUBLIC) + .query(VIEW_4_QUERY) + .queryHash(VIEW_4_QUERY_HASH) + .createdBy(USER_1_ID) + .columns(null) /* VIEW_4_COLUMNS */ + .build(); public final static ViewDto VIEW_4_DTO = ViewDto.builder() .id(VIEW_4_ID) @@ -5391,19 +5202,39 @@ public abstract class BaseTest { ViewColumn.builder() .id(29L) .ordinalPosition(0) - .column(TABLE_2_COLUMNS.get(0)) + .name("location") + .internalName("location") + .ordinalPosition(0) + .columnType(TableColumnType.VARCHAR) + .size(255L) + .isNullAllowed(false) + .autoGenerated(false) .view(VIEW_5) .build(), ViewColumn.builder() .id(30L) .ordinalPosition(1) - .column(TABLE_2_COLUMNS.get(1)) + .name("lat") + .internalName("lat") + .ordinalPosition(1) + .columnType(TableColumnType.DECIMAL) + .size(10L) + .d(0L) + .isNullAllowed(true) + .autoGenerated(false) .view(VIEW_5) .build(), ViewColumn.builder() .id(31L) .ordinalPosition(2) - .column(TABLE_2_COLUMNS.get(2)) + .name("lng") + .internalName("lng") + .ordinalPosition(2) + .columnType(TableColumnType.DECIMAL) + .size(10L) + .d(0L) + .isNullAllowed(true) + .autoGenerated(false) .view(VIEW_5) .build()); @@ -7411,4 +7242,285 @@ public abstract class BaseTest { .huserid(USER_3_ID) .build(); + public final static Constraints TABLE_1_CONSTRAINTS = Constraints.builder() + .checks(new LinkedHashSet<>()) + .foreignKeys(new LinkedList<>()) + .uniques(new LinkedList<>()) + .primaryKey(new LinkedList<>(List.of(PrimaryKey.builder() + .table(TABLE_1) + .column(TABLE_1_COLUMNS.get(0)) + .pkid(1L) + .build()))) + .build(); + + public final static ConstraintsDto TABLE_1_CONSTRAINTS_DTO = ConstraintsDto.builder() + .checks(new LinkedHashSet<>()) + .foreignKeys(new LinkedList<>()) + .uniques(new LinkedList<>()) + .primaryKey(new LinkedHashSet<>(Set.of(PrimaryKeyDto.builder() + .table(TABLE_1_BRIEF_DTO) + .column(TABLE_1_COLUMNS_DTO.get(0)) + .pkid(1L) + .build()))) + .build(); + + public final static Constraints TABLE_2_CONSTRAINTS = Constraints.builder() + .checks(new LinkedHashSet<>(List.of("`mintemp` > 0"))) + .foreignKeys(new LinkedList<>(List.of(ForeignKey.builder() + .name("fk_location") + .onDelete(ReferenceType.NO_ACTION) + .references(new LinkedList<>(List.of(ForeignKeyReference.builder() + .id(1L) + .column(TABLE_2_COLUMNS.get(2)) + .referencedColumn(TABLE_1_COLUMNS.get(0)) + .foreignKey(null) // set later + .build()))) + .table(TABLE_1) + .referencedTable(TABLE_2) + .onUpdate(ReferenceType.NO_ACTION) + .build()))) + .uniques(new LinkedList<>(List.of(Unique.builder() + .uid(1L) + .table(TABLE_2) + .name("uk_1") + .columns(new LinkedList<>(List.of(TABLE_2_COLUMNS.get(1)))) + .build()))) + .primaryKey(new LinkedList<>(List.of(PrimaryKey.builder() + .table(TABLE_2) + .column(TABLE_2_COLUMNS.get(0)) + .pkid(2L) + .build()))) + .build(); + + public final static ConstraintsDto TABLE_2_CONSTRAINTS_DTO = ConstraintsDto.builder() + .checks(new LinkedHashSet<>(List.of("`mintemp` > 0"))) + .foreignKeys(new LinkedList<>(List.of(ForeignKeyDto.builder() + .name("fk_location") + .onDelete(ReferenceTypeDto.NO_ACTION) + .references(new LinkedList<>(List.of(ForeignKeyReferenceDto.builder() + .id(1L) + .column(TABLE_2_COLUMNS_DTO.get(2)) + .referencedColumn(TABLE_1_COLUMNS_DTO.get(0)) + .foreignKey(null) // set later + .build()))) + .table(TABLE_1_DTO) + .referencedTable(TABLE_2_DTO) + .onUpdate(ReferenceTypeDto.NO_ACTION) + .build()))) + .uniques(new LinkedList<>(List.of(UniqueDto.builder() + .uid(1L) + .table(TABLE_2_BRIEF_DTO) + .name("uk_1") + .columns(new LinkedList<>(List.of(TABLE_2_COLUMNS_DTO.get(1)))) + .build()))) + .primaryKey(new LinkedHashSet<>(Set.of(PrimaryKeyDto.builder() + .table(TABLE_2_BRIEF_DTO) + .column(TABLE_2_COLUMNS_DTO.get(0)) + .pkid(2L) + .build()))) + .build(); + + public final static Constraints TABLE_3_CONSTRAINTS = Constraints.builder() + .checks(new LinkedHashSet<>()) + .foreignKeys(new LinkedList<>()) + .uniques(new LinkedList<>()) + .primaryKey(new LinkedList<>(List.of(PrimaryKey.builder() + .table(TABLE_3) + .column(TABLE_3_COLUMNS.get(0)) + .pkid(3L) + .build()))) + .build(); + + public final static ConstraintsDto TABLE_3_CONSTRAINTS_DTO = ConstraintsDto.builder() + .checks(new LinkedHashSet<>()) + .foreignKeys(new LinkedList<>()) + .uniques(new LinkedList<>()) + .primaryKey(new LinkedHashSet<>(Set.of(PrimaryKeyDto.builder() + .table(TABLE_3_BRIEF_DTO) + .column(TABLE_3_COLUMNS_DTO.get(0)) + .pkid(3L) + .build()))) + .build(); + + public final static Constraints TABLE_4_CONSTRAINTS = Constraints.builder() + .checks(new LinkedHashSet<>()) + .foreignKeys(new LinkedList<>()) + .uniques(new LinkedList<>()) + .primaryKey(new LinkedList<>(List.of(PrimaryKey.builder() + .table(TABLE_4) + .column(TABLE_4_COLUMNS.get(0)) + .pkid(4L) + .build()))) + .build(); + + public final static ConstraintsDto TABLE_4_CONSTRAINTS_DTO = ConstraintsDto.builder() + .checks(new LinkedHashSet<>()) + .foreignKeys(new LinkedList<>()) + .uniques(new LinkedList<>()) + .primaryKey(new LinkedHashSet<>(Set.of(PrimaryKeyDto.builder() + .table(TABLE_4_BRIEF_DTO) + .column(TABLE_4_COLUMNS_DTO.get(0)) + .pkid(4L) + .build()))) + .build(); + + public final static Constraints TABLE_5_CONSTRAINTS = Constraints.builder() + .checks(new LinkedHashSet<>()) + .foreignKeys(new LinkedList<>()) + .uniques(new LinkedList<>()) + .primaryKey(new LinkedList<>(List.of(PrimaryKey.builder() + .table(TABLE_5) + .column(TABLE_5_COLUMNS.get(0)) + .pkid(5L) + .build()))) + .build(); + + public final static ConstraintsDto TABLE_5_CONSTRAINTS_DTO = ConstraintsDto.builder() + .checks(new LinkedHashSet<>()) + .foreignKeys(new LinkedList<>()) + .uniques(new LinkedList<>()) + .primaryKey(new LinkedHashSet<>(Set.of(PrimaryKeyDto.builder() + .table(TABLE_5_BRIEF_DTO) + .column(TABLE_5_COLUMNS_DTO.get(0)) + .pkid(5L) + .build()))) + .build(); + + public final static Constraints TABLE_6_CONSTRAINTS = Constraints.builder() + .checks(new LinkedHashSet<>()) + .foreignKeys(new LinkedList<>(List.of())) + .uniques(new LinkedList<>()) + .primaryKey(new LinkedList<>(List.of(PrimaryKey.builder() + .table(TABLE_6) + .column(TABLE_6_COLUMNS.get(0)) + .pkid(6L) + .build()))) + .build(); + + public final static ConstraintsDto TABLE_6_CONSTRAINTS_DTO = ConstraintsDto.builder() + .checks(new LinkedHashSet<>()) + .foreignKeys(new LinkedList<>()) + .uniques(new LinkedList<>()) + .primaryKey(new LinkedHashSet<>(Set.of(PrimaryKeyDto.builder() + .table(TABLE_6_BRIEF_DTO) + .column(TABLE_6_COLUMNS_DTO.get(0)) + .pkid(6L) + .build()))) + .build(); + + public final static Constraints TABLE_7_CONSTRAINTS = Constraints.builder() + .checks(new LinkedHashSet<>()) + .foreignKeys(new LinkedList<>(List.of(ForeignKey.builder() + .name("fk_name_id") + .onDelete(ReferenceType.NO_ACTION) + .references(new LinkedList<>(List.of(ForeignKeyReference.builder() + .id(2L) + .column(TABLE_6_COLUMNS.get(0)) + .referencedColumn(TABLE_7_COLUMNS.get(0)) + .foreignKey(null) // set later + .build()))) + .table(TABLE_7) + .referencedTable(TABLE_6) + .onUpdate(ReferenceType.NO_ACTION) + .build(), + ForeignKey.builder() + .name("fk_zoo_id") + .onDelete(ReferenceType.NO_ACTION) + .references(new LinkedList<>(List.of(ForeignKeyReference.builder() + .id(3L) + .column(TABLE_5_COLUMNS.get(0)) + .referencedColumn(TABLE_7_COLUMNS.get(1)) + .foreignKey(null) // set later + .build()))) + .table(TABLE_7) + .referencedTable(TABLE_5) + .onUpdate(ReferenceType.NO_ACTION) + .build()))) + .uniques(new LinkedList<>()) + .primaryKey(new LinkedList<>(List.of(PrimaryKey.builder() + .table(TABLE_7) + .column(TABLE_7_COLUMNS.get(0)) + .pkid(7L) + .build()))) + .build(); + + public final static ConstraintsDto TABLE_7_CONSTRAINTS_DTO = ConstraintsDto.builder() + .checks(new LinkedHashSet<>()) + .foreignKeys(new LinkedList<>(List.of(ForeignKeyDto.builder() + .name("fk_name_id") + .onDelete(ReferenceTypeDto.NO_ACTION) + .references(new LinkedList<>(List.of(ForeignKeyReferenceDto.builder() + .id(2L) + .column(TABLE_6_COLUMNS_DTO.get(0)) + .referencedColumn(TABLE_7_COLUMNS_DTO.get(0)) + .foreignKey(null) // set later + .build()))) + .table(TABLE_7_DTO) + .referencedTable(TABLE_6_DTO) + .onUpdate(ReferenceTypeDto.NO_ACTION) + .build(), + ForeignKeyDto.builder() + .name("fk_zoo_id") + .onDelete(ReferenceTypeDto.NO_ACTION) + .references(new LinkedList<>(List.of(ForeignKeyReferenceDto.builder() + .id(3L) + .column(TABLE_5_COLUMNS_DTO.get(0)) + .referencedColumn(TABLE_7_COLUMNS_DTO.get(1)) + .foreignKey(null) // set later + .build()))) + .table(TABLE_7_DTO) + .referencedTable(TABLE_5_DTO) + .onUpdate(ReferenceTypeDto.NO_ACTION) + .build()))) + .uniques(new LinkedList<>()) + .primaryKey(new LinkedHashSet<>(Set.of(PrimaryKeyDto.builder() + .table(TABLE_7_BRIEF_DTO) + .column(TABLE_7_COLUMNS_DTO.get(0)) + .pkid(7L) + .build()))) + .build(); + + public final static Constraints TABLE_8_CONSTRAINTS = Constraints.builder() + .checks(new LinkedHashSet<>()) + .foreignKeys(new LinkedList<>()) + .uniques(new LinkedList<>()) + .primaryKey(new LinkedList<>(List.of(PrimaryKey.builder() + .table(TABLE_8) + .column(TABLE_8_COLUMNS.get(0)) + .pkid(8L) + .build()))) + .build(); + + public final static ConstraintsDto TABLE_8_CONSTRAINTS_DTO = ConstraintsDto.builder() + .checks(new LinkedHashSet<>()) + .foreignKeys(new LinkedList<>()) + .uniques(new LinkedList<>()) + .primaryKey(new LinkedHashSet<>(Set.of(PrimaryKeyDto.builder() + .table(TABLE_8_BRIEF_DTO) + .column(TABLE_8_COLUMNS_DTO.get(0)) + .pkid(8L) + .build()))) + .build(); + + public static void saveObservedMetrics(Map<String, String> observedMetrics) throws IOException { + final int keySize = observedMetrics.keySet().stream().max(Comparator.comparingInt(String::length)).get().length(); + final int valueSize = observedMetrics.values().stream().max(Comparator.comparingInt(String::length)).get().length(); + final StringBuilder content = new StringBuilder("| ") + .append(StringUtils.rightPad("**Metric**", Integer.max(keySize + 2, 16))) + .append(" | ") + .append(StringUtils.rightPad("**Description**", Integer.max(valueSize, 19))) + .append(" |\n") + .append("|-") + .append(StringUtils.leftPad("", Integer.max(keySize + 2, 16), "-")) + .append("-|-") + .append(StringUtils.leftPad("", Integer.max(valueSize, 19), "-")) + .append("-|\n"); + observedMetrics.forEach((key, value) -> content.append("| ") + .append(StringUtils.rightPad("`" + key + "`", Integer.max(keySize + 2, 16))) + .append(" | ") + .append(StringUtils.rightPad(value, Integer.max(valueSize, 19))) + .append(" |\n")); + FileUtils.writeStringToFile(new File("../metrics.md"), content.toString(), Charset.defaultCharset()); + } + } diff --git a/dbrepo-search-service/Pipfile b/dbrepo-search-service/Pipfile index a38e8cdd41..3daa275b49 100644 --- a/dbrepo-search-service/Pipfile +++ b/dbrepo-search-service/Pipfile @@ -18,7 +18,7 @@ jwt = "~=1.3" testcontainers-opensearch = "*" pytest = "*" rdflib = "*" -dbrepo = {path = "./lib/dbrepo-1.4.3.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.4.4.tar.gz"} gunicorn = "*" [dev-packages] diff --git a/dbrepo-search-service/Pipfile.lock b/dbrepo-search-service/Pipfile.lock index b2d114395b..1c60362635 100644 --- a/dbrepo-search-service/Pipfile.lock +++ b/dbrepo-search-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "433f88ce7dc4c6ef81f97d831edbf5a111df0974ba884fed63847c72925a28d9" + "sha256": "ece384cd1606901f3d2575f082692a5d5ce3164b4ba5187fc4b457757d3b0fce" }, "pipfile-spec": 6, "requires": { @@ -108,11 +108,11 @@ }, "annotated-types": { "hashes": [ - "sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43", - "sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d" + "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", + "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89" ], "markers": "python_version >= '3.8'", - "version": "==0.6.0" + "version": "==0.7.0" }, "attrs": { "hashes": [ @@ -340,18 +340,18 @@ }, "dbrepo": { "hashes": [ - "sha256:ea77f1bbd4fc79b56f59d5fbc55985de95be562c90da24d7b069ef629459c596" + "sha256:ceab260cf76c050e118ce0f0589fec66059396751e03f2ec41fa489cfacc4e7b" ], - "path": "./lib/dbrepo-1.4.3.tar.gz", - "version": "==1.4.3" + "path": "./lib/dbrepo-1.4.4.tar.gz", + "version": "==1.4.4" }, "docker": { "hashes": [ - "sha256:12ba681f2777a0ad28ffbcc846a69c31b4dfd9752b47eb425a274ee269c5e14b", - "sha256:323736fb92cd9418fc5e7133bc953e11a9da04f4483f828b527db553f1e7e5a3" + "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", + "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0" ], "markers": "python_version >= '3.8'", - "version": "==7.0.0" + "version": "==7.1.0" }, "flasgger": { "hashes": [ @@ -1031,11 +1031,11 @@ }, "pytest": { "hashes": [ - "sha256:1733f0620f6cda4095bbf0d9ff8022486e91892245bb9e7d5542c018f612f233", - "sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f" + "sha256:5046e5b46d8e4cac199c373041f26be56fdb81eb4e67dc11d4e10811fc3408fd", + "sha256:faccc5d332b8c3719f40283d0d44aa5cf101cec36f88cde9ed8f2bc0538612b1" ], "index": "pypi", - "version": "==8.2.0" + "version": "==8.2.1" }, "python-dateutil": { "hashes": [ @@ -1135,11 +1135,11 @@ }, "requests": { "hashes": [ - "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", - "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" + "sha256:dd951ff5ecf3e3b3aa26b40703ba77495dab41da839ae72ef3c8e5d8e2433289", + "sha256:fc06670dd0ed212426dfeb94fc1b983d917c4f9847c863f313c9dfaaffb7c23c" ], - "markers": "python_version >= '3.7'", - "version": "==2.31.0" + "markers": "python_version >= '3.8'", + "version": "==2.32.2" }, "rpds-py": { "hashes": [ @@ -1349,11 +1349,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", - "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" + "sha256:8cbcdc8606ebcb0d95453ad7dc5065e6237b6aa230a31e81d0f440c30fed5fd8", + "sha256:b349c66bea9016ac22978d800cfff206d5f9816951f12a7d0ec5578b0a819594" ], "markers": "python_version >= '3.8'", - "version": "==4.11.0" + "version": "==4.12.0" }, "tzdata": { "hashes": [ @@ -1555,61 +1555,61 @@ "develop": { "coverage": { "hashes": [ - "sha256:0646599e9b139988b63704d704af8e8df7fa4cbc4a1f33df69d97f36cb0a38de", - "sha256:0cdcbc320b14c3e5877ee79e649677cb7d89ef588852e9583e6b24c2e5072661", - "sha256:0d0a0f5e06881ecedfe6f3dd2f56dcb057b6dbeb3327fd32d4b12854df36bf26", - "sha256:1434e088b41594baa71188a17533083eabf5609e8e72f16ce8c186001e6b8c41", - "sha256:16db7f26000a07efcf6aea00316f6ac57e7d9a96501e990a36f40c965ec7a95d", - "sha256:1cc0fe9b0b3a8364093c53b0b4c0c2dd4bb23acbec4c9240b5f284095ccf7981", - "sha256:1fc81d5878cd6274ce971e0a3a18a8803c3fe25457165314271cf78e3aae3aa2", - "sha256:2ec92012fefebee89a6b9c79bc39051a6cb3891d562b9270ab10ecfdadbc0c34", - "sha256:39afcd3d4339329c5f58de48a52f6e4e50f6578dd6099961cf22228feb25f38f", - "sha256:4a7b0ceee8147444347da6a66be737c9d78f3353b0681715b668b72e79203e4a", - "sha256:4a9ca3f2fae0088c3c71d743d85404cec8df9be818a005ea065495bedc33da35", - "sha256:4bf0655ab60d754491004a5efd7f9cccefcc1081a74c9ef2da4735d6ee4a6223", - "sha256:4cc37def103a2725bc672f84bd939a6fe4522310503207aae4d56351644682f1", - "sha256:4fc84a37bfd98db31beae3c2748811a3fa72bf2007ff7902f68746d9757f3746", - "sha256:5037f8fcc2a95b1f0e80585bd9d1ec31068a9bcb157d9750a172836e98bc7a90", - "sha256:54de9ef3a9da981f7af93eafde4ede199e0846cd819eb27c88e2b712aae9708c", - "sha256:556cf1a7cbc8028cb60e1ff0be806be2eded2daf8129b8811c63e2b9a6c43bca", - "sha256:57e0204b5b745594e5bc14b9b50006da722827f0b8c776949f1135677e88d0b8", - "sha256:5a5740d1fb60ddf268a3811bcd353de34eb56dc24e8f52a7f05ee513b2d4f596", - "sha256:5c3721c2c9e4c4953a41a26c14f4cef64330392a6d2d675c8b1db3b645e31f0e", - "sha256:5fa567e99765fe98f4e7d7394ce623e794d7cabb170f2ca2ac5a4174437e90dd", - "sha256:5fd215c0c7d7aab005221608a3c2b46f58c0285a819565887ee0b718c052aa4e", - "sha256:6175d1a0559986c6ee3f7fccfc4a90ecd12ba0a383dcc2da30c2b9918d67d8a3", - "sha256:61c4bf1ba021817de12b813338c9be9f0ad5b1e781b9b340a6d29fc13e7c1b5e", - "sha256:6537e7c10cc47c595828b8a8be04c72144725c383c4702703ff4e42e44577312", - "sha256:68f962d9b72ce69ea8621f57551b2fa9c70509af757ee3b8105d4f51b92b41a7", - "sha256:7352b9161b33fd0b643ccd1f21f3a3908daaddf414f1c6cb9d3a2fd618bf2572", - "sha256:796a79f63eca8814ca3317a1ea443645c9ff0d18b188de470ed7ccd45ae79428", - "sha256:79afb6197e2f7f60c4824dd4b2d4c2ec5801ceb6ba9ce5d2c3080e5660d51a4f", - "sha256:7a588d39e0925f6a2bff87154752481273cdb1736270642aeb3635cb9b4cad07", - "sha256:8748731ad392d736cc9ccac03c9845b13bb07d020a33423fa5b3a36521ac6e4e", - "sha256:8fe7502616b67b234482c3ce276ff26f39ffe88adca2acf0261df4b8454668b4", - "sha256:9314d5678dcc665330df5b69c1e726a0e49b27df0461c08ca12674bcc19ef136", - "sha256:9735317685ba6ec7e3754798c8871c2f49aa5e687cc794a0b1d284b2389d1bd5", - "sha256:9981706d300c18d8b220995ad22627647be11a4276721c10911e0e9fa44c83e8", - "sha256:9e78295f4144f9dacfed4f92935fbe1780021247c2fabf73a819b17f0ccfff8d", - "sha256:b016ea6b959d3b9556cb401c55a37547135a587db0115635a443b2ce8f1c7228", - "sha256:b6cf3764c030e5338e7f61f95bd21147963cf6aa16e09d2f74f1fa52013c1206", - "sha256:beccf7b8a10b09c4ae543582c1319c6df47d78fd732f854ac68d518ee1fb97fa", - "sha256:c0884920835a033b78d1c73b6d3bbcda8161a900f38a488829a83982925f6c2e", - "sha256:c3e757949f268364b96ca894b4c342b41dc6f8f8b66c37878aacef5930db61be", - "sha256:ca498687ca46a62ae590253fba634a1fe9836bc56f626852fb2720f334c9e4e5", - "sha256:d1d0d98d95dd18fe29dc66808e1accf59f037d5716f86a501fc0256455219668", - "sha256:d21918e9ef11edf36764b93101e2ae8cc82aa5efdc7c5a4e9c6c35a48496d601", - "sha256:d7fed867ee50edf1a0b4a11e8e5d0895150e572af1cd6d315d557758bfa9c057", - "sha256:db66fc317a046556a96b453a58eced5024af4582a8dbdc0c23ca4dbc0d5b3146", - "sha256:dde0070c40ea8bb3641e811c1cfbf18e265d024deff6de52c5950677a8fb1e0f", - "sha256:df4e745a81c110e7446b1cc8131bf986157770fa405fe90e15e850aaf7619bc8", - "sha256:e2213def81a50519d7cc56ed643c9e93e0247f5bbe0d1247d15fa520814a7cd7", - "sha256:ef48e2707fb320c8f139424a596f5b69955a85b178f15af261bab871873bb987", - "sha256:f152cbf5b88aaeb836127d920dd0f5e7edff5a66f10c079157306c4343d86c19", - "sha256:fc0b4d8bfeabd25ea75e94632f5b6e047eef8adaed0c2161ada1e922e7f7cece" + "sha256:06d96b9b19bbe7f049c2be3c4f9e06737ec6d8ef8933c7c3a4c557ef07936e46", + "sha256:13017a63b0e499c59b5ba94a8542fb62864ba3016127d1e4ef30d354fc2b00e9", + "sha256:1acc2e2ef098a1d4bf535758085f508097316d738101a97c3f996bccba963ea5", + "sha256:1aef719b6559b521ae913ddeb38f5048c6d1a3d366865e8b320270b7bc4693c2", + "sha256:1e4225990a87df898e40ca31c9e830c15c2c53b1d33df592bc8ef314d71f0281", + "sha256:1f11f98753800eb1ec872562a398081f6695f91cd01ce39819e36621003ec52a", + "sha256:1f29bf497d51a5077994b265e976d78b09d9d0dff6ca5763dbb4804534a5d380", + "sha256:1f96aa94739593ae0707eda9813ce363a0a0374a810ae0eced383340fc4a1f73", + "sha256:20e611fc36e1a0fc7bbf957ef9c635c8807d71fbe5643e51b2769b3cc0fb0b51", + "sha256:23f2f16958b16152b43a39a5ecf4705757ddd284b3b17a77da3a62aef9c057ef", + "sha256:24bb4c7859a3f757a116521d4d3a8a82befad56ea1bdacd17d6aafd113b0071e", + "sha256:26716a1118c6ce2188283b4b60a898c3be29b480acbd0a91446ced4fe4e780d8", + "sha256:29da75ce20cb0a26d60e22658dd3230713c6c05a3465dd8ad040ffc991aea318", + "sha256:2b144d142ec9987276aeff1326edbc0df8ba4afbd7232f0ca10ad57a115e95b6", + "sha256:2c79f058e7bec26b5295d53b8c39ecb623448c74ccc8378631f5cb5c16a7e02c", + "sha256:3bb5b92a0ab3d22dfdbfe845e2fef92717b067bdf41a5b68c7e3e857c0cff1a4", + "sha256:3d3f7744b8a8079d69af69d512e5abed4fb473057625588ce126088e50d05493", + "sha256:3d9c62cff2ffb4c2a95328488fd7aa96a7a4b34873150650fe76b19c08c9c792", + "sha256:3e12536446ad4527ac8ed91d8a607813085683bcce27af69e3b31cd72b3c5960", + "sha256:40dbb8e7727560fe8ab65efcddfec1ae25f30ef02e2f2e5d78cfb52a66781ec5", + "sha256:431a3917e32223fcdb90b79fe60185864a9109631ebc05f6c5aa03781a00b513", + "sha256:448ec61ea9ea7916d5579939362509145caaecf03161f6f13e366aebb692a631", + "sha256:482df956b055d3009d10fce81af6ffab28215d7ed6ad4a15e5c8e67cb7c5251c", + "sha256:4a00bd5ba8f1a4114720bef283cf31583d6cb1c510ce890a6da6c4268f0070b7", + "sha256:51b6cee539168a912b4b3b040e4042b9e2c9a7ad9c8546c09e4eaeff3eacba6b", + "sha256:554c7327bf0fd688050348e22db7c8e163fb7219f3ecdd4732d7ed606b417263", + "sha256:5662bf0f6fb6757f5c2d6279c541a5af55a39772c2362ed0920b27e3ce0e21f7", + "sha256:5997d418c219dcd4dcba64e50671cca849aaf0dac3d7a2eeeb7d651a5bd735b8", + "sha256:59a75e6aa5c25b50b5a1499f9718f2edff54257f545718c4fb100f48d570ead4", + "sha256:60b66b0363c5a2a79fba3d1cd7430c25bbd92c923d031cae906bdcb6e054d9a2", + "sha256:6e34680049eecb30b6498784c9637c1c74277dcb1db75649a152f8004fbd6646", + "sha256:74eeaa13e8200ad72fca9c5f37395fb310915cec6f1682b21375e84fd9770e84", + "sha256:7c5c5b7ae2763533152880d5b5b451acbc1089ade2336b710a24b2b0f5239d20", + "sha256:829fb55ad437d757c70d5b1c51cfda9377f31506a0a3f3ac282bc6a387d6a5f1", + "sha256:878243e1206828908a6b4a9ca7b1aa8bee9eb129bf7186fc381d2646f4524ce9", + "sha256:8809c0ea0e8454f756e3bd5c36d04dddf222989216788a25bfd6724bfcee342c", + "sha256:8941e35a0e991a7a20a1fa3e3182f82abe357211f2c335a9e6007067c3392fcf", + "sha256:894b1acded706f1407a662d08e026bfd0ff1e59e9bd32062fea9d862564cfb65", + "sha256:900532713115ac58bc3491b9d2b52704a05ed408ba0918d57fd72c94bc47fba1", + "sha256:976cd92d9420e6e2aa6ce6a9d61f2b490e07cb468968adf371546b33b829284b", + "sha256:97de509043d3f0f2b2cd171bdccf408f175c7f7a99d36d566b1ae4dd84107985", + "sha256:9a42970ce74c88bdf144df11c52c5cf4ad610d860de87c0883385a1c9d9fa4ab", + "sha256:9e41c94035e5cdb362beed681b58a707e8dc29ea446ea1713d92afeded9d1ddd", + "sha256:9f805481d5eff2a96bac4da1570ef662bf970f9a16580dc2c169c8c3183fa02b", + "sha256:a35c97af60a5492e9e89f8b7153fe24eadfd61cb3a2fb600df1a25b5dab34b7e", + "sha256:a7c6574225f34ce45466f04751d957b5c5e6b69fca9351db017c9249786172ce", + "sha256:c7ebf2a37e4f5fea3c1a11e1f47cea7d75d0f2d8ef69635ddbd5c927083211fc", + "sha256:d0305e02e40c7cfea5d08d6368576537a74c0eea62b77633179748d3519d6705", + "sha256:e1046aab24c48c694f0793f669ac49ea68acde6a0798ac5388abe0a5615b5ec8", + "sha256:e5d22eba19273b2069e4efeff88c897a26bdc64633cbe0357a198f92dca94268", + "sha256:ec27e93bbf5976f0465e8936f02eb5add99bbe4e4e7b233607e4d7622912d68d", + "sha256:fe76d6dee5e4febefa83998b17926df3a04e5089e3d2b1688c74a9157798d7a2" ], "index": "pypi", - "version": "==7.5.1" + "version": "==7.5.2" }, "iniconfig": { "hashes": [ @@ -1637,11 +1637,11 @@ }, "pytest": { "hashes": [ - "sha256:1733f0620f6cda4095bbf0d9ff8022486e91892245bb9e7d5542c018f612f233", - "sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f" + "sha256:5046e5b46d8e4cac199c373041f26be56fdb81eb4e67dc11d4e10811fc3408fd", + "sha256:faccc5d332b8c3719f40283d0d44aa5cf101cec36f88cde9ed8f2bc0538612b1" ], "index": "pypi", - "version": "==8.2.0" + "version": "==8.2.1" } } } diff --git a/dbrepo-search-service/app.py b/dbrepo-search-service/app.py index 41144c6913..be4481cf08 100644 --- a/dbrepo-search-service/app.py +++ b/dbrepo-search-service/app.py @@ -217,6 +217,7 @@ def health(): @app.route("/api/search/<string:index>", methods=["GET"], endpoint="search_get_index") +@metrics.gauge(name='dbrepo_search_index_list', description='Time needed to list search index') @swag_from("os-yml/get_index.yml") def get_index(index: str): """ @@ -239,6 +240,7 @@ def get_index(index: str): @app.route("/api/search/<string:type>/fields", methods=["GET"], endpoint="search_get_index_fields") +@metrics.gauge(name='dbrepo_search_type_list', description='Time needed to list search types') @swag_from("os-yml/get_fields.yml") def get_fields(type: str): """ @@ -256,6 +258,7 @@ def get_fields(type: str): @app.route("/api/search", methods=["GET"], endpoint="search_fuzzy_search") +@metrics.gauge(name='dbrepo_search_fuzzy', description='Time needed to search fuzzy') @swag_from("os-yml/get_fuzzy_search.yml") def get_fuzzy_search(): """ @@ -274,6 +277,7 @@ def get_fuzzy_search(): @app.route("/api/search/<string:type>", methods=["POST"], endpoint="search_post_general_search") +@metrics.gauge(name='dbrepo_search_type', description='Time needed to search by type') @swag_from("os-yml/post_general_search.yml") def post_general_search(type): """ @@ -353,6 +357,8 @@ def post_general_search(type): @app.route("/api/search/database/<int:database_id>", methods=["PUT"], endpoint="database_put_database") +@metrics.gauge(name='dbrepo_search_update_database', + description='Time needed to update a database in the search database') @auth.login_required(role=['admin']) @swag_from("os-yml/update_database.yml") def update_database(database_id: int): @@ -376,6 +382,8 @@ def update_database(database_id: int): @app.route("/api/search/database/<int:database_id>", methods=["DELETE"], endpoint="database_delete_database") +@metrics.gauge(name='dbrepo_search_delete_database', + description='Time needed to delete a database in the search database') @auth.login_required(role=['admin']) @swag_from("os-yml/delete_database.yml") def delete_database(database_id: int): diff --git a/dbrepo-search-service/lib/dbrepo-1.4.3-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.4.3-py3-none-any.whl index bb0ce570729cffddbd0f77eb818fd40eb0a56195..2e19eddac149ac401c67a52ba56577132e32869a 100644 GIT binary patch delta 20837 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ʑd)B&FX?zRWxEZP)tee<<Hn5*~)wt}#8%sue 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%0D@+}nRxkHqa2I;Ik5NNgFEn=@ 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 HX&?ar33Q77 delta 20877 zcmaEOnQ`i6M)3e|W)=|!1_lm>sx7?{|1StBY-DC&sF^4(SD$~|OyJ+Uct;5h9Y((H zvIusT3k=7<ZDUyZ*6L&%BP&ak)$JIKAXUxnKfkMLo?H}iEc=Jz!v6EN-w*9xoDs;i zGSJWDq(mUsm5yslh4-d@>D*HNwMOj!a+dt>J~Dh$<lPqU6=6M9F67nd=~=jrHOruw z)8+7?2&rDTa}u*e<4@IFE<W(}E5}Szx&FKV+m$QQSFpWrb(yKr)pfZiBbm2$>93A0 z2leu{9aET9`)7;e=Ciu5dTt#sm}S`JrR2#dwZuvCVFtTLqg#t+qn-6)buWPr!c&{X zuf6K@@G9fEBEo2wz|KBzdebcD^jkAx^RB%t+InM6emK9xUu`XSJwFB2`m+Zur*p2` zvc@R)&-XbidgnQFL>*IR-&K~Cp?*~O#21Yz`_=_tIhO4zvDVv{Rh?%s>l@FbJXtZX zV>BnI&pK$~kbc=@!RAE@ch}3;Rm(3hnD@GC!-Vv+7g_o5f19(aXZf8a84j1bY`NlB zn|%EkdZI?cU0E(`Yw9)c6+4xuESUPB{=xjKH#eHkE4j#iSnfr6BM+Zd{9fkrNr&Z@ zYCa8Fp1Gvq?Q*|6(Tvm8|60%6v&NL?S!#;LmXo&yN;S?g=!lf|tg9=Z{n~inOywU8 zzs}`2x(Rc}YXwC4CgoUt;PX4MNUUu4uVmTypmi$ACErh<fBmjw(ao3-wze*54@6wl zC!5y`2F_f@dW36lXU>L?S9gCeJFk<h`y-)Ve1V9i#GRC`JCT<@=}j~5uV?%8NO!V? zf@_kRPMDSW)OUL}A8pvX+MH8_%Ut>JF=^kNi_4e2xV-<`cm890+W9{3_*l`HzWH92 zjo96f7yh2Es=uEnFPC1vRo-wBSK&hT>o#AG>Tmb9`&z&Ae93_;=O?o-`TJ*!Xzj^~ z$A3R9GyT28gfr`5v(9$bdc&iefB&w(cDpq(^I@Sm*Qu=IE3B?fW;nS0jmM9L?>1{r zT4v`HyVU=~9gjEO)1R1JZrql|J}-9mEU_t<H~6bMvR5(HnO(H?+PY_BYtPzW9SdZI zZ%&>%^LVdwT6^~Au$%Q)eV(36wVrzZO<o`W#=R9fcZ`2A->`~XeCM+q&*kb&;qR=? z&(p)rpKm@9S8tTFeq}Y|<izbUdG`-|%GRk|sS<y7mgkAH;Y_CU^*XuF2tVLeo^syW z@rw4#@Y_{)Uy0V;F?9)7c^iAj<m=_To>yXLEYHwtV>XV8n`?UL1$%_;9^cE`@^3YH z-|}6bEtLPiKJ#YhAIpvNcU!FQ3Ua-7-AL`!x0oxncic*qXW19ZoMAjSBOu|<e?HXw zoDxxJU@XtTuv~TWC1&0Fva;7PM{j?+ac*9|vFEX}w0Bywi!Lgq6gy9pn$)%U^RxZ( zyFU6giD(9z%=HNE{K;f8tM}Mt-UW;-n=9v}`0etU&-%t_T6khjwY1Cj^G9l(>f$Gu zc+dBpT=DG8^nK!~2ai0=Uq7w5=uP$K9u*zOZ64~04vTWm{5#Ro{e?xoz^Xp(N%hK# z%2%oPP9K>)G5yWj`pFY2ZR*VVlh4~5zIbuI=g2)9iQkbrm;P2iRQ+kA_*thzIr0sw z=kqVq<{YuJ^qyoPY56{AlFO8do6j@;P5bvD=Naq5k55YHNPhoc@$AC=(-u29Yv#NB zd3iq0qIa_7N7r>W597sDBID8umAd}VOsSve-&*K&bJ0r=lSnQ(yYvH*6+4&or@L)D z-u<S}VQIyO(nrn#eifhJ+}!N>VyR|L{xOyE7Rm45zI}LqRrcaNOC7_fcV-^hd{fEk z(8aaI@+swfx~DAvzHH*Uy3=C!o}#|{^ZMsLHdtcHCF(KLXKtssrTGz0&u0~hQr7dC z&MRJAUa!!(SW@J`jek#68_R_!l{}g7@vX$<$tUI?XY_4Kb!5E0rQ!AF>&x@+&)L6E z%91<IekaR&z4Ll;^8ahxJX0rc{Jj4o)65S0i7K2mhrC(tsfTQe+%zL#;cK1K`ImoA zk?EVC_)qza!c3c_rpG}O`j4NJ4l&l3v0k3?O4n&t(R;nq_0Qbd*|*2Jz1#b=_?P7T zCeE9eUv}l6z9`ynx~poP<=QpBEj||SJo0!_jOI)op{PswA;kfowmkL8Or0p`<!Dl+ z&XXsk9~t!Xf>vLWmhdE&%c^RhTJEvlywth;oKc+0xvQ&BH=jNo9wGKeP32^h<_ZDN zxr({1$<O6Z#VlD6q{&&o{QTtyW=i`e7R3w8uGKX%`w|+;u-5DN(zS+4Kb$-bzB_Sh zes?<YP_57TqfGpdlvgqF?12+v<M|uUPW+?t^YmxK4dI^-OuBk(rRvPyeD6(n!eatE z-&&vlFFaZP<P({j$G59gyXt!y$#hi7z3E>mv`1;ahlR+=bMgCYHpfq`oLJuyVq3Rj z{`X_v&77^<G7GF(622Ife`sGg-EUKZ+qdB7{LTU=|9w9E{-G61*PDa$AJ(~Dy0Uxe zOEzWp`#YQ7y}arF{$HA4x86b>#d~L#isjEqtJ`xzq}GN+B6X=^ec(}#_R9T{6Q zekxV=b-66((qdZ0#&xDB#ARuCU}bepedW*Fv%7=6TvftDnldYoo!&gTTs*zGR^4Nx z?QAWj$^@y<qm3$0f{wEHN_%LvJn|6rEnB#C^Y0_G&#&}Kv@X_AxqsB>>B^o-6XF#M zmb#z&t$62My};SVeGyG-i*MeQ{aDlW!o5%4XVWJ&=dbxr>lhEEY_2@{p?_u9Pm$=! z89MdJ56xv>3Wc-CzPfGU9IUuvOQT?Wl<eldpWU^=ah>8zj-=gazr1()70HDKo{Y1* zcxFvZc;lgHly=~`qthSTrBWetzRX_M%<lYpzs-f`@ocSZuP4uD&0WPDsLcQ7(dh*@ zwz&qa(RVu+;1O2+G-~>C<*eV0u}@ZPv|8owd*vnb?)nwK7#f%I&pP+a>$z6g{)&~8 z`Twj^kh$_e?b1OW4Y@s+I1l*;lpMWU;Wqcqhg<Pyo?ZX%^Ee~pl=1pCO}tm0HXXZ` z9CULBd-K2P6VtA@mA^22|NMu)$2Je8t51F$ouIkk^gjiw9bfKqnBF(NedolJ>iQ$K z;^C`rWGz;#Q_!D&I<TIp=k$NBgrb}CCz_c4aIX!$tiQ=%chkhF_k+%^XnD+9CTk(# zuX!WpylsQ$EP=ua|3XFeYm9zuv~zz|F{Aqx^N*r^k5jw24v78e(^*-3(njT7{NeuJ z%cC|vxTd7pVDc)>sceaVzVSc3BkG#pdP|agUTk@|cggy|?Ul<;%g>R{um3cWX@Np! zk;$R3jWc{!TsDj?xNrG?@8+kb@1N{iRd3xQrNi)s@ol4=!9h8N)$FqlZGO%oW8+z* zBgeN?Bc?L+%&E!QYpb;O-MA{G`mp+M+8m$e6Y_i-#^=h<J)HRVZh7-x{<gWoC8m?z z=JOmaF5!r~ac1T<)uk^MoRQEDy{cVXKV|a01s8f;GQG0jzfZ~+TX2m_xAfmsXU)Bz z?x{U^=eTfFb87G$ZC%D-u1PnyF6451>mccJd4|*%8LM}Z6EAoK8^q1I^g5z+g691H z+rlTzzIkw=++EWYkEu7}STn!LxjEY1IQq@}&6V~DzpSYe0S#`gnp|%^PBVB-6k|{9 zn^RmrOO?&xNFaMg{P!#Wudpd(M0z^dRjR%XvanopG0=={mPAD6i`Jk{uj`W!e~=SB zInO2Wuv^!fEzA#7yT4R9NwUTM|L5v=J3p!3^X2I;mc^^DwwYC#g*4rlzpT$)(>3?{ zXVs@#QcSLEwKkfHK1ti6nX!8fTi+FP=Hpi+ZreTSuD=lW%k<obv-c0miC<}%&9Y+; zUrnk&!)vbGgFI_K<u&`?_`dvmWBko~R>3lk=VUH9N13p1dUd>ov)!R-mR0$O15dv! zU4M)H>an{{3kxiLS8IIt*Z-GtxFWc#Y--9?!5@8-E@VA5JGIJl8|&5i0rxw$9iH>; z^u*Z{EuD;uICw;7*Xur3UsV`f{n^6t)dK_9CvuwNwu;3e0f(%=N2S<3f6m%^S9+Eb zSDiR>nv`Vmi~y_8l}0~v{!}aQ$F0-b{@JWI)TQ=t(&TMC&z>*o;GK2Keu>GS)QL@& zi}W21epGwWQ?z&CGlPBVb+H~FZys1S`N);)JHJcxX71_G5&2}yU*%gr<>S3+s&kI7 zWOFmE@=B6v%QWSv*I;?8CGNFip0-}a;=+&r|IS)azJv2cV)q?}pLH7)=daYVWEb~J zP*{3v;WDdcT}M4<eVrdC48Qojin+V!|KV2`#ib)Ee{wA@KD%CxyS;wn#tHd~rKi-- zZ)Mxk`PT4-`4-dmb03~Odh_Gen=ADO7Czyp?&!YgSI-QaVOijG{@az=m+FEVUhGI> zYy9^pMMy%JSG#6+`H9S^^ZSFh@z}dI7|h7d3;bZV`?Hby-fr=Q{bsD)AGpIjg_(kq zPFB3!w$n&={iG@LO1*yfJuC{1bDmdK_LlXpibT^~wgee(&BDajCii0I%$Yy!$-6r% z>W!A|GVGB3edBX$-nA`-)#7P}Qa3EGF<dz3*;?{+YS!d+I}D_jtd6}d-FD`GKzq!e z{p)W2`8V+w*R_ueUdgRVGwGkBa41Oj*Z-y~rV{?g{iN@A9W~!}-hSQxweA<#JPJ-X zR0~&U2;^q)?=NpVuCAV*ug&wwl(k!O<1E*j;B=RIrwCmK-7_rTo(uX&q(_)D*jRtq zQe;uo{;S~^yT;mY8}2i`4PQ|d(bxUI{%(Nwmru7DV?G|$J(QQ6na^0y`ciknh83FH z0@9BYc{fDJPpo3GFl#@~<1%exiM7qKcu_g-$XwA$_qqOR^QhK7y|HG>7wM+-%@5Yq zB(1$6RIpCtXTAIGCD&KJ=ufd+`0D>f#R&`NZ)04>u3k8$(lKO?mz|(~!G+SJOExVE zvfR98lI_1Qo1QFPzqzK>@>xvp7PH%HvX(B@O!u5%E%ix`*UsgB)3lT4SI%mj7FoJ{ zQ3_j?tnTL7A!~0K9lo`5mYmItq&IKxY*}-aPkqHp_El1wXV13kRjhYkHgy?8c2l0s zDh<mL+o$KlAFMhPxAKG0)yIohB`jV4Dv}{IQgH3Tm1}ypg?6aLyUYw);-JHR`uYjZ zC94<O>&#u}ka}>kZJ0dAqPrpWJBk7t`BLTN=5%+ff3vf9zxn>{cMtg;g`(Traz&$J zQ=>wcPM;Na?WmboL*3?z08uWr`b%HfC-KQ`;eWaIuZZdO(wgaOf+c%WJ+d!btk3%N z_GtA}sdlmVp#@GW)0SQTeAHLM=f<psQo8M~CnS2+J5JpR`Fi2nsw*Me<iyloh#lMM z^KCtkyr~9XcjkPyOncVM0^ydLy~_gy%*?j+iHPM`JrVYtw&&@=TNkD0SugRmTxMB6 zxq8Ka3$E#Iy@&Z<ocrOFkv_vOBmJs$rtssJb@P@)gdV7P%ReKhc+Wbw=Zk!Q&*)~m zop5W8=Kc(Y9ZxQ&ZhpM0XxFdaYsX?Lw|))SC}yzbWrsAshS1l`sS{>s1#5;))(g-q z5Pz{<N<;Nyd}45?`)0m?*Ty23zRl2h@w7*X`E9+>{bhaXQ@r;yKe*?#Va>L!j1{@* zo8GNCd48k3&-DGPwrymbu+BF76Nkeo_uaa=+fH-#TzX{Ac6Algt+}73a!K7^z3_(8 zHZd{QwTx>boWy5DnP&57OHY{iFEPSgqog5zzo|}DbC!#&O&q87m&nLJ+dJ&`D9=0i z&wJ^D<S(ZWAFcQ4N!y=Z+oOG=rb*v!N=d+tvVbeM&n74YpI4oKxyjSYv#HXqM=p^s z_`BfaH_XgFYqkhA=H7nMFzMLTJG$KRSC$@F-T3s_>?%uM#mC22vX^nKe*D-l_PfE{ z_@Xktt-X6X{w(+xpk4D(EWYc~w(D8%?A432clWA1nV-TWv^O!jzG`WbecK`PNMC<$ zX93IG%|TU15;=3u{hHCTtaV-4-nb+CG6ePhTVIl%u{t)tHivot=C>Yd!S{2Tc_Q|@ zJDr{K>#U1kpzLj~OrxJK@=998BW$-^s$snM`fB(4ijzEbZ&ts%CVT1OlG~E!8!a_e zW`v#fSXk=*G}iFx+?Uekhw|(1Mrs&Z&-=Jn>$fHURS66E@?CSTCS(^sU6U6zOJZ%A z<;S%PCyB}_%vQXrQ-AQ};lEoWntE;Rj?Vg0Tea-UZJD0ilk|%|C>*(Ud*?mh+{$3- zRkLE$#Z2PwSQ$oI_4Yb8otnAk%`CCPMK#*1f>mzlFS)Vxcj+zL;NC92lU2>JYw8!~ zFE=%wW}S2XDAV=Ki)vHFlyBOzKB?Qv{Y%?7^j+gJzMz|@4E#?9xS!Cq65C_^;#wQ; zrk864&+k65B5}3NlW%XWUip`o#cJo}?mm~f<<TGJwL!D_^m#QJtX6&cqv)(F;PAL_ zrTMnElRU+A0~9hBu<g0u=&BhZV^fg%?b>(tdfqp;zOv6O=@!ssaH-z7aH_z<vmSr> z+IN4*j(!qoS#jb+z_psi?(?*n^td8_Tz8b)vu0{$s*dopDy~AGU+M1{w(#b!emhep zBkq?AU)IX*|Mq?sFWUnCGMU}dtNpuI^klgI34@HBLc3*?P9M|W#H+V^_S&0go=Lde znkn<p+3#%qp39-kewo7DmzTEx>TP}&6_?KMHZRIe!|u@K;ufPFZ}Pt67`GU8Y_Tb8 zV_dw|flG-wzi_>#g~Q{cCp??~Pu||He@bVc{nj~WUG|HA+xB<5mDi>{@qOnMzMcBr zT({H3#~{2T<458bM}duhT^ApHbL@s}i0stwiyS&SulRA?i>yB>Blfc40^?_c1;)Wo z4B9vpn9Lk~=Wc%!;UCEv_9-HJ={!^QHKiOf54YIX>d&q{U)ICAEJ&<be#cX*_q~s! z9X5Bd+XVV**sp5|lxp7F`R8E)g9_W4kMG`xFJsxod~MxV)$_e>0Y%TXa|<0<TaFei zx#j!3_4nn)Oir1K$9?|SKNPt2y2XmCbN-=49}I)vPddEr(yX>^3sqZXHD^2u+$U%J zOY67?`?E_yk9Jj8Wu)BdHeR`H+A)<+vz}dQJZ!2Nzxk)&6o&_8I(kq19_mVk+Rcr* zzACTM%X<2n^0v^`vZmAA>?WUN@=VN~ny<Xi`1IQusmt_Nn`NGoy{=nad~-?tj*t8~ zCY&aD46<SqH{N`*Y$AvMu_M8HOOmeZho&uLdHVHSVMWaGM)O{|3O*}!*`0hpmCXBZ zoJ;gDE-YT)7!!H8`C{gFQ|W7Wx)YxsetAaQP4m2_HRpGojB`8Q?_>RK;K;LIAV+8G z^C{n@6QuXGhq2f77+GI>^)T^VPG(29b^UIx;@KNTgV)XoJLbCn&8u6lr_525yx%uB zJijhU$$U+|!R+G-@BXg6dB6Ah7M<!vJPSF*|3w!k=2R<hYxh0N8oYL11P`~dtVHjm zAoIAw?1i^4?a<9u%YIPd#qiB2W5b^mt-niNtonKDzIfp@>y=u6CC;ortk4uHv&Q}O zJpYBk^+mo)zYIk#gvlozt-Bz<DSgr0Jq9^G{1ThfqEZhAY}>Fg{1+!HS1ikiH%A0- z`X5}A`L$;v|Cityy+Qdp>?M-N%O9V-|Lfx29oqJxzKs_jMZB9L)O^poP<B;^mE+mK z?rzC<hm)^;op<MAiAct(bN4Ql@+QY^xX=IRp>sywge6V&PI20eT|1bq3?@14=~%jY z!Q{)Ajf^I&Y4Y-0`Z?sm)~$#A(>~{Lp5o#B{;f-W>CCA4%V#HEF?<^rlzINgh4!s; zCUd9%h!*(yv3A$~;-sk3q$eLgzsV`BW7=zBe%I75F#MXkwbVU}oVufdpI=+~u)k53 zQx)q_{9w?d{^o+|$Cvf9eil8w+VQZv`@ebo!?guRL#JPAX-#oceLL&I#XSOSl5=J> z${*VHv7AlIM4w%H|FuoA%)Glk_|CSPf9Be^BR_SFF1LQp)Zcn@forLN`#z_MOE;gF zlzAZ)r+2yM%&Sn}2a`LeuUO?6l5VlFb9Ri*N>%fli|=punb|%^_j%FOs&n<Pbt{gx zREZa5rB0pC*|~nRg-LA!+qp>`Y@a)1w>3;nPSN$a{>Aa&;wSOXSr+JW8pjl#VoGY% z<VwzXwe;`z4+q$vHZJt&`uAenp97^eL1DsaIfkp{Cn+3Rddo6!JNKkzN3JvXES_Pz zbbkE9o|RfI%V${?bc*{H<hZAqbIY=AuMeDaV8aEG_#HV+>lX1W6!@7xG3n^5shg%N zp3{kcxcWx&%r2=UzDfTLLPV?O_OMLOJJ!5#@0Fc@94p0VB^{h0ew6L}cB_sT_ouzv z<~BoAY2UKU+cQf)RXA6*%q@x7E4ln2x7YDKxpB`lU#+#7!L`=lRgUd{fx6c}J5+p% zi*2N2>u26GYD|41$>*}}poh>6`KOmoOtZTXuzdno)RhL);@8$0tN+->tnv>G&T4yn zTJ)F0t;W)DwzcNATQBNW?AmxEOyyU9udI1ub;#?y%f;ERoNw-!IqP)ij}yJcCwoQm zXUzVgyDccXEXHn9YV7=_XCD5rj?BAxeTMo$9yK40&40`4)%Jx7`^=r$f9pqoSp2yb zv9^d!o6r3$+qn50>+3y-_Ao`+3Z7oI@X@&yb;)j1c}tw)emy+6B<KEwOSy;jQvG&2 zK7DcM+k~Tj$p#;9Sk7#DfAZG$n~Q~{4+&{_zRhU~7VKZ}-RKq1X6>DMm5ZCU1{y7Y zC!1%hm7uV`v6jI_+W$^{SYF+u{7OaLg$nkH36ljj2=3_1TwAcAJnM2HTiM@3w%lh| zB^VSQ`Lk<d!p=uCL>5{U9Nl^;EzZnw#}S98Kji$SHj8~=Ilt!p=PNntA5%^J;}U$2 z^XMn*o^Sm>FK&sXeZvCz$+co>yR4rq{OV!MeRtZK)_wVD%Ef`VT|V@h%&+h0e8HcV zeAeN|x$wqY{q4uK%@YGAoCy(C+!-trmoMB_$FR0_X5V-1T;UAelIS~Kjtke6-TQv+ z+Kf%{y;GN6Rqs39x<t5eNyT}^KP&asbtTu_)cyA6e$x4`Vr5PT?>nBXZ$0yl`Op8S z{S%JYHvHc&!FnZP^G-QwDeY!^zMk--^`4xzALH4-ou4>o7yqYCC(As`k9;=2yL57Y zPN0eODI16BDlca^eJJ=~f8PIw*IwP;oVU}`-%U$jck9fKKJI`Umg^=qzB{kxb@iIh zravdl)*hYNv3$q!*vocT!<(-Z{g+tQ+0T2OwQSeDUU&WS$F`L$8^a2Mv(~q-2q={} zVz{iK{_Jn<Z;i)IWSdes`HJik)c&k4cyilaOKsu4cVFvHMW$M%&vle_ewxQ`ykwf8 zV`-b@wW8}sdzdzE+jeLLyY#cbm&!SP?oxeMnnX7`+vHy?^tE~DJ~#j2moJYTSn9&~ z%BnbhZNDE+@jb#RT(&!*{KJ9On?2v}e7H}{XLftQZoT?H*KbaI|5oAYtn|BL1<STq zOH4PsbGPlaG-J(6j%vw|WryRfT5A8gRPxOfaC&c;aARiUT*(*LcuctLe;!+Nz^Qe$ zEw6UKv4ZlAI=446r5?H6n-zJS>x#|N#m6)DGe5o8SR~KK6sdpW$xDY+$-{SD7w52R zo$lDqGF6AKG3N0e?|MzASI?iV746-m#Iy86j?B^Thih|>7hB8BH+=W-%97LZaUU;q z-3fRn>&aowmOoL2p|pdmT<+`?OT~|udQMGZ5^w)J>F^(h<gaY{k9qfSgtu?HAn<7O zpD(^_7rHKgD$<(w%lziue>Z-vXPCC1P1w%soCd>t#=}1Ien&c1NZ;x{RR6PKfz}S= zi{@f3&a8W0pMIiL(DLZRi_KG?Z8lMJ57+;7<&Gamd_>FP^UXF3nU*h|kg@5?3eMS! zr>O_c^*CDAtQmcs_sY|alO82s+y3oDM*BoN>Hhaq8P<Ojj<x5Twcp@~xPU@mVo0FP zwzv1TU)J8UVq;+S>U+G~t1hjxy|pI4uYMxm98vGi+q@S~ie|L3UAy(Fu;7PycItEm zkGWau^Pl(d-udsi=!9Ba^tvTt%^eeyz6SA5OF8`EVXxo(oeJkWi_Wgei>!P;L;e1i z@-<5q=v)fs5U<;G{P5d7tF+d4%|G$?YgMRCMfanlho?VVckN(v#`?MJk>=eRlAZje zKkwgFtT#LRcfHH4cHJEbZ~L@GBi|nI+$_E;)_!fov*cY_Po*}o=C6&2&^GKo6&fx0 z=I)Wi)qHIEM?W5#ZNW8Nr^)#09`@69o8p%TZ!0b>TX*gmvq$Z>tbJVy|K=)hELPbk z=)P#)_l9?j*Zh7yVh@w8;lCl*b7IPkTkF#+Kc6!Rn{{koz1};AkNF1L7e&?-UOroz zxGOb#>hq;D=iXvi|F!A0aw)5^{XUB|_l|E3Dzd+oz46q)m+=9oKbe{tS8=YDoY4@n zZdJ8w_8Z%}Z|zy9onBtqqN}@RA@jNfQF;9x`g4u)ZqM`5h|&I*c3ARToumDc-}1lj z*(~PCn6=+ttn5M6z9l*JuD)juZWFLlxZAQ*lshMB!M^Q&z2PNq&pguFRmy86)Su4% zL3v(-=>zTzsV^381tv^4ip}EptYSX2z2|MTyvlT+x=TBs8gNeYmiauPYJNwA)H%O1 z53HH@F`uyQ*J$zC%X!g%dVtHB%_;%a!K-eaboUZsI(<~Hp=kR-)>d`1pn4Y5h{#9g zS2o_7)Oz~;?AwX%%WqoAiJd+=_1e?=?Q+|;X8zBx?oQn$9iuIF<A{P>)cM>sMrvu5 zVQW)8qatQqo@V>-^#|st<VXYF6>Zb=sya>!oliZa9aA`iHPU0p;{Wq>W3Np*aGF1K zVLzz%zC@(F@`KeTVf9oN{~NFQm8aEDlntofs}gr;#u|;2>MvC|3yfCw{95VtY2mSx zlY>`zFPU<6`j4<ng&Nyi!g@UZb=|$Dss3frZC1Y>dmn{QT9NqTX>e`6)=z`W-`A`O zT&0(AKYG@YFVi<$G(BGWD$v)1Bk;$peKSApPIy06qP5{dZeaiF?G+22c`eI%($}$e zo!X!J3=P+1NmKP=Oi!MO=1DvHnr-IRZ%jX*<}wSd>WuB=5y`*wcUg=?ufNgZc~&2` zFgk87Oj^1^{pz03ITrf2o{L(gRczMNy;{{Mu|InDjGPM|J|?e9J#OB8sud*u<hv__ z`|^AD1NG&?#p3t<e);K*S9wD-$KTejrrg~pO?AFq|6ITM{w&d1k>xXTBi>y7=)eBl ztf|ol4(-`>xjj2{KCAoZB_BUV9a$T3x=H1b%+y=6VlE{Ic5c6%>$uE8YL2J&lr5L~ zZ~mL<zO&UPXZ8NH&wkSmA6BhAbl*~QUrC!lRE1E=l_s^6T@B8>>K}8qb+j~jDqg?O z71tU6bw*1|jQV>{-g?vS*IC!kEG;oU+h1~X{zRjkb$eEAY&tga*jZ6=SO1G=?Ik3i z9lx5NHT9%#_v!yy;paugl{r7H+YzvDwzgiD=&{1<PwS_~Kkw=elv{V_PVL$vt`kqh z=Jn)oJdT=|xp(fhGS5f#*<}m)ufKKD)_qs-Rrr3hyXS`EfyQESyKggT*2iZxzx&(& zZE1p7N^EF>TtTX+q`~b&^L(ln^8Wq{8K<<^AEz06=iVd}?Qj3YJr|VSj=1`IS4xP< zzYqha+cnL-64~$X$Ij_rxn}Q8n<aPR_w1Cg%-8cf=kI>*=hN4pCw|_3{mZ8>XDbU0 zBrT0&`IdZ(n8zue=zIUjBO#ZK^^?Tnv(E83J$Y`EeZN!IH*WdMq;q|jvQpOl=Q{Aq zA@#=X8GT_4+coDbVdcH{fko@kgo?v|jdPDgb8-pXW8D@h%B<iv?bKohCp%4j4vqXB zNo?^yjdrGO3HtlwfwlU@@T=NqG`T(3%?e$&yL*+COUBZFru^N9%U(oZYk9Q%1#?#Y zf2Nf9wX#w_m3Z2x72ny))7Rd7@5*N1pPaA%*ZzF=^>g_0YZd=8U%omT?i#nvMnBA@ z@btkQs<zfQ7N*Sm_%%JETIE24#;PlaO6?f_F20&&$Mg67gUa4xCj2#5>#j_)lTf-k z+kJ+$S#0zla|<^!cK34!4jp=Mde+*_OH0ee?rp7Ci@MtNwtdl+jDJ#pnOHL3rY*iP z$^QBaCXpGZ9=97#NY=WYGx1TU6|3)N?ORgO4$`gLMUNf$wMJ*!)_0lFI$P`H8&%e| zo{vfvYudI_L*t3V78}P`Qx^(q&a4a(5stD6nJ+U#=y{$YTVlnEUpsX7JnY<URpTuz z*Y|JrC2mgBmGzsJ{Ak$uZfSC#*SZPp?><R-{V6$i(wy&|Y9d$UzbV>kYns_3XY0D@ zt&x*4a+Z#0mdyI~DC@fNO2KtIZdBc1e!SxFM=3ki^I418m%ma{j&+O3U|m;ysKGOJ z^WKPm@~BhqoviUcpD-~nc(O4th%qoQq$Cy9rxxVvhZf}IC#E>(WTxho=oM7<hU8}7 zHW2tXFTRkaOLmsUTefCan~d2dBD+*fUbbHpS!|K+?z7Ft(@%5p|JwAE`e&ouzPjd@ zf1mTN($7YFiIGCetWP#?3%5_*6{(pM_ABzckgBo4(mvMXcN}UTm+g(y7xT&9q2H3S zTf5q#{v~5?-TwUNU*-Dq4qB=NIqGa)bEfhP&r(MJJ8uq7`1<7&A2(<D=BrYA)65xT zI2c)jb)1{MoX-^9P|7el&@!#y0gr)wf$HZqOgAF#FbB`cWqqZXFoErw%;#7|%b5{6 zhi2-EU(B(K)ysSKT5*b0sGo-W_3x{1-u?6Fc+a6377g|DH*MiO!K`((Jj1xGW8;~v zfvGt!GS^?qz5mtfxY_On>9y+D7Wx(>oxT>bz?Lr|P(rU*jcG>GAuq>ifA<<5O|kKt zc~JeE%_4W1ik{@K4~3cB_I?(MU;8s&PS8l_NYpDXS^37GQR9)NdEk?5k&_>KH-2~Y z$Y)rbZ?@&Ki)q%?dREO@(NT*&*|zTYzS4GvIq9Vszs8?qZ_?`aO8hy$GsNk`+voki z^JYH#IQ5M1ykAQW^~}6r{c&a=@A-lS509)jF_4&Bzv|ket`~g!LVojXP1C$t>Aayl zQMlY{_n!ZDIS=nihuEe>dc=xmY@WRI<)+nKvRi)ftdwq!(!ZKqyZ(|>eaZeku`xc; zN2_FwoBOQY9nQwMI)@l+-hL(0D&yUaj3)uT(zkC)&G@QxQY&(q->!9yiBBuon5KNI zagAD@Wg@<HMm*;)(YmD>(mQT7oylcTOjc7!{y6Ws`#Ub*l|{CV*+m<DBdh-~Te8e+ z(0e?i!qZD|&u^n&dl&us&GmY|c0~R3TeTi`ni@7*^~bwbtA@>bpTu%@<^6qnIpO)W z*~R;JpVXM+bV)n-<Gt@@vp4=f;CAxni`S1|CTzA;jk8WywK~3Jr7K6|1R>kjdb0|P z`90_4@1Lk?zdecN-PMU@>%P_Ba*1!SxKe8Pnysw<s(#Hpi^E*6kG}pOtC=gccYlC4 z^W-aP;*)o(Meu1PEsogJD5g;=#K7<+XtKPzWPSGJ*%qIE|KSQ>7c_hA?UUC+zfE5K zjd|NlL+d)99Gjaerml$-a@ST`aHKu@^J{XHu0Vo;-?zf*@}CnnE(zOzb<(UhU!iu} z<2O?>rwJT?dGUjQdgl4wMHZ#OQtoeFWhp1rn3wK7klJIwx@Dotho>5yn*vH_|M@QZ z@7ZP#FK4BN^_Lzux<#{^FVy+F(A=IwEANBz`HsFv_6j}%?;pO{9q46in*PAZsJHge z!S=!}3vUa4wV3q#z|xD8RIc#85T6tidvlJO_uUT{e(!Yn`Ek|p|C-a{R?BaFxt_^9 z=6BxvmG`Tw&R$AUUJzIN{nOvCr$78!n!jJ>d%WLo{psuD^Y;DzSD*a<*V*Lv^Y^~D ztNHG%uNc!i@$gd>`_G;C<89+&V;iqkg}ul-*)h3h>gf-)@)C>c_PZ|*F?_!6=Z?*t zlP~!Gw(VnO+tg9FuJm2ZGmd+|_Lj=9UwEqO((#I8LkwrCT9l;6iD|P{EyY}v!UY1> zs!uY=TfgY=b1&t2$EM5=;CsSQe{j)v^ZK`zik{^g*Ede;oz1#Z*(dr^<D~h@0slS* z?l^rsrn|rY&ZY+q>qVyZzFt~b^vCi+!~N;5aw=1DqMq6*r}oyi)^YrjTX-`|<y6LA z3$LBa3*Ww2qFKy$(`td-tc^WYM|U`fT}<1vxo1|39&gvPM&*jW$y}RPH{Wk5bQZ3k z<~3#Kv7aFepGL|EHaxUA*SKRgFRunmpV$hEk1b4oeb4t4>CHYnO}~4V(ka~~OJ>bC z+IMK@^&ftcIj3XIR(;96Gl9*0t?~BmO^;alj#jfSc5FSSmv-xvrarTl%y#|1;qkYA z?Gn4&^Xo{lu=}H|D?6DcyA&Dtt!0^ZvADy+g}c6Q)+D{ys$Dk>w)=i#+o~2R^0C(~ zIZ$WKBoUjEcjqb|81QW}*fpj8UBWuC@1GjhoqrJPxO2Iq0DnZo-zEKjZu}`fw@6nY z_S8cE8PhK~M{yN=G~OP%KcZBsQjhmYoUeR;uFvO+wvWLQYeX)wR4Mxk?>ZNBD9dKK zby3pCI_C`+>tDu6xZjy`wyyQ<<cUirdfIL=VVaucs~mE=!1mB>r|G#;>-={f_g!qZ zI??>+GLFBYvk%8FtW;h1u(HK)<Da;X59J@s=>D{?;v>_)F1<+&&fgyS?)z4)=TjTo z6g%Ts$K;BG%(MSH^%g8{JXAGL`s)!6es#tNmAcOuZ|rVOoqg_4{av3kb$%N5Iv<Z# zOR@5Fmr8w?;556QH1)U9AA`DM-*0D1O!jnaX5M<4!Q|}<@5Zk}zD!X(?hXDisvfS3 z4{zKk@Tbb!e4;J?F{e_yot_u%H>4eVwD(2a<rBVrmL-M<9)2~vJ!`ML&ogGjDVJXC z;CobRm^6F;tt=JQ`N1-Qdn@bv4+Wf=H%mF&G<1UE$4oJ?4@DtoCoMjD=VVRU>NK{( zExOM-1x>wsM2gSc%+jhlTI>5w$JgON$D@mzmL^?tvdf;<eY}?Q;j`ioe1i7{FHf=N zY1%X)+OB<S(Sr#h%JPTrF|9A{j?Lb6wmM&}nAytQ@lDeGjD1o*J{Mme|MSOZL;ZD` zs5yc!)a2}a70Q(lPupN~L)3Pg>DlU|zFsG7Os8)%+&ew!apz)*;Jcfi@70Wb<Iz&D zsXl+lMKj^;Yy0%%6l#vH<TY5-{mhsrW9N-sjn~+s%P-toY<RCp((a*z#9i0P-ep&l z3=}5pkZ?Tq;IDN_buwo%Pc;99szYKc4!Ww=OBkFF{cPv(ntPVWiuDtJF{DH+=6S|- z$MCS>ft_x1m>=Zy&fz_F;g+WPM7<{62gSWLd=C4zM!ng7;npH;rumAWELq}go;>CI zai?8t&WVI3-3Mo!&!sh}I_bzWeClpu>9m=W!D00|Aiey3!y)6ovxz##rt!p`_$m=) zox|&B*I%!Be5ziz?t%x(t&$aWOXkSEc~BqN9j{lL!&usMB~>KA@c>IEr&l%e1nHJN zKUt&pCvv~p;Ank^;kxvbUu=JhoBvgE-@YqmzB~Fsad(a10XN25FZiC^*8cf~$u;g> z!#%l|GaFhJrdema-B`+fDKGF=^oCPnYmL}4%QfCgym&jI{vL?DCt<R~nYXX;7vIW$ zM}6xnrzJGrOlV>iTbyCYt)S@?rJ(DYse6Ijb#KH0Zr3=S2dzr_VgU=fnAVhcz5Xlq zEcdF7WN_fV_=Gp+GQU~>JT-qhalumCte1Rmw!8nn+sIQr<ssjTw-fI%*;qRI?_-`* z-75U#wsv;Yo9Zd`fBE*L_ungK7kV4G$T}kQ_u^Yeo_uT7ouKF-spg>XP$j(c;>ujX z9FYaRY6|fUpM0OBt=#6hKu+PS<_YmdHNg`ULjsvi1Q)3-dyua9>t@Kitd7rO7Ppns zgCD56#4THJS757k>k7f7D-jJ_IK8Y{*Ev6_V%y}d@ta4(C2Mc<_j;EXw#E;voYtj3 zuobL2FBIkDYOp|Daj#^CffMh!hN_k;x)T}~@qAvGaa3;Gfmw!8#eAQRYTTDul-YB! zgiop`u=#t#=LU=Sj{BHTmGe(vZ`sqhu~&-utbD-d?+bo1XZ_QS_$(Y%%y>n3$v%co zp(z=R6F8mp7$>cKERZo_A=~tNhq;PhRZpA?_@?S{I^dRSK!QgiXINs!R0#KnWbkhj zk0VzExz-%IpygdT#p!37gT7OhT1MxBY10%0gM|*>O4(sHo#CX2N(I03`;CoNT~~4= z>Q`EQYElcj(!x8-BT#so4gWLt*o>8jg@2T;`j$B%qgUwWf=&_B#KRG*>W?*?7x}rx zalYoO%WOA;r`%=ZUADqedWmn~EzyFxir2Lp&IlB-Mi?F0)O2EAVoE)O<h+13_6MIi zf7USA&7W|-d_iaWl_LTr&laA`Td?)uHR~DQdp_5(?yYg#yN8|2eaQzog?^5oj2bnL zT=ECD#cz6)v2xSdPi|5BA3JYbv16T6{qh~_PP(v}_&>RPD)afe9j7B(ywfA?I)e&l z`sd7I`&!a!#d>&!h3e<uYG<GCd8f<y@?$iA%EGF;Hy?#drzAOLOkc)+?f*yjX|gW+ zKAGAacocs1df}$O6Ay2a4?SP%5fpB+ZsvC7h1Gw*T=u`Nxc~63N0o=ZDt7X#cxop8 zuPB~d&*gW@{Yy}qKacoIzS0%f<&zV_HMtc<ryOqB;S~6Fj*7(dIk*00=yCm8tTg?` zznIq{=RRuxyp&OPDNwq<UM-&0-8}Ni{K}dQj1yidbKZ<x)3EJGnCP{Y8=|Wn6l&&M zL^|CLT6aG0k@cTvyYf`^4qo8BJ^77jvgwLv^{%qQuO`;NI8y8qd(39DRz$YXtLyRs z*XGVI|5k1H^^%u_J-hC#>Y|jXCzXXJw4GF6pj)vhzL_WKyso~x8(*H1)5d=?`hL;9 z+n2MeFA%&auMjR@ntP`~u>G@+S?{)V*UU+!P2HOmEEvP9drti<`Y})R(u&KQxeYqc z%)GYc>CuVqd@m)<>(46PVq2t9c%-DbW<k%oOoz+Kce$nKg`DpE{CrvZqSE>n_VDNP zr+uEUXD+>cky&oU7v-3jnp62S*v^S^T?zAVuUNX!UfJdC#kntRR7^@HFFqXJ8n%n^ z-D5V#KXdHOnOQ#__<EDmV~cOO?!7ZF#4j1W+1{I*aeKoF(d%4>EqSNvzj*GATFg=s z)Vx#mwJM+B-zkErSA}*JUwbm~_U+X(GmaD&n-w~}Fe^$~aLMMS8{eIY$<Mnc+k`Q< z?WkS+UB#y~`?v9FLzYR!w-pbR+{)CR(09i}e_lb}b6u6!$F9BPe7-Y#?sdf#Vf+@p zb|35Qf4u+J%*uJBcXvU{wG|(putnDAimzOF!hDKLPeWn00k_O5izk(3{|dySGUl(F z#mMJ3;n>pPzS~<x)w9E%{B)faXtP24!eNfvFV%A_HkvPNef=@{>yHa8Yh(H3w{m;t zp0=r#f3@Z9&%)bImW3<V%KJS06!@4^Uv=(`2i0cwH@3`E?|QY|ZGyVjyxWQme%Vty z9@Hxfg)UjNZ2Q^;Ej4O!WojmBmzHmxdOu<3tk30_qMT+(WN3O_UXXSD?5eyH`R{j= z-A@?wN%7D4y4ZKS)-&&E`CEVVEX|u`SbI#U>eS~~rj1F~PY(SEP!5sZlkqeBk(aZJ zCTr)qhYvp;`0#(ihwt2+|L-1r&=~#XlR<#p{Y7WJeCwy|*~0Z&d#8x$hedZn`l7s| zJOX9~@oCQSdY#8Bt7;uSE#>;^g?E(wwAO{{`*u!ewQ%H}{-t+c#bUNw){jn2SY#!2 zePZ72&!tCYdDhH7x!UWub!9`?bv>cHwON{~Y0@+7ixXeZn;`TuY~xlbnFl8_Y$p~e z)y_&k<Kpy9S!9K1z2qu)o<HKMn(t3+oY<)JUE7nhe)W~6uDNrq*}wYTb&@&fyq~?b z-gWx#$oE{G(o=8S>3-jErM%|Tl3kw`-D5VL{NzY!%v`%Er*^!R$eG&8_t#6&bjg+? z&sS9$SE}rm2b}KO{k*=ff93|+N!ych=Uow5wx_#VcvE2(>(hSG-C=I^Vu~*Fw)$QD zCnbD4<_yp6Dg)Wun^GfJ2s&7JycA|!v??rVg0s%%(x{#r+{xSKNNlszD!9=pZFu9T zsYr2kj+5>|o2Tr@#Lt%h@ji0ovy11QT?-alitv4~U$u<U%i@Rp)p;ks@rZ725aRgf zzO{a9ie&mH?W0-~8cik6rOv!NYh8V7vU2mWH}Ux{`hO1CWovrJK4^a<Exmc-m1{S8 zYnH0K4rA)te`E6$(YcS-zuMTo>A2jgSGq^+H9z=I+vMi==jf^VE8hs#Z)6uOjL&!^ z7x39WqW7cQxym}_thZ9W%O;8LUw?DWQsXTx$-E1kjwCssQs)hk)RJ#{C4TYrC&|-S z|JMIKGG~_Y?TJf`#G=#Mn`;iF99Mr}!o-^5=w4tr|K_!vrNxK(t4vOr<O#SGwJc^0 zS1z`UiD2e!-g9UTHxCz!!HU3Tb5dXW_}-R~+_WU)%_hxh@lRB)>?l_DKD9>XiCgG& zP80rTNttKUJDxi3E1sf!FfhGNIq<=cn#s;*&Xk+huaK-<$9zx!414yzRgd@hpAhcd zEWG1=Z)<GBPR~`xSRN+{>=bi8y5wrZ?!PluUz_#NXV27MVTv~n?J*R8ma`%<!O=`b z@lVR6*$V7T(oY`Gl6-zR^k}MEgu`M<p~fYOg)=hGne5%JrW()1Z*n1)li|YTgf%n% zCg|ui|28xKv}Hs6q}d<lT0br0GtE6G{%9>ja!}h`^+&vn<|`PYmCtQ7eR3h|>WQmw zcQ$UzXz@H-t}5HLdBHkI#)enI&cB2rKJ=zNxucUZad8CGqqXV()dIivB}JYK?_M~w zcz4g{Bg#_qxj(->6*a};$CQgM&lwmduu5oG%;2B)xpU?0{C#N~D;VnMpAT1PaOgE! z+qWiW!za<-8_QZOc53ratMQj@S}&dbamD%5_c=Bm|14-=*1COFXr<EiH79*7gxj9o z-WhZE(bbwmYdrRe%+oKrE#cErr?^5>zcu(qjq;<ghpV?)%A7x-%96&Qd{0kEPjSPx z_pb`x>~wJ~Xt!L-|1iK-Lq{cIU44gs@JY$@dWX+2-}nEKUzg{<@CENA`J=ZZ^TU_b zcycZ)bvUxgR5|md?3(q~i?`$#^*+kHtP#9+@edJ~P?I`~V0{(F^K&o0P;z?m==Sjg z5v!(GKbUn(a^|dn1<c{E9a(e!Eem9KVYs{CyVC5RqPM1BpB(IV;=91XwO(1jbY-3! z)PJ}p$9vf4u~f)TgS-POb&v9H=^PSOS77L`FrE;f*|cE0nr)r*<9R>Yf5*EkubjUo zXF>N~x8uRzXZUqHx__L??dV>ZG<W{K&2u#zE?m-x`nI`d;hHB|DQ@=s{kh>6C(m3I zyi;!CYQc8RY16tAyeuykt@H4IAtpLUw{y?BnV0X^D?e24-tH&O_;gL(*T*HHfu~>p zx&Nh=(cC*Z-CJqn2`{PqUtb!Gf^-)io72Xm_D9L-^mNUAyNW!Y)qYAm@iv4ZMQH^q zi}wo?i8CLsdc80am^lAsoJy(Q<NIOOrQZboKW>%bb^SPZ&LsD8ZB=V-g_w6Xvo8F7 zQ_}ooSMj7DJJ;4n7@ud}7GdPiv+cl>$^&dOf{flrPrm>4!m8S|#kw)`etkH$_*2+g zjZHzEH~%)vNad!-`t46&^2>DUjC{6>VPV?ao?V$eza{nu$D5k0O$py(4qmFf|7-8v zo3*#NCcSM?b)S97W6#Qey8pszEnhUrE@__Kwf<*Ef6d(Dm`^uv@4Q&Q?Uj?b&5V=# zCtlUxr})LXdb*9;UrReJ`;I_WR=4*qtU~-(Up{&nv;5`{!==v_nN_H+J{SL!ceCG; zqSM>gxW9eL7Qg%Jr2Drxm&HfP=`IXR)LT`0UTnI#>kXCjOD%nEG8E2MJUVgm!I$gb z*3Rz8cT>{7ys~49>yGZDKf9m2i20zZ8_S}d^lIzPsL*Xw_D6lv^}kUyx7P4WK4MVU zBX;uU%a-$*m<uMY+gxh1lwYu5(z*yU1;vh;VhjuyJsB9}Cx1+mntUgNqyDW;cJX7k zqWeF!)k-F*3QxGxKL682(Wpna_FR7LaY}l6p0^wmbCHt3fwK&YD#CxhfB9}EqXWZ~ zDSP*>3V9U}eNVOF<;$1fx%UZ3@>d*V-_Nl$RcQW(?T5|hdhZie*NM=as5bY}$=MI5 zA1<Hky6<k$R{O+s`*RNsci&5&t&;Y<sD9~#vgglJwAnP{5C8I=w)9tu$*s3#&XTVZ zr@dd&(SAq%Q;y2xfWo;e@0>4E{c<A5OsZ7P@<6cqo2J!1$KEtgh`KSGdE-+ftHisn zjQe%-Z?H4mN!@?@(%*-C@Bh1(?v}TDeo1^I+ZwAkORuXu{pV(|`;+Qxos|u3>utYP z%RP4xl=$}T>ude_u{~QhEqS!%twG@Hz?5y*7AMtCPW4r(-}Cljbo%C_MRvbGvc2EJ zRAZcyt~6!inFj(@H-7QO#ClKEyDTl|nxkED#%Mu^+LbV4IrcODj}AB_CN7HT%VGMr zN`;~BaPE3Gq3bL{M;zA`)tuXr#<)m{Y1^&Mtsi(dm~ZI!`t-G}_V^@$I*$tdkDu3e zY<~X1H-tIS-t)WHI`eu-@3M^nJOQi@Mz@XqnAHC}{l5NS>)JDBHpvZVq6!%V*1uHs zUal@6oGrIeGxw&0UjIaa60d_h`~zgm9P}!-v*|U8zhzu<flW2RW!a<?$uXSYl@~cz zRz&TYeVkF}^W?W?o!J6!nYK;7dF+5O2hYvlE`o8H>n^dVY<c3Q=uj$GU#`1FPd0G# zyf@MUC;c?|Z>(=P-7%%-?0(y6s%M@n*!+m&omJVYvE;_I;|YZU90L4ve@l0-I9?|0 zn8K*J=&$A5i*7q*C50QVO>U6f7@D8bCEzT{bTxQk&7DQxufDE-d3hV>g!2X~_zcdM zu*EpdV~jp{!14q`m1>g0B>l#(?7QnjKG^9Q?N_Uu{*^)OpLgl+(3Oq$9=q8kpKwHP zTvc<Gq0`->_ezJtoNVo_YOKmXO}*UT)P%K&H?;CEW4KZiJ^evQXMhIlgBO_|b9Noq z-R`N-$TDZkE<FvSZ;R)6upetU>Um6Q=hP0-6U}~ya@vztXC^0PF~k&`H85N|FjL&N zK7G2=&U2!B*>if22&cWv`Wmm0bawH_iu`ws(VsiM7=@e^llvttcX;KiF3uqF?3jad z4_umi;vbJ>dRq_6HER_I-mqSo1>07-wEA&GdiR-nNX!w;lNVTa_7#(>T+j7O9OrLL zSj(Z3e$%eD%SK+P^u9rq^$t&UrQe;CVpl0t<kVN6X=9QKy8Sr6l7a0#V~lOQ>p8p7 zH!IukF|yu$9u`u0IM4Dm&yyzC)=IM}t*(=99N5fLs~dPJF`oHqb91NrK3_&*1_nKz zE2kL_h)y;UZ8)i{Q99+#uj4CA)uz-i=-F_zwOqct%jMy{w_7${S?Or9rHDPcu-8do zawbQC{uQhG30}#`h2BZ#uO8$n|Ml&@$h0i|!RG@>8XpxrRRXdbTEhHiGW4mO`pXm$ z7PIPB40Bgpe8vQaM^f!)CwEK{oOXI^PvZ7vXH5Qj-`&^7{_JFO>8Geyi?&6~yKHt% zTZ>0Uy3A=w%)}##cVARQFLc?$Ufcb?bA$E-t0~(h9zEVCELG3R7TkJAT|FXvBl9Ek z2`;ZXRc!Q3m%rGQ<8wvJuryZN$DLb__2Ak=yKgKyz~3nMVN!|8hKVt<Nl6)=s~_%7 zZvU)xYWl)*Z-&+t@A^viG0jfvoz;EaBkH9~%eqj@TNC~SEAy=O=G^&LeQ%QK1?Trp z84KjrvItnS2-(X2*{dT}pLF+8&s`}WVSdp(R<UjlkvP={J~mITb-AnbTerSW=DPOj zMp5U&vaN>hQ(9cC(sqToJ(~P&UddM8*->|e|4p$l@;NQw!J=s6uy)5YrIstzb31bn zUtfH~@y$f;l1{s$Y~Os9&0f6pEeSueCiGc_ZrU4%Dy<mDT~2)upU+w(cdNeA``ewi z*YYQr%wyM8l(<+eX`GyGvB+=feD$4d$&8jSY-c5fx=sChAv9xW-^ubu4`u&O#<fDd zZkww)YaXu2;%>Y9+}BO_zUGNXCV!7EOq%*2WB+#3lpAalVmK#wbDU(Yl(X<D-M?&8 z_Q&TkPYj$){;>Q=J|ya6qLp<oPvSmb{Y`&~WlC1dS$D=PIVHA}Q*9037PY0iS+QT$ zm=-aGDXKUJv!yS3G2@X6$G%1`0n6n|%v{%wO8FFvyiqxpR4Byn(PR?9R?ny46_V}K zG1<0%(_e)UraDiKDe^+{vKKC99J|IWz&PFau-Ao`B43vzHqL&haW<TRc?DnB1UDIx zRrNcV(+w3{msy)#SoQ2_Zf3+oYmLgxgbPB)CiG^fzuC=|yx!8P`~UHnw+D+Rrmc7| zK`Tvf2}{dX&z#>nrY0*2WG|^R?0U%GwCIUdQ%Jh!A%VxK1!+o5+Y|qBPtyyWnV69{ zJtrw?akf$YS7GH&o_tv`8((D|eHB9v-a_Ww)vond`**PHn^7Lk$9qLBAyiMK%#Q8# zLeua`Yn)ab(Awn_a$;BhdZ`8T-WkiOZrmUzf5yZm%eBn)^lR={?53i8(y<3N`b?<l zSaUb4U8i_o&51O{Q@+aWR}(w~)49~rigE)UW%u=;<hb4Bx4z^^Z;YF26o1Et3LE>A zhWAYNJ0@AwcmMEvZsaWFl9W3~GT@5rGD+d9YrY4w&8V4e*|AM^x|+@YlxO#3uYb(< zo@n1-toVAN%XMe3@R|*?UI^_EYG3PJ9=QBtUIy2M+oh3@Z?W!Rv?+0lDPUZX^iO`v z>_z(RIeM!^Pbx0l^7QwmPuJEe-^hHKv_H)Hr^^(dHAg;3o1Lvc$T8U_=?HthdT+;* z4K+zlGnJ=Z(+&<(iU|(c?j(`PIhms<LioAG?5ZN2b1y#bTj;?zY0t6G3cu9kSqvvS zaG9*SDzbRu*T+{CIMnOI&wtow&!PNk#~Q62Gnx`-o=TAGDU}QM3DH<I;oeD!rx!xl zUnO;j&wAoCRlsao*)<oJ#QF!ey%XaPdUW!L+$;X+z4VInP3eRvbti5oR;8r}Dp!0= zEqM_6_S1zm>`adX)~o(F)SbTcSG3d&p)l^c<1x%}sVO;o8k${CuyLx2Jn;Sa!=o;l zG2~jwm1iwy1)gOpvDcdHYpuEIBJaAQx^nBBxqiD7WaNw=iO*u*ZNAJ&_jmZ@icocF znF)Q*_O|frKDcFh`4qcQT!Sd*Iz!vM*KIeKPTm!&!~Sma3bTj$eUsmYN-}<!%pT^* z=e|j#rn9ZG&09+1T3OiSurL>vdE2X0CeI5?VSGE8Ioz;5X1ZrvcekF_&(onvlX6X@ zv%T(LloeWK#a_P5Rlz4&?CRRqsb$H+r8ArC19p4lUZ1dea?;ziY(dL(<y!AQT67{& zge5rX?9`XvuN5Ctw%xM+V9Ra?-^G^epIACNiP;-#1}=5(?%Bj!DE#c|?dF>9(z{Ab zN3zxg@ZVtGY|j|JT0!|)>T;2HDy5y;r$xN}SWe$IyPL6>EiTE!S&5M`ps9HB<#1zF z<u%`yO>mql>9cTlTIZ6+Nf$SHy`IXmeVfO0_ZJT(H=HP06A~CZSv$f+aFhKRz4Hn> zQ__^42(JFOtI}z5L4+;iq{-_dRO{D?Oqg(G>*90ESF&yCmMw@;T{&rnnxLc8gs_^a zPj-G0nOfJda#}X;M&(Hh-{mb)<6kNqFZNXU@tij`tfjK6n8nU6a@(y_Z{6~|kCo#| z%%`b689&n61UZ@u49{`cGYjXrh8$tPBfK?V^XblWMjT0Dx|T<iWIa3LYA=58(v*B( zzo7Nv3KP54{<gvniTpZ~w7GgXZ<=1)EcMsE-KlM|->hZXx4xc__|0tI;kw^ywX$c& z4KJZiw)>yHCZ6YBxFc|J(F>2|OzFi@%YqyV6&nrKTJZev;b)e9Cbr|VP6T&bal&u6 znUc~yNm3iR{Q9qO%es8sv!Qb5PUYm&f4ctWudX-vI&aS0!U!eHMMpFaSa~+h?YWh8 z_q#xkisreZDiP(U6$>Vu)(Ag#`jf_)$3{Pt)&Cz!kt#bMpt<UcQ3nTaQ~ReL&Y-;x zG0mYSvnxI*WWG?`lAN+2ahgZoj8l1+*CpQPy?Mm_e%qCzc}#}0rZjrFzO>6RXtgpC zK0fQO|F*-i^(F7~Cmjj-x-#j$)f{JA){c5-$8WqohKXmA<7YT8Tec>D?dN$<B65;t zYO}?%c%_xf)uydcisoIqBd;Y*z?kRqrIzAFcDMFKT+^+c$nbB@8-rp~)uyHeF8@!l zJ>8kfq@NeTu%XCxUGnYTD{D4vzxZJKvw0tudu({)XJ#81IdM&W$K<z-3G1|-ANyap zAYtvig<E<Hw+lz+(n!vk9v3coJ<9SHyQpf+I(2rMO8BZbX}9}0e+VoL@Xakgkp0aw ztXjInlz*2y*VHZglUByMuF`&3-Wa_*$w&XZL0^WneqL>TQ7x}`+W*R?MGjY0KCo0< z%Z17=JeJ<_>Rm>@_`0Xu^^6r|HLo|k3h~bux)3$h?M1E6wRcme&I{<$xWFSLFQNGO zNSH;df&=re?eedar3B_Bxt^~2xmP&s6PMZU^&w$xYs#k`S>N?@u~_s&v){|@7H9EI z)ih~|S4f;tC0cRw&03*-Th62{Sog~I$MWMz9~!&t*c3O!GbmiTVPTekyUwBhuJ%PK z<>?A%XDH4vnRV#r6;|cEB}uBMCR)wvSdqL;&_R5{vSWO|Ch7e;bl8*KdP#dmbHnLl zGW|<8%-*eWsxEb6k9K{tu<l!@P(IE(?;id-k@qsDpzqd}qsOm34g1mLrB|adEw1## z{I4Hclic?GuN9qgTKi&wq<P-$0KK!5HtN>9Pw3QF*(#{DX_MEKH7mMK^Lw54OROmK zIXmz7lLs<IYfm37VQ|l4{Wz)TRRm9Zdd2DoT1y{1JECs(dX>J-bj`oLnUlPG_)hE< zc*LN(JVivWDd*6{$EAEse2Stw4)3swj9q<d>d&cp^U81R4CCDPfzAALvB~P_#6uhW ze=cFOzg=HxZPijy7Qy?!WP=rJXw4eO`41hY>m6K|D)#ZJ!QBE$4ZkF|#3fP}+TCs3 z_kD8QAf*t~YrNujpu~qp-Ix~_6I_&&eick_o%{M<%<htZ3f~@tGrhIT{d6utmG9c7 z%8g5kyUGM_cX7ov?@;#>O_%Aa&i%lbqGZ*>Z#!rP$wx=uH+$dBSpW8}pm1R}1df zII#ZwdeF$?W7NmDVoP7%;gr~uyMNcAw{7|NWOR0V8Qwg^$~|kz;pyuff*np2gh{ru zu3m3lxomry#f3FOG7p>XUppl#v3v5&Se5$dH3zE=Y8o00O;oQKU-%+yq~p}A{x9)Q z*^hU=e+#wVS3bUHcR;8$em{SY=l9;}j*2_qmF%<lq!|5NYm0p5kBKI%MO6-6_1V{I z-qdzIyK~p^$d}V4`xt^t%FUauv_I}(>Wo@G#m~6ki_wm4A5-m|nV;V=%-Y^(r^@%z zZmP<+`jvr`Cswm=-%)y`@=@(~uD$*))sIrE>|T`{SnY7lvtgBx>;L7f@J(EyU8*QU zM*M9_-S4;NXG|2fy#Hfd(Eq~z22*~p)PjRP_v>0X^2@A3lvro(aaY~2<YHgGM&tjy zZ9kIr{#Hk<+vN9LBq?o;&4x8ALT5#4>@fZEwV8L)2J?Cs!MWZg?JaW;u5|9_RXc1M z@a2j}3v0+d%ZiE2f=pj(p6NE95ZY+ryQqdc?fRcysYkMQ$Kr&3eBn8And|<JP2T)l zEPNk){4sTL1si{R+5J@<`#u?*36OZ#vpaE8$!)2bJQ=G@XYDI2KN`Bd-|L`a;Em*B z7yFVk`y0O{ujY3CUH^se=rlXwmx_|_gXZNPi}hs<Qpvks?E1~6cek9wGLH@7W$JuO zRyNJquz#2DKk0kFnt1CN{1i&R>}Y>%o&1Nt*XmJ5=f~*B40Smh<(MDVK6T$yX8-Hz zUt0$6K6A11yflu5e>9JM{^jQ9;br9()^&MSdU?tA=O$nM*dCj|eNs|CUGev!E8Q1o z$|&yN{b$n0$7Pi-Y<JE}$YDA0@5i^Rj4KaxY`VVQ&Tg-5T&2#%w4VHIhPc{4H|qH+ z53jr3w%|LD?1bj?0uMU5m*&K1o%xWnX-=Kd1_hR9dp}G3Zu-l0{lTLofi0zZ@g<EO z$&Vkui+gk2d#btDQvH38Y`WfAJlj~WB(c9e#n;C9(<3XlPt0O<ZnymX)5Rx$_HSGM zH2%nsv#<Tr@BcXM9~b>p?Bb8l8@MI^Z!h9rbHl!(<@*0rxudV^KX9zyuikGrt?*Fh zQQh5rC*xm+3#xxPAvpW|2ZgpB%5F0yS{@1a^R^$}*S(}oO~&}#oO#!6cHKPv@3(8< zS>by1>)(y`9`0~fHsP{$d82+~fn@oAk#MF(-;JhKDK{zJS)3sL=te7Np`v6pf5-um zroY<11)cUDG~G5mqhzabg7}wO5!R{(&hMEnbH3&^AGtn%+QOb9UIF%q;}sK<%zqtn zabUialwkhid-vMJaChgw<u|W8u74Bx#-lW!cM79U{fE_|w{QPgld<H=Y0ZxkGi*8M zN}imo+9)=E<_G_`Ii<|c<9yaH3!din@ZNJ*7H+oJJB}z%WmGgYJ#4ta^hj^Sz8`yT zceyWl*RW5*Sn0d)1c{9sKG&>RQ`MsXdSa#b<acv!>Hl?IZhTNPQ<drR>ZL1fr!6^p z<_cGl=fvIuf7Qae`U_KHUH>SA3I$g_Yt(+FzS~gthjPwri$$H&4f;16^gHbF<1X{- zKX&bR0yX9&3$0e!dHqWwSJ9c0j015Kw=_lm&gH27o91q!Xx}U3CmS<!Zh+9Onf~IZ zcc1+FCa<cptk!gQOyBPFs&#jZE}l)Y+CL}8$CoMM-u`(yV)E;rrK{Dy)PAqOY`J-H zg|u(scH^Bt9-H3%_cQC`qS|iO>*2)_AFf`%zh~{8HHyLeYC3!h|4+YJQ)z6ueRsdk zEc5Hn!zXY4&uZy5p{M_oh^F<Tmw)pTQ=S*(pAI%z!o6x^K<Xin0JgAgmw%eCIn?T0 zX5GpB=D<eF^WjcYh30w23g=%rsbV9y_xHQk*YES0-!yym-|zWL{%`+7zU&tK$FL*a zxFPEAe965G&u-`M|M~3g?ZpoN*%70Y1(ViIew;KJG&niAGTDO@G&Xr=im15r<WtF- z^%qa}EplLBdr)o9eIqCIz(W2tO$r<<w#0cTsxDG$ePj36$EfhplE=Am4^Hn-c_};j zRj_9EqFC;l?DUjHvxFZp{1H-i{wja+>l2|B{R@vr<ORv!Haz>zOh(}HGmS4lSF$a1 zDcp3RCZ&FZfcabgGjX0hB@$<h*KbbbKD4a!_hr|5)BWZrES*%CT5jlE{c|o!LvVvq zMV55Y+JJ9|gPr%Co?bX*UTcST#@~YW*|{5TpH7<a_VkY5e9s;$?Kj$&AE1-+M18u- z(X|<qpR@|O+~qhCx#<eW#gn)6lBIM^?yy?ynQ|a{lIx!NpO>#NHotOzQisU@tEX<g zYCYM&zS>lqyMJ!|Y9`Ke=0BS*{yI3XOjC&IXI<t#`KOQ8T;IPu-BNB}(2ueeMm6;h zYZm*qZ_r=%@0_vD#xHUFuc|g3jjDcgl>5_$d#T44Ew7yYXyF%rGdY9I?pN3LRD|si zndZouYRVh5V4C;V2gy#)zbX{F+D*Bzt>%H1wtJw)wC3~rnPqBceni%Xndrve>ASi- zJG)I>(%<acn#+ca3)>2w9|@jovFFZo7c<L~vUA-;m4c=^Z+RZmmJ})1@&3-zjbSCJ zYi$x!X5Gq|B(a8F|NcCQ^4SwoH|=UsTkU`Mp-cROiJsewZ`}%9qjEC;;SD36?<>!V zC(VvYx;m##<SE~QsX5`Z5B4US{*149JB3kKeA>>h#~LQ>EKiA^_@t}4X71MH-%EHq z-cGuB+RFE7@zEk_!=vG|)SW!Jwco6j>-Cc7I^S8&_0=pVBcpCb@Rj5G0p5&EBFrL~ zrv*+9NHdiOogbJ2KW~hY0i=!r3YIiJp1dSY8LXz0H6CSQG*k)0l17io&(fS36DDh= z+cQm4oBUQyLI>GO4U|=*3=D!WoeT^NOBzq8O<tca&+HL9dGf_{X~vw%Z_}L^D<>Od zsDtxFRE9JYpUq@}Ov%X;GK3XC*#l+h9>uI}-e84yGDPG-3jgp`d&e*^Fo3WOio%}B x{F&Nd^KCPwnUs>j+KMwJ!RCXr9}@$^Q)UJRStM;+8gn5Ek7kOoy-o$m002-yroaFI diff --git a/dbrepo-search-service/lib/dbrepo-1.4.3.tar.gz b/dbrepo-search-service/lib/dbrepo-1.4.3.tar.gz index 04043f0f56105d80e7f2aaa5fe1598077184ef64..ffb89654bab83c6f72a9381825e41f0dbe7d37c9 100644 GIT binary patch literal 37342 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 literal 37117 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 diff --git a/dbrepo-search-service/lib/dbrepo-1.4.4-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.4.4-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..11873004972bb08703994ba1fb0ddf18f96f6a2c GIT binary patch literal 27104 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 G;sF4l(3t=L literal 0 HcmV?d00001 diff --git a/dbrepo-search-service/lib/dbrepo-1.4.4.tar.gz b/dbrepo-search-service/lib/dbrepo-1.4.4.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..f7452a0e12c9a2d44f663bc1f338204b7579144b GIT binary patch literal 37351 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 A;s5{u literal 0 HcmV?d00001 diff --git a/dbrepo-search-service/metrics.md b/dbrepo-search-service/metrics.md new file mode 100644 index 0000000000..d99df25c8e --- /dev/null +++ b/dbrepo-search-service/metrics.md @@ -0,0 +1,8 @@ +| **Metric** | **Description** | +|---------------------------------|---------------------------------------------------------| +| `dbrepo_search_index_list` | Time needed to list search index | +| `dbrepo_search_type_list` | Time needed to list search types | +| `dbrepo_search_fuzzy` | Time needed to search fuzzy | +| `dbrepo_search_type` | Time needed to search by type | +| `dbrepo_search_update_database` | Time needed to update a database in the search database | +| `dbrepo_search_delete_database` | Time needed to delete a database in the search database | \ No newline at end of file diff --git a/dbrepo-ui/components/subset/SubsetList.vue b/dbrepo-ui/components/subset/SubsetList.vue index a921373ae6..1a0150f4d6 100644 --- a/dbrepo-ui/components/subset/SubsetList.vue +++ b/dbrepo-ui/components/subset/SubsetList.vue @@ -20,13 +20,10 @@ <v-list-item lines="two" :title="title(item)" + :subtitle="subtitle(item)" :class="clazz(item)" :to="link(item)" :href="link(item)"> - <v-list-item-subtitle - class="mt-2"> - <pre>{{ item.query }}</pre> - </v-list-item-subtitle> <template v-slot:append> <v-tooltip v-if="hasPublishedIdentifier(item)" @@ -97,6 +94,13 @@ export default { const identifierService = useIdentifierService() return identifierService.identifierPreferEnglishTitle(query.identifiers[0]) }, + subtitle (query) { + if (query.identifiers.length === 0) { + return null + } + const identifierService = useIdentifierService() + return identifierService.identifierPreferEnglishDescription(query.identifiers[0]) + }, link (query) { return `/database/${this.$route.params.database_id}/subset/${query.id}/info` }, diff --git a/dbrepo-ui/components/table/TableList.vue b/dbrepo-ui/components/table/TableList.vue index c192a4b149..362f4a9366 100644 --- a/dbrepo-ui/components/table/TableList.vue +++ b/dbrepo-ui/components/table/TableList.vue @@ -16,7 +16,7 @@ lines="two" :title="table.name" :class="clazz(table)" - :subtitle="table.description ? table.description : '(no description)'" + :subtitle="table.description ? table.description : ''" :to="`/database/${$route.params.database_id}/table/${table.id}/info`"> <template v-slot:append> <v-tooltip diff --git a/dbrepo-ui/components/view/ViewList.vue b/dbrepo-ui/components/view/ViewList.vue index 992e748447..ea2dc0946c 100644 --- a/dbrepo-ui/components/view/ViewList.vue +++ b/dbrepo-ui/components/view/ViewList.vue @@ -13,10 +13,6 @@ :title="view.name" :class="clazz(view)" :to="`/database/${$route.params.database_id}/view/${view.id}/info`"> - <v-list-item-subtitle - class="mt-2"> - <pre v-text="view.query" /> - </v-list-item-subtitle> <template v-slot:append> <v-tooltip v-if="hasPublishedIdentifier(view)" diff --git a/dbrepo-ui/composables/axios-instance.ts b/dbrepo-ui/composables/axios-instance.ts index 7c3fa797b9..a2b6ca4f6e 100644 --- a/dbrepo-ui/composables/axios-instance.ts +++ b/dbrepo-ui/composables/axios-instance.ts @@ -1,6 +1,5 @@ -import axios, {AxiosError, type AxiosInstance} from 'axios' +import axios, {type AxiosInstance} from 'axios' import {useUserStore} from '@/stores/user' -import {axiosErrorToApiError} from '@/utils' let instance: AxiosInstance | null = null; @@ -9,7 +8,7 @@ export const useAxiosInstance = () => { const userStore = useUserStore() if (!instance) { instance = axios.create({ - timeout: 10000, + timeout: 10_000, params: {}, headers: { Accept: 'application/json', @@ -44,9 +43,9 @@ export const useAxiosInstance = () => { config.headers.Authorization = `Bearer ${response.access_token}` return config }) - .catch((error: AxiosError) => { - if (axiosErrorToApiError(error).code === 'error.user.credentials') { - console.error('Invalid user credentials: perform logout') + .catch((error: ApiErrorDto) => { + if (error.code === 'error.user.credentials') { + console.warn('User session expired.') userStore.logout() } return config diff --git a/dbrepo-ui/composables/database-service.ts b/dbrepo-ui/composables/database-service.ts index a992f13547..6a4e283f8d 100644 --- a/dbrepo-ui/composables/database-service.ts +++ b/dbrepo-ui/composables/database-service.ts @@ -17,6 +17,38 @@ export const useDatabaseService = (): any => { }); } + async function refreshTablesMetadata(databaseId: number): Promise<DatabaseDto> { + const axios = useAxiosInstance(); + console.debug('refresh database tables metadata'); + return new Promise<DatabaseDto>((resolve, reject) => { + axios.put<DatabaseDto>('/api/database/' + databaseId + '/metadata/table', {}) + .then((response) => { + console.info('Refreshed database tables metadata'); + resolve(response.data); + }) + .catch((error) => { + console.error('Failed to refresh database tables metadata', error); + reject(axiosErrorToApiError(error)); + }); + }); + } + + async function refreshViewsMetadata(databaseId: number): Promise<DatabaseDto> { + const axios = useAxiosInstance(); + console.debug('refresh database views metadata'); + return new Promise<DatabaseDto>((resolve, reject) => { + axios.put<DatabaseDto>('/api/database/' + databaseId + '/metadata/view', {}) + .then((response) => { + console.info('Refreshed database views metadata'); + resolve(response.data); + }) + .catch((error) => { + console.error('Failed to refresh database views metadata', error); + reject(axiosErrorToApiError(error)); + }); + }); + } + async function findCount(): Promise<number> { const axios = useAxiosInstance(); console.debug('find databases count'); @@ -185,6 +217,8 @@ export const useDatabaseService = (): any => { return { findAll, + refreshTablesMetadata, + refreshViewsMetadata, findOne, findCount, getServerTime, diff --git a/dbrepo-ui/composables/query-service.ts b/dbrepo-ui/composables/query-service.ts index 381137bba0..fa18a55ec0 100644 --- a/dbrepo-ui/composables/query-service.ts +++ b/dbrepo-ui/composables/query-service.ts @@ -93,7 +93,7 @@ export const useQueryService = (): any => { const axios = useAxiosInstance() console.debug('re-execute query in database with id', databaseId) return new Promise<QueryResultDto>((resolve, reject) => { - axios.get<QueryResultDto>(`/api/database/${databaseId}/subset/${queryId}/data`, { params: mapFilter(null, page, size)}) + axios.get<QueryResultDto>(`/api/database/${databaseId}/subset/${queryId}/data`, { params: mapFilter(null, page, size), timeout: 30_000 }) .then((response) => { console.info('Re-executed query in database with id', databaseId) resolve(response.data) @@ -109,7 +109,7 @@ export const useQueryService = (): any => { const axios = useAxiosInstance() console.debug('re-execute query in database with id', databaseId) return new Promise<number>((resolve, reject) => { - axios.head<void>(`/api/database/${databaseId}/subset/${queryId}/data`) + axios.head<void>(`/api/database/${databaseId}/subset/${queryId}/data`, { timeout: 30_000 }) .then((response) => { const count: number = Number(response.headers['x-count']) console.info('Found', count, 'tuples for query', queryId, 'in database with id', databaseId) diff --git a/dbrepo-ui/composables/table-service.ts b/dbrepo-ui/composables/table-service.ts index 37305f2437..393c540f83 100644 --- a/dbrepo-ui/composables/table-service.ts +++ b/dbrepo-ui/composables/table-service.ts @@ -71,7 +71,7 @@ export const useTableService = (): any => { const axios = useAxiosInstance() console.debug('get data for table with id', tableId, 'in database with id', databaseId); return new Promise<QueryResultDto>((resolve, reject) => { - axios.get<QueryResultDto>(`/api/database/${databaseId}/table/${tableId}/data`, {params: mapFilter(timestamp, page, size)}) + axios.get<QueryResultDto>(`/api/database/${databaseId}/table/${tableId}/data`, { params: mapFilter(timestamp, page, size), timeout: 30_000 }) .then((response) => { console.info('Got data for table with id', tableId, 'in database with id', databaseId) resolve(response.data) @@ -87,7 +87,7 @@ export const useTableService = (): any => { const axios = useAxiosInstance() console.debug('get data count for table with id', tableId, 'in database with id', databaseId); return new Promise<number>((resolve, reject) => { - axios.head<void>(`/api/database/${databaseId}/table/${tableId}/data`, {params: mapFilter(timestamp, null, null)}) + axios.head<void>(`/api/database/${databaseId}/table/${tableId}/data`, { params: mapFilter(timestamp, null, null), timeout: 30_000 }) .then((response: AxiosResponse<void>) => { const count: number = Number(response.headers['x-count']) console.info('Found' + count + 'in table with id', tableId, 'in database with id', databaseId) diff --git a/dbrepo-ui/composables/user-service.ts b/dbrepo-ui/composables/user-service.ts index cb22cf75b3..a8b9891613 100644 --- a/dbrepo-ui/composables/user-service.ts +++ b/dbrepo-ui/composables/user-service.ts @@ -95,7 +95,6 @@ export const useUserService = (): any => { resolve(response.data) }).catch((error) => { console.error('Failed to obtain user token', error) - reject(axiosErrorToApiError(error)) }) }) @@ -115,7 +114,6 @@ export const useUserService = (): any => { resolve(response.data) }).catch((error) => { console.error('Failed to refresh user token', error) - reject(axiosErrorToApiError(error)) }) }) diff --git a/dbrepo-ui/composables/view-service.ts b/dbrepo-ui/composables/view-service.ts index 1c898cea01..adc76e32a1 100644 --- a/dbrepo-ui/composables/view-service.ts +++ b/dbrepo-ui/composables/view-service.ts @@ -37,7 +37,7 @@ export const useViewService = (): any => { const axios = useAxiosInstance() console.debug('re-execute view with id', viewId, 'in database with id', databaseId) return new Promise<QueryResultDto>((resolve, reject) => { - axios.get<QueryResultDto>(`/api/database/${databaseId}/view/${viewId}/data`, {params: {page, size}}) + axios.get<QueryResultDto>(`/api/database/${databaseId}/view/${viewId}/data`, { params: {page, size}, timeout: 30_000 }) .then((response) => { console.info('Re-executed view with id', viewId, 'in database with id', databaseId) resolve(response.data) @@ -53,7 +53,7 @@ export const useViewService = (): any => { const axios = useAxiosInstance() console.debug('re-execute view with id', viewId, 'in database with id', databaseId) return new Promise<number>((resolve, reject) => { - axios.head<number>(`/api/database/${databaseId}/view/${viewId}/data`) + axios.head<number>(`/api/database/${databaseId}/view/${viewId}/data`, { timeout: 30_000 }) .then((response) => { const count: number = Number(response.headers['x-count']) console.info('Found', count, 'tuples for view with id', viewId, 'in database with id', databaseId) diff --git a/dbrepo-ui/locales/de-AT.json b/dbrepo-ui/locales/de-AT.json index f111e47037..15c2664f0f 100644 --- a/dbrepo-ui/locales/de-AT.json +++ b/dbrepo-ui/locales/de-AT.json @@ -421,7 +421,7 @@ } }, "schema": { - "title": "Struktur", + "title": "System Versioniert", "bullet": "●", "assign": "Zuordnen", "remove": { @@ -446,7 +446,10 @@ "title": "Nullbar" }, "sequence": { - "title": "Reihenfolge" + "title": "Sequenz" + }, + "description": { + "title": "Beschreibung" }, "name": { "label": "Name", @@ -644,6 +647,13 @@ "image-remove": { "text": "Entferne Bild" }, + "scheme": { + "title": "Schema", + "subtitle": "Aktualisiert die Metadaten im Datenbankschema, um systemversionierte Tabellen und Ansichten in der Benutzeroberfläche anzuzeigen.", + "submit": { + "text": "Aktualisieren" + } + }, "ownership": { "title": "Eigentum", "subtitle": "Benutzer, der Eigentümer dieser Datenbank ist.", @@ -1020,7 +1030,8 @@ "missing": "Der Zugriff in der Metadatendatenbank konnte nicht gefunden werden." }, "axios": { - "connection": "Es konnte keine Verbindung hergestellt werden." + "connection": "Es konnte keine Verbindung hergestellt werden.", + "timeout": "Zeitüberschreitung der Verbindung." }, "concept": { "missing": "Das Konzept konnte in der Metadatendatenbank nicht gefunden werden." @@ -1120,7 +1131,9 @@ "dataset": "Der Datensatz konnte nicht hochgeladen werden." }, "schema": { - "id": "Die Spalte „id“ muss ein Primärschlüssel sein." + "id": "Die Spalte „id“ muss ein Primärschlüssel sein.", + "view": "Ansichtsschema konnte nicht zugeordnet werden.", + "table": "Tabellenschema konnte nicht zugeordnet werden." }, "user": { "exists": "Benutzer mit Benutzername ist in der Authentifizierungsdatenbank vorhanden.", @@ -1162,6 +1175,9 @@ }, "success": { "signup": "Konto erfolgreich erstellt.", + "clipboard": { + "user": "Benutzer-ID erfolgreich kopiert." + }, "query": { "build": "Abfrage konnte nicht erstellt werden: Spalte nicht gefunden", "fatal": "Abfragen mit diesem Schema können derzeit nicht über die Benutzeroberfläche erstellt werden" @@ -1189,6 +1205,10 @@ "created": "Tabelle erfolgreich erstellt.", "semantics": "Semantische Instanz erfolgreich zugewiesen." }, + "schema": { + "tables": "Die Metadaten der Datenbanktabellen wurden erfolgreich aktualisiert.", + "views": "Metadaten der Datenbankansichten wurden erfolgreich aktualisiert." + }, "database": { "upload": "Datenbankbild erfolgreich hochgeladen.", "transfer": "Der Datenbankeigentümer wurde erfolgreich übertragen.", diff --git a/dbrepo-ui/locales/en-US.json b/dbrepo-ui/locales/en-US.json index a6a7ca925c..227ae506c2 100644 --- a/dbrepo-ui/locales/en-US.json +++ b/dbrepo-ui/locales/en-US.json @@ -421,7 +421,7 @@ } }, "schema": { - "title": "Structure", + "title": "System Versioned", "bullet": "●", "assign": "Assign", "remove": { @@ -448,6 +448,9 @@ "sequence": { "title": "Sequence" }, + "description": { + "title": "Description" + }, "name": { "label": "Name", "hint": "Required." @@ -644,6 +647,13 @@ "image-remove": { "text": "Remove Image" }, + "scheme": { + "title": "Schema", + "subtitle": "Update the metadata on the database schema to display system-versioned tables and views in the UI.", + "submit": { + "text": "Refresh" + } + }, "ownership": { "title": "Ownership", "subtitle": "User who has ownership over this database.", @@ -1020,7 +1030,8 @@ "missing": "Failed to find access in metadata database." }, "axios": { - "connection": "Failed to establish connection." + "connection": "Failed to establish connection.", + "timeout": "Connection timed out." }, "concept": { "missing": "Failed to find concept in metadata database." @@ -1120,7 +1131,9 @@ "dataset": "Failed to upload dataset." }, "schema": { - "id": "Column \"id\" must be a primary key." + "id": "Column \"id\" must be a primary key.", + "view": "Failed to map view schema.", + "table": "Failed to map table schema." }, "user": { "exists": "User with username exists in auth database.", @@ -1162,6 +1175,9 @@ }, "success": { "signup": "Successfully created account.", + "clipboard": { + "user": "Successfully copied user id." + }, "query": { "build": "Failed to build query: column not found", "fatal": "Query with this schema is not buildable through the UI at the moment" @@ -1189,6 +1205,10 @@ "created": "Successfully created table.", "semantics": "Successfully assigned semantic instance." }, + "schema": { + "tables": "Successfully refreshed database tables metadata.", + "views": "Successfully refreshed database views metadata." + }, "database": { "upload": "Successfully uploaded database image.", "transfer": "Successfully transferred the database owner.", diff --git a/dbrepo-ui/pages/database/[database_id]/settings.vue b/dbrepo-ui/pages/database/[database_id]/settings.vue index 57bf242eff..296f639cae 100644 --- a/dbrepo-ui/pages/database/[database_id]/settings.vue +++ b/dbrepo-ui/pages/database/[database_id]/settings.vue @@ -173,6 +173,27 @@ </v-row> </v-card-text> </v-card> + <v-divider /> + <v-card + v-if="canUpdateScheme" + :title="$t('pages.database.subpages.settings.scheme.title')" + :subtitle="$t('pages.database.subpages.settings.scheme.subtitle')" + variant="flat" + rounded="0"> + <v-card-text> + <v-row> + <v-col> + <v-btn + size="small" + variant="flat" + color="tertiary" + :loading="loadingSchema" + :text="$t('pages.database.subpages.settings.scheme.submit.text')" + @click="refreshSchema" /> + </v-col> + </v-row> + </v-card-text> + </v-card> </v-window-item> <v-dialog v-model="editAccessDialog" @@ -205,6 +226,7 @@ export default { loading: false, loadingUpload: false, loadingImage: false, + loadingSchema: false, validUpload: false, loadingDeleteImage: false, fileModel: null, @@ -319,6 +341,12 @@ export default { } return this.roles.includes('modify-database-owner') }, + canUpdateScheme () { + if (!this.isOwner) { + return false + } + return this.roles.includes('find-database') + }, canModifyAccess () { if (!this.isOwner) { return false @@ -464,6 +492,28 @@ export default { this.loading = false }) }, + refreshSchema () { + this.loadingSchema = true + const databaseService = useDatabaseService() + databaseService.refreshTablesMetadata(this.$route.params.database_id) + .then(() => { + this.$toast.success(this.$t('success.schema.tables')) + databaseService.refreshViewsMetadata(this.$route.params.database_id) + .then(() => { + this.$toast.success(this.$t('success.schema.views')) + this.cacheStore.reloadDatabase() + this.loadingSchema = false + }) + .catch(({code}) => { + this.$toast.error(this.$t(code)) + this.loadingSchema = false + }) + }) + .catch(({code}) => { + this.$toast.error(this.$t(code)) + this.loadingSchema = false + }) + }, giveAccess () { this.userId = null this.accessType = null diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue index 5bc0cd4a1a..4af6ba09d7 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue @@ -74,7 +74,7 @@ </v-data-table> </v-card> <v-card - v-if="table" + v-if="table && hasStructure" variant="flat" rounded="0" tile @@ -82,7 +82,7 @@ <v-card-text> <v-container> <ul> - <li> + <li v-if="table.constraints.primary_key.length > 0"> <strong>PRIMARY KEY</strong> (<i v-text="primaryKeysColumns" />) </li> @@ -168,7 +168,8 @@ export default { { value: 'column_concept', title: this.$t('pages.table.subpages.schema.concept.title') }, { value: 'column_unit', title: this.$t('pages.table.subpages.schema.unit.title') }, { value: 'is_null_allowed', title: this.$t('pages.table.subpages.schema.nullable.title') }, - { value: 'auto_generated', title: this.$t('pages.table.subpages.schema.sequence.title') } + { value: 'auto_generated', title: this.$t('pages.table.subpages.schema.sequence.title') }, + { value: 'description', title: this.$t('pages.table.subpages.schema.description.title') }, ], dateColumns: [], userStore: useUserStore(), @@ -213,6 +214,10 @@ export default { buttonVariant () { const runtimeConfig = useRuntimeConfig() return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.button.contrast : runtimeConfig.public.variant.button.normal + }, + hasStructure () { + const constraints = this.table.constraints + return constraints.primary_key.length > 0 || constraints.foreign_keys.length > 0 || constraints.checks.length > 0 || constraints.uniques.length > 0 } }, methods: { diff --git a/dbrepo-ui/pages/user/info.vue b/dbrepo-ui/pages/user/info.vue index 91069edd62..3a085b6008 100644 --- a/dbrepo-ui/pages/user/info.vue +++ b/dbrepo-ui/pages/user/info.vue @@ -14,9 +14,11 @@ <v-col md="6"> <v-text-field v-model="model.id" - disabled + readonly :variant="inputVariant" - :label="$t('pages.user.subpages.info.id.label')" /> + :label="$t('pages.user.subpages.info.id.label')" + append-inner-icon="mdi-content-copy" + @click:append-inner="copy" /> </v-col> </v-row> <v-row dense> @@ -282,6 +284,10 @@ export default { this.orcidLoading = false }) }, + copy () { + navigator.clipboard.writeText(this.model.id) + this.$toast.success(this.$t('success.clipboard.user')) + } } } </script> diff --git a/dbrepo-ui/utils/index.ts b/dbrepo-ui/utils/index.ts index fe0e7c03f3..66dbe94483 100644 --- a/dbrepo-ui/utils/index.ts +++ b/dbrepo-ui/utils/index.ts @@ -1049,6 +1049,15 @@ export function isActiveMessage(message: any) { } export function axiosErrorToApiError(error: AxiosError): ApiErrorDto { + if (error.code === 'ECONNABORTED') { + /* timeout */ + const errorObj: ApiErrorDto = { + status: error.code, + code: 'error.axios.timeout', + message: error.message + } + return errorObj + } if (error.response?.data) { const errorObj: ApiErrorDto = (error.response?.data as ApiErrorDto) return errorObj diff --git a/docker-compose.yml b/docker-compose.yml index 7b128e1d57..da0d6a27ea 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -80,6 +80,8 @@ services: container_name: dbrepo-auth-service hostname: auth-service image: dbrepo-auth-service:latest + ports: + - "8080:8080" build: context: ./dbrepo-auth-service network: host @@ -135,7 +137,8 @@ services: GATEWAY_SERVICE_ENDPOINT: ${GATEWAY_SERVICE_ENDPOINT:-http://gateway-service} GRANULARITY: "${GRANULARITY:-YYYY-MM-DDThh:mm:ssZ}" JWT_PUBKEY: "${JWT_PUBKEY:-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB}" - LOG_LEVEL: ${LOG_LEVEL:-info} +# LOG_LEVEL: ${LOG_LEVEL:-info} + LOG_LEVEL: trace METADATA_DB: "${METADATA_DB:-dbrepo}" METADATA_HOST: "${METADATA_HOST:-metadata-db}" METADATA_JDBC_EXTRA_ARGS: "${METADATA_JDBC_EXTRA_ARGS:-}" @@ -287,6 +290,7 @@ services: S3_ACCESS_KEY_ID: "${S3_ACCESS_KEY_ID:-seaweedfsadmin}" S3_ENDPOINT: "${S3_ENDPOINT:-http://storage-service:9000}" S3_EXPORT_BUCKET: "${S3_EXPORT_BUCKET:-dbrepo-download}" + S3_FILE_PATH: "${S3_FILE_PATH:-/tmp}" S3_IMPORT_BUCKET: "${S3_IMPORT_BUCKET:-dbrepo-upload}" S3_SECRET_ACCESS_KEY: "${S3_SECRET_ACCESS_KEY:-seaweedfsadmin}" volumes: @@ -483,7 +487,12 @@ services: QUEUE_NAME: ${QUEUE_NAME:-dbrepo} REQUEUE_REJECTED: ${REQUEUE_REJECTED:-false} ROUTING_KEY: "${ROUTING_KEY:-dbrepo.#}" - STORAGE_SERVICE_ENDPOINT: ${BROKER_SERVICE_ENDPOINT:-http://storage-service:9000} + S3_ACCESS_KEY_ID: "${S3_ACCESS_KEY_ID:-seaweedfsadmin}" + S3_ENDPOINT: "${S3_ENDPOINT:-http://storage-service:9000}" + S3_EXPORT_BUCKET: "${S3_EXPORT_BUCKET:-dbrepo-download}" + S3_FILE_PATH: "${S3_FILE_PATH:-/tmp}" + S3_IMPORT_BUCKET: "${S3_IMPORT_BUCKET:-dbrepo-upload}" + S3_SECRET_ACCESS_KEY: "${S3_SECRET_ACCESS_KEY:-seaweedfsadmin}" healthcheck: test: wget -qO- localhost:8080/actuator/health/readiness | grep -q "UP" || exit 1 interval: 10s diff --git a/helm/dbrepo/Chart.yaml b/helm/dbrepo/Chart.yaml index d61aa8701a..24e580a297 100644 --- a/helm/dbrepo/Chart.yaml +++ b/helm/dbrepo/Chart.yaml @@ -4,8 +4,8 @@ description: Helm Chart for installing DBRepo sources: - https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services type: application -version: "1.4.3" -appVersion: "1.4.3" +version: "1.4.4" +appVersion: "1.4.4" keywords: - dbrepo maintainers: diff --git a/helm/dbrepo/Makefile b/helm/dbrepo/Makefile index c1e8e02d8f..b89c9b4dec 100644 --- a/helm/dbrepo/Makefile +++ b/helm/dbrepo/Makefile @@ -3,6 +3,6 @@ all: .PHONY: build build: ## Generate Helm values schema JSON - helm package --sign --key 'Martin Weise' . --keyring ~/.gnupg/mweise.gpg --destination ./build + #helm package --sign --key 'Martin Weise' . --keyring ~/.gnupg/mweise.gpg --destination ./build helm schema -input ./values.yaml readme-generator-for-helm --readme README.md --values values.yaml diff --git a/helm/dbrepo/README.md b/helm/dbrepo/README.md index cde2c105fe..f7c43ba5db 100644 --- a/helm/dbrepo/README.md +++ b/helm/dbrepo/README.md @@ -1,16 +1,16 @@ # DBRepo Helm chart -[DBRepo](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/__CHARTVERSION__/) is a database repository system that +[DBRepo](https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.4/) is a database repository system that allows researchers to ingest data into a central, versioned repository through common interfaces. ## TL;DR Download the -sample [`values.yaml`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/helm-charts/dbrepo/values.yaml?inline=true) +sample [`values.yaml`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/release-1.4.4/helm-charts/dbrepo/values.yaml?inline=true) for your deployment and update the variables, especially `hostname`. ```bash -helm install my-release "oci://s210.dl.hpc.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.4.3" +helm install my-release "oci://s210.dl.hpc.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.4.4" ``` ## Prerequisites @@ -27,7 +27,7 @@ helm install my-release "oci://s210.dl.hpc.tuwien.ac.at/dbrepo/helm" --values ./ To install the chart with the release name `my-release`: ```bash -helm install my-release "oci://s210.dl.hpc.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.4.3" +helm install my-release "oci://s210.dl.hpc.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.4.4" ``` The command deploys DBRepo on the Kubernetes cluster in the default configuration. The Parameters section lists the @@ -64,17 +64,18 @@ The command removes all the Kubernetes components associated with the chart and ### Metadata Database -| Name | Description | Value | -| -------------------------------- | -------------------------------------------------------------- | ------------- | -| `metadatadb.enabled` | Enable the Metadata Database. | `true` | -| `metadatadb.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `false` | -| `metadatadb.host` | The hostname for the microservices. | `metadata-db` | -| `metadatadb.rootUser.user` | The root username. | `root` | -| `metadatadb.rootUser.password` | The root user password. | `dbrepo` | -| `metadatadb.jdbcExtraArgs` | The extra arguments for JDBC connections in the microservices. | `""` | -| `metadatadb.db.name` | The database name. | `fda` | -| `metadatadb.persistence.enabled` | Enable persistent storage. Requires PV-provisioner. | `false` | -| `metadatadb.replicaCount` | The number of replicas, should be uneven (2n+1). | `3` | +| Name | Description | Value | +| -------------------------------- | ---------------------------------------------------------------- | ------------- | +| `metadatadb.enabled` | Enable the Metadata Database. | `true` | +| `metadatadb.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `false` | +| `metadatadb.host` | The hostname for the microservices. | `metadata-db` | +| `metadatadb.rootUser.user` | The root username. | `root` | +| `metadatadb.rootUser.password` | The root user password. | `dbrepo` | +| `metadatadb.jdbcExtraArgs` | The extra arguments for JDBC connections in the microservices. | `""` | +| `metadatadb.db.name` | The database name. | `fda` | +| `metadatadb.extraInitDbScripts` | Additional init.db scripts that are executed on the first start. | `{}` | +| `metadatadb.persistence.enabled` | Enable persistent storage. Requires PV-provisioner. | `false` | +| `metadatadb.replicaCount` | The number of replicas, should be uneven (2n+1). | `3` | ### Auth Service @@ -169,19 +170,23 @@ The command removes all the Kubernetes components associated with the chart and ### Data Service -| Name | Description | Value | -| ----------------------------------- | -------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -| `dataservice.enabled` | Enable the Metadata Service. | `true` | -| `dataservice.endpoint` | The endpoint for the microservices. | `http://data-service` | -| `dataservice.grant.read` | The default database permissions for users with read access. | `SELECT` | -| `dataservice.grant.write` | The default database permissions for users with write access. | `SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE` | -| `dataservice.s3.endpoint` | The S3-capable endpoint the microservice connects to. | `http://storageservice-s3:9000` | -| `dataservice.s3.auth.username` | The S3-capable endpoint username (or access key id). | `seaweedfsadmin` | -| `dataservice.s3.auth.password` | The S3-capable endpoint user password (or access key secret). | `seaweedfsadmin` | -| `dataservice.consumerConcurrentMin` | The minimum broker service consumer number. | `1` | -| `dataservice.consumerConcurrentMax` | The maximum broker service consumer number. | `5` | -| `dataservice.requeueRejected` | Enable re-queueing of rejected messages to the broker service. | `false` | -| `dataservice.replicaCount` | The number of replicas. | `2` | +| Name | Description | Value | +| ----------------------------------- | ------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------- | +| `dataservice.enabled` | Enable the Metadata Service. | `true` | +| `dataservice.endpoint` | The endpoint for the microservices. | `http://data-service` | +| `dataservice.grant.read` | The default database permissions for users with read access. | `SELECT` | +| `dataservice.grant.write` | The default database permissions for users with write access. | `SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE` | +| `dataservice.default.date` | The default date format id for dates. | `3` | +| `dataservice.default.time` | The default date format id for times. | `4` | +| `dataservice.default.timestamp` | The default date format id for timestamps. | `1` | +| `dataservice.s3.endpoint` | The S3-capable endpoint the microservice connects to. | `http://storageservice-s3:9000` | +| `dataservice.s3.auth.username` | The S3-capable endpoint username (or access key id). | `seaweedfsadmin` | +| `dataservice.s3.auth.password` | The S3-capable endpoint user password (or access key secret). | `seaweedfsadmin` | +| `dataservice.s3.filePath` | The local location to download/upload files from/to S3-capable endpoint. | `/s3` | +| `dataservice.consumerConcurrentMin` | The minimum broker service consumer number. | `1` | +| `dataservice.consumerConcurrentMax` | The maximum broker service consumer number. | `5` | +| `dataservice.requeueRejected` | Enable re-queueing of rejected messages to the broker service. | `false` | +| `dataservice.replicaCount` | The number of replicas. | `2` | ### Search Service diff --git a/helm/dbrepo/templates/data-secret.yaml b/helm/dbrepo/templates/data-secret.yaml index 57c1ebd1a0..b5307a23d9 100644 --- a/helm/dbrepo/templates/data-secret.yaml +++ b/helm/dbrepo/templates/data-secret.yaml @@ -12,7 +12,7 @@ stringData: AUTH_SERVICE_ADMIN_PASSWORD: "{{ .Values.authservice.auth.adminPassword }}" AUTH_SERVICE_CLIENT: "{{ .Values.authservice.client.id }}" AUTH_SERVICE_CLIENT_SECRET: "{{ .Values.authservice.client.secret }}" - AUTH_SERVICE_ENDPOINT: "{{ .Values.authservice.endpoint }}" + AUTH_SERVICE_HOST: "{{ .Values.authservice.endpoint }}" BROKER_EXCHANGE_NAME: "{{ .Values.brokerservice.exchangeName }}" BROKER_HOST: "{{ .Values.brokerservice.host }}" BROKER_QUEUE_NAME: "{{ .Values.brokerservice.queueName }}" @@ -26,13 +26,17 @@ stringData: GATEWAY_SERVICE_ENDPOINT: "{{ .Values.gateway }}" GRANT_DEFAULT_READ: "{{ .Values.dataservice.grant.read }}" GRANT_DEFAULT_WRITE: "{{ .Values.dataservice.grant.write }}" + DEFAULT_DATE_FORMAT_ID: "{{ .Values.dataservice.default.date }}" + DEFAULT_TIME_FORMAT_ID: "{{ .Values.dataservice.default.time }}" + DEFAULT_TIMESTAMP_FORMAT_ID: "{{ .Values.dataservice.default.timestamp }}" JWT_PUBKEY: "{{ .Values.authservice.jwt.pubkey }}" LOG_LEVEL: "{{ ternary "debug" "info" .Values.dataservice.image.debug }}" MIN_CONCURRENT_CONSUMERS: "{{ .Values.dataservice.consumerConcurrentMin }}" MAX_CONCURRENT_CONSUMERS: "{{ .Values.dataservice.consumerConcurrentMax }}" REQUEUE_REJECTED: "{{ .Values.dataservice.requeueRejected }}" - S3_ENDPOINT: "{{ .Values.dataservice.s3.endpoint }}" S3_ACCESS_KEY_ID: "{{ .Values.dataservice.s3.auth.username }}" + S3_ENDPOINT: "{{ .Values.dataservice.s3.endpoint }}" + S3_EXPORT_BUCKET: "{{ .Values.dataservice.s3.bucket.export }}" + S3_FILE_PATH: "{{ .Values.dataservice.s3.filePath }}" S3_SECRET_ACCESS_KEY: "{{ .Values.dataservice.s3.auth.password }}" S3_IMPORT_BUCKET: "{{ .Values.dataservice.s3.bucket.import }}" - S3_EXPORT_BUCKET: "{{ .Values.dataservice.s3.bucket.export }}" diff --git a/helm/dbrepo/templates/metadata-configmap.yaml b/helm/dbrepo/templates/metadata-configmap.yaml index b0c927e915..88c761643a 100644 --- a/helm/dbrepo/templates/metadata-configmap.yaml +++ b/helm/dbrepo/templates/metadata-configmap.yaml @@ -4,8 +4,11 @@ apiVersion: v1 kind: ConfigMap metadata: name: metadata-db-setup - namespace: {{ $.Values.namespace }} + namespace: {{ .Values.namespace }} data: + {{- with .Values.metadatadb.extraInitDbScripts }} + {{ toYaml . | nindent 2 }} + {{- end }} 02-setup-data.sql: | BEGIN; INSERT INTO `mdb_containers` (name, internal_name, image_id, host, port, sidecar_host, sidecar_port, privileged_username, privileged_password) diff --git a/helm/dbrepo/values.schema.json b/helm/dbrepo/values.schema.json index b325533b9c..3f555c6705 100644 --- a/helm/dbrepo/values.schema.json +++ b/helm/dbrepo/values.schema.json @@ -580,6 +580,20 @@ "consumerConcurrentMin": { "type": "integer" }, + "default": { + "properties": { + "date": { + "type": "integer" + }, + "time": { + "type": "integer" + }, + "timestamp": { + "type": "integer" + } + }, + "type": "object" + }, "enabled": { "type": "boolean" }, @@ -643,6 +657,9 @@ }, "endpoint": { "type": "string" + }, + "filePath": { + "type": "string" } }, "type": "object" @@ -750,6 +767,10 @@ "enabled": { "type": "boolean" }, + "extraInitDbScripts": { + "properties": {}, + "type": "object" + }, "fullnameOverride": { "type": "string" }, diff --git a/helm/dbrepo/values.yaml b/helm/dbrepo/values.yaml index 3b2e12c656..d15d46c305 100644 --- a/helm/dbrepo/values.yaml +++ b/helm/dbrepo/values.yaml @@ -42,6 +42,7 @@ admin: ## @skip metadatadb.metrics.enabled The Prometheus settings. ## @skip metadatadb.galera The Galera settings. ## @skip metadatadb.initdbScriptsConfigMap The initial database scripts. +## @param metadatadb.extraInitDbScripts Additional init.db scripts that are executed on the first start. ## @skip metadatadb.service The initial database scripts. ## @param metadatadb.persistence.enabled Enable persistent storage. Requires PV-provisioner. ## @param metadatadb.replicaCount The number of replicas, should be uneven (2n+1). @@ -65,6 +66,12 @@ metadatadb: user: mariabackup password: mariabackup initdbScriptsConfigMap: metadata-db-setup + extraInitDbScripts: { } + # 03-additional-data.sql: | + # BEGIN; + # INSERT INTO `mdb_containers` (name, internal_name, image_id, host, port, sidecar_host, sidecar_port, privileged_username, privileged_password) + # VALUES ('MariaDB Galera TEST', 'mariadb_11_1_3', 1, 'data-db', 3306, 'data-db', 80, 'root', 'dbrepo'); + # COMMIT; service: type: ClusterIP annotations: { } @@ -171,7 +178,7 @@ datadb: protocol: TCP sidecars: - name: sidecar - image: s210.dl.hpc.tuwien.ac.at/dbrepo/data-db-sidecar:1.4.3 + image: s210.dl.hpc.tuwien.ac.at/dbrepo/data-db-sidecar:1.4.4 securityContext: runAsUser: 1001 runAsGroup: 0 @@ -207,10 +214,10 @@ datadb: periodSeconds: 30 volumeMounts: - name: s3 - mountPath: /tmp + mountPath: /s3 extraVolumeMounts: - name: s3 - mountPath: /tmp + mountPath: /s3 extraVolumes: - name: s3 emptyDir: { } @@ -429,7 +436,7 @@ brokerservice: analyseservice: enabled: true image: - name: s210.dl.hpc.tuwien.ac.at/dbrepo/analyse-service:1.4.3 + name: s210.dl.hpc.tuwien.ac.at/dbrepo/analyse-service:1.4.4 pullPolicy: Always debug: false s3: @@ -459,7 +466,7 @@ analyseservice: metadataservice: enabled: true image: - name: s210.dl.hpc.tuwien.ac.at/dbrepo/metadata-service:1.4.3 + name: s210.dl.hpc.tuwien.ac.at/dbrepo/metadata-service:1.4.4 pullPolicy: Always debug: false admin: @@ -492,10 +499,14 @@ metadataservice: ## @skip dataservice.image ## @param dataservice.grant.read The default database permissions for users with read access. ## @param dataservice.grant.write The default database permissions for users with write access. +## @param dataservice.default.date The default date format id for dates. +## @param dataservice.default.time The default date format id for times. +## @param dataservice.default.timestamp The default date format id for timestamps. ## @param dataservice.s3.endpoint The S3-capable endpoint the microservice connects to. ## @skip dataservice.s3.bucket ## @param dataservice.s3.auth.username The S3-capable endpoint username (or access key id). ## @param dataservice.s3.auth.password The S3-capable endpoint user password (or access key secret). +## @param dataservice.s3.filePath The local location to download/upload files from/to S3-capable endpoint. ## @param dataservice.consumerConcurrentMin The minimum broker service consumer number. ## @param dataservice.consumerConcurrentMax The maximum broker service consumer number. ## @param dataservice.requeueRejected Enable re-queueing of rejected messages to the broker service. @@ -505,12 +516,16 @@ dataservice: enabled: true endpoint: http://data-service image: - name: s210.dl.hpc.tuwien.ac.at/dbrepo/data-service:1.4.3 + name: s210.dl.hpc.tuwien.ac.at/dbrepo/data-service:1.4.4 pullPolicy: Always debug: false grant: read: SELECT write: SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE + default: + date: 3 + time: 4 + timestamp: 1 s3: endpoint: http://storageservice-s3:9000 bucket: @@ -519,6 +534,7 @@ dataservice: auth: username: seaweedfsadmin password: seaweedfsadmin + filePath: /s3 consumerConcurrentMin: 1 consumerConcurrentMax: 5 requeueRejected: false @@ -536,12 +552,12 @@ searchservice: enabled: true endpoint: http://search-service image: - name: s210.dl.hpc.tuwien.ac.at/dbrepo/search-service:1.4.3 + name: s210.dl.hpc.tuwien.ac.at/dbrepo/search-service:1.4.4 pullPolicy: Always debug: false init: image: - name: s210.dl.hpc.tuwien.ac.at/dbrepo/search-service-init:1.4.3 + name: s210.dl.hpc.tuwien.ac.at/dbrepo/search-service-init:1.4.4 pullPolicy: Always replicaCount: 2 @@ -588,7 +604,7 @@ storageservice: username: seaweedfsadmin password: seaweedfsadmin init: - image: s210.dl.hpc.tuwien.ac.at/dbrepo/storage-service-init:1.4.3 + image: s210.dl.hpc.tuwien.ac.at/dbrepo/storage-service-init:1.4.4 pullPolicy: Always ## @section User Interface @@ -617,7 +633,7 @@ storageservice: ui: enabled: true image: - name: s210.dl.hpc.tuwien.ac.at/dbrepo/ui:1.4.3 + name: s210.dl.hpc.tuwien.ac.at/dbrepo/ui:1.4.4 pullPolicy: Always debug: false public: diff --git a/lib/python/build-website.sh b/lib/python/build-site.sh similarity index 54% rename from lib/python/build-website.sh rename to lib/python/build-site.sh index 1178d90892..75602b09cc 100755 --- a/lib/python/build-website.sh +++ b/lib/python/build-site.sh @@ -2,7 +2,5 @@ python3 -m venv ./lib/python/venv source ./lib/python/venv/bin/activate PIPENV_PIPFILE=./lib/python/Pipfile pipenv install --dev -sed -i -e "s/__APPVERSION__/${APP_VERSION}/g" ./lib/python/pyproject.toml ./lib/python/setup.py ./lib/python/README.md ./lib/python/docs/conf.py ./lib/python/docs/index.rst sphinx-apidoc -o ./lib/python/docs/source ./lib/python/dbrepo -sphinx-build -M html ./lib/python/docs/ ./lib/python/docs/build/ -cp -r ./lib/python/docs/build/html ./site/sphinx \ No newline at end of file +sphinx-build -M html ./lib/python/docs/ ./lib/python/docs/build/ \ No newline at end of file diff --git a/lib/python/dbrepo/RestClient.py b/lib/python/dbrepo/RestClient.py index 101bff51a1..25f20858a9 100644 --- a/lib/python/dbrepo/RestClient.py +++ b/lib/python/dbrepo/RestClient.py @@ -518,6 +518,27 @@ class RestClient: raise NotExistsError(f'Failed to delete table: not found') raise ResponseCodeError(f'Failed to delete table: response code: {response.status_code} is not 202 (ACCEPTED)') + def get_table_metadata(self, database_id: int) -> Database: + """ + Generate metadata of all system-versioned tables in a database with given id. + + :param database_id: The database id. + + :raises ResponseCodeError: If something went wrong with the retrieval. + :raises ForbiddenError: If the action is not allowed. + :raises NotExistsError: If the container does not exist. + """ + url = f'/api/database/{database_id}/metadata/table' + response = self._wrapper(method="put", url=url, force_auth=True) + if response.status_code == 200: + body = response.json() + return Database.model_validate(body) + if response.status_code == 403: + raise ForbiddenError(f'Failed to get tables metadata: not allowed') + if response.status_code == 404: + raise NotExistsError(f'Failed to get tables metadata: not found') + raise ResponseCodeError(f'Failed to get tables metadata: response code: {response.status_code} is not 200 (OK)') + def get_views(self, database_id: int) -> List[View]: """ Gets views of a database with given database id. @@ -655,6 +676,27 @@ class RestClient: raise NotExistsError(f'Failed to get view data: not found') raise ResponseCodeError(f'Failed to get view data: response code: {response.status_code} is not 200 (OK)') + def get_views_metadata(self, database_id: int) -> Database: + """ + Generate metadata of all views in a database with given id. + + :param database_id: The database id. + + :raises ResponseCodeError: If something went wrong with the retrieval. + :raises ForbiddenError: If the action is not allowed. + :raises NotExistsError: If the container does not exist. + """ + url = f'/api/database/{database_id}/metadata/view' + response = self._wrapper(method="put", url=url, force_auth=True) + if response.status_code == 200: + body = response.json() + return Database.model_validate(body) + if response.status_code == 403: + raise ForbiddenError(f'Failed to get views metadata: not allowed') + if response.status_code == 404: + raise NotExistsError(f'Failed to get views metadata: not found') + raise ResponseCodeError(f'Failed to get views metadata: response code: {response.status_code} is not 200 (OK)') + def get_table_data(self, database_id: int, table_id: int, page: int = 0, size: int = 10, timestamp: datetime.datetime = None, df: bool = False) -> Result | DataFrame: """ @@ -1319,7 +1361,7 @@ class RestClient: publication_day: int = None, publication_month: int = None, related_identifiers: List[CreateRelatedIdentifier] = None) -> Identifier: """ - Create an identifier + Create an identifier draft. :param database_id: The database id of the created identifier. :param type: The type of the created identifier. @@ -1367,6 +1409,93 @@ class RestClient: raise ResponseCodeError( f'Failed to create identifier: response code: {response.status_code} is not 201 (CREATED)') + def save_identifier(self, identifier_id: int, database_id: int, type: IdentifierType, + titles: List[CreateIdentifierTitle], publisher: str, creators: List[CreateIdentifierCreator], + publication_year: int, descriptions: List[CreateIdentifierDescription] = None, + funders: List[CreateIdentifierFunder] = None, licenses: List[License] = None, + language: Language = None, query_id: int = None, view_id: int = None, table_id: int = None, + publication_day: int = None, publication_month: int = None, + related_identifiers: List[CreateRelatedIdentifier] = None) -> Identifier: + """ + Save an existing identifier and update the metadata attached to it. + + :param identifier_id: The identifier id. + :param database_id: The database id of the created identifier. + :param type: The type of the created identifier. + :param titles: The titles of the created identifier. + :param publisher: The publisher of the created identifier. + :param creators: The creator(s) of the created identifier. + :param publication_year: The publication year of the created identifier. + :param descriptions: The description(s) of the created identifier. Optional. + :param funders: The funders(s) of the created identifier. Optional. + :param licenses: The license(s) of the created identifier. Optional. + :param language: The language of the created identifier. Optional. + :param query_id: The query id of the created identifier. Required when type=SUBSET, otherwise invalid. Optional. + :param view_id: The view id of the created identifier. Required when type=VIEW, otherwise invalid. Optional. + :param table_id: The table id of the created identifier. Required when type=TABLE, otherwise invalid. Optional. + :param publication_day: The publication day of the created identifier. Optional. + :param publication_month: The publication month of the created identifier. Optional. + :param related_identifiers: The related identifier(s) of the created identifier. Optional. + + :returns: The identifier, if successful. + + :raises ResponseCodeError: If something went wrong with the creation of the identifier. + :raises ForbiddenError: If the action is not allowed. + :raises MalformedError: If the payload is rejected by the service. + :raises NotExistsError: If the database, table/view/subset or user does not exist. + :raises ExternalSystemError: If the external system (DataCite) refused communication with the service. + """ + url = f'/api/identifier/{identifier_id}' + payload = CreateIdentifier(database_id=database_id, type=type, titles=titles, publisher=publisher, + creators=creators, publication_year=publication_year, descriptions=descriptions, + funders=funders, licenses=licenses, language=language, query_id=query_id, + view_id=view_id, table_id=table_id, publication_day=publication_day, + publication_month=publication_month, related_identifiers=related_identifiers) + response = self._wrapper(method="put", url=url, force_auth=True, payload=payload) + if response.status_code == 201: + body = response.json() + return Identifier.model_validate(body) + if response.status_code == 400: + raise MalformedError(f'Failed to save identifier: service rejected malformed payload') + if response.status_code == 403 or response.status_code == 405: + raise ForbiddenError(f'Failed to save identifier: not allowed') + if response.status_code == 404: + raise NotExistsError(f'Failed to save identifier: not found') + if response.status_code == 503: + raise ExternalSystemError(f'Failed to save identifier: external system rejected communication') + raise ResponseCodeError( + f'Failed to save identifier: response code: {response.status_code} is not 202 (ACCEPTED)') + + def publish_identifier(self, identifier_id: int) -> Identifier: + """ + Publish an identifier with given id. + + :param identifier_id: The identifier id. + + :returns: The identifier, if successful. + + :raises ResponseCodeError: If something went wrong with the creation of the identifier. + :raises ForbiddenError: If the action is not allowed. + :raises MalformedError: If the payload is rejected by the service. + :raises NotExistsError: If the database, table/view/subset or user does not exist. + :raises ExternalSystemError: If the external system (DataCite) refused communication with the service. + """ + url = f'/api/identifier/{identifier_id}/publish' + response = self._wrapper(method="put", url=url, force_auth=True) + if response.status_code == 201: + body = response.json() + return Identifier.model_validate(body) + if response.status_code == 400: + raise MalformedError(f'Failed to publish identifier: service rejected malformed payload') + if response.status_code == 403 or response.status_code == 405: + raise ForbiddenError(f'Failed to publish identifier: not allowed') + if response.status_code == 404: + raise NotExistsError(f'Failed to publish identifier: not found') + if response.status_code == 503: + raise ExternalSystemError(f'Failed to publish identifier: external system rejected communication') + raise ResponseCodeError( + f'Failed to publish identifier: response code: {response.status_code} is not 201 (CREATED)') + def suggest_identifier(self, uri: str) -> Identifier: """ Suggest identifier metadata for a given identifier URI. Example: ROR, ORCID, ISNI, GND, DOI. diff --git a/lib/python/dbrepo/api/dto.py b/lib/python/dbrepo/api/dto.py index e22b989541..27256c6398 100644 --- a/lib/python/dbrepo/api/dto.py +++ b/lib/python/dbrepo/api/dto.py @@ -624,6 +624,7 @@ class View(BaseModel): is_public: bool initial_view: bool last_modified: Timestamp + columns: List[ViewColumn] identifiers: List[Identifier] = field(default_factory=list) @@ -877,6 +878,7 @@ class Column(BaseModel): is_public: bool is_null_allowed: bool alias: Optional[str] = None + description: Optional[str] = None size: Optional[int] = None d: Optional[int] = None mean: Optional[float] = None @@ -896,6 +898,27 @@ class Column(BaseModel): std_dev: Optional[float] = None +class ViewColumn(BaseModel): + id: int + name: str + database_id: int + internal_name: str + auto_generated: bool + column_type: ColumnType + is_public: bool + is_null_allowed: bool + alias: Optional[str] = None + size: Optional[int] = None + d: Optional[int] = None + mean: Optional[float] = None + median: Optional[float] = None + concept: Optional[Concept] = None + unit: Optional[Unit] = None + date_format: Optional[ImageDate] = None + index_length: Optional[int] = None + length: Optional[int] = None + + class Table(BaseModel): id: int database_id: int diff --git a/lib/python/docs/conf.py b/lib/python/docs/conf.py index 4d955a3a4c..2992f7ada7 100644 --- a/lib/python/docs/conf.py +++ b/lib/python/docs/conf.py @@ -17,7 +17,7 @@ project = "dbrepo" current_year = datetime.date.today().year copyright = f'{current_year} the DBRepo Developers' author = "Martin Weise" -release = "__APPVERSION__" +release = "" # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/lib/python/docs/index.rst b/lib/python/docs/index.rst index d1916a2e2a..f905221999 100644 --- a/lib/python/docs/index.rst +++ b/lib/python/docs/index.rst @@ -12,7 +12,7 @@ Quickstart ---------- Find numerous quickstart examples on -the `DBRepo website <https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/__APPVERSION__/usage-overview/>`_. +the `DBRepo website <https://www.ifs.tuwien.ac.at/infrastructures/dbrepo//usage-overview/>`_. AMQP API Client ----------- diff --git a/lib/python/package.sh b/lib/python/package.sh index 4478dbf962..2ad8d301e8 100755 --- a/lib/python/package.sh +++ b/lib/python/package.sh @@ -1,8 +1,3 @@ #!/bin/bash -PRE_RELEASE="" -if [ "${CI_COMMIT_BRANCH:8:8}" = "master" ]; then - PRE_RELEASE="rc${CI_PIPELINE_ID}" -fi -sed -i -e "s/__APPVERSION__/${APP_VERSION}${PRE_RELEASE}/g" ./lib/python/pyproject.toml ./lib/python/setup.py ./lib/python/README.md python -m build --sdist ./lib/python python -m build --wheel ./lib/python diff --git a/lib/python/pyproject.toml b/lib/python/pyproject.toml index e0b1a19844..e8de41883d 100644 --- a/lib/python/pyproject.toml +++ b/lib/python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "dbrepo" -version = "1.4.3" +version = "1.4.4" description = "DBRepo Python Library" keywords = [ "DBRepo", diff --git a/lib/python/setup.py b/lib/python/setup.py index f9915ffbd3..4d5b26206d 100644 --- a/lib/python/setup.py +++ b/lib/python/setup.py @@ -2,7 +2,7 @@ from distutils.core import setup setup(name="dbrepo", - version="1.4.3", + version="1.4.4", description="A library for communicating with DBRepo", url="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.3/", author="Martin Weise", diff --git a/make/gen.mk b/make/gen.mk index 0ab27496d4..e6fceaf2ba 100644 --- a/make/gen.mk +++ b/make/gen.mk @@ -17,4 +17,4 @@ gen-docs-doc: ## Generate DBRepo documentation. .PHONY: gen-lib-doc gen-lib-doc: ## Generate Python Library documentation. - bash ./lib/python/build.sh + bash ./lib/python/build-site.sh diff --git a/mkdocs.yml b/mkdocs.yml index 05933f2ddd..e437015236 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -5,44 +5,49 @@ site_author: Research Unit Data Science, Technische Universität Wien copyright: CC-BY 4.0 Technische Universität Wien & Universität Wien docs_dir: .docs nav: - - Home: index.md - - Deployment: - - Docker Compose: deployment-docker-compose.md + - Get Started: + - Welcome to DBRepo: index.md + - Why use DBRepo: why.md + - Help with DBRepo: help.md + - Installation: deployment-docker-compose.md - Kubernetes: deployment-helm.md - - System: - - Overview: system-overview.md - - Services: - - Analyse Service: system-services-analyse.md - - Authentication Service: system-services-authentication.md - - Broker Service: system-services-broker.md - - Data Service: system-services-data.md - - Gateway Service: system-services-gateway.md - - Metadata Service: system-services-metadata.md - - Search Service: system-services-search.md - - Storage Service: system-services-storage.md - - Upload Service: system-services-upload.md + - Migration Guide: migration.md + - contributing.md + - Concepts: + - Overview: concepts/index.md + - Authentication: concepts/authentication.md + - Databases: concepts/databases.md + - Messaging: concepts/messaging.md + - Monitoring: concepts/monitoring.md + - Persistent Identifier: concepts/pid.md + - Search: concepts/search.md + - Storage: concepts/storage.md + - User Interface: concepts/ui.md + - API: + - Overview: api/index.md - Databases: - - Authentication Database: system-databases-authentication.md - - Data Database: system-databases-data.md - - Metadata Database: system-databases-metadata.md - - Search Database: system-databases-search.md - - Other: - - User Interface: system-other-ui.md - - Search Database Dashboard: system-other-search-dashboard.md - - Operation: - - Actuator: operation-actuator.md - - Prometheus: operation-prometheus.md - - Usage: - - Overview: usage-overview.md - - Python Library: usage-python.md + - Data Database: api/data-db.md + - Metadata Database: api/metadata-db.md + - SDK: + - Python Library: api/python.md + - Swagger / OpenAPI: api/open-api.md - Services: - - Authentication Service: usage-authentication.md - - Storage Service: usage-storage.md - - Upload Service: usage-upload.md - - Development: - - Overview: dev-overview.md - - Application Guide: dev-guide-app.md - - Infrastructure Guide: dev-guide-infra.md + - Analyse Service: api/analyse-service.md + - Auth Service: api/auth-service.md + - Data Service: api/data-service.md + - Gateway Service: api/gateway-service.md + - Metadata Service: api/metadata-service.md + - Search Service: api/search-service.md + - Storage Service: api/storage-service.md + - Upload Service: api/upload-service.md + - UI: + - Customization: api/ui.md + - Examples: + - COVID-19 Tweets: examples/covid19.md + - Influenza Monitoring: examples/influenza.md + - Manufacturing Data: examples/manufacturing.md + - Power Usage: examples/power.md + - Transportation Monitoring: examples/transportation.md - publications.md - contact.md extra_css: diff --git a/versions.json b/versions.json index 4378f77235..5eb8a9b173 100644 --- a/versions.json +++ b/versions.json @@ -1,8 +1,13 @@ [ + { + "version": "1.4.3", + "title": "1.4.3", + "aliases": ["latest"] + }, { "version": "1.4.2", "title": "1.4.2", - "aliases": ["latest"] + "aliases": [] }, { "version": "1.4.1", -- GitLab