diff --git a/.docker/.env b/.docker/.env index f72626ab5ef38013f5672b522006ea410925ead0..d191e59edda36e8ca7795d1da35710d28129cfdc 100644 --- a/.docker/.env +++ b/.docker/.env @@ -1,4 +1,4 @@ -APP_VERSION=1.9 +APP_VERSION=1.9.2 FLUENTBIT_VERSION=4.0.0 GRAFANA_VERSION=11.4.0 MARIADB_VERSION=11.3.2 diff --git a/.docker/docker-compose.yml b/.docker/docker-compose.yml index c88d780c356bdb651f00ca61cfb7c7e03ff53196..833e44e38550953f02544a3bb78a4e2fbb650f43 100644 --- a/.docker/docker-compose.yml +++ b/.docker/docker-compose.yml @@ -316,14 +316,6 @@ services: - search-db-data:/bitnami/opensearch/data ports: - "9200:9200" - deploy: - resources: - reservations: - cpus: '0.25' - memory: 512M - limits: - cpus: '0.50' - memory: 2048M healthcheck: test: curl -sSL 127.0.0.1:9200 <<: *healthcheck-params @@ -389,7 +381,7 @@ services: ports: - "80:8080" volumes: - - ./conf/dbrepo.conf:/opt/bitnami/nginx/conf/server_blocks/dbrepo.conf:ro + - ./config/dbrepo.conf:/opt/bitnami/nginx/conf/server_blocks/dbrepo.conf:ro depends_on: dbrepo-analyse-service: condition: service_healthy diff --git a/.docs/.openapi/api-analyse-service.yaml b/.docs/.openapi/api-analyse-service.yaml index 287da431362cba6b19ff3783011daa183ae2b889..b32200943151d90ba32f6b8baf8b647d5cfeeda5 100644 --- a/.docs/.openapi/api-analyse-service.yaml +++ b/.docs/.openapi/api-analyse-service.yaml @@ -124,7 +124,7 @@ "url": "https://www.apache.org/licenses/LICENSE-2.0" }, "title": "Database Repository Analyse Service API", - "version": "1.9.0" + "version": "1.9.2" }, "openapi": "3.0.0", "paths": { diff --git a/.docs/.openapi/api-dashboard-service.yaml b/.docs/.openapi/api-dashboard-service.yaml index 10a0140d0965d69e1c3b147588b58935973031f3..cd7f47b785ea04cfdee32fd8605ae8cb916a5c37 100644 --- a/.docs/.openapi/api-dashboard-service.yaml +++ b/.docs/.openapi/api-dashboard-service.yaml @@ -216,6 +216,61 @@ "dashboard-endpoint" ] } + }, + "/api/dashboard/{uid}/access/{username}": { + "put": { + "consumes": [ + "application/json" + ], + "description": "Updates a dashboard access in the Dashboard UI. Requires role `system`.", + "operationId": "update_dashboard_access", + "parameters": [ + { + "in": "path", + "name": "uid", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + }, + { + "in": "path", + "name": "username", + "required": true, + "schema": { + "type": "string" + } + } + ], + "produces": [ + "application/json" + ], + "responses": { + "202": { + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + }, + "description": "Updated dashboard access successfully" + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ], + "summary": "Update dashboard access", + "tags": [ + "dashboard-endpoint" + ] + } } }, "servers": [ diff --git a/.docs/.openapi/api-data-service.yaml b/.docs/.openapi/api-data-service.yaml index c3947778ccf83e0f1521e86e66710b6891229b3b..4bb63ac60782d0a356b019b559571738a8505006 100644 --- a/.docs/.openapi/api-data-service.yaml +++ b/.docs/.openapi/api-data-service.yaml @@ -11,11 +11,11 @@ "name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0" }, - "version": "1.9.0" + "version": "1.9.2" }, "externalDocs": { "description": "Sourcecode Documentation", - "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9.0/system-services-metadata/" + "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9.2/system-services-metadata/" }, "servers": [ { @@ -1299,6 +1299,170 @@ ] } }, + "/api/database/{databaseId}/grant/{userId}": { + "get": { + "tags": [ + "grant-endpoint" + ], + "summary": "Get grants", + "description": "Get the grant permissions for a user of a given database.", + "operationId": "find", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Access found", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DatabaseAccessDto" + } + } + } + } + }, + "401": { + "description": "Not authenticated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not database owner or foreign user", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "Grants malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + }, + "head": { + "tags": [ + "grant-endpoint" + ], + "summary": "Get grants", + "description": "Get the grant permissions for a user of a given database.", + "operationId": "find_1", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Access found", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DatabaseAccessDto" + } + } + } + } + }, + "401": { + "description": "Not authenticated", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not database owner or foreign user", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "Grants malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + } + }, "/api/database/{databaseId}/subset/{queryId}": { "put": { "tags": [ @@ -2105,6 +2269,66 @@ "status" ] }, + "DatabaseAccessDto": { + "type": "object", + "properties": { + "user": { + "$ref": "#/components/schemas/UserBriefDto" + }, + "type": { + "type": "string", + "enum": [ + "read", + "write_own", + "write_all" + ], + "example": "read" + } + }, + "required": [ + "type", + "user" + ] + }, + "UserBriefDto": { + "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" + } + }, + "required": [ + "id", + "username" + ] + }, "TupleUpdateDto": { "type": "object", "properties": { @@ -2805,45 +3029,6 @@ "query_normalized" ] }, - "UserBriefDto": { - "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" - } - }, - "required": [ - "id", - "username" - ] - }, "CreatorDto": { "type": "object", "properties": { diff --git a/.docs/.openapi/api-metadata-service.yaml b/.docs/.openapi/api-metadata-service.yaml index 231e1d3c2e3516dd3be5c7bccb40dd6602dfb337..11591e0d7bd446852b52045fb046368f6e790c54 100644 --- a/.docs/.openapi/api-metadata-service.yaml +++ b/.docs/.openapi/api-metadata-service.yaml @@ -11,11 +11,11 @@ "name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0" }, - "version": "1.9.0" + "version": "1.9.2" }, "externalDocs": { "description": "Sourcecode Documentation", - "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9.0/system-services-metadata/" + "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9.2/system-services-metadata/" }, "servers": [ { diff --git a/.docs/.openapi/api-search-service.yaml b/.docs/.openapi/api-search-service.yaml index ee2f2a21adb14b8ca19448b9dcc5e291fddb5603..df4123760083023cdc46fe851a286b533b8c517c 100644 --- a/.docs/.openapi/api-search-service.yaml +++ b/.docs/.openapi/api-search-service.yaml @@ -128,7 +128,7 @@ "url": "https://www.apache.org/licenses/LICENSE-2.0" }, "title": "Database Repository Search Service API", - "version": "1.9.0" + "version": "1.9.2" }, "openapi": "3.0.0", "paths": { diff --git a/.docs/.openapi/api.base.yaml b/.docs/.openapi/api.base.yaml index ec62afe97aecd1bec6123351f40076ee7591881b..75f7de6d14d6d57799bf9720c47d772967f3d996 100644 --- a/.docs/.openapi/api.base.yaml +++ b/.docs/.openapi/api.base.yaml @@ -24,7 +24,7 @@ info: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0 title: DBRepo REST API - version: 1.9.1 + version: 1.9.2 openapi: 3.1.0 servers: - description: Test Instance diff --git a/.docs/.openapi/api.yaml b/.docs/.openapi/api.yaml index 3ed4b4aea0880a0f2f874f2e042930eb411752c0..688c3e4bc14aaff6292c1a134f16b8abe3a10642 100644 --- a/.docs/.openapi/api.yaml +++ b/.docs/.openapi/api.yaml @@ -16,7 +16,7 @@ info: name: Apache 2.0 url: 'https://www.apache.org/licenses/LICENSE-2.0' title: DBRepo REST API - version: 1.9.0 + version: 1.9.2 servers: - description: Test Instance url: 'https://test.dbrepo.tuwien.ac.at' @@ -982,6 +982,105 @@ paths: security: - bearerAuth: [] - basicAuth: [] + '/api/database/{databaseId}/grant/{userId}': + get: + tags: + - grant-endpoint + summary: Get grants + description: Get the grant permissions for a user of a given database. + operationId: find + parameters: + - name: databaseId + in: path + required: true + schema: + type: string + format: uuid + - name: userId + in: path + required: true + schema: + type: string + format: uuid + responses: + '200': + description: Access found + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/DatabaseAccessDto' + '401': + description: Not authenticated + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + '403': + description: Not database owner or foreign user + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + '409': + description: Grants malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - basicAuth: [] + - bearerAuth: [] + head: + tags: + - grant-endpoint + summary: Get grants + description: Get the grant permissions for a user of a given database. + operationId: find_1 + parameters: + - name: databaseId + in: path + required: true + schema: + type: string + format: uuid + - name: userId + in: path + required: true + schema: + type: string + format: uuid + responses: + '200': + description: Access found + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/DatabaseAccessDto' + '401': + description: Not authenticated + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + '403': + description: Not database owner or foreign user + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + '409': + description: Grants malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - basicAuth: [] + - bearerAuth: [] '/api/database/{databaseId}/subset/{queryId}': put: tags: @@ -1452,7 +1551,7 @@ paths: authentication. Foreign user information can only be obtained if additional role `find-foreign-user` is present. Finding information about internal users results in a 404 error. - operationId: find + operationId: find1 parameters: - name: userId in: path @@ -1544,7 +1643,7 @@ paths: authentication. Foreign user information can only be obtained if additional role `find-foreign-user` is present. Finding information about internal users results in a 404 error. - operationId: find_1 + operationId: find_11 parameters: - name: userId in: path @@ -4680,6 +4779,50 @@ components: - code - message - status + DatabaseAccessDto: + type: object + properties: + user: + $ref: '#/components/schemas/UserBriefDto' + type: + type: string + enum: + - read + - write_own + - write_all + example: read + required: + - type + - user + UserBriefDto: + 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 + required: + - id + - username TupleUpdateDto: type: object properties: @@ -5296,35 +5439,6 @@ components: - query - query_hash - query_normalized - UserBriefDto: - 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 - required: - - id - - username CreatorDto: type: object properties: @@ -6263,21 +6377,6 @@ components: - is_schema_public - name - owner_id - DatabaseAccessDto: - type: object - properties: - user: - $ref: '#/components/schemas/UserBriefDto' - type: - type: string - enum: - - read - - write_own - - write_all - example: read - required: - - type - - user UserUpdateDto: type: object properties: diff --git a/.docs/api/analyse-service.md b/.docs/api/analyse-service.md index db44f66efda6557a1bbbc84e3b5448646a7368e4..13f9956db04a808febcdc6dd5572888a0b923644 100644 --- a/.docs/api/analyse-service.md +++ b/.docs/api/analyse-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.9.1`](https://hub.docker.com/r/dbrepo/analyse-service) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.9.2`](https://hub.docker.com/r/dbrepo/analyse-service) * Ports: 5000/tcp * Prometheus: `http://<hostname>:5000/metrics` diff --git a/.docs/api/data-service.md b/.docs/api/data-service.md index 4f7a1a30ec80a8e77c403f04aaabb54ee52c8f97..cec568c4324194a37bda5b3aba72f7b9cde74d35 100644 --- a/.docs/api/data-service.md +++ b/.docs/api/data-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/data-service:1.9.1`](https://hub.docker.com/r/dbrepo/data-service) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/data-service:1.9.2`](https://hub.docker.com/r/dbrepo/data-service) * Ports: 9093/tcp * Info: `http://<hostname>:9093/actuator/info` diff --git a/.docs/api/metadata-service.md b/.docs/api/metadata-service.md index af1ecb4a681cd31b5a2208c3bf4975072e52e231..bb5504676fe85ec4bd0417e41dcc35bbca90c2d8 100644 --- a/.docs/api/metadata-service.md +++ b/.docs/api/metadata-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.9.1`](https://hub.docker.com/r/dbrepo/metadata-service) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.9.2`](https://hub.docker.com/r/dbrepo/metadata-service) * Ports: 9099/tcp * Info: `http://<hostname>:9099/actuator/info` diff --git a/.docs/api/search-service.md b/.docs/api/search-service.md index 25f08adec993d5c1ba1f74c0ac9c25a493a0816d..86928387a4eabac8ca9b314fa9cb098a8dbe654a 100644 --- a/.docs/api/search-service.md +++ b/.docs/api/search-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/search-service:1.9.1`](https://hub.docker.com/r/dbrepo/search-service) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/search-service:1.9.2`](https://hub.docker.com/r/dbrepo/search-service) * Ports: 4000/tcp * Health: `http://<hostname>:4000/api/search/health` diff --git a/.docs/api/ui.md b/.docs/api/ui.md index 2f46559e2c165de333b1dcc5d5b92ea86f1043c2..09127fe8504ffc9eb565b4e761623d55dca51cc5 100644 --- a/.docs/api/ui.md +++ b/.docs/api/ui.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/ui:1.9.1`](https://hub.docker.com/r/dbrepo/ui) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/ui:1.9.2`](https://hub.docker.com/r/dbrepo/ui) * Ports: 3000/tcp diff --git a/.docs/changelog.md b/.docs/changelog.md index df198bb9d14efdc8a7508839174b992252faf50b..8ea8897f5264d2bcb2c41bfbc0dbf073a051ea35 100644 --- a/.docs/changelog.md +++ b/.docs/changelog.md @@ -7,6 +7,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [UNRELEASED](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags/v1.9.2) - 2025-06-?? + +#### Features + +* Added an endpoint to check for database grants and display them in the UI (Database > Settings) for the owner + in [#536](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/536). + ## [v1.9.1](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags/v1.9.1) - 2025-05-31 #### Changes diff --git a/.docs/index.md b/.docs/index.md index 833e5db5f7154175294b1f403cc36780c0a61b3c..711906f2e0138d6846b90633a2479a4e6176cd5e 100644 --- a/.docs/index.md +++ b/.docs/index.md @@ -14,7 +14,7 @@ author: Martin Weise   -Documentation for version: [v1.9.1](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). +Documentation for version: [v1.9.2](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). DBRepo is an open-source database repository that cover the data life cycle supporting data evolution, -citation and -versioning. It implements the query store of the [RDA WGDC](https://doi.org/10.1162/99608f92.be565013) on diff --git a/.docs/kubernetes.md b/.docs/kubernetes.md index 3fb005e58046f287840dcd2436da81dd397bbe81..53243bff89012d1629427c694dcb4f6fef098142 100644 --- a/.docs/kubernetes.md +++ b/.docs/kubernetes.md @@ -14,7 +14,7 @@ helm upgrade --install dbrepo \ -n dbrepo \ "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" \ --values ./values.yaml \ - --version "1.9.1" \ + --version "1.9.2" \ --create-namespace \ --cleanup-on-fail ``` diff --git a/.env b/.env index f72626ab5ef38013f5672b522006ea410925ead0..d191e59edda36e8ca7795d1da35710d28129cfdc 100644 --- a/.env +++ b/.env @@ -1,4 +1,4 @@ -APP_VERSION=1.9 +APP_VERSION=1.9.2 FLUENTBIT_VERSION=4.0.0 GRAFANA_VERSION=11.4.0 MARIADB_VERSION=11.3.2 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c3a44109fa41b9ef5bc75363635307d48ab7557e..6022f8b31775da44e5202bd2dd77daf81de702fb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -12,9 +12,9 @@ variables: REGCLIENT_VERSION: "0.8.2" BUN_VERSION: "1.1.40" DOC_VERSION: "1.9" - APP_VERSION: "1.9.1" - CHART_VERSION: "1.9.1" - SUPPORTED_VERSIONS: "1.8.0, 1.8.1, 1.8.2, 1.9.0, 1.9.1" + APP_VERSION: "1.9.2" + CHART_VERSION: "1.9.2" + SUPPORTED_VERSIONS: "1.8.0, 1.8.1, 1.8.2, 1.9.0, 1.9.1, 1.9.2" SUPPORTED_ARCH: "linux/amd64" MAINTAINED_SERVICES: "analyse-service, auth-service-init, dashboard-service, dashboard-service-init, data-service, metadata-service, search-service, search-service-init, storage-service-init, ui" CACHE_FALLBACK_KEY: "${CI_DEFAULT_BRANCH}" diff --git a/.s3cfg b/.s3cfg deleted file mode 100644 index 5d33284185529b63eca11f14dad396e3b3485cfb..0000000000000000000000000000000000000000 --- a/.s3cfg +++ /dev/null @@ -1,8 +0,0 @@ -access_key = seaweedfsadmin -secret_key = seaweedfsadmin -# Setup endpoint -host_base = http://localhost:9000 -host_bucket = dbrepo -use_https = False -# Enable S3 v4 signature APIs -signature_v2 = False \ No newline at end of file diff --git a/Makefile b/Makefile index e13bb9ce88ef7c638bfb69a318c03cf3d8864fe1..ff09f43cb1bf17febbbd5764cb3549f50bd32df3 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ .PHONY: all -APP_VERSION ?= 1.9.1 -CHART_VERSION ?= 1.9.1 +APP_VERSION ?= 1.9.2 +CHART_VERSION ?= 1.9.2 REPOSITORY_URL ?= registry.datalab.tuwien.ac.at/dbrepo .PHONY: all diff --git a/dbrepo-analyse-service/Pipfile b/dbrepo-analyse-service/Pipfile index 6ea296ccf99e239de5b6e65f140044176b839489..2151ebe9ad563dcb7a91443050b229f18e068417 100644 --- a/dbrepo-analyse-service/Pipfile +++ b/dbrepo-analyse-service/Pipfile @@ -21,7 +21,7 @@ numpy = "*" pandas = "*" minio = "*" pydantic = "*" -dbrepo = {path = "./lib/dbrepo-1.9.1.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.9.2.tar.gz"} opensearch-py = "*" ecs_logging = "*" diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock index 7d7a367358c6455c3a35bd2b382adc1bb6101358..c5870383ba6d34725b078b96f6dee6ced25d1ba1 100644 --- a/dbrepo-analyse-service/Pipfile.lock +++ b/dbrepo-analyse-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "683dd8c657d5355de5fbe9fb26daa0807a4b6a5d66f8293468a7bbca16ffa88c" + "sha256": "e7cad9c3a5bea16afca5b7fa00c5d81a390fadf857606d4ee96555c1f3c8db30" }, "pipfile-spec": 6, "requires": { @@ -323,10 +323,10 @@ }, "dbrepo": { "hashes": [ - "sha256:32a72a27077bcaefafed362feae8c025348ed222b438e0dfe855779aed686584" + "sha256:57796d53aabbfea68cc48bb238e1cdb00efc28df196fb80121affa589cce641f" ], - "path": "./lib/dbrepo-1.9.1.tar.gz", - "version": "==1.9.1" + "path": "./lib/dbrepo-1.9.2.tar.gz", + "version": "==1.9.2" }, "ecs-logging": { "hashes": [ @@ -971,7 +971,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.9.0.post0" }, "pytz": { @@ -1200,7 +1200,7 @@ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.17.0" }, "typing-extensions": { @@ -1713,7 +1713,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.9.0.post0" }, "requests": { @@ -1737,7 +1737,7 @@ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.17.0" }, "testcontainers-core": { diff --git a/dbrepo-analyse-service/app.py b/dbrepo-analyse-service/app.py index 2dfd301e720859c15e18d8f0aac7bcafcf55a7ac..9f816f7e32c872bac6bd29a921876856757cd835 100644 --- a/dbrepo-analyse-service/app.py +++ b/dbrepo-analyse-service/app.py @@ -199,7 +199,7 @@ template = { "info": { "title": "Database Repository Analyse Service API", "description": "Service that analyses data structures", - "version": "1.9.1", + "version": "1.9.2", "contact": { "name": "Prof. Andreas Rauber", "email": "andreas.rauber@tuwien.ac.at" diff --git a/dbrepo-analyse-service/lib/dbrepo-1.9.1.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.9.1.tar.gz deleted file mode 100644 index 8aca96aacad8cc90c6a0d978c49b4bc0bdeb032d..0000000000000000000000000000000000000000 Binary files a/dbrepo-analyse-service/lib/dbrepo-1.9.1.tar.gz and /dev/null differ diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.9.1-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.9.2-py3-none-any.whl similarity index 92% rename from dbrepo-dashboard-service/lib/dbrepo-1.9.1-py3-none-any.whl rename to dbrepo-analyse-service/lib/dbrepo-1.9.2-py3-none-any.whl index 3d97921b6a82ef23d9c32a22c8db6d74a09b400a..658217e61233bd386c2abead7a1aee64b7a14781 100644 Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.9.1-py3-none-any.whl and b/dbrepo-analyse-service/lib/dbrepo-1.9.2-py3-none-any.whl differ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.9.2.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.9.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..cc536fecd0b417e82a49442320b056d6da14d4ed Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.9.2.tar.gz differ diff --git a/dbrepo-auth-service/init/Pipfile b/dbrepo-auth-service/init/Pipfile index 85449bc7e2bb8e9a7d230136aa7ef8c3f7e41ccf..1a91e97fcbf063210a7cb1d729566dc95f747586 100644 --- a/dbrepo-auth-service/init/Pipfile +++ b/dbrepo-auth-service/init/Pipfile @@ -7,7 +7,7 @@ name = "pypi" requests = "*" mariadb = "*" ecs_logging = "*" -dbrepo = {path = "./lib/dbrepo-1.9.1.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.9.2.tar.gz"} [dev-packages] coverage = "*" diff --git a/dbrepo-auth-service/init/Pipfile.lock b/dbrepo-auth-service/init/Pipfile.lock index b5f520be9b2bd0324926955b66bf9456780283c9..60243d8ccdd96ab77adc8c81410a0a2b352cf541 100644 --- a/dbrepo-auth-service/init/Pipfile.lock +++ b/dbrepo-auth-service/init/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "abe8b909c2f90002157de747a21ae3607758fc775e59de0657b7c33d945e752a" + "sha256": "6fd3a7e6af693bf9a3ad1367d54f826a2ec47441981a2c94a19dcb104200823f" }, "pipfile-spec": 6, "requires": { @@ -132,10 +132,10 @@ }, "dbrepo": { "hashes": [ - "sha256:6cde515183d5f4644ebbc26f06155a474b42ab2a4699f03dfe77fc28688b45a1" + "sha256:b9079a9a97d7112459df40cbc8e63302848e4cd995a5bd0fe69d52b99e670be7" ], - "path": "./lib/dbrepo-1.9.1.tar.gz", - "version": "==1.9.1" + "path": "./lib/dbrepo-1.9.2.tar.gz", + "version": "==1.9.2" }, "ecs-logging": { "hashes": [ @@ -413,7 +413,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.9.0.post0" }, "pytz": { @@ -436,7 +436,7 @@ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.17.0" }, "typing-extensions": { @@ -718,7 +718,7 @@ "sha256:fd9fb7c941280e2c837b603850efc93c999ae58aae2b40765ed682a6907ebbc5", "sha256:fe46d4f8e94e637634d54477b0cfabcf93c53f29eedcbdeecaf2af32029b4421" ], - "markers": "python_version < '3.14' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", + "markers": "python_version < '3.14' and (platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32'))))))", "version": "==3.2.2" }, "idna": { diff --git a/dbrepo-auth-service/init/lib/dbrepo-1.9.1.tar.gz b/dbrepo-auth-service/init/lib/dbrepo-1.9.1.tar.gz deleted file mode 100644 index 8aca96aacad8cc90c6a0d978c49b4bc0bdeb032d..0000000000000000000000000000000000000000 Binary files a/dbrepo-auth-service/init/lib/dbrepo-1.9.1.tar.gz and /dev/null differ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.9.1-py3-none-any.whl b/dbrepo-auth-service/init/lib/dbrepo-1.9.2-py3-none-any.whl similarity index 92% rename from dbrepo-analyse-service/lib/dbrepo-1.9.1-py3-none-any.whl rename to dbrepo-auth-service/init/lib/dbrepo-1.9.2-py3-none-any.whl index 3d97921b6a82ef23d9c32a22c8db6d74a09b400a..658217e61233bd386c2abead7a1aee64b7a14781 100644 Binary files a/dbrepo-analyse-service/lib/dbrepo-1.9.1-py3-none-any.whl and b/dbrepo-auth-service/init/lib/dbrepo-1.9.2-py3-none-any.whl differ diff --git a/dbrepo-auth-service/init/lib/dbrepo-1.9.2.tar.gz b/dbrepo-auth-service/init/lib/dbrepo-1.9.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..cc536fecd0b417e82a49442320b056d6da14d4ed Binary files /dev/null and b/dbrepo-auth-service/init/lib/dbrepo-1.9.2.tar.gz differ diff --git a/dbrepo-auth-service/listeners/create-event-listener.jar b/dbrepo-auth-service/listeners/create-event-listener.jar index 8df9e19da6675b86f1b5755a9cec8c8e1044b11f..fb1458371a5ce51be8ca63a9421a621e0ef09ce3 100644 Binary files a/dbrepo-auth-service/listeners/create-event-listener.jar and b/dbrepo-auth-service/listeners/create-event-listener.jar differ diff --git a/dbrepo-dashboard-service/Pipfile b/dbrepo-dashboard-service/Pipfile index ee805c077b60ab4a8a6f348ff819da0b568c0614..3bef7a534bc707e491b77217ba369792efa38bdf 100644 --- a/dbrepo-dashboard-service/Pipfile +++ b/dbrepo-dashboard-service/Pipfile @@ -12,7 +12,7 @@ prometheus-flask-exporter = "*" python-dotenv = "~=1.0" jwt = "~=1.3" pytest = "*" -dbrepo = {path = "./lib/dbrepo-1.9.1.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.9.2.tar.gz"} gunicorn = "*" pydantic = "*" flask_httpauth = "*" diff --git a/dbrepo-dashboard-service/Pipfile.lock b/dbrepo-dashboard-service/Pipfile.lock index 3a969a61b14fdd52c18acaf14d9e5fce80ce08e3..e5d5310417014313ceff9beed6977437d16beefa 100644 --- a/dbrepo-dashboard-service/Pipfile.lock +++ b/dbrepo-dashboard-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "4addd51108f7ad13a3a58c75b68a40dbfe8fa1ce02622f00741cea9c3c3a3ae7" + "sha256": "942ef7f6536e2ec7960d3a899d236db8409c093d6fd3e4135394db4a00254937" }, "pipfile-spec": 6, "requires": { @@ -272,10 +272,10 @@ }, "dbrepo": { "hashes": [ - "sha256:b6d7b9f5efeade2274249f1e48517820dd58dce5b24c0bf092cb4fc4be59c602" + "sha256:b9079a9a97d7112459df40cbc8e63302848e4cd995a5bd0fe69d52b99e670be7" ], - "path": "./lib/dbrepo-1.9.1.tar.gz", - "version": "==1.9.1" + "path": "./lib/dbrepo-1.9.2.tar.gz", + "version": "==1.9.2" }, "ecs-logging": { "hashes": [ @@ -880,7 +880,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.9.0.post0" }, "python-dotenv": { @@ -959,104 +959,104 @@ }, "qh3": { "hashes": [ - "sha256:02130af8f4d5f58ae858bd0b90358bf4607b4a6be16d254c4a81527a48306111", - "sha256:032221480f04cce330988c4acdc5527ccf31515b02c7a15257530b00a1b16a46", - "sha256:04b1682d4b4199b7ddbc7367dad4e52c23e5e33def9bf47b30ba2a5a75d77337", - "sha256:074f9c6765f6753cf69f786325f7bbe7c943ae23e23af43db59c240376c21c41", - "sha256:08c96471e452bace59e4daedb6d51db047dac3737f359293e276ab466ea98fe2", - "sha256:0af350c466eac335d5984d6ea8f40bc186ec6ae34f11c2b2109bf63863b88846", - "sha256:0d175c13eb8b255b0bcb0044546bbc2cab8bd8af354ed222a9d4d38a60c3815d", - "sha256:0e0a1a1890d3e74a8b48b735ac3c52c26653e27edaa1fda1b9f533c9b0c57cff", - "sha256:0e448cbeb887e7ccd30551812ee9a32e2bf6d9e13fb97976426dd15d2c6fa9bf", - "sha256:0eee72469ea4befd0e87dab58c359417f42e80a1d1ca7c2ac4a27b89158c5075", - "sha256:118e6a141001a204536044e07ac3908bc4c8f3fe42caefae64281ff2de0860ac", - "sha256:1537270b7affb352d9c6ae5f303aaa513ac22df1b7795b317cfcec1cbc31c84e", - "sha256:156219090c0dff9e7256b069bb83a8ebebea32d5478a92ee9b9de40e22ee22d6", - "sha256:1d7c6ec44dd0a0f44c3beb128401af9233f155a45995d278e79722d561cd73a4", - "sha256:1eed1e1873427bd56f130320f8827ceb0f70600321fffe429e544ea9249ee865", - "sha256:2263d18b75d4320f5626490b9ea9181944b552f9e2e3a40bd4dbfe3705c700ff", - "sha256:2713476b262346ed8d9cb0afb6c1c2475417cdfc18c607e28d834da63731d072", - "sha256:27892c4d79629c8a1e9a989f9a9a22b8141b515fe2b120f55b1731933ff24e52", - "sha256:279b5961b094c6fb13548612298019297156cd718e999e666bf947fb47933435", - "sha256:29980aefd4778aa21d5a45a34cc4b9ca7f1635160f6938de2927c4a69d1aa735", - "sha256:29e4d422cd858a4e284336eeda167ddc3c669eea61a772efe4341b800478f89f", - "sha256:35c7b38458520301298b0cc6d979907bc59b71ba4a87fc5e487536ea65a2d517", - "sha256:3682dc975e6d42a77186f568f39f69ff6319e9d9117b03d2af116742c8289a57", - "sha256:37003232c34f0777e8c009a75a6a44bc9edf14065298d290acc75561cc8a7244", - "sha256:3cf1720799a5546462ff33bd81e25d88e1f4b220aa9935613b7460ab0c614d74", - "sha256:3de0c67c3de5ce9c35ac507f31bdde7e081a128ef13665a6534af065bdd40976", - "sha256:4017f07629338c9a86de6b6d8e5fa34b62ee8ea6efec77a283f3166c0db532e3", - "sha256:45ee055192d5e81751be864774f66a4113ff96e3b8565242ae957f734ffb2f36", - "sha256:4bb12cacf16952fa4b19618386fe132c9d8984dfa38e73a3a57043cf773b7663", - "sha256:4c055867471392fafe314ed2296fc009552c85af1405feba3381148cbcc38956", - "sha256:5001f0460f222bd32b08cc03d6692cae7e7b9669678fcd5b7f555a768c3360f6", - "sha256:52ad639c3e04e31be880ed0808616f15c1a14bd65e3ba812373207d287fe01ca", - "sha256:556b305f8d9bce5da8c99563521415b9e6e43d3bc4781a7f2da2a43e8735a30d", - "sha256:565cfe50e199689d3d34670b85e57394e33f399d1ab3167deb26d4f888d1865b", - "sha256:56f83ecde8656052669ccb32897fa15fbeb5427d6d550b5df1fd56b0a7e51908", - "sha256:576dc2cd85336735b9e33a9a226977b347c37fb92445d13a2c95790186eda147", - "sha256:586510eb7e6fc1c0d8cb0234fed2c0e4d19c873d39c6bca0f6c8899cc1355e6d", - "sha256:5c81df3b745e6a8ef758f027823525e880dfbe10e6e1d417146df447f29b8590", - "sha256:5c82b561c82f8883672d2f5eee55311759bdeef2143378d9e90b36558492c652", - "sha256:6104cf7ca8c6351546d28600a497bf1a205b833295af47d23aa32afad422d84c", - "sha256:618ec54a581fbf1580f3611c828ff01e16b57eadf69dc67f71494b2c36624568", - "sha256:63c0e51b6d24aa9a86a8258966a00554a7876b4c0f634fb60fbf28cccfee72a2", - "sha256:64c0b076acae5cd2cbffd38f4aa612c71e4a5fe9d828f4c740a1d6bf872a765f", - "sha256:67c30e47c489ca9102fa64f6fe0d6eb388b57ec68059a7fa8baaa06c5bb47e1b", - "sha256:68e45279615c561fe90dbffd7cc3406137b0a1dced328469f340e9a8fa9be522", - "sha256:6cf1fb74c6811ba940b284cab987fed61aeb13bdbe7e3700b0316795409fcb70", - "sha256:6ebfddd19dd046ee9f0e886120d8840177af24571f6c439747689759c0c51339", - "sha256:744664c6e23ee8643a309ff9f8c390a9a367c476380c82852bf05b1bf718f163", - "sha256:75d879d67457c079012f096dcbaa8d040ec43aa97210d6096bc3ff6be8eb1099", - "sha256:7656090018fb5629c504373b80116e30e54dc1be88df88f2a736a18370dd7a20", - "sha256:80157816dbbf89f372e9b971f0168a886b4520686b92a973f67051064663a4be", - "sha256:83334c95f7f5f1c39b5d4053f953500f85bcddeaa3ff85904079773d5504ca6a", - "sha256:8429531a674fc81843272b23e8b918651ca4082e54073266a19e7ac2a77fe203", - "sha256:848d71c5f6750513401a28e64ed1094706f83157f2203342f9355f00ffef5b85", - "sha256:857ded39921b556ec13d318d62aa0734c1ffbc415d5595366327fdb73b020404", - "sha256:8bdf93cff9d7283b809320f1ceff9f1bc9df2a8e912f6ba511614f648da91ede", - "sha256:8dbc83e5d1be9596c48446daa5f6039a3b7df13a3943f4519d6423bf3ccfedbf", - "sha256:8ec3c943a37d57ec836b23b0c2f28a389ecc7a2e690aaeda5b44debd04762972", - "sha256:91072f72f302ae307ee62b32ce1903cd9b5298e3e4ed08701be5714eaa1051c6", - "sha256:9888d7ce62ce2bbc252a88adf482a2ab561aada3ac50654f2ab730da60d4ef6d", - "sha256:988e53cbed460577ea2f692a30bbbb9d5963bd0e8bd26f7d20ea83b170320e65", - "sha256:9a1a175a0b8732c3e60dcb5595c3f6da66da8c70abb22bbaa67dbca82e91e435", - "sha256:9db78edb44d4ef978329df38f417dee8a20dd65ef67800b9013f81e21f9396cb", - "sha256:9e164eb332547143efdf6c0cdb013651edf0697e320dbc175a7358bfb253fb97", - "sha256:9fc6c3acce1c274f36d4653ef1e1055d24222d23791f37cdf82a533fe65bde7c", - "sha256:a416cfb018da01be25c3a7b730c25fbfc395c3df82c45798e87fa5ad4ad81d34", - "sha256:a43bbd5e68e9dac7f858aa592a12b606e34b16c478acf36ae3c24ff49c1ea24d", - "sha256:a4d41cb5b8c045fa233b32b1020937fe6443af0e269b355e8368a5ccad7356df", - "sha256:ab83c97bc8422a4ee68bbb350fcc41904d3c982dd8046fdb08fb046b40edfd35", - "sha256:ad51c81a29d2c67e8bd92684cb27a7cdc099d4414a769beadcfc999a9a87d9e2", - "sha256:adea2aecc6da81ebbc2048821bd23bdf1e09dc116d56cfef9018a8e7ddfed822", - "sha256:b4a2bb4ac2243504b002c95010fd78cc1709ca8be45ee9fd90b695d458fb59a1", - "sha256:b9881d8e11137270e8ff21e8ac300cd317cb3bf089ed81b6c59b44f5fbe5f7ca", - "sha256:c056b9cd280c11c261113fbad7e3cbfb734b06421fddc69a7bb922b604aa093d", - "sha256:c10e95f060e46d0946b2f883c4ae4ed9950475839e4c5763a366bd6f11246c66", - "sha256:c3576dac1c92bd09775bded18f496dacb6095973449891be3ada1836aa226bb4", - "sha256:c8122efcc01ce7e44591aeb19d67e9fb8c8e465fd5022ce9cd3c728230591b38", - "sha256:c8e5d8c65eefc931a340eb81b65d6e24e2ed2950801ae30e58ff4f368a7ecb88", - "sha256:cbb5c52ee5c481bd9a58bd87f36c497268afd6fca6e8704d05ab53b81074e504", - "sha256:cd64add5819480cc0a4cb59d4579df37bf95ebb7616eb0d70ceabf6e6599b4a4", - "sha256:cde2021162748e54fa5cbd5bf8536c9db0a425eec5d28750d2ec2369fdc38b93", - "sha256:d382e87ae4197d36e06f26f87a636aa27592f57473a1569cc64a38200f27ed7e", - "sha256:d4c1b8a9f3fa2d3ea63b28875c780d24f2652a9dd53a2fe76fb1454598bc10d8", - "sha256:d7382e6f3569ac84249c7fc590b2290b0438c7b4ee67f397b598c789faafda58", - "sha256:dbdf95ce396e5c23417d2c7716fd650b0408de302c1334dd535b1e2bed2e4857", - "sha256:e44f6a7a4ed46543d9d8f49674ed8b38f28f68561a39d01a5929222403985f0a", - "sha256:e7ddad0e0f1ca8aae5fc457ccde940481c2a0323ac04eed015b4a97891df0ca9", - "sha256:e8aa3bde1ea6a693c5f3d31b3296c253865708583250dd9d2a58af0b11176e70", - "sha256:e9c3da7831ae7221fe82938a6c1f8e87ec230e093dece3759110ae57a119ad91", - "sha256:ef787b45d545b403094e81b6b99ae4b8142ed219b23e2488cf062f97bc0e1416", - "sha256:f345cd2e0b1f26b7e13eadab78d53de9b9011c14b44a9a0c58a7d2466234efb0", - "sha256:f43c7048f64f8e2d1461226af8bafaafc243c571ca5c88baa56b89b2db7b314f", - "sha256:f93178ccf0d8325b66c755bd0273359d2a2a0dbb408af28cee05aa902b501869", - "sha256:fa1bf4d9838e4c8cdf309500a908fc412cdc325a63e5c74ad88a794bed16c943", - "sha256:fcdd2f6b1b1500bde96b442d777a563eadca1b825db0c42ac6aef45ad9ec3c4d" - ], - "markers": "python_version < '3.12' and (platform_python_implementation != 'CPython' or python_full_version > '3.7.10') and (platform_system == 'Darwin' or platform_system == 'Windows' or platform_system == 'Linux') and (platform_machine == 'x86_64' or platform_machine == 's390x' or platform_machine == 'armv7l' or platform_machine == 'ppc64le' or platform_machine == 'ppc64' or platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'arm64' or platform_machine == 'ARM64' or platform_machine == 'x86' or platform_machine == 'i686') and (platform_python_implementation == 'CPython' or platform_python_implementation == 'PyPy')", - "version": "==1.5.1" + "sha256:0083b52578a54f04957527f28c9016736242efb8c2b5e589e027ab8b2e1916a2", + "sha256:025d7331c8bb45bf7d02c1c0bc8ec9b5a9054b891e865ff679753c22da8bc6c9", + "sha256:02856422f3009270990ebdee6a2e29f1f1167b1fe8260c62810b6bfb7d86740d", + "sha256:04151e6ce7c3aaaca7d850a2b7dcc769f1356581af178649ab5e6f2aa78b0304", + "sha256:04c18ca8ebdeda8ab60cb72a43f2c5d730446705f5060854eb21167b0d21097e", + "sha256:0529b9ee9b37f3ccf2833d558e7ad1846596e36f1916a23c0c1af825f07549be", + "sha256:087bf1a4b3a6809112b1a22f50dd0dbd86eb991971b036d2f3a650c79d81fe29", + "sha256:0a87ecebdf3a3216ecbbd32d6c3cbabcd3f90d1a24363fc6aeea3af99d7c394b", + "sha256:0ca013329d0345d4d203f24e12e5adde3bc393571d55c02b8279efd1cf7fd818", + "sha256:0eac427589488b069293fb2d06a2d765a4aff77ae74990c566fe161542493bac", + "sha256:134939418800fad4e669bb6ce4e7c4e303e5d40d2ff457add9ccd99e64cbbf64", + "sha256:1399e604c7ac178758eecdefdfae0bed37f52a792101ee8e32dc594ca2350c0d", + "sha256:13fc96388d3010377b52aa3059141568dd4ba35c0d2f3f39b60244fbd4f70b79", + "sha256:1735afdce2c3d924da8c4b7f5da5d1020c14981b472e94052e2ec351b1b67068", + "sha256:238b185d8d1c41907a093201e389127cffbfbb013141fd9fed98609c0adcfb45", + "sha256:2800f9fabec12e4e3ba40cdce65ded9b951f6d5374ec7021be667db88e496a38", + "sha256:2ae6a3170f14c49b0733aeb71bfbdb98962d05a3502e2e4f2a056eae76c34800", + "sha256:2b928f026cef5eecd530a1a546a468eca8ac71aebc9eaf864b5ff54aebb4a63e", + "sha256:2f1997b95fd66835e3a372a6c21062a35ca870bdd1687867c09e1d8f91980df0", + "sha256:3bb915e2a46b0d2364e74e7c7c85a9b0d5c473a0bcfcd27a2ed6923773b0216c", + "sha256:3d7fb7ec47465c40af3c0471a14f2a4af8f0c1af95a0476ef4ac6eacf18b2b1e", + "sha256:3de09f8d58eb69f8d8a9bc1a77982001c1d43df27544512d2a89d00911dfa40c", + "sha256:4341c2e53b3f1a5ed065dd2be4f7ff23e0b1708397bb66c19e6b898377fe941c", + "sha256:45937d8be16030d1c6da5dcfff10bbba35a7f5bd5f96de45045fd8fbea033df4", + "sha256:465c7efc5bb33ee90da4d29580ad0f57efd897c4184f575e77653514e9a058cb", + "sha256:4707bdb76176b00cb4bd0d27d8ccea41fc86fbff7479cc9812aef0a23ffc6813", + "sha256:486065b50f7787e2f62c918b619bc34c06d8a66e1f1bd4f66cb449a2e467f3a5", + "sha256:4bb83c8437d7c43bda7006240fc95dc119d2569dab30a20b428dbf058f686a2b", + "sha256:4e7dff6ffc3ed19be9b2e42ea58ef00bc0435f2a950f3320eed932b1dff325b7", + "sha256:548b31b6d1bec0b11813c74ed3c94664aeeeef4ba51a3ac312fe471962e58442", + "sha256:585ebc0d5a415fa1042189c7c98bd93e63813c38e2d6e1581181f99e2bc7aea7", + "sha256:5ac050fce6407914b32ab84366fc15f00c6a7aad33c7116dc29ac441ded3bce6", + "sha256:5c1d3f12442b7c43db7753eaf914e9644b8a90d97798206dc6a1444a4a06ddcb", + "sha256:5f963a886bc882cba39091568e225ab36b882ae24eb2a965256c5f63e6b7eafa", + "sha256:62115845fb1695d1d018e995eae90dc2b53da9a30127e264e5cd370384358178", + "sha256:6341cddfd43d962c77849358ed7ae98022949ac8155ee9e97dcb3000edd73613", + "sha256:6380a52e146227bf420af66803f8c4b54627129f49631ba9f9b058bed92de51a", + "sha256:657442ae3d713f88c8ac8c7bf047da4e1cee4f6cc2aff254a7e7d4e2cc5d9d7a", + "sha256:66a6c77d667a848f39fc153675c2d53bce7ad068d8ce7d651da79a5d43672a81", + "sha256:66c01e2d825587a7b06062b4f05373c7ec3191939f6b744192403863078ddf41", + "sha256:695f0b5ab6a886fd3d1089eed50a4815136e84583b5d426c0de11db24274dff8", + "sha256:6975abfe6d21f0f2a74109aab4b9e9071d215f0ae38b5760e070d4c027187fcb", + "sha256:69c5f38e00cb41ceea8f6d9f82b76a10cd4bd0f5612551f841ddcc335df5e88b", + "sha256:6b8baa1c9789945de14571e48bed5996440171f5dd91589d9572ece6db8aa09d", + "sha256:748587c5fd4216d44fedcdfc8b03320e36f2eba6ab373cbf337448583ff37f16", + "sha256:74e3d7265edc7268f3eb54b8d0623a2b5adea8e272cc124818686bc6583a4645", + "sha256:7d9d83f65e778a421a24e4eb82de22cbac3f94ac09637309890465bf5592a5ce", + "sha256:7db6eddc5c19730e92cca95c2a2a7bca184637d854720e33367466db9f428708", + "sha256:8022106a134c142f4a1e774be4ae6a2be4e480586de65c0b13658e9e329aea7d", + "sha256:819a5733de1a2407b738105f99b323a1fe31f687a701c29566ae934fa893224f", + "sha256:844d7ff5a5081f6920d726518860a76138f97763ce6c4206c06756844f0c1645", + "sha256:892c335cbd1ac5786229aa6b8987250dbb7f7b0bf3775b56ca11cde6090bcb30", + "sha256:89a19e6af701e525b7c0e4e589d8fa0dcf9f1deddb9eee171fa941a0add93ffc", + "sha256:89b24c3060cfdf8e61926af5271632f656bee689b6c95c36b85d2c79ec04c757", + "sha256:95efc1710dc4d4a7fff837a603a7bc4370449c87bdaecafdf290226e82303b52", + "sha256:968b1d7aae7d1dcd9d1899bac4936ff641589420575ef0f886150313b3872de7", + "sha256:9b2e8cb7a2940d2b94ca24db9f544f4011cdde2c446ccc71f7d1646ae011df11", + "sha256:9c094865d884a88053f8a2a282f26debc2727a21ef14e9fc5ee23d07d9d749f1", + "sha256:9e687e7317f87ad139e4959b65bcff22adb4bbec5f8e09c1873a5bb973e1380e", + "sha256:a4c265cff95c19da27450c4861fd60a25e4b4dddc58ddf62cf5fe869922d6e8e", + "sha256:a75c04955b285c9b9dd54077ad8e180bb5393c714c213e26a37170cbd7cc9df7", + "sha256:a790ceebd0f105241e425af0545b7b21623e3e94a67add68e854f13596d3f76b", + "sha256:ac1c429b0f283fad0521e50fba6135d70b7d8fa9538523880ee232b0cf0edd09", + "sha256:af885eeda54152c3086b7c5861b50f79c94b83e1ea4a1407afaffb84f52aaddf", + "sha256:b07b805c3ef734e5c330333b549d98adc514df6e83ef0338cb3353538d570322", + "sha256:bbfeeff794bb947fe90ba3fc3d395c78418bb17c2dbafe5ca47552ef3ccb6a29", + "sha256:bd7ae2ead0ddd0df3a22fe9f84aff1c44afbac82b1af41dc2934eec6c56ef3ec", + "sha256:be8800c5a087e7e4e33cb12f35234ca94f4ec4837d29918899a48d6f61ea59b3", + "sha256:c11567cd77d11a7ba2f8be9a31cfa74a11df34a4a78f91cff8fa6bee5c3145c7", + "sha256:c2ce0f0cdb9d22cbccd477b09436354e4aa2aaf0cdd0c2ed3f3da6f11979e68e", + "sha256:c5d45257e8ecbddf2587aa4ae1a0cf45856eb32d5e847bb01a3f74a39ab4b645", + "sha256:c66f50475727ac7cde643d48b27b6388a6b680484c3dcbb0b237fb003529785a", + "sha256:cb846ab19c1fa9d2d1aeaa1e603f4ddc6e9837952fc22c5b56061167b28cb2d0", + "sha256:cff8b68a89b2e03f8d954606d2015a4241002e3ea7ce45c3e7c7c73918263bac", + "sha256:d33da2a9b44f7613fe214b1d2dc03a4345b7a0345383ac562b8636a41129791f", + "sha256:d37c6809d76e9ed95277dc0155bb72c08e7334d741b2eae62ff4f9f8adcb43af", + "sha256:d58d5d2e59432c86324565a4adc649f383251f747809e469de1c01208691bc02", + "sha256:d6bc891a9480c0b4791a1cc7d62b3128ffa04b7883fabf35bb0ece3173338911", + "sha256:d725c7335184f1ef96b22660b92ab8f343ada41804bb54d74ac166f82033f115", + "sha256:d9362ea607a8640b5a1a612f834f39002dfa57561388e21e4d9dd12c7f5d11fc", + "sha256:db84023568e545ea45385cacd9edcc02cd1bd8cb1f4c5c0a89d4d061e8153850", + "sha256:ddebca89a63a726b129a7198087a17a8c33d72f957442593892c681e6aef0e8f", + "sha256:de091b890eaab8be1cba3c7483f718e68067c7681209f0c98251b50e7e032800", + "sha256:de9587b4d32462af1eafb84f2ea35aed5cb92b945f18acb1593cdec0d90accc6", + "sha256:def7d1d90c61da6860377403e603d0aff5a47e3fb71cbf0155b8fa0d9f6cacbb", + "sha256:e73e1d9633315b3a01763b9c7be55522f7f0983880b61d67f49823ac7e3b4421", + "sha256:eaf03403091b30c97bfbf4c22e6fc7057253e283157dbcdd23eb7a925d7ec65a", + "sha256:efc70ae80f742e84b320765587f0ce7715f11ae0b6a2a1b9e0ebed650b5da546", + "sha256:f0d7845993703cf115c82b9161cc361ddffd91af9d164892297bc009dac70097", + "sha256:f5b03dea0416ee7f9ec5c6be7b9dc02ffd3a187eaac159f291fd548160ca6d68", + "sha256:f6a2196df79b2aeccefe48fc81b11ad10d99ca274181dbd277793caa1b802890", + "sha256:f703a48096176403f86753d0e60da190d9663501c1d491de65607ba51fb4dda2", + "sha256:f9c80a48731f267dd9843d2c7149102066c3baf1ef0ac31bfc09d01060774dfe", + "sha256:fbfaccbaf223e52f05cb07b56d5ab1ce315a21b796f2531924bdd9aae01b1604", + "sha256:ff454ce3765a756392348da7887dffb3972b197e34feddc2b37a0c913cd0a8af" + ], + "markers": "(platform_python_implementation != 'CPython' or python_full_version > '3.7.10') and (platform_system == 'Darwin' or platform_system == 'Windows' or platform_system == 'Linux') and (platform_machine == 'x86_64' or platform_machine == 's390x' or platform_machine == 'armv7l' or platform_machine == 'ppc64le' or platform_machine == 'ppc64' or platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'arm64' or platform_machine == 'ARM64' or platform_machine == 'x86' or platform_machine == 'i686') and (platform_python_implementation == 'CPython' or (platform_python_implementation == 'PyPy' and python_version < '3.12'))", + "version": "==1.5.2" }, "referencing": { "hashes": [ @@ -1202,7 +1202,7 @@ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.17.0" }, "typing-extensions": { diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.9.1.tar.gz b/dbrepo-dashboard-service/lib/dbrepo-1.9.1.tar.gz deleted file mode 100644 index 8aca96aacad8cc90c6a0d978c49b4bc0bdeb032d..0000000000000000000000000000000000000000 Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.9.1.tar.gz and /dev/null differ diff --git a/dbrepo-search-service/lib/dbrepo-1.9.1-py3-none-any.whl b/dbrepo-dashboard-service/lib/dbrepo-1.9.2-py3-none-any.whl similarity index 92% rename from dbrepo-search-service/lib/dbrepo-1.9.1-py3-none-any.whl rename to dbrepo-dashboard-service/lib/dbrepo-1.9.2-py3-none-any.whl index 3d97921b6a82ef23d9c32a22c8db6d74a09b400a..658217e61233bd386c2abead7a1aee64b7a14781 100644 Binary files a/dbrepo-search-service/lib/dbrepo-1.9.1-py3-none-any.whl and b/dbrepo-dashboard-service/lib/dbrepo-1.9.2-py3-none-any.whl differ diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.9.2.tar.gz b/dbrepo-dashboard-service/lib/dbrepo-1.9.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..cc536fecd0b417e82a49442320b056d6da14d4ed Binary files /dev/null and b/dbrepo-dashboard-service/lib/dbrepo-1.9.2.tar.gz differ diff --git a/dbrepo-data-service/pom.xml b/dbrepo-data-service/pom.xml index f806ccb7794c5c0f5a551289b82284ecf0a321a7..8175e571ab49f8df326510662bfdad3b01789bfd 100644 --- a/dbrepo-data-service/pom.xml +++ b/dbrepo-data-service/pom.xml @@ -16,7 +16,7 @@ <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>data-service</artifactId> <name>data-service</name> - <version>1.9.1</version> + <version>1.9.2</version> <description>Service that manages the data</description> @@ -96,7 +96,7 @@ <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>dbrepo-core</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </dependency> <!-- Spark --> <dependency> diff --git a/dbrepo-data-service/querystore/pom.xml b/dbrepo-data-service/querystore/pom.xml index ddde97c4dc5165f29dcd2abf89f50dfa207610f1..c74b871c0ee0f05aef05210cdae0d08a3bd9d273 100644 --- a/dbrepo-data-service/querystore/pom.xml +++ b/dbrepo-data-service/querystore/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>data-service</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </parent> <name>querystore</name> <artifactId>querystore</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> <dependencies/> diff --git a/dbrepo-data-service/report/pom.xml b/dbrepo-data-service/report/pom.xml index a17e5adecaf5eb8f4748f724aca42bc41e52e84f..e25ad8ff16b30ca5a29b6d8d383b9fef71c9f949 100644 --- a/dbrepo-data-service/report/pom.xml +++ b/dbrepo-data-service/report/pom.xml @@ -6,23 +6,23 @@ <parent> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>data-service</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </parent> <name>report</name> <artifactId>report</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>rest-service</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </dependency> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>services</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </dependency> </dependencies> diff --git a/dbrepo-data-service/rest-service/pom.xml b/dbrepo-data-service/rest-service/pom.xml index 49d83a28c00b5dab842052386a959de0106e9c0b..76bb9a02ecb0634d1375c0b6e04ef66e0185d9c4 100644 --- a/dbrepo-data-service/rest-service/pom.xml +++ b/dbrepo-data-service/rest-service/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>data-service</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </parent> <name>rest-service</name> <artifactId>rest-service</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>services</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </dependency> </dependencies> diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java index abd843150b99ce5d541945234de1df78efae996a..d8d66162956512981b549939b12e1f6064502c94 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java @@ -93,6 +93,7 @@ public class DatabaseEndpoint extends RestEndpoint { try { final DatabaseDto database = containerService.createDatabase(container, data); containerService.createQueryStore(container, data.getInternalName()); + accessService.create(database, dataMapper.createDatabaseDtoToUserDto(data), AccessTypeDto.WRITE_ALL); accessService.create(database, dataMapper.createDatabaseDtoToPrivilegedUserDto(data), AccessTypeDto.WRITE_ALL); accessService.create(database, dataMapper.createDatabaseDtoToReadonlyUserDto(data), AccessTypeDto.READ); return ResponseEntity.status(HttpStatus.CREATED) diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/GrantEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/GrantEndpoint.java new file mode 100644 index 0000000000000000000000000000000000000000..5913a997bb05d87601b6cffce7ddd706dcce6032 --- /dev/null +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/GrantEndpoint.java @@ -0,0 +1,100 @@ +package at.ac.tuwien.ifs.dbrepo.endpoints; + +import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseAccessDto; +import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; +import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseGrantsDto; +import at.ac.tuwien.ifs.dbrepo.core.api.error.ApiErrorDto; +import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDto; +import at.ac.tuwien.ifs.dbrepo.core.exception.*; +import at.ac.tuwien.ifs.dbrepo.service.CacheService; +import at.ac.tuwien.ifs.dbrepo.service.GrantService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.constraints.NotNull; +import lombok.extern.slf4j.Slf4j; +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.web.bind.annotation.*; + +import java.security.Principal; +import java.sql.SQLException; +import java.util.UUID; + +@Slf4j +@RestController +@CrossOrigin(origins = "*") +@RequestMapping(path = "/api/database/{databaseId}/grant") +public class GrantEndpoint extends RestEndpoint { + + private final CacheService cacheService; + private final GrantService grantService; + + @Autowired + public GrantEndpoint(CacheService cacheService, GrantService grantService) { + this.cacheService = cacheService; + this.grantService = grantService; + } + + @RequestMapping(path = "/{userId}", method = {RequestMethod.GET, RequestMethod.HEAD}) + @PreAuthorize("isAuthenticated()") + @Operation(summary = "Get grants", + description = "Get the grant permissions for a user of a given database.", + security = {@SecurityRequirement(name = "basicAuth"), @SecurityRequirement(name = "bearerAuth")}) + @ApiResponses(value = { + @ApiResponse(responseCode = "200", + description = "Access found", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = DatabaseAccessDto[].class))}), + @ApiResponse(responseCode = "401", + description = "Not authenticated", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "403", + description = "Not database owner or foreign user", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + @ApiResponse(responseCode = "409", + description = "Grants malformed", + content = {@Content( + mediaType = "application/json", + schema = @Schema(implementation = ApiErrorDto.class))}), + }) + public ResponseEntity<DatabaseGrantsDto> find(@NotNull @PathVariable("databaseId") UUID databaseId, + @PathVariable("userId") UUID userId, + Principal principal, + @NotNull HttpServletRequest request) throws DatabaseNotFoundException, + RemoteUnavailableException, MetadataServiceException, DatabaseMalformedException, + DatabaseUnavailableException, UserNotFoundException, NotAllowedException { + log.debug("endpoint check access to database, databaseId={}", databaseId); + final DatabaseDto database = cacheService.getDatabase(databaseId); + final UserDto user = cacheService.getUser(userId); + if (!database.getOwner().getId().equals(getId(principal)) && !user.getId().equals(getId(principal))) { + log.error("Failed to find access: not owner or foreign user"); + throw new NotAllowedException("Failed to find access: not owner or foreign user"); + } + try { + final DatabaseGrantsDto grants = grantService.find(database, user); + final DatabaseGrantsDto body = request.getMethod().equals("HEAD") ? null : grants; + if (grants.getType() == null) { + return ResponseEntity.status(HttpStatus.CONFLICT) + .body(body); + } + return ResponseEntity.ok() + .body(body); + } catch (SQLException e) { + log.error("Failed to establish connection to database: {}", e.getMessage()); + throw new DatabaseUnavailableException("Failed to establish connection to database", e); + } + } + +} 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 25d00ab8dfd2b9419b017f4f5df702daba807e81..be28c4ba71d4375450609998ee63a3f301b611dd 100644 --- a/dbrepo-data-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-data-service/rest-service/src/main/resources/application.yml @@ -82,8 +82,8 @@ dbrepo: clientSecret: "${AUTH_SERVICE_CLIENT_SECRET:MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}" grant: default: - read: "${GRANT_DEFAULT_READ:SELECT}" - write: "${GRANT_DEFAULT_WRITE:SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE}" + read: "${GRANT_DEFAULT_READ:SELECT, EXECUTE}" + write: "${GRANT_DEFAULT_WRITE:SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, EXECUTE, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE}" credentialCacheTimeout: "${CREDENTIAL_CACHE_TIMEOUT:300}" minConcurrent: "${MIN_CONCURRENT_CONSUMERS:2}" maxConcurrent: "${MAX_CONCURRENT_CONSUMERS:6}" diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbConfig.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbConfig.java index e8604aabd3d56fcf43287206f5ccf9633ce7abfb..a45498c644032ba9d34eadecf77be0a8e699d40e 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbConfig.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbConfig.java @@ -30,6 +30,21 @@ public class MariaDbConfig { log.debug("created database {}", database); } + public static void revokeAccess(DatabaseDto database, String username) throws SQLException { + final String jdbc = "jdbc:mariadb://" + database.getContainer().getHost() + ":" + database.getContainer().getPort() + "/" + database.getInternalName(); + log.trace("connect to database {}", jdbc); + try (Connection connection = DriverManager.getConnection(jdbc, database.getContainer().getUsername(), database.getContainer().getPassword())) { + connection.prepareStatement("REVOKE ALL PRIVILEGES, GRANT OPTION FROM `" + username + "`@`%`;") + .executeUpdate(); + connection.prepareStatement("FLUSH PRIVILEGES;") + .executeUpdate(); + } catch (SQLException e) { + log.error("Failed to revoke access", e); + throw new SQLException("Failed to revoke access", e); + } + log.debug("revoked access from user {} in database {}", username, database.getInternalName()); + } + public static void createInitDatabase(DatabaseDto database) throws SQLException { final String jdbc = "jdbc:mariadb://" + database.getContainer().getHost() + ":" + database.getContainer().getPort(); log.trace("connect to database {}", jdbc); @@ -41,11 +56,11 @@ public class MariaDbConfig { log.debug("created init database {}", database.getInternalName()); } - public static void grantWriteAccess(DatabaseDto database, String username) { + public static void grantAccess(DatabaseDto database, String grants, String username) { final String jdbc = "jdbc:mariadb://" + database.getContainer().getHost() + ":" + database.getContainer().getPort() + "/" + database.getInternalName(); log.trace("connect to database {}", jdbc); try (Connection connection = DriverManager.getConnection(jdbc, database.getContainer().getUsername(), database.getContainer().getPassword())) { - connection.prepareStatement("GRANT SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE ON *.* TO `" + username + "`@`%`;") + connection.prepareStatement("GRANT " + grants + " ON `" + database.getInternalName() + "`.* TO `" + username + "`@`%`;") .executeUpdate(); connection.prepareStatement("FLUSH PRIVILEGES;") .executeUpdate(); diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/GrantEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/GrantEndpointUnitTest.java new file mode 100644 index 0000000000000000000000000000000000000000..f1a5258d4791772308b277be8d878f32cdf1ba02 --- /dev/null +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/GrantEndpointUnitTest.java @@ -0,0 +1,136 @@ +package at.ac.tuwien.ifs.dbrepo.endpoint; + +import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseGrantsDto; +import at.ac.tuwien.ifs.dbrepo.core.api.database.GrantTypeDto; +import at.ac.tuwien.ifs.dbrepo.core.exception.*; +import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; +import at.ac.tuwien.ifs.dbrepo.endpoints.GrantEndpoint; +import at.ac.tuwien.ifs.dbrepo.service.CacheService; +import at.ac.tuwien.ifs.dbrepo.service.GrantService; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +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.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.sql.SQLException; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +@Slf4j +@SpringBootTest +@ExtendWith(SpringExtension.class) +public class GrantEndpointUnitTest extends BaseTest { + + @Autowired + private GrantEndpoint grantEndpoint; + + @MockitoBean + private HttpServletRequest httpServletRequest; + + @MockitoBean + private CacheService cacheService; + + @MockitoBean + private GrantService grantService; + + @Test + @WithMockUser(username = USER_1_USERNAME) + public void find_succeeds() throws UserNotFoundException, DatabaseUnavailableException, NotAllowedException, + DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException, + DatabaseMalformedException, SQLException { + + /* mock */ + when(cacheService.getDatabase(DATABASE_1_ID)) + .thenReturn(DATABASE_1_PRIVILEGED_DTO); + when(cacheService.getUser(USER_1_ID)) + .thenReturn(USER_1_DTO); + when(grantService.find(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO)) + .thenReturn(READ_GRANT_DTO); + when(httpServletRequest.getMethod()) + .thenReturn("GET"); + + /* test */ + final ResponseEntity<DatabaseGrantsDto> response = grantEndpoint.find(DATABASE_1_ID, USER_1_ID, USER_1_PRINCIPAL, httpServletRequest); + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertNotNull(response.getBody()); + final DatabaseGrantsDto body = response.getBody(); + assertEquals(GrantTypeDto.READ, body.getType()); + assertNotNull(body.getGrants()); + } + + @Test + @WithMockUser(username = USER_1_USERNAME) + public void find_own_succeeds() throws UserNotFoundException, DatabaseUnavailableException, NotAllowedException, + DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException, + DatabaseMalformedException, SQLException { + + /* mock */ + when(cacheService.getDatabase(DATABASE_2_ID)) + .thenReturn(DATABASE_2_PRIVILEGED_DTO); + when(cacheService.getUser(USER_1_ID)) + .thenReturn(USER_1_DTO); + when(grantService.find(DATABASE_2_PRIVILEGED_DTO, USER_1_DTO)) + .thenReturn(READ_GRANT_DTO); + when(httpServletRequest.getMethod()) + .thenReturn("GET"); + + /* test */ + final ResponseEntity<DatabaseGrantsDto> response = grantEndpoint.find(DATABASE_2_ID, USER_1_ID, USER_1_PRINCIPAL, httpServletRequest); + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertNotNull(response.getBody()); + final DatabaseGrantsDto body = response.getBody(); + assertEquals(GrantTypeDto.READ, body.getType()); + assertNotNull(body.getGrants()); + } + + @Test + @WithMockUser(username = USER_1_USERNAME) + public void find_head_succeeds() throws UserNotFoundException, DatabaseUnavailableException, NotAllowedException, + DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException, + DatabaseMalformedException, SQLException { + + /* mock */ + when(cacheService.getDatabase(DATABASE_1_ID)) + .thenReturn(DATABASE_1_PRIVILEGED_DTO); + when(cacheService.getUser(USER_1_ID)) + .thenReturn(USER_1_DTO); + when(grantService.find(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO)) + .thenReturn(READ_GRANT_DTO); + when(httpServletRequest.getMethod()) + .thenReturn("HEAD"); + + /* test */ + final ResponseEntity<DatabaseGrantsDto> response = grantEndpoint.find(DATABASE_1_ID, USER_1_ID, USER_1_PRINCIPAL, httpServletRequest); + assertEquals(HttpStatus.OK, response.getStatusCode()); + } + + @Test + @WithMockUser(username = USER_2_USERNAME) + public void find_notOwnerForeign_fails() throws UserNotFoundException, DatabaseNotFoundException, + RemoteUnavailableException, MetadataServiceException { + + /* mock */ + when(cacheService.getDatabase(any(UUID.class))) + .thenReturn(DATABASE_1_PRIVILEGED_DTO); + when(cacheService.getUser(USER_2_ID)) + .thenReturn(USER_2_DTO); + when(cacheService.getUser(USER_1_ID)) + .thenReturn(USER_1_DTO); + + /* test */ + assertThrows(NotAllowedException.class, () -> { + grantEndpoint.find(DATABASE_1_ID, USER_1_ID, USER_2_PRINCIPAL, httpServletRequest); + }); + } + +} diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceIntegrationTest.java index 9e17d447dde57109fd35202bf302660be7b42386..7c7617b6aa3339b31855cbf1082e0fedaf6ee079 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceIntegrationTest.java @@ -1,8 +1,8 @@ package at.ac.tuwien.ifs.dbrepo.service; -import at.ac.tuwien.ifs.dbrepo.core.api.database.AccessTypeDto; import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig; import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; +import at.ac.tuwien.ifs.dbrepo.core.api.database.AccessTypeDto; import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseMalformedException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import lombok.extern.slf4j.Slf4j; @@ -42,7 +42,6 @@ public class AccessServiceIntegrationTest extends BaseTest { @BeforeEach public void beforeEach() throws SQLException { - /* metadata database */ MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNAL_NAME); MariaDbConfig.createInitDatabase(DATABASE_1_PRIVILEGED_DTO); } diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceIntegrationTest.java index 493a2430b863b962e10b6a64737dbeee459f696f..1081358ab5a2b816b99752beec3abd3a1eaef6a2 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceIntegrationTest.java @@ -1,5 +1,7 @@ package at.ac.tuwien.ifs.dbrepo.service; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewColumnDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableBriefDto; @@ -16,8 +18,6 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.table.constraints.unique.Unique import at.ac.tuwien.ifs.dbrepo.core.api.database.table.internal.TableCreateDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierDto; import at.ac.tuwien.ifs.dbrepo.core.api.user.internal.UpdateUserPasswordDto; -import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig; -import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import lombok.extern.slf4j.Slf4j; @@ -27,6 +27,7 @@ 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.beans.factory.annotation.Value; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.testcontainers.containers.MariaDBContainer; @@ -50,6 +51,9 @@ public class DatabaseServiceIntegrationTest extends BaseTest { @Autowired private DatabaseService databaseService; + @Value("${dbrepo.grant.default.write}") + private String grantDefaultWrite; + @Container private static MariaDBContainer<?> mariaDBContainer = MariaDbContainerConfig.getContainer(); @@ -109,7 +113,7 @@ public class DatabaseServiceIntegrationTest extends BaseTest { .build(); /* mock */ - MariaDbConfig.grantWriteAccess(DATABASE_1_PRIVILEGED_DTO, USER_1_USERNAME); + MariaDbConfig.grantAccess(DATABASE_1_PRIVILEGED_DTO, grantDefaultWrite, USER_1_USERNAME); /* pre-condition */ MariaDbConfig.mockQuery(CONTAINER_1_HOST, CONTAINER_1_PORT, DATABASE_1_INTERNAL_NAME, "CREATE SEQUENCE debug NOCACHE", USER_1_USERNAME, USER_1_PASSWORD); diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/GrantServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/GrantServiceIntegrationTest.java new file mode 100644 index 0000000000000000000000000000000000000000..31a2f3b7c8e927053fb0320fd4115a7b847aa921 --- /dev/null +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/GrantServiceIntegrationTest.java @@ -0,0 +1,98 @@ +package at.ac.tuwien.ifs.dbrepo.service; + +import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig; +import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; +import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseGrantsDto; +import at.ac.tuwien.ifs.dbrepo.core.api.database.GrantTypeDto; +import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseMalformedException; +import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; +import lombok.extern.slf4j.Slf4j; +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.beans.factory.annotation.Value; +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.Arrays; +import java.util.Collections; +import java.util.Map; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.*; + +@Slf4j +@SpringBootTest +@ExtendWith(SpringExtension.class) +@Testcontainers +public class GrantServiceIntegrationTest extends BaseTest { + + @Autowired + private GrantService grantService; + + @Value("${dbrepo.grant.default.read}") + private String grantDefaultRead; + + @Value("${dbrepo.grant.default.write}") + private String grantDefaultWrite; + + @Container + private static MariaDBContainer<?> mariaDBContainer = MariaDbContainerConfig.getContainer(); + + @BeforeEach + public void beforeEach() throws SQLException { + MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNAL_NAME); + MariaDbConfig.createInitDatabase(DATABASE_1_PRIVILEGED_DTO); + MariaDbConfig.revokeAccess(DATABASE_1_PRIVILEGED_DTO, USER_1_USERNAME); + } + + @Test + public void find_read_succeeds() throws SQLException, DatabaseMalformedException { + + /* mock */ + MariaDbConfig.grantAccess(DATABASE_1_PRIVILEGED_DTO, grantDefaultRead, USER_1_USERNAME); + + /* test */ + final DatabaseGrantsDto response = grantService.find(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO); + assertNotNull(response); + assertEquals(GrantTypeDto.READ, response.getType()); + assertEquals(Arrays.stream(grantDefaultRead.split(",")).map(String::trim).map(String::toUpperCase).collect(Collectors.toSet()), response.getGrants()); + } + + @Test + public void find_write_succeeds() throws SQLException, DatabaseMalformedException { + + /* mock */ + MariaDbConfig.grantAccess(DATABASE_1_PRIVILEGED_DTO, grantDefaultWrite, USER_1_USERNAME); + + /* test */ + final DatabaseGrantsDto response = grantService.find(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO); + assertNotNull(response); + assertEquals(GrantTypeDto.WRITE, response.getType()); + assertEquals(Arrays.stream(grantDefaultWrite.split(",")).map(String::trim).map(String::toUpperCase).collect(Collectors.toSet()), response.getGrants()); + } + + @Test + public void findAll_succeeds() throws SQLException, DatabaseMalformedException { + + /* mock */ + MariaDbConfig.grantAccess(DATABASE_1_PRIVILEGED_DTO, grantDefaultRead, USER_1_USERNAME); + + /* test */ + final Map<String, DatabaseGrantsDto> response = grantService.findAll(DATABASE_1_PRIVILEGED_DTO, USER_1_DTO); + assertNotNull(response); + assertEquals(2, response.size()); + final DatabaseGrantsDto grants0 = response.get("*"); + assertEquals(Collections.EMPTY_SET, grants0.getGrants()); + assertNull(grants0.getType()); + final DatabaseGrantsDto grants1 = response.get(DATABASE_1_INTERNAL_NAME); + assertEquals(Arrays.stream(grantDefaultRead.split(",")).map(String::trim).map(String::toUpperCase).collect(Collectors.toSet()), grants1.getGrants()); + assertEquals(GrantTypeDto.READ, grants1.getType()); + } + +} diff --git a/dbrepo-data-service/services/pom.xml b/dbrepo-data-service/services/pom.xml index 2513a620242be7085e0a4f006bbf1423a79582c0..4e2d36d39c82a8aecc1f955dabaa168aba63b642 100644 --- a/dbrepo-data-service/services/pom.xml +++ b/dbrepo-data-service/services/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>data-service</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </parent> <name>services</name> <artifactId>services</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>querystore</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </dependency> </dependencies> diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/DataMapper.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/DataMapper.java index 641136652d639561ac76e2f7b0779f747dbbd36f..15f9602ab6502be4ecd5ed9f3220d67e77a1c852 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/DataMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/DataMapper.java @@ -1,7 +1,10 @@ package at.ac.tuwien.ifs.dbrepo.mapper; import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; -import at.ac.tuwien.ifs.dbrepo.core.api.database.*; +import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseBriefDto; +import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; +import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewColumnDto; +import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.internal.CreateDatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.QueryDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.*; @@ -58,6 +61,11 @@ public interface DataMapper { }) UserDto createDatabaseDtoToPrivilegedUserDto(CreateDatabaseDto data); + @Mappings({ + @Mapping(target = "id", source = "userId"), + }) + UserDto createDatabaseDtoToUserDto(CreateDatabaseDto data); + @Mappings({ @Mapping(target = "username", source = "readonlyUsername"), @Mapping(target = "password", source = "readonlyPassword"), diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapper.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapper.java index 141c9e9c0882ed710e3b15218806c37563e6c970..dacc5537079e1973c7219869ddd7108b1adfcea6 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapper.java @@ -33,6 +33,7 @@ import java.time.Instant; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -71,6 +72,40 @@ public interface MariaDbMapper { return statement.toString(); } + default String databaseFindAccessQuery() { + final StringBuilder statement = new StringBuilder("SHOW GRANTS FOR ?@`%`;"); + log.trace("mapped database find access statement: {}", statement); + return statement.toString(); + } + + default Map<String, Set<String>> resultSetToGrants(ResultSet resultSet) throws SQLException, + DatabaseMalformedException { + final Pattern grantPattern = Pattern.compile("GRANT (.*) ON"); + final Matcher grantMatcher = grantPattern.matcher(resultSet.getString(1)); + final Set<String> grants = new HashSet<>(); + if (grantMatcher.find()) { + Arrays.asList(grantMatcher.group(1) + .split(",")) + .forEach(g -> grants.add(g.trim())); + } else { + log.debug("no grants were found in the result set"); + } + final Map<String, Set<String>> map = new HashMap<>(); + final Pattern databasePattern = Pattern.compile("ON `?([a-zA-Z0-9*]+)`?"); + final Matcher databaseMatcher = databasePattern.matcher(resultSet.getString(1)); + if (databaseMatcher.find()) { + final String databaseName = databaseMatcher.group(1) + .trim(); + if (!databaseName.equals("PROCEDURE")) { + map.put(databaseName, grants); + log.trace("grant on {} has privilege(s): {}", databaseName, grants); + } + return map; + } + log.debug("no database name was found in the result set"); + throw new DatabaseMalformedException("No database name was found in the result set"); + } + default String databaseCreateUserQuery(String username, String password) { final StringBuilder statement = new StringBuilder("CREATE USER IF NOT EXISTS `") .append(username) @@ -80,6 +115,12 @@ public interface MariaDbMapper { return statement.toString(); } + default String databaseAccessRawQuery() { + final StringBuilder statement = new StringBuilder(";"); + log.trace("mapped database access statement: {}", statement); + return statement.toString(); + } + default String databaseGrantPrivilegesQuery(String username, String grants) { final StringBuilder statement = new StringBuilder("GRANT ") .append(grants) diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/GrantService.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/GrantService.java new file mode 100644 index 0000000000000000000000000000000000000000..3abce1daf88b462ecd58c406b69c49d78c4aa499 --- /dev/null +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/GrantService.java @@ -0,0 +1,24 @@ +package at.ac.tuwien.ifs.dbrepo.service; + +import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; +import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseGrantsDto; +import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDto; +import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseMalformedException; + +import java.sql.SQLException; +import java.util.Map; + +public interface GrantService { + + /** + * Finds database access grants for a given user for a given database. + * @param database The database. + * @param user The user. + * @return The database access grants. + * @throws SQLException The connection to the database could not be established. + * @throws DatabaseMalformedException The database schema is malformed. + */ + DatabaseGrantsDto find(DatabaseDto database, UserDto user) throws SQLException, DatabaseMalformedException; + + Map<String, DatabaseGrantsDto> findAll(DatabaseDto database, UserDto user) throws SQLException, DatabaseMalformedException; +} diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceMariaDbImpl.java index 8a6d79de51c222cbf78e64e0045a91245ce339b6..fc756583688e0a6a6864a646d0b04b4461474fcb 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceMariaDbImpl.java @@ -25,7 +25,7 @@ public class AccessServiceMariaDbImpl extends DataConnector implements AccessSer @Value("${dbrepo.grant.default.write}") private String grantDefaultWrite; - private MariaDbMapper mariaDbMapper; + private final MariaDbMapper mariaDbMapper; @Autowired public AccessServiceMariaDbImpl(MariaDbMapper mariaDbMapper) { @@ -42,22 +42,38 @@ public class AccessServiceMariaDbImpl extends DataConnector implements AccessSer long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseCreateUserQuery(user.getUsername(), user.getPassword())) .execute(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("create user in database: " + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "create_user") + .log(); /* grant access */ final String grants = access != AccessTypeDto.READ ? grantDefaultWrite : grantDefaultRead; start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseGrantPrivilegesQuery(user.getUsername(), grants)) .execute(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("grant user privileges in database: " + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "grant_user_privileges") + .log(); /* grant query store */ start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseGrantProcedureQuery(user.getUsername(), "store_query")) .execute(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("grant procedure privileges in database: " + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "grant_procedure_privileges") + .log(); /* apply access rights */ start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseFlushPrivilegesQuery()); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("flush privileges in database: " + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "flush_privileges") + .log(); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -71,8 +87,8 @@ public class AccessServiceMariaDbImpl extends DataConnector implements AccessSer } @Override - public void update(DatabaseDto database, UserDto user, AccessTypeDto access) - throws DatabaseMalformedException, SQLException { + public void update(DatabaseDto database, UserDto user, AccessTypeDto access) throws DatabaseMalformedException, + SQLException { final ComboPooledDataSource dataSource = getDataSource(database); final Connection connection = dataSource.getConnection(); try { @@ -81,7 +97,11 @@ public class AccessServiceMariaDbImpl extends DataConnector implements AccessSer final long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseGrantPrivilegesQuery(user.getUsername(), grants)) .execute(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("update privileges in database: " + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "grant_user_privileges") + .log(); /* apply access rights */ connection.prepareStatement(mariaDbMapper.databaseFlushPrivilegesQuery()); connection.commit(); @@ -105,12 +125,20 @@ public class AccessServiceMariaDbImpl extends DataConnector implements AccessSer long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseRevokePrivilegesQuery(user.getUsername())) .execute(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("revoke privileges in database: " + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "grant_user_privileges") + .log(); /* apply access rights */ start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseFlushPrivilegesQuery()) .execute(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("flush privileges in database: " + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "flush_privileges") + .log(); connection.commit(); } catch (SQLException e) { connection.rollback(); diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CacheServiceImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CacheServiceImpl.java index 2178f89707949077bc9bbf254a408abd84e4e72b..0cd04b304def0ef9812a57594460ab8c1f07af3b 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CacheServiceImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CacheServiceImpl.java @@ -56,10 +56,16 @@ public class CacheServiceImpl implements CacheService { if (!forceReload) { final DatabaseDto cacheDatabase = databaseCache.getIfPresent(id); if (cacheDatabase != null) { - log.trace("found database with id {} in cache", id); + log.atTrace() + .setMessage("found database with id " + id + " in cache") + .addKeyValue("cache_hit", true) + .log(); return cacheDatabase; } - log.debug("database with id {} not it cache (anymore): reload from metadata service", id); + log.atTrace() + .setMessage("reload database from metadata service with id " + id + " in cache") + .addKeyValue("cache_hit", false) + .log(); } final DatabaseDto database = gateway.getDatabaseById(id); databaseCache.put(id, database); @@ -77,10 +83,16 @@ public class CacheServiceImpl implements CacheService { MetadataServiceException, TableNotFoundException { final TableDto cacheTable = tableCache.getIfPresent(tableId); if (cacheTable != null) { - log.trace("found table with id {} in cache", tableId); + log.atTrace() + .setMessage("found table with id " + tableId + " in cache") + .addKeyValue("cache_hit", true) + .log(); return cacheTable; } - log.debug("table with id {} not it cache (anymore): reload from metadata service", tableId); + log.atTrace() + .setMessage("reload table from metadata service with id " + tableId + " in cache") + .addKeyValue("cache_hit", false) + .log(); final TableDto table = gateway.getTableById(databaseId, tableId); tableCache.put(tableId, table); return table; @@ -91,10 +103,16 @@ public class CacheServiceImpl implements CacheService { TableMalformedException, QueryMalformedException, SQLException { final TableStatisticDto cacheStatistic = statisticCache.getIfPresent(view.getId()); if (cacheStatistic != null) { - log.trace("found view statistic with id {} in cache", view.getId()); + log.atTrace() + .setMessage("found view with id " + view.getId() + " in cache") + .addKeyValue("cache_hit", true) + .log(); return cacheStatistic; } - log.debug("view statistic with id {} not it cache (anymore): reload", view.getId()); + log.atTrace() + .setMessage("reload view from metadata service with id " + view.getId() + " in cache") + .addKeyValue("cache_hit", false) + .log(); final TableStatisticDto statistic = tableService.getStatistics(database, view.getInternalName()); statistic.setTotalRows(tableService.getCount(database, view.getInternalName(), Instant.now())); statisticCache.put(view.getId(), statistic); @@ -106,10 +124,16 @@ public class CacheServiceImpl implements CacheService { ContainerNotFoundException { final ContainerDto cacheContainer = containerCache.getIfPresent(id); if (cacheContainer != null) { - log.trace("found container with id {} in cache", id); + log.atTrace() + .setMessage("found container with id " + id + " in cache") + .addKeyValue("cache_hit", true) + .log(); return cacheContainer; } - log.debug("container with id {} not it cache (anymore): reload from metadata service", id); + log.atTrace() + .setMessage("reload container from metadata service with id " + id + " in cache") + .addKeyValue("cache_hit", false) + .log(); final ContainerDto container = gateway.getContainerById(id); containerCache.put(id, container); return container; @@ -120,10 +144,16 @@ public class CacheServiceImpl implements CacheService { MetadataServiceException, ViewNotFoundException { final ViewDto cacheView = viewCache.getIfPresent(viewId); if (cacheView != null) { - log.trace("found view with id {} in cache", viewId); + log.atTrace() + .setMessage("found view with id " + viewId + " in cache") + .addKeyValue("cache_hit", true) + .log(); return cacheView; } - log.debug("view with id {} not it cache (anymore): reload from metadata service", viewId); + log.atTrace() + .setMessage("reload view from metadata service with id " + viewId + " in cache") + .addKeyValue("cache_hit", false) + .log(); final ViewDto view = gateway.getViewById(databaseId, viewId); viewCache.put(viewId, view); return view; @@ -134,10 +164,16 @@ public class CacheServiceImpl implements CacheService { UserNotFoundException { final UserDto cacheUser = userCache.getIfPresent(id); if (cacheUser != null) { - log.trace("found user with id {} in cache", id); + log.atTrace() + .setMessage("found user with id " + id + " in cache") + .addKeyValue("cache_hit", true) + .log(); return cacheUser; } - log.debug("user with id {} not it cache (anymore): reload from metadata service", id); + log.atTrace() + .setMessage("reload user from metadata service with id " + id + " in cache") + .addKeyValue("cache_hit", false) + .log(); final UserDto user = gateway.getUserById(id); userCache.put(id, user); return user; @@ -148,10 +184,16 @@ public class CacheServiceImpl implements CacheService { MetadataServiceException, NotAllowedException { final DatabaseAccessDto cacheAccess = accessCache.getIfPresent(databaseId); if (cacheAccess != null) { - log.trace("found access for user with id {} to database with id {} in cache", userId, databaseId); + log.atTrace() + .setMessage("found access for user with id " + userId + " in cache") + .addKeyValue("cache_hit", true) + .log(); return cacheAccess; } - log.debug("access for user with id {} to database with id {} not it cache (anymore): reload from metadata service", userId, databaseId); + log.atTrace() + .setMessage("reload access from metadata service with user id " + userId + " in cache") + .addKeyValue("cache_hit", false) + .log(); final DatabaseAccessDto access = gateway.getAccess(databaseId, userId); accessCache.put(databaseId, access); return access; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java index f4ab2ed2dec88196f9c70aeda0d22735c1afdadf..899f60d685d3d1ed95a329f7949033b91dfe1464 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java @@ -1,17 +1,16 @@ package at.ac.tuwien.ifs.dbrepo.service.impl; +import at.ac.tuwien.ifs.dbrepo.config.RabbitConfig; import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.internal.CreateDatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.user.UserBriefDto; import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseMalformedException; import at.ac.tuwien.ifs.dbrepo.core.exception.QueryStoreCreateException; -import at.ac.tuwien.ifs.dbrepo.config.RabbitConfig; import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper; import at.ac.tuwien.ifs.dbrepo.service.ContainerService; import com.mchange.v2.c3p0.ComboPooledDataSource; import lombok.extern.slf4j.Slf4j; -import org.apache.logging.log4j.message.MapMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -41,8 +40,12 @@ public class ContainerServiceMariaDbImpl extends DataConnector implements Contai final long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseCreateDatabaseQuery(data.getInternalName())) .execute(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); connection.commit(); + log.atDebug() + .setMessage("created database: " + data.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "create_database") + .log(); } catch (SQLException e) { connection.rollback(); log.error("Failed to create database access: {}", e.getMessage()); @@ -74,19 +77,35 @@ public class ContainerServiceMariaDbImpl extends DataConnector implements Contai long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.queryStoreCreateTableRawQuery()) .execute(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("created query store in database: " + databaseName) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "create_query_store") + .log(); start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.queryStoreCreateHashTableProcedureRawQuery()) .execute(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("created query store hash table procedure in database: " + databaseName) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "create_procedure_hash_table") + .log(); start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.queryStoreCreateStoreQueryProcedureRawQuery()) .execute(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("created query store procedure in database: " + databaseName) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "create_procedure_store_query") + .log(); start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.queryStoreCreateInternalStoreQueryProcedureRawQuery()) .execute(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("created internal query store procedure in database: " + databaseName) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "create_procedure_internal_store_query") + .log(); connection.commit(); } catch (SQLException e) { connection.rollback(); diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceMariaDbImpl.java index 266ccf7f13d7bb309cb7520ce16eeb977bebfff9..724ef43b2fd887d7fd87ac14314a90eb6f6d689a 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceMariaDbImpl.java @@ -1,8 +1,5 @@ package at.ac.tuwien.ifs.dbrepo.service.impl; -import at.ac.tuwien.ifs.dbrepo.mapper.DataMapper; -import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper; -import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableDto; @@ -10,6 +7,9 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.table.constraints.unique.Unique import at.ac.tuwien.ifs.dbrepo.core.api.database.table.internal.TableCreateDto; import at.ac.tuwien.ifs.dbrepo.core.api.user.internal.UpdateUserPasswordDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; +import at.ac.tuwien.ifs.dbrepo.mapper.DataMapper; +import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper; +import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; import com.google.common.hash.Hashing; import com.mchange.v2.c3p0.ComboPooledDataSource; import lombok.extern.slf4j.Slf4j; @@ -49,7 +49,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas statement1.setString(2, viewName); log.trace("1={}, 2={}", database.getInternalName(), viewName); final ResultSet resultSet1 = statement1.executeQuery(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("inspected view: " + viewName + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "select_view_schema") + .log(); if (!resultSet1.next()) { throw new ViewNotFoundException("Failed to find view in the information schema"); } @@ -63,7 +67,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas statement2.setString(2, view.getInternalName()); log.trace("1={}, 2={}", database.getInternalName(), view.getInternalName()); final ResultSet resultSet2 = statement2.executeQuery(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("inspect view columns: " + viewName + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "select_view_columns") + .log(); TableDto tmp = TableDto.builder() .columns(new LinkedList<>()) .build(); @@ -95,7 +103,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas connection.prepareStatement(mariaDbMapper.tableCreateDtoToCreateTableRawQuery(database.getInternalName(), data)) .execute(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("created table: " + tableName + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "create_table") + .log(); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -131,24 +143,32 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas .databaseId(database.getId()) .columns(new LinkedList<>()) .build(); - log.debug("creating view: {}.{}", database.getInternalName(), view.getInternalName()); try { /* create view if not exists */ - final long start = System.currentTimeMillis(); + long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.viewCreateRawQuery(view.getInternalName(), query)) .execute(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("created view: " + view.getInternalName() + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "create_view") + .log(); /* select view columns */ + start = System.currentTimeMillis(); final PreparedStatement statement2 = connection.prepareStatement(mariaDbMapper.databaseTableColumnsSelectRawQuery()); statement2.setString(1, database.getInternalName()); statement2.setString(2, view.getInternalName()); final ResultSet resultSet2 = statement2.executeQuery(); + log.atDebug() + .setMessage("created view: " + view.getInternalName() + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "select_view_columns") + .log(); while (resultSet2.next()) { view = dataMapper.resultSetToTable(resultSet2, view); } connection.commit(); } catch (SQLException e) { - log.error("Failed to create table", e); connection.rollback(); log.error("Failed to create view: {}", e.getMessage()); throw new ViewMalformedException("Failed to create view: " + e.getMessage(), e); @@ -171,7 +191,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas statement.setString(1, database.getInternalName()); final long start = System.currentTimeMillis(); final ResultSet resultSet1 = statement.executeQuery(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("explored views in database: " + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "select_views") + .log(); while (resultSet1.next()) { final String viewName = resultSet1.getString(1); if (viewName.length() == 64) { @@ -208,7 +232,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas final PreparedStatement statement = connection.prepareStatement(mariaDbMapper.databaseTablesSelectRawQuery()); statement.setString(1, database.getInternalName()); final ResultSet resultSet1 = statement.executeQuery(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("explored tables in database: " + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "select_tables") + .log(); while (resultSet1.next()) { final String tableName = resultSet1.getString(1); if (database.getTables().stream().anyMatch(t -> t.getInternalName().equals(tableName))) { @@ -243,7 +271,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas statement1.setString(2, tableName); log.trace("1={}, 2={}", database.getInternalName(), tableName); TableDto table = dataMapper.schemaResultSetToTable(database, statement1.executeQuery()); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("inspected table: " + tableName + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "select_table_schema") + .log(); /* obtain columns metadata */ start = System.currentTimeMillis(); final PreparedStatement statement2 = connection.prepareStatement(mariaDbMapper.databaseTableColumnsSelectRawQuery()); @@ -251,7 +283,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas statement2.setString(2, tableName); log.trace("1={}, 2={}", database.getInternalName(), tableName); final ResultSet resultSet2 = statement2.executeQuery(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("inspect table columns: " + tableName + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "select_table_columns") + .log(); while (resultSet2.next()) { table = dataMapper.resultSetToTable(resultSet2, table); } @@ -262,7 +298,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas statement3.setString(2, tableName); log.trace("1={}, 2={}", database.getInternalName(), tableName); final ResultSet resultSet3 = statement3.executeQuery(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("inspect table check constraints: " + tableName + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "select_table_constraints_check") + .log(); while (resultSet3.next()) { final String clause = resultSet3.getString(1); table.getConstraints() @@ -277,7 +317,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas statement4.setString(2, tableName); log.trace("1={}, 2={}", database.getInternalName(), tableName); final ResultSet resultSet4 = statement4.executeQuery(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("inspect table constraints: " + tableName + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "select_table_constraints") + .log(); while (resultSet4.next()) { table = dataMapper.resultSetToConstraint(resultSet4, table); for (UniqueDto uk : table.getConstraints().getUniques()) { @@ -315,7 +359,11 @@ public class DatabaseServiceMariaDbImpl extends DataConnector implements Databas final long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.databaseSetPasswordQuery(data.getUsername(), data.getPassword())) .execute(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("updated user password: " + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "update_user_password") + .log(); connection.commit(); } catch (SQLException e) { connection.rollback(); diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/GrantServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/GrantServiceMariaDbImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..c19cff34d57d734192dc4106737f643d520e16b2 --- /dev/null +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/GrantServiceMariaDbImpl.java @@ -0,0 +1,90 @@ +package at.ac.tuwien.ifs.dbrepo.service.impl; + +import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; +import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseGrantsDto; +import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDto; +import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseMalformedException; +import at.ac.tuwien.ifs.dbrepo.core.mapper.MetadataMapper; +import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper; +import at.ac.tuwien.ifs.dbrepo.service.GrantService; +import com.mchange.v2.c3p0.ComboPooledDataSource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@Service +public class GrantServiceMariaDbImpl extends DataConnector implements GrantService { + + @Value("${dbrepo.grant.default.read}") + private String grantDefaultRead; + + @Value("${dbrepo.grant.default.write}") + private String grantDefaultWrite; + + private final MariaDbMapper mariaDbMapper; + private final MetadataMapper metadataMapper; + + @Autowired + public GrantServiceMariaDbImpl(MariaDbMapper mariaDbMapper, MetadataMapper metadataMapper) { + this.mariaDbMapper = mariaDbMapper; + this.metadataMapper = metadataMapper; + } + + @Override + public DatabaseGrantsDto find(DatabaseDto database, UserDto user) throws SQLException, DatabaseMalformedException { + final Map<String, DatabaseGrantsDto> grants = findAll(database, user); + if (!grants.containsKey(database.getInternalName())) { + log.atError() + .setMessage("Failed to find access grant(s) for database: " + database.getInternalName()) + .addKeyValue("user_id", user.getId()) + .addKeyValue("database_id", database.getId()) + .log(); + /* there must be at least 1 grant otherwise the user does not exist in the database which indicates malformed */ + throw new DatabaseMalformedException("Failed to find access grant(s) for database: " + database.getInternalName()); + } + final DatabaseGrantsDto grant = grants.get(database.getInternalName()); + log.debug("found grant: {}", grant); + return grant; + } + + @Override + public Map<String, DatabaseGrantsDto> findAll(DatabaseDto database, UserDto user) throws SQLException, DatabaseMalformedException { + final ComboPooledDataSource dataSource = getDataSource(database); + final Connection connection = dataSource.getConnection(); + final Map<String, DatabaseGrantsDto> grants = new HashMap<>(); + try { + /* get access */ + long start = System.currentTimeMillis(); + final PreparedStatement statement = connection.prepareStatement(mariaDbMapper.databaseFindAccessQuery()); + statement.setString(1, user.getUsername()); + log.trace("1={}", user.getUsername()); + final ResultSet resultSet = statement.executeQuery(); + log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + while (resultSet.next()) { + mariaDbMapper.resultSetToGrants(resultSet) + .forEach((k, v) -> grants.put(k, + metadataMapper.grantsToDatabaseGrantDto(v, grantDefaultRead, grantDefaultWrite))); + } + log.atInfo() + .setMessage("Found " + grants.size() + " access grant(s) for user with id: " + user.getId()) + .addKeyValue("user_id", user.getId()) + .log(); + return grants; + } catch (SQLException e) { + connection.rollback(); + log.error("Failed to list database access: {}", e.getMessage()); + throw new DatabaseMalformedException("Failed to list database access: " + e.getMessage(), e); + } finally { + dataSource.close(); + } + } +} diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/QueueServiceRabbitMqImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/QueueServiceRabbitMqImpl.java index f6bd0287ae30921333d1842a90424ee526253163..1a2665738ca5f11a7f3911ad1eb22e5ddc057ae4 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/QueueServiceRabbitMqImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/QueueServiceRabbitMqImpl.java @@ -47,8 +47,11 @@ public class QueueServiceRabbitMqImpl extends DataConnector implements QueueServ } final long start = System.currentTimeMillis(); preparedStatement.executeUpdate(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); - log.trace("successfully inserted tuple"); + log.atDebug() + .setMessage("successfully inserted tuple") + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "insert_tuple") + .log(); } finally { dataSource.close(); } diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java index 22887c8d10d2049943468db739d0c5ed4b051044..d941f5117fb1787bfe00e4d003f8133473bdeb0a 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java @@ -46,21 +46,33 @@ public class StorageServiceS3Impl implements StorageService { @Override public void putObject(String key, byte[] content) { + final long start = System.currentTimeMillis(); s3Client.putObject(PutObjectRequest.builder() .key(key) .bucket(s3Config.getS3Bucket()) .build(), RequestBody.fromBytes(content)); - log.debug("put object in S3 bucket {} with key: {}", s3Config.getS3Bucket(), key); + log.atDebug() + .setMessage("put object in bucket with key: " + key) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "s3_put_object") + .log(); } @Override public InputStream getObject(String bucket, String key) throws StorageNotFoundException, StorageUnavailableException { try { - return s3Client.getObject(GetObjectRequest.builder() + final long start = System.currentTimeMillis(); + final InputStream object = s3Client.getObject(GetObjectRequest.builder() .bucket(bucket) .key(key) .build()); + log.atDebug() + .setMessage("get object from bucket with key: " + key) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "s3_get_object") + .log(); + return object; } catch (NoSuchKeyException e) { log.error("Failed to find object: not found: {}", e.getMessage()); throw new StorageNotFoundException("Failed to find object: not found: " + e.getMessage(), e); @@ -88,19 +100,21 @@ public class StorageServiceS3Impl implements StorageService { @Override public void deleteObject(String key) { + final long start = System.currentTimeMillis(); s3Client.deleteObject(DeleteObjectRequest.builder() .bucket(s3Config.getS3Bucket()) .key(key) .build()); log.atDebug() - .setMessage("deleted object " + key + " in bucket " + s3Config.getS3Bucket()) - .addKeyValue("key", key) - .addKeyValue("bucket", s3Config.getS3Bucket()) + .setMessage("delete object from bucket with key: " + key) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "s3_delete_object") .log(); } @Override public ExportResourceDto transformDataset(Dataset<Row> dataset) throws StorageUnavailableException { + long start = System.currentTimeMillis(); final List<Map<String, String>> inMemory = dataset.collectAsList() .stream() .map(row -> { @@ -111,7 +125,12 @@ public class StorageServiceS3Impl implements StorageService { return map; }) .toList(); - log.debug("collected dataset with {} row(s)", inMemory.size()); + log.atDebug() + .setMessage("transformed dataset with rows: " + inMemory.size()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "dataset_transform") + .log(); + start = System.currentTimeMillis(); try { final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); try (Writer w = new OutputStreamWriter(byteArrayOutputStream, Charset.defaultCharset())) { @@ -131,9 +150,15 @@ public class StorageServiceS3Impl implements StorageService { } w.flush(); } + final InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(byteArrayOutputStream.toByteArray())); + log.atDebug() + .setMessage("transformed dataset to input stream resource") + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "dataset_export") + .log(); return ExportResourceDto.builder() .filename("dataset.csv") - .resource(new InputStreamResource(new ByteArrayInputStream(byteArrayOutputStream.toByteArray()))) + .resource(resource) .build(); } catch (IOException e) { log.error("Failed to transform in-memory dataset: {}", e.getMessage()); diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/SubsetServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/SubsetServiceMariaDbImpl.java index 738dfa96429c6ae7458dc04ea50cce629bedc79c..5ba91f2089fa93b4f8d4ae9c81a7325c811c0915 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/SubsetServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/SubsetServiceMariaDbImpl.java @@ -50,13 +50,20 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer @Override public Dataset<Row> getData(DatabaseDto database, String query) throws QueryMalformedException, TableNotFoundException { try { - return sparkSession.read() + final long start = System.currentTimeMillis(); + final Dataset<Row> dataset = sparkSession.read() .format("jdbc") .option("user", database.getContainer().getUsername()) .option("password", database.getContainer().getPassword()) .option("url", getSparkUrl(database)) .option("query", query) .load(); + log.atDebug() + .setMessage("get data from url: " + getSparkUrl(database)) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "jdbc_get_data") + .log(); + return dataset; } catch (Exception e) { if (e instanceof ExtendedAnalysisException && e.getMessage().contains("TABLE_OR_VIEW_NOT_FOUND") || e instanceof SQLSyntaxErrorException && e.getMessage().contains("doesn't exist")) { @@ -98,7 +105,11 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer log.trace("filter persisted only {}", filterPersisted); } final ResultSet resultSet = statement.executeQuery(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("list subsets in database: " + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "list_queries") + .log(); final List<QueryDto> queries = new LinkedList<>(); while (resultSet.next()) { final QueryDto query = dataMapper.resultSetToQueryDto(resultSet); @@ -132,7 +143,13 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer final long start = System.currentTimeMillis(); final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.countRawSelectQuery(statement, timestamp)) .executeQuery(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("count subset in database: " + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "count_query") + .addKeyValue("query", statement) + .addKeyValue("timestamp", timestamp) + .log(); return mariaDbMapper.resultSetToNumber(resultSet); } catch (SQLException e) { log.error("Failed to map object: {}", e.getMessage()); @@ -152,7 +169,11 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer final PreparedStatement preparedStatement = connection.prepareStatement(mariaDbMapper.queryStoreFindQueryRawQuery()); preparedStatement.setString(1, String.valueOf(queryId)); final ResultSet resultSet = preparedStatement.executeQuery(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("find query in query store of database: " + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "find_query") + .log(); if (!resultSet.next()) { throw new QueryNotFoundException("Failed to find query"); } @@ -190,7 +211,12 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer callableStatement.setTimestamp(3, Timestamp.from(timestamp)); callableStatement.registerOutParameter(4, Types.VARCHAR); callableStatement.executeUpdate(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("store query in query store of database: " + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "store_query") + .addKeyValue("query", query) + .log(); queryId = UUID.fromString(callableStatement.getString(4)); callableStatement.close(); log.info("Stored query with id {} in database with name {}", queryId, database.getInternalName()); @@ -217,7 +243,12 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer preparedStatement.setBoolean(1, persist); preparedStatement.setString(2, String.valueOf(queryId)); preparedStatement.executeUpdate(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("persist query in query store of database: " + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "persist_query") + .addKeyValue("query_id", queryId) + .log(); } catch (SQLException e) { log.error("Failed to (un-)persist query: {}", e.getMessage()); throw new QueryStorePersistException("Failed to (un-)persist query", e); @@ -235,7 +266,11 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer final long start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.queryStoreDeleteStaleQueriesRawQuery()) .executeUpdate(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("delete stale queries in query store of database: " + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "delete_stale_queries") + .log(); } catch (SQLException e) { log.error("Failed to delete stale queries: {}", e.getMessage()); throw new QueryStoreGCException("Failed to delete stale queries: " + e.getMessage(), e); diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceMariaDbImpl.java index 2382ee09f45d9f4a77282cd137cf3ecc0cb4364b..b4551be7d6ad091f992d37744218312924fe1f6d 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceMariaDbImpl.java @@ -69,7 +69,11 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi statistic = dataMapper.resultSetToTableStatistic(resultSet); statistic.setTotalColumns(Long.parseLong("" + tmpTable.getColumns() .size())); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("get table statistics: " + tableName + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "get_table_statistics") + .log(); statistic.setAvgRowLength(tmpTable.getAvgRowLength()); statistic.setDataLength(tmpTable.getDataLength()); statistic.setMaxDataLength(tmpTable.getMaxDataLength()); @@ -102,14 +106,18 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi final long start = System.currentTimeMillis(); final PreparedStatement statement = connection.prepareStatement( mariaDbMapper.tableNameToUpdateTableRawQuery(database.getInternalName(), table.getInternalName())); - log.trace("prepare with arg 1={}", data.getDescription()); + log.trace("1={}", data.getDescription()); if (data.getDescription() == null) { statement.setString(1, ""); } else { statement.setString(1, data.getDescription()); } statement.executeUpdate(); - log.debug(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("update table comment: " + table.getInternalName() + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "update_table_comment") + .log(); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -131,7 +139,11 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi connection.prepareStatement(mariaDbMapper.dropTableRawQuery(database.getInternalName(), table.getInternalName())) .execute(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("delete table: " + table.getInternalName() + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "delete_table") + .log(); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -155,7 +167,11 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectHistoryRawQuery( database.getInternalName(), table.getInternalName(), size)) .executeQuery(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("get table history: " + table.getInternalName() + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "get_table_history") + .log(); history = dataMapper.resultSetToTableHistory(resultSet); connection.commit(); } catch (SQLException e) { @@ -181,7 +197,11 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectCountRawQuery( database.getInternalName(), tableName, timestamp)) .executeQuery(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("get table count: " + tableName + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "get_table_count") + .log(); queryResult = mariaDbMapper.resultSetToNumber(resultSet); connection.commit(); } catch (SQLException e) { @@ -211,11 +231,17 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi final String temporaryTable = table.getInternalName() + "_tmp"; final ComboPooledDataSource dataSource = getDataSource(database); final Connection connection = dataSource.getConnection(); + long start = System.currentTimeMillis(); try { /* import tuple */ connection.prepareStatement(mariaDbMapper.copyTableSchemaToRawQuery(table.getInternalName(), temporaryTable)) .execute(); connection.commit(); + log.atDebug() + .setMessage("copy table schema from " + table.getInternalName() + "." + database.getInternalName() + " into temporary table: " + temporaryTable + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "table_copy_schema") + .log(); } catch (SQLException e) { connection.rollback(); log.atError() @@ -226,10 +252,16 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi } log.debug("copied schema from target table {} to import table: {}", table.getInternalName(), temporaryTable); try { + start = System.currentTimeMillis(); dataset.write() .mode(SaveMode.Overwrite) .option("header", data.getHeader()) .jdbc(getSparkUrl(database), temporaryTable, properties); + log.atDebug() + .setMessage("write data into temporary table: " + temporaryTable + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "table_import_data") + .log(); } catch (Exception e) { log.atError() .setMessage("Failed to write dataset: schema malformed") @@ -239,10 +271,16 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi } try { /* import tuple */ + start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.temporaryTableToRawMergeQuery(temporaryTable, table.getInternalName(), table.getColumns().stream().map(c -> c.getInternalName()).toList())) .execute(); connection.commit(); + log.atDebug() + .setMessage("merge data from temporary table " + temporaryTable + "." + database.getInternalName() + " into table: " + table.getInternalName() + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "table_merge_data") + .log(); } catch (SQLException e) { connection.rollback(); log.atError() @@ -252,19 +290,21 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi throw new MalformedException("Failed to import tuple: " + e.getMessage(), e); } finally { /* delete temporary table */ + start = System.currentTimeMillis(); connection.prepareStatement(mariaDbMapper.dropTableRawQuery(database.getInternalName(), temporaryTable, false)) .execute(); log.debug("deleted temporary table: {}", temporaryTable); connection.commit(); + log.atDebug() + .setMessage("delete temporary table: " + temporaryTable + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "table_delete_schema") + .log(); dataSource.close(); } storageService.deleteObject(data.getLocation()); - log.atInfo() - .setMessage("Imported dataset into table " + database.getInternalName() + "." + table.getInternalName()) - .addKeyValue("s3_key", data.getLocation()) - .addKeyValue("table_name", database.getInternalName() + "." + table.getInternalName()) - .log(); + log.info("Imported dataset into table {}.{}", database.getInternalName(), table.getInternalName()); } @Override @@ -286,7 +326,11 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi } final long start = System.currentTimeMillis(); statement.executeUpdate(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("delete tuple in table: " + table.getInternalName() + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "table_delete_tuple") + .log(); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -331,7 +375,11 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi } final long start = System.currentTimeMillis(); statement.executeUpdate(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("create tuple in table: " + table.getInternalName() + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "table_create_tuple") + .log(); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -368,7 +416,11 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi } final long start = System.currentTimeMillis(); statement.executeUpdate(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("update tuple in table: " + table.getInternalName() + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "table_update_tuple") + .log(); connection.commit(); } catch (SQLException e) { connection.rollback(); diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceMariaDbImpl.java index 589b7eda06f36c6204225da610e369298bff42e5..5bf8ad366017b0ab323ad40808e07e890275f379 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceMariaDbImpl.java @@ -37,7 +37,11 @@ public class ViewServiceMariaDbImpl extends DataConnector implements ViewService connection.prepareStatement(mariaDbMapper.dropViewRawQuery(database.getInternalName(), view.getInternalName())) .execute(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("delete view: " + view.getInternalName() + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "view_delete") + .log(); connection.commit(); } catch (SQLException e) { connection.rollback(); @@ -61,7 +65,11 @@ public class ViewServiceMariaDbImpl extends DataConnector implements ViewService final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.selectCountRawQuery( database.getInternalName(), view.getInternalName(), timestamp)) .executeQuery(); - log.trace(EXECUTED_STATEMENT_MS, System.currentTimeMillis() - start); + log.atDebug() + .setMessage("count view: " + view.getInternalName() + "." + database.getInternalName()) + .addKeyValue("duration", System.currentTimeMillis() - start) + .addKeyValue("action", "count_view") + .log(); queryResult = mariaDbMapper.resultSetToNumber(resultSet); connection.commit(); } catch (SQLException e) { diff --git a/dbrepo-gateway-service/dbrepo.conf b/dbrepo-gateway-service/dbrepo.conf index 153d6fb7f50444c94fbcd2a29371f12833d20d6d..0fcec7824a6e1f024c5e0cc6e2f0362f8312d84e 100644 --- a/dbrepo-gateway-service/dbrepo.conf +++ b/dbrepo-gateway-service/dbrepo.conf @@ -136,7 +136,7 @@ server { proxy_read_timeout 90; } - location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/subset" { + location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/(subset|grant)" { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; diff --git a/dbrepo-metadata-db/migration/19/schema.sql b/dbrepo-metadata-db/migration/19/schema.sql new file mode 100644 index 0000000000000000000000000000000000000000..3647c9a87f1c27ba14ae0b677eb22f109bf91fc9 --- /dev/null +++ b/dbrepo-metadata-db/migration/19/schema.sql @@ -0,0 +1,30 @@ +ALTER TABLE mdb_identifier_creators + DROP SYSTEM VERSIONING; +ALTER TABLE mdb_identifier_creators + ADD COLUMN ordinal_position INT NOT NULL; +ALTER TABLE mdb_identifier_creators + ADD SYSTEM VERSIONING; +ALTER TABLE mdb_identifier_titles + DROP SYSTEM VERSIONING; +ALTER TABLE mdb_identifier_titles + ADD COLUMN ordinal_position INT NOT NULL; +ALTER TABLE mdb_identifier_titles + ADD SYSTEM VERSIONING; +ALTER TABLE mdb_identifier_funders + DROP SYSTEM VERSIONING; +ALTER TABLE mdb_identifier_funders + ADD COLUMN ordinal_position INT NOT NULL; +ALTER TABLE mdb_identifier_funders + ADD SYSTEM VERSIONING; +ALTER TABLE mdb_identifier_descriptions + DROP SYSTEM VERSIONING; +ALTER TABLE mdb_identifier_descriptions + ADD COLUMN ordinal_position INT NOT NULL; +ALTER TABLE mdb_identifier_descriptions + ADD SYSTEM VERSIONING; +ALTER TABLE mdb_identifier_related + DROP SYSTEM VERSIONING; +ALTER TABLE mdb_identifier_related + ADD COLUMN ordinal_position INT NOT NULL; +ALTER TABLE mdb_identifier_related + ADD SYSTEM VERSIONING; diff --git a/dbrepo-metadata-service/oai/pom.xml b/dbrepo-metadata-service/oai/pom.xml index 672f9b98a177acc992d6cd1203ad271e36432134..2e7051933bfa3bf1c4df7f2474800a0b29fa5a6f 100644 --- a/dbrepo-metadata-service/oai/pom.xml +++ b/dbrepo-metadata-service/oai/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>metadata-service</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </parent> <name>oai</name> <artifactId>oai</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> <dependencies/> diff --git a/dbrepo-metadata-service/pom.xml b/dbrepo-metadata-service/pom.xml index 428062e680058ab80e67c056e14117139ea1cd32..0552aa9883fd74521b3fcb7ef2b1afd4c13e0fac 100644 --- a/dbrepo-metadata-service/pom.xml +++ b/dbrepo-metadata-service/pom.xml @@ -18,7 +18,7 @@ <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>metadata-service</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> <packaging>pom</packaging> <modules> @@ -69,7 +69,7 @@ <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>dbrepo-core</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </dependency> <!-- Data Source --> <dependency> diff --git a/dbrepo-metadata-service/report/pom.xml b/dbrepo-metadata-service/report/pom.xml index 05bebc48357e36773629021f17bb19095c2f32ed..55f33ff3e3792685f26dc987890b39f19f4aa2c2 100644 --- a/dbrepo-metadata-service/report/pom.xml +++ b/dbrepo-metadata-service/report/pom.xml @@ -6,23 +6,23 @@ <parent> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>metadata-service</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </parent> <name>report</name> <artifactId>report</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>rest-service</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </dependency> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>services</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </dependency> </dependencies> diff --git a/dbrepo-metadata-service/repositories/pom.xml b/dbrepo-metadata-service/repositories/pom.xml index c7135144b847c5574a6f303b669c74952cc64b66..d7c45b2898bb84baeef2adac49daa1e6b584ad01 100644 --- a/dbrepo-metadata-service/repositories/pom.xml +++ b/dbrepo-metadata-service/repositories/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>metadata-service</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </parent> <name>repositories</name> <artifactId>repositories</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>oai</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </dependency> </dependencies> diff --git a/dbrepo-metadata-service/rest-service/pom.xml b/dbrepo-metadata-service/rest-service/pom.xml index 087e22b654a7ef118053dfdb9f1e451b8ba554bb..992395d34ead6c2e5491bf7db4d60042e7119a3c 100644 --- a/dbrepo-metadata-service/rest-service/pom.xml +++ b/dbrepo-metadata-service/rest-service/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>metadata-service</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </parent> <name>rest-service</name> <artifactId>rest-service</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>services</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </dependency> </dependencies> diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java index 485967e56814ee0b5449e1faa95c7fc2ab21eef6..aaed002d5c330f5ee98d1ded5b9933e14de1b390 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java @@ -41,6 +41,7 @@ import java.util.UUID; public class DatabaseEndpoint extends AbstractEndpoint { private final UserService userService; + private final AccessService accessService; private final MetadataMapper metadataMapper; private final StorageService storageService; private final DatabaseService databaseService; @@ -48,10 +49,11 @@ public class DatabaseEndpoint extends AbstractEndpoint { private final DashboardService dashboardService; @Autowired - public DatabaseEndpoint(UserService userService, MetadataMapper metadataMapper, StorageService storageService, + public DatabaseEndpoint(UserService userService, AccessService accessService, MetadataMapper metadataMapper, StorageService storageService, DatabaseService databaseService, ContainerService containerService, DashboardService dashboardService) { this.userService = userService; + this.accessService = accessService; this.metadataMapper = metadataMapper; this.storageService = storageService; this.databaseService = databaseService; diff --git a/dbrepo-metadata-service/services/pom.xml b/dbrepo-metadata-service/services/pom.xml index 6b5f58f4f6797012f6e1e3e621a7c8700f3234e5..f69e7124a530895da06484aedd3dbe8d9a090f8f 100644 --- a/dbrepo-metadata-service/services/pom.xml +++ b/dbrepo-metadata-service/services/pom.xml @@ -6,23 +6,23 @@ <parent> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>metadata-service</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </parent> <name>services</name> <artifactId>services</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>oai</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </dependency> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>repositories</artifactId> - <version>1.9.1</version> + <version>1.9.2</version> </dependency> </dependencies> diff --git a/dbrepo-search-service/Pipfile b/dbrepo-search-service/Pipfile index e62574783c7e347bcbd40fcebb4ff2fe0a498e7c..c05cd0a461a0fa3d47242f0624dfe87cedf9c4eb 100644 --- a/dbrepo-search-service/Pipfile +++ b/dbrepo-search-service/Pipfile @@ -17,7 +17,7 @@ flask_httpauth = "*" jwt = "~=1.3" rdflib = "*" grafana-client = "*" -dbrepo = {path = "./lib/dbrepo-1.9.1.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.9.2.tar.gz"} gunicorn = "*" ecs_logging = "*" diff --git a/dbrepo-search-service/Pipfile.lock b/dbrepo-search-service/Pipfile.lock index 6c32cb119d2b4dc4945c5fdfcc901a422cbff162..0311f44581bb1744221436b48273638364afa081 100644 --- a/dbrepo-search-service/Pipfile.lock +++ b/dbrepo-search-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "40d4f3f3e19b2840cae3c53ef9a753b8c93e6601e4b10e03c8f4d7a8276440be" + "sha256": "415611f31c7f873488df627f955025366a591388a32f43f163254bffd48be442" }, "pipfile-spec": 6, "requires": { @@ -272,10 +272,10 @@ }, "dbrepo": { "hashes": [ - "sha256:b6d7b9f5efeade2274249f1e48517820dd58dce5b24c0bf092cb4fc4be59c602" + "sha256:b9079a9a97d7112459df40cbc8e63302848e4cd995a5bd0fe69d52b99e670be7" ], - "path": "./lib/dbrepo-1.9.1.tar.gz", - "version": "==1.9.1" + "path": "./lib/dbrepo-1.9.2.tar.gz", + "version": "==1.9.2" }, "ecs-logging": { "hashes": [ @@ -404,7 +404,7 @@ "sha256:fd9fb7c941280e2c837b603850efc93c999ae58aae2b40765ed682a6907ebbc5", "sha256:fe46d4f8e94e637634d54477b0cfabcf93c53f29eedcbdeecaf2af32029b4421" ], - "markers": "python_version < '3.14' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", + "markers": "python_version < '3.14' and (platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32'))))))", "version": "==3.2.2" }, "gunicorn": { @@ -947,7 +947,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.9.0.post0" }, "python-dotenv": { @@ -1026,104 +1026,104 @@ }, "qh3": { "hashes": [ - "sha256:02130af8f4d5f58ae858bd0b90358bf4607b4a6be16d254c4a81527a48306111", - "sha256:032221480f04cce330988c4acdc5527ccf31515b02c7a15257530b00a1b16a46", - "sha256:04b1682d4b4199b7ddbc7367dad4e52c23e5e33def9bf47b30ba2a5a75d77337", - "sha256:074f9c6765f6753cf69f786325f7bbe7c943ae23e23af43db59c240376c21c41", - "sha256:08c96471e452bace59e4daedb6d51db047dac3737f359293e276ab466ea98fe2", - "sha256:0af350c466eac335d5984d6ea8f40bc186ec6ae34f11c2b2109bf63863b88846", - "sha256:0d175c13eb8b255b0bcb0044546bbc2cab8bd8af354ed222a9d4d38a60c3815d", - "sha256:0e0a1a1890d3e74a8b48b735ac3c52c26653e27edaa1fda1b9f533c9b0c57cff", - "sha256:0e448cbeb887e7ccd30551812ee9a32e2bf6d9e13fb97976426dd15d2c6fa9bf", - "sha256:0eee72469ea4befd0e87dab58c359417f42e80a1d1ca7c2ac4a27b89158c5075", - "sha256:118e6a141001a204536044e07ac3908bc4c8f3fe42caefae64281ff2de0860ac", - "sha256:1537270b7affb352d9c6ae5f303aaa513ac22df1b7795b317cfcec1cbc31c84e", - "sha256:156219090c0dff9e7256b069bb83a8ebebea32d5478a92ee9b9de40e22ee22d6", - "sha256:1d7c6ec44dd0a0f44c3beb128401af9233f155a45995d278e79722d561cd73a4", - "sha256:1eed1e1873427bd56f130320f8827ceb0f70600321fffe429e544ea9249ee865", - "sha256:2263d18b75d4320f5626490b9ea9181944b552f9e2e3a40bd4dbfe3705c700ff", - "sha256:2713476b262346ed8d9cb0afb6c1c2475417cdfc18c607e28d834da63731d072", - "sha256:27892c4d79629c8a1e9a989f9a9a22b8141b515fe2b120f55b1731933ff24e52", - "sha256:279b5961b094c6fb13548612298019297156cd718e999e666bf947fb47933435", - "sha256:29980aefd4778aa21d5a45a34cc4b9ca7f1635160f6938de2927c4a69d1aa735", - "sha256:29e4d422cd858a4e284336eeda167ddc3c669eea61a772efe4341b800478f89f", - "sha256:35c7b38458520301298b0cc6d979907bc59b71ba4a87fc5e487536ea65a2d517", - "sha256:3682dc975e6d42a77186f568f39f69ff6319e9d9117b03d2af116742c8289a57", - "sha256:37003232c34f0777e8c009a75a6a44bc9edf14065298d290acc75561cc8a7244", - "sha256:3cf1720799a5546462ff33bd81e25d88e1f4b220aa9935613b7460ab0c614d74", - "sha256:3de0c67c3de5ce9c35ac507f31bdde7e081a128ef13665a6534af065bdd40976", - "sha256:4017f07629338c9a86de6b6d8e5fa34b62ee8ea6efec77a283f3166c0db532e3", - "sha256:45ee055192d5e81751be864774f66a4113ff96e3b8565242ae957f734ffb2f36", - "sha256:4bb12cacf16952fa4b19618386fe132c9d8984dfa38e73a3a57043cf773b7663", - "sha256:4c055867471392fafe314ed2296fc009552c85af1405feba3381148cbcc38956", - "sha256:5001f0460f222bd32b08cc03d6692cae7e7b9669678fcd5b7f555a768c3360f6", - "sha256:52ad639c3e04e31be880ed0808616f15c1a14bd65e3ba812373207d287fe01ca", - "sha256:556b305f8d9bce5da8c99563521415b9e6e43d3bc4781a7f2da2a43e8735a30d", - "sha256:565cfe50e199689d3d34670b85e57394e33f399d1ab3167deb26d4f888d1865b", - "sha256:56f83ecde8656052669ccb32897fa15fbeb5427d6d550b5df1fd56b0a7e51908", - "sha256:576dc2cd85336735b9e33a9a226977b347c37fb92445d13a2c95790186eda147", - "sha256:586510eb7e6fc1c0d8cb0234fed2c0e4d19c873d39c6bca0f6c8899cc1355e6d", - "sha256:5c81df3b745e6a8ef758f027823525e880dfbe10e6e1d417146df447f29b8590", - "sha256:5c82b561c82f8883672d2f5eee55311759bdeef2143378d9e90b36558492c652", - "sha256:6104cf7ca8c6351546d28600a497bf1a205b833295af47d23aa32afad422d84c", - "sha256:618ec54a581fbf1580f3611c828ff01e16b57eadf69dc67f71494b2c36624568", - "sha256:63c0e51b6d24aa9a86a8258966a00554a7876b4c0f634fb60fbf28cccfee72a2", - "sha256:64c0b076acae5cd2cbffd38f4aa612c71e4a5fe9d828f4c740a1d6bf872a765f", - "sha256:67c30e47c489ca9102fa64f6fe0d6eb388b57ec68059a7fa8baaa06c5bb47e1b", - "sha256:68e45279615c561fe90dbffd7cc3406137b0a1dced328469f340e9a8fa9be522", - "sha256:6cf1fb74c6811ba940b284cab987fed61aeb13bdbe7e3700b0316795409fcb70", - "sha256:6ebfddd19dd046ee9f0e886120d8840177af24571f6c439747689759c0c51339", - "sha256:744664c6e23ee8643a309ff9f8c390a9a367c476380c82852bf05b1bf718f163", - "sha256:75d879d67457c079012f096dcbaa8d040ec43aa97210d6096bc3ff6be8eb1099", - "sha256:7656090018fb5629c504373b80116e30e54dc1be88df88f2a736a18370dd7a20", - "sha256:80157816dbbf89f372e9b971f0168a886b4520686b92a973f67051064663a4be", - "sha256:83334c95f7f5f1c39b5d4053f953500f85bcddeaa3ff85904079773d5504ca6a", - "sha256:8429531a674fc81843272b23e8b918651ca4082e54073266a19e7ac2a77fe203", - "sha256:848d71c5f6750513401a28e64ed1094706f83157f2203342f9355f00ffef5b85", - "sha256:857ded39921b556ec13d318d62aa0734c1ffbc415d5595366327fdb73b020404", - "sha256:8bdf93cff9d7283b809320f1ceff9f1bc9df2a8e912f6ba511614f648da91ede", - "sha256:8dbc83e5d1be9596c48446daa5f6039a3b7df13a3943f4519d6423bf3ccfedbf", - "sha256:8ec3c943a37d57ec836b23b0c2f28a389ecc7a2e690aaeda5b44debd04762972", - "sha256:91072f72f302ae307ee62b32ce1903cd9b5298e3e4ed08701be5714eaa1051c6", - "sha256:9888d7ce62ce2bbc252a88adf482a2ab561aada3ac50654f2ab730da60d4ef6d", - "sha256:988e53cbed460577ea2f692a30bbbb9d5963bd0e8bd26f7d20ea83b170320e65", - "sha256:9a1a175a0b8732c3e60dcb5595c3f6da66da8c70abb22bbaa67dbca82e91e435", - "sha256:9db78edb44d4ef978329df38f417dee8a20dd65ef67800b9013f81e21f9396cb", - "sha256:9e164eb332547143efdf6c0cdb013651edf0697e320dbc175a7358bfb253fb97", - "sha256:9fc6c3acce1c274f36d4653ef1e1055d24222d23791f37cdf82a533fe65bde7c", - "sha256:a416cfb018da01be25c3a7b730c25fbfc395c3df82c45798e87fa5ad4ad81d34", - "sha256:a43bbd5e68e9dac7f858aa592a12b606e34b16c478acf36ae3c24ff49c1ea24d", - "sha256:a4d41cb5b8c045fa233b32b1020937fe6443af0e269b355e8368a5ccad7356df", - "sha256:ab83c97bc8422a4ee68bbb350fcc41904d3c982dd8046fdb08fb046b40edfd35", - "sha256:ad51c81a29d2c67e8bd92684cb27a7cdc099d4414a769beadcfc999a9a87d9e2", - "sha256:adea2aecc6da81ebbc2048821bd23bdf1e09dc116d56cfef9018a8e7ddfed822", - "sha256:b4a2bb4ac2243504b002c95010fd78cc1709ca8be45ee9fd90b695d458fb59a1", - "sha256:b9881d8e11137270e8ff21e8ac300cd317cb3bf089ed81b6c59b44f5fbe5f7ca", - "sha256:c056b9cd280c11c261113fbad7e3cbfb734b06421fddc69a7bb922b604aa093d", - "sha256:c10e95f060e46d0946b2f883c4ae4ed9950475839e4c5763a366bd6f11246c66", - "sha256:c3576dac1c92bd09775bded18f496dacb6095973449891be3ada1836aa226bb4", - "sha256:c8122efcc01ce7e44591aeb19d67e9fb8c8e465fd5022ce9cd3c728230591b38", - "sha256:c8e5d8c65eefc931a340eb81b65d6e24e2ed2950801ae30e58ff4f368a7ecb88", - "sha256:cbb5c52ee5c481bd9a58bd87f36c497268afd6fca6e8704d05ab53b81074e504", - "sha256:cd64add5819480cc0a4cb59d4579df37bf95ebb7616eb0d70ceabf6e6599b4a4", - "sha256:cde2021162748e54fa5cbd5bf8536c9db0a425eec5d28750d2ec2369fdc38b93", - "sha256:d382e87ae4197d36e06f26f87a636aa27592f57473a1569cc64a38200f27ed7e", - "sha256:d4c1b8a9f3fa2d3ea63b28875c780d24f2652a9dd53a2fe76fb1454598bc10d8", - "sha256:d7382e6f3569ac84249c7fc590b2290b0438c7b4ee67f397b598c789faafda58", - "sha256:dbdf95ce396e5c23417d2c7716fd650b0408de302c1334dd535b1e2bed2e4857", - "sha256:e44f6a7a4ed46543d9d8f49674ed8b38f28f68561a39d01a5929222403985f0a", - "sha256:e7ddad0e0f1ca8aae5fc457ccde940481c2a0323ac04eed015b4a97891df0ca9", - "sha256:e8aa3bde1ea6a693c5f3d31b3296c253865708583250dd9d2a58af0b11176e70", - "sha256:e9c3da7831ae7221fe82938a6c1f8e87ec230e093dece3759110ae57a119ad91", - "sha256:ef787b45d545b403094e81b6b99ae4b8142ed219b23e2488cf062f97bc0e1416", - "sha256:f345cd2e0b1f26b7e13eadab78d53de9b9011c14b44a9a0c58a7d2466234efb0", - "sha256:f43c7048f64f8e2d1461226af8bafaafc243c571ca5c88baa56b89b2db7b314f", - "sha256:f93178ccf0d8325b66c755bd0273359d2a2a0dbb408af28cee05aa902b501869", - "sha256:fa1bf4d9838e4c8cdf309500a908fc412cdc325a63e5c74ad88a794bed16c943", - "sha256:fcdd2f6b1b1500bde96b442d777a563eadca1b825db0c42ac6aef45ad9ec3c4d" - ], - "markers": "python_version < '3.12' and (platform_python_implementation != 'CPython' or python_full_version > '3.7.10') and (platform_system == 'Darwin' or platform_system == 'Windows' or platform_system == 'Linux') and (platform_machine == 'x86_64' or platform_machine == 's390x' or platform_machine == 'armv7l' or platform_machine == 'ppc64le' or platform_machine == 'ppc64' or platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'arm64' or platform_machine == 'ARM64' or platform_machine == 'x86' or platform_machine == 'i686') and (platform_python_implementation == 'CPython' or platform_python_implementation == 'PyPy')", - "version": "==1.5.1" + "sha256:0083b52578a54f04957527f28c9016736242efb8c2b5e589e027ab8b2e1916a2", + "sha256:025d7331c8bb45bf7d02c1c0bc8ec9b5a9054b891e865ff679753c22da8bc6c9", + "sha256:02856422f3009270990ebdee6a2e29f1f1167b1fe8260c62810b6bfb7d86740d", + "sha256:04151e6ce7c3aaaca7d850a2b7dcc769f1356581af178649ab5e6f2aa78b0304", + "sha256:04c18ca8ebdeda8ab60cb72a43f2c5d730446705f5060854eb21167b0d21097e", + "sha256:0529b9ee9b37f3ccf2833d558e7ad1846596e36f1916a23c0c1af825f07549be", + "sha256:087bf1a4b3a6809112b1a22f50dd0dbd86eb991971b036d2f3a650c79d81fe29", + "sha256:0a87ecebdf3a3216ecbbd32d6c3cbabcd3f90d1a24363fc6aeea3af99d7c394b", + "sha256:0ca013329d0345d4d203f24e12e5adde3bc393571d55c02b8279efd1cf7fd818", + "sha256:0eac427589488b069293fb2d06a2d765a4aff77ae74990c566fe161542493bac", + "sha256:134939418800fad4e669bb6ce4e7c4e303e5d40d2ff457add9ccd99e64cbbf64", + "sha256:1399e604c7ac178758eecdefdfae0bed37f52a792101ee8e32dc594ca2350c0d", + "sha256:13fc96388d3010377b52aa3059141568dd4ba35c0d2f3f39b60244fbd4f70b79", + "sha256:1735afdce2c3d924da8c4b7f5da5d1020c14981b472e94052e2ec351b1b67068", + "sha256:238b185d8d1c41907a093201e389127cffbfbb013141fd9fed98609c0adcfb45", + "sha256:2800f9fabec12e4e3ba40cdce65ded9b951f6d5374ec7021be667db88e496a38", + "sha256:2ae6a3170f14c49b0733aeb71bfbdb98962d05a3502e2e4f2a056eae76c34800", + "sha256:2b928f026cef5eecd530a1a546a468eca8ac71aebc9eaf864b5ff54aebb4a63e", + "sha256:2f1997b95fd66835e3a372a6c21062a35ca870bdd1687867c09e1d8f91980df0", + "sha256:3bb915e2a46b0d2364e74e7c7c85a9b0d5c473a0bcfcd27a2ed6923773b0216c", + "sha256:3d7fb7ec47465c40af3c0471a14f2a4af8f0c1af95a0476ef4ac6eacf18b2b1e", + "sha256:3de09f8d58eb69f8d8a9bc1a77982001c1d43df27544512d2a89d00911dfa40c", + "sha256:4341c2e53b3f1a5ed065dd2be4f7ff23e0b1708397bb66c19e6b898377fe941c", + "sha256:45937d8be16030d1c6da5dcfff10bbba35a7f5bd5f96de45045fd8fbea033df4", + "sha256:465c7efc5bb33ee90da4d29580ad0f57efd897c4184f575e77653514e9a058cb", + "sha256:4707bdb76176b00cb4bd0d27d8ccea41fc86fbff7479cc9812aef0a23ffc6813", + "sha256:486065b50f7787e2f62c918b619bc34c06d8a66e1f1bd4f66cb449a2e467f3a5", + "sha256:4bb83c8437d7c43bda7006240fc95dc119d2569dab30a20b428dbf058f686a2b", + "sha256:4e7dff6ffc3ed19be9b2e42ea58ef00bc0435f2a950f3320eed932b1dff325b7", + "sha256:548b31b6d1bec0b11813c74ed3c94664aeeeef4ba51a3ac312fe471962e58442", + "sha256:585ebc0d5a415fa1042189c7c98bd93e63813c38e2d6e1581181f99e2bc7aea7", + "sha256:5ac050fce6407914b32ab84366fc15f00c6a7aad33c7116dc29ac441ded3bce6", + "sha256:5c1d3f12442b7c43db7753eaf914e9644b8a90d97798206dc6a1444a4a06ddcb", + "sha256:5f963a886bc882cba39091568e225ab36b882ae24eb2a965256c5f63e6b7eafa", + "sha256:62115845fb1695d1d018e995eae90dc2b53da9a30127e264e5cd370384358178", + "sha256:6341cddfd43d962c77849358ed7ae98022949ac8155ee9e97dcb3000edd73613", + "sha256:6380a52e146227bf420af66803f8c4b54627129f49631ba9f9b058bed92de51a", + "sha256:657442ae3d713f88c8ac8c7bf047da4e1cee4f6cc2aff254a7e7d4e2cc5d9d7a", + "sha256:66a6c77d667a848f39fc153675c2d53bce7ad068d8ce7d651da79a5d43672a81", + "sha256:66c01e2d825587a7b06062b4f05373c7ec3191939f6b744192403863078ddf41", + "sha256:695f0b5ab6a886fd3d1089eed50a4815136e84583b5d426c0de11db24274dff8", + "sha256:6975abfe6d21f0f2a74109aab4b9e9071d215f0ae38b5760e070d4c027187fcb", + "sha256:69c5f38e00cb41ceea8f6d9f82b76a10cd4bd0f5612551f841ddcc335df5e88b", + "sha256:6b8baa1c9789945de14571e48bed5996440171f5dd91589d9572ece6db8aa09d", + "sha256:748587c5fd4216d44fedcdfc8b03320e36f2eba6ab373cbf337448583ff37f16", + "sha256:74e3d7265edc7268f3eb54b8d0623a2b5adea8e272cc124818686bc6583a4645", + "sha256:7d9d83f65e778a421a24e4eb82de22cbac3f94ac09637309890465bf5592a5ce", + "sha256:7db6eddc5c19730e92cca95c2a2a7bca184637d854720e33367466db9f428708", + "sha256:8022106a134c142f4a1e774be4ae6a2be4e480586de65c0b13658e9e329aea7d", + "sha256:819a5733de1a2407b738105f99b323a1fe31f687a701c29566ae934fa893224f", + "sha256:844d7ff5a5081f6920d726518860a76138f97763ce6c4206c06756844f0c1645", + "sha256:892c335cbd1ac5786229aa6b8987250dbb7f7b0bf3775b56ca11cde6090bcb30", + "sha256:89a19e6af701e525b7c0e4e589d8fa0dcf9f1deddb9eee171fa941a0add93ffc", + "sha256:89b24c3060cfdf8e61926af5271632f656bee689b6c95c36b85d2c79ec04c757", + "sha256:95efc1710dc4d4a7fff837a603a7bc4370449c87bdaecafdf290226e82303b52", + "sha256:968b1d7aae7d1dcd9d1899bac4936ff641589420575ef0f886150313b3872de7", + "sha256:9b2e8cb7a2940d2b94ca24db9f544f4011cdde2c446ccc71f7d1646ae011df11", + "sha256:9c094865d884a88053f8a2a282f26debc2727a21ef14e9fc5ee23d07d9d749f1", + "sha256:9e687e7317f87ad139e4959b65bcff22adb4bbec5f8e09c1873a5bb973e1380e", + "sha256:a4c265cff95c19da27450c4861fd60a25e4b4dddc58ddf62cf5fe869922d6e8e", + "sha256:a75c04955b285c9b9dd54077ad8e180bb5393c714c213e26a37170cbd7cc9df7", + "sha256:a790ceebd0f105241e425af0545b7b21623e3e94a67add68e854f13596d3f76b", + "sha256:ac1c429b0f283fad0521e50fba6135d70b7d8fa9538523880ee232b0cf0edd09", + "sha256:af885eeda54152c3086b7c5861b50f79c94b83e1ea4a1407afaffb84f52aaddf", + "sha256:b07b805c3ef734e5c330333b549d98adc514df6e83ef0338cb3353538d570322", + "sha256:bbfeeff794bb947fe90ba3fc3d395c78418bb17c2dbafe5ca47552ef3ccb6a29", + "sha256:bd7ae2ead0ddd0df3a22fe9f84aff1c44afbac82b1af41dc2934eec6c56ef3ec", + "sha256:be8800c5a087e7e4e33cb12f35234ca94f4ec4837d29918899a48d6f61ea59b3", + "sha256:c11567cd77d11a7ba2f8be9a31cfa74a11df34a4a78f91cff8fa6bee5c3145c7", + "sha256:c2ce0f0cdb9d22cbccd477b09436354e4aa2aaf0cdd0c2ed3f3da6f11979e68e", + "sha256:c5d45257e8ecbddf2587aa4ae1a0cf45856eb32d5e847bb01a3f74a39ab4b645", + "sha256:c66f50475727ac7cde643d48b27b6388a6b680484c3dcbb0b237fb003529785a", + "sha256:cb846ab19c1fa9d2d1aeaa1e603f4ddc6e9837952fc22c5b56061167b28cb2d0", + "sha256:cff8b68a89b2e03f8d954606d2015a4241002e3ea7ce45c3e7c7c73918263bac", + "sha256:d33da2a9b44f7613fe214b1d2dc03a4345b7a0345383ac562b8636a41129791f", + "sha256:d37c6809d76e9ed95277dc0155bb72c08e7334d741b2eae62ff4f9f8adcb43af", + "sha256:d58d5d2e59432c86324565a4adc649f383251f747809e469de1c01208691bc02", + "sha256:d6bc891a9480c0b4791a1cc7d62b3128ffa04b7883fabf35bb0ece3173338911", + "sha256:d725c7335184f1ef96b22660b92ab8f343ada41804bb54d74ac166f82033f115", + "sha256:d9362ea607a8640b5a1a612f834f39002dfa57561388e21e4d9dd12c7f5d11fc", + "sha256:db84023568e545ea45385cacd9edcc02cd1bd8cb1f4c5c0a89d4d061e8153850", + "sha256:ddebca89a63a726b129a7198087a17a8c33d72f957442593892c681e6aef0e8f", + "sha256:de091b890eaab8be1cba3c7483f718e68067c7681209f0c98251b50e7e032800", + "sha256:de9587b4d32462af1eafb84f2ea35aed5cb92b945f18acb1593cdec0d90accc6", + "sha256:def7d1d90c61da6860377403e603d0aff5a47e3fb71cbf0155b8fa0d9f6cacbb", + "sha256:e73e1d9633315b3a01763b9c7be55522f7f0983880b61d67f49823ac7e3b4421", + "sha256:eaf03403091b30c97bfbf4c22e6fc7057253e283157dbcdd23eb7a925d7ec65a", + "sha256:efc70ae80f742e84b320765587f0ce7715f11ae0b6a2a1b9e0ebed650b5da546", + "sha256:f0d7845993703cf115c82b9161cc361ddffd91af9d164892297bc009dac70097", + "sha256:f5b03dea0416ee7f9ec5c6be7b9dc02ffd3a187eaac159f291fd548160ca6d68", + "sha256:f6a2196df79b2aeccefe48fc81b11ad10d99ca274181dbd277793caa1b802890", + "sha256:f703a48096176403f86753d0e60da190d9663501c1d491de65607ba51fb4dda2", + "sha256:f9c80a48731f267dd9843d2c7149102066c3baf1ef0ac31bfc09d01060774dfe", + "sha256:fbfaccbaf223e52f05cb07b56d5ab1ce315a21b796f2531924bdd9aae01b1604", + "sha256:ff454ce3765a756392348da7887dffb3972b197e34feddc2b37a0c913cd0a8af" + ], + "markers": "(platform_python_implementation != 'CPython' or python_full_version > '3.7.10') and (platform_system == 'Darwin' or platform_system == 'Windows' or platform_system == 'Linux') and (platform_machine == 'x86_64' or platform_machine == 's390x' or platform_machine == 'armv7l' or platform_machine == 'ppc64le' or platform_machine == 'ppc64' or platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'arm64' or platform_machine == 'ARM64' or platform_machine == 'x86' or platform_machine == 'i686') and (platform_python_implementation == 'CPython' or (platform_python_implementation == 'PyPy' and python_version < '3.12'))", + "version": "==1.5.2" }, "rdflib": { "hashes": [ @@ -1277,7 +1277,7 @@ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.17.0" }, "sqlalchemy": { @@ -1882,7 +1882,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.9.0.post0" }, "requests": { @@ -1906,7 +1906,7 @@ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.17.0" }, "testcontainers-core": { diff --git a/dbrepo-search-service/app.py b/dbrepo-search-service/app.py index 37885f81dc11d07aecb3c9dddf2d650f58023182..d8aa0a2cedb375658698f41bd05c244ff605245b 100644 --- a/dbrepo-search-service/app.py +++ b/dbrepo-search-service/app.py @@ -183,7 +183,7 @@ template = { "info": { "title": "Database Repository Search Service API", "description": "Service that searches the search database", - "version": "1.9.1", + "version": "1.9.2", "contact": { "name": "Prof. Andreas Rauber", "email": "andreas.rauber@tuwien.ac.at" diff --git a/dbrepo-search-service/lib/dbrepo-1.9.1.tar.gz b/dbrepo-search-service/lib/dbrepo-1.9.1.tar.gz deleted file mode 100644 index 8aca96aacad8cc90c6a0d978c49b4bc0bdeb032d..0000000000000000000000000000000000000000 Binary files a/dbrepo-search-service/lib/dbrepo-1.9.1.tar.gz and /dev/null differ diff --git a/dbrepo-auth-service/init/lib/dbrepo-1.9.1-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.9.2-py3-none-any.whl similarity index 92% rename from dbrepo-auth-service/init/lib/dbrepo-1.9.1-py3-none-any.whl rename to dbrepo-search-service/lib/dbrepo-1.9.2-py3-none-any.whl index 3d97921b6a82ef23d9c32a22c8db6d74a09b400a..658217e61233bd386c2abead7a1aee64b7a14781 100644 Binary files a/dbrepo-auth-service/init/lib/dbrepo-1.9.1-py3-none-any.whl and b/dbrepo-search-service/lib/dbrepo-1.9.2-py3-none-any.whl differ diff --git a/dbrepo-search-service/lib/dbrepo-1.9.2.tar.gz b/dbrepo-search-service/lib/dbrepo-1.9.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..cc536fecd0b417e82a49442320b056d6da14d4ed Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.9.2.tar.gz differ diff --git a/dbrepo-ui/composables/grant-service.ts b/dbrepo-ui/composables/grant-service.ts new file mode 100644 index 0000000000000000000000000000000000000000..9b259963c1389afc242bc0c96e754da6ae1f263b --- /dev/null +++ b/dbrepo-ui/composables/grant-service.ts @@ -0,0 +1,21 @@ +import {axiosErrorToApiError} from '@/utils' + +export const useGrantService = (): any => { + async function findOne(databaseId: string, userId: string): Promise<DatabaseGrantsDto> { + const axios = useAxiosInstance() + console.debug('find grant of database with id', databaseId) + return new Promise<DatabaseGrantsDto>((resolve, reject) => { + axios.get<DatabaseGrantsDto>(`/api/database/${databaseId}/grant/${userId}`) + .then((response) => { + console.info('Found grant of database with id', databaseId) + resolve(response.data) + }) + .catch((error) => { + console.error('Failed to find grant', error) + reject(axiosErrorToApiError(error)) + }) + }) + } + + return {findOne} +} diff --git a/dbrepo-ui/dto/index.ts b/dbrepo-ui/dto/index.ts index e05e0fc4d48e3b224131dec7d12bf25023c3faf0..4ab739009b8efd53d451760173944e37a6266524 100644 --- a/dbrepo-ui/dto/index.ts +++ b/dbrepo-ui/dto/index.ts @@ -227,6 +227,11 @@ interface IdentifierFunderSaveDto { award_title: string; } +interface DatabaseGrantsDto { + grants: string[]; + type: string | null; +} + interface IdentifierDto { id: string; database_id: string; diff --git a/dbrepo-ui/locales/en-US.json b/dbrepo-ui/locales/en-US.json index d3918cab602c062a1c902d6afc29a17b0103b8a7..9c5bf688978d7526686a5d12b4c94d0f1ad88451 100644 --- a/dbrepo-ui/locales/en-US.json +++ b/dbrepo-ui/locales/en-US.json @@ -661,13 +661,14 @@ }, "subpages": { "access": { - "title": "Access to database", + "title": "Database Access", "subtitle": "Overview on users with their access to the database", "read": "Read all contents", "write-own": "Read all contents & write own tables", "write-all": "Read all contents & write all tables", "revoke": "No access", "action": "Action", + "grants": "Grants", "username": { "label": "Username", "hint": "Required" diff --git a/dbrepo-ui/pages/database/[database_id]/settings.vue b/dbrepo-ui/pages/database/[database_id]/settings.vue index 3b8c104d142a47fd7c121f06d7be1878c82ce301..4168c58649a23765c4f371f3c322cc9b589a2ec8 100644 --- a/dbrepo-ui/pages/database/[database_id]/settings.vue +++ b/dbrepo-ui/pages/database/[database_id]/settings.vue @@ -97,14 +97,28 @@ :subtitle="$t('pages.database.subpages.access.subtitle')" > <v-data-table :headers="headers" - :items="database.accesses" + :items="accesses" :items-per-page="10"> + <template v-slot:item.type="{ item }"> + <v-chip + size="small" + :append-icon="`mdi-${item.type.startsWith(item.grants?.type) ? 'checkbox-marked-circle' : 'close-circle'}`"> + {{ item.type }} + </v-chip> + </template> <template v-slot:item.qualified_name="{ item }"> <span v-if="item && item.user"> {{ item.user.qualified_name }} </span> </template> + <template v-slot:item.grants="{ item }"> + <v-skeleton-loader + v-if="item.loading" + type="text" /> + <span + v-else>{{ item.grants.grants.join(', ') }}</span> + </template> <template v-slot:item.action="{ item }"> <v-btn v-if="item && item.user && item.user.username !== cacheUser.username" @@ -331,10 +345,15 @@ export default { sortable: false }, { - title: this.$t('pages.database.subpages.access.title'), + title: this.$t('pages.database.subpages.access.type.label'), value: 'type', sortable: false }, + { + title: this.$t('pages.database.subpages.access.grants'), + value: 'grants', + sortable: false + }, { title: this.$t('pages.database.subpages.access.action'), value: 'action', @@ -489,6 +508,8 @@ export default { this.modifyVisibility.is_schema_public = this.database.is_schema_public this.modifyVisibility.is_dashboard_enabled = this.database.is_dashboard_enabled this.modifyOwner.id = this.database.owner.id + this.accesses = this.database.accesses + this.accesses.forEach(a => this.findGrant(a.user.id)) }, methods: { submit () { @@ -514,6 +535,26 @@ export default { this.loading = false }) }, + findGrant (userId) { + if (!this.database) { + return false + } + const access = this.accesses.filter(a => a.user.id === userId)[0] + console.debug('===>', access) + access['loading'] = true + const grantService = useGrantService() + grantService.findOne(this.database.id, userId) + .then((grant) => { + access['grants'] = grant + access['loading'] = false + }) + .catch(() => { + access['loading'] = false + }) + .finally(() => { + access['loading'] = false + }) + }, uploadFile () { console.debug('upload file', this.file) if (this.file.size > 1_000_000) { diff --git a/docker-compose.yml b/docker-compose.yml index 564b666b35fe53a860729cc3db939b718ebe7b2e..aec93aa4fd17a91845b6ca0be5138ff2a090559b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -326,14 +326,6 @@ services: - search-db-data:/bitnami/opensearch/data ports: - "9200:9200" - deploy: - resources: - reservations: - cpus: '0.25' - memory: 512M - limits: - cpus: '0.50' - memory: 2048M healthcheck: test: curl -sSL 127.0.0.1:9200 <<: *healthcheck-params @@ -373,7 +365,7 @@ services: build: context: ./dbrepo-ui args: - APP_VERSION: ${CI_COMMIT_TAG:-latest} + APP_VERSION: ${APP_VERSION:-latest} COMMIT: ${CI_COMMIT_SHORT_SHA:-} network: host environment: @@ -576,8 +568,8 @@ services: COMPUTE_SERVICE_ENDPOINT: "${COMPUTE_SERVICE_ENDPOINT:-local[2]}" EXCHANGE_NAME: "${EXCHANGE_NAME:-dbrepo}" METADATA_SERVICE_ENDPOINT: "${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080}" - GRANT_DEFAULT_READ: "${GRANT_DEFAULT_READ:-SELECT}" - GRANT_DEFAULT_WRITE: "${GRANT_DEFAULT_WRITE:-SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE}" + GRANT_DEFAULT_READ: "${GRANT_DEFAULT_READ:-SELECT, EXECUTE}" + GRANT_DEFAULT_WRITE: "${GRANT_DEFAULT_WRITE:-SELECT, CREATE, CREATE VIEW, CREATE ROUTINE, CREATE TEMPORARY TABLES, EXECUTE, LOCK TABLES, INDEX, TRIGGER, INSERT, UPDATE, DELETE}" 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} QUEUE_NAME: ${QUEUE_NAME:-dbrepo} diff --git a/helm/dbrepo/files/create-event-listener.jar b/helm/dbrepo/files/create-event-listener.jar index 8df9e19da6675b86f1b5755a9cec8c8e1044b11f..fb1458371a5ce51be8ca63a9421a621e0ef09ce3 100644 Binary files a/helm/dbrepo/files/create-event-listener.jar and b/helm/dbrepo/files/create-event-listener.jar differ diff --git a/helm/dbrepo/values.yaml b/helm/dbrepo/values.yaml index b15f67ee63dbeba62fbdd0024775ea57f1de8985..4f0bf2968551411f2787a680b89f346011de41c8 100644 --- a/helm/dbrepo/values.yaml +++ b/helm/dbrepo/values.yaml @@ -141,7 +141,7 @@ authservice: setupJob: image: ## @skip authservice.setupJob.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/auth-service-init:1.9.1 + name: registry.datalab.tuwien.ac.at/dbrepo/auth-service-init:1.9.2 ## @param authservice.setupJob.resourcesPreset The container resource preset resourcesPreset: "nano" ## @param authservice.setupJob.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) @@ -419,7 +419,7 @@ analyseservice: enabled: true image: ## @skip analyseservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.9.1 + name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.9.2 ## @param analyseservice.podAnnotations the pod annotations. Evaluated as a template ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ podAnnotations: { } @@ -483,7 +483,7 @@ metadataservice: enabled: true image: ## @skip metadataservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.9.1 + name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.9.2 ## @param metadataservice.podAnnotations the pod annotations. Evaluated as a template ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ podAnnotations: { } @@ -583,7 +583,7 @@ dataservice: endpoint: http://data-service image: ## @skip dataservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.9.1 + name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.9.2 ## @param dataservice.podAnnotations the pod annotations. Evaluated as a template ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ podAnnotations: { } @@ -672,7 +672,7 @@ searchservice: endpoint: http://search-service image: ## @skip searchservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.9.1 + name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.9.2 ## @param searchservice.podAnnotations the pod annotations. Evaluated as a template ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ podAnnotations: { } @@ -724,7 +724,7 @@ searchservice: enabled: true image: ## @skip searchservice.setupJob.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.9.1 + name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.9.2 ## @param searchservice.setupJob.resourcesPreset The container resource preset resourcesPreset: "nano" ## @param searchservice.setupJob.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) @@ -787,7 +787,7 @@ storageservice: enabled: true image: ## @skip storageservice.setupJob.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.9.1 + name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.9.2 s3: ## @param storageservice.setupJob.s3.endpoint The S3-capable endpoint the microservice connects to. endpoint: http://storage-service-s3:8333 @@ -922,7 +922,7 @@ ui: enabled: true image: ## @skip ui.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.9.1 + name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.9.2 ## https://stackblitz.com/edit/nuxt-oidc-auth-keygen?file=index.js oidc: ## @param ui.oidc.authSessionSecret This should be a at least 48 characters random string. It is used to encrypt the user session. @@ -1043,7 +1043,7 @@ dashboardservice: enabled: true image: ## @skip dashboardservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:1.9.1 + name: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:1.9.2 ## @param dashboardservice.endpoint The endpoint for the microservices. endpoint: http://dashboard-service ## @param dashboardservice.podAnnotations the pod annotations. Evaluated as a template @@ -1098,7 +1098,7 @@ dashboardservice: enabled: true image: ## @skip dashboardservice.setupJob.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service-init:1.9.1 + name: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service-init:1.9.2 ## @param dashboardservice.setupJob.resourcesPreset The container resource preset resourcesPreset: "nano" ## @param dashboardservice.setupJob.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) diff --git a/install.sh b/install.sh index 6110ab5276d1efa5ff29eb7cc09abd39d63ec9a9..8550259eb7547ebaf562a844548fb53207fc0713 100644 --- a/install.sh +++ b/install.sh @@ -1,7 +1,7 @@ #!/bin/bash # preset -APP_VERSION="1.9.1" +APP_VERSION="1.9.2" MIN_CPU=8 MIN_RAM=10 SKIP_CHECKS=${SKIP_CHECKS:-0} diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/api/database/DatabaseGrantsDto.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/api/database/DatabaseGrantsDto.java new file mode 100644 index 0000000000000000000000000000000000000000..b88680f5d589c245925d87c2ddacd36e73dd572d --- /dev/null +++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/api/database/DatabaseGrantsDto.java @@ -0,0 +1,28 @@ + +package at.ac.tuwien.ifs.dbrepo.core.api.database; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.*; +import lombok.extern.jackson.Jacksonized; + +import java.util.Set; + +@Getter +@Setter +@Builder +@EqualsAndHashCode +@NoArgsConstructor +@AllArgsConstructor +@Jacksonized +@ToString +public class DatabaseGrantsDto { + + @NotNull + @Schema(example = "[\"SELECT\"]") + private Set<String> grants; + + @Schema(example = "read") + private GrantTypeDto type; + +} diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/api/database/GrantTypeDto.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/api/database/GrantTypeDto.java new file mode 100644 index 0000000000000000000000000000000000000000..b693570c719f760c3d64cf802b212ea03f0f7a0b --- /dev/null +++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/api/database/GrantTypeDto.java @@ -0,0 +1,27 @@ +package at.ac.tuwien.ifs.dbrepo.core.api.database; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; + +@Getter +@Schema +public enum GrantTypeDto { + + @JsonProperty("read") + READ("read"), + + @JsonProperty("write") + WRITE("write"); + + private final String name; + + GrantTypeDto(String name) { + this.name = name; + } + + @Override + public String toString() { + return this.name; + } +} diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/mapper/MetadataMapper.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/mapper/MetadataMapper.java index 0ed6e783c033c7f85e9f3278552374de8ab6f50e..c872e26b5d48fb8b966dd092d621b5127af0a6a3 100644 --- a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/mapper/MetadataMapper.java +++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/mapper/MetadataMapper.java @@ -104,6 +104,37 @@ public interface MetadataMapper { }) DataTypeDto dataTypeToDataTypeDto(DataType data); + default DatabaseGrantsDto grantsToDatabaseGrantDto(Set<String> grants, String grantDefaultRead, + String grantDefaultWrite) { + final Set<String> read = Arrays.asList(grantDefaultRead.split(",")) + .stream() + .map(String::trim) + .map(String::toUpperCase) + .collect(Collectors.toSet()); + final Set<String> write = Arrays.asList(grantDefaultWrite.split(",")) + .stream() + .map(String::trim) + .map(String::toUpperCase) + .collect(Collectors.toSet()); + grants = grants.stream() + .map(String::trim) + .map(String::toUpperCase) + .filter(g -> !g.equals("USAGE")) + .collect(Collectors.toSet()); + final GrantTypeDto type; + if (write.containsAll(grants) && grants.containsAll(write)) { + type = GrantTypeDto.WRITE; + } else if (read.containsAll(grants) && grants.containsAll(read)) { + type = GrantTypeDto.READ; + } else { + type = null; + } + return DatabaseGrantsDto.builder() + .grants(grants) + .type(type) + .build(); + } + @Mappings({ @Mapping(target = "databaseName", source = "internalName"), @Mapping(target = "ownerUsername", source = "owner.username") diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/test/BaseTest.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/test/BaseTest.java index e5437b5cd9af0f025b3d8e192160f567cf78f633..9fe2e55ceb012a55ff2742e5616fd287c084175d 100644 --- a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/test/BaseTest.java +++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/test/BaseTest.java @@ -7339,6 +7339,20 @@ public class BaseTest { .user(USER_1_BRIEF_DTO) .build(); + public final DatabaseGrantsDto READ_GRANT_DTO = DatabaseGrantsDto.builder() + .type(GrantTypeDto.READ) + .grants(Set.of("SELECT", "EXECUTE")) + .build(); + + public final DatabaseGrantsDto WRITE_GRANT_DTO = DatabaseGrantsDto.builder() + .type(GrantTypeDto.WRITE) + .grants(Set.of("SELECT", "CREATE", "CREATE VIEW", "CREATE ROUTINE", "CREATE TEMPORARY TABLES", "EXECUTE", "LOCK TABLES", "INDEX", "TRIGGER", "INSERT", "UPDATE", "DELETE")) + .build(); + + public final DatabaseGrantsDto UNKNOWN_GRANT_DTO = DatabaseGrantsDto.builder() + .grants(Set.of("MONITOR")) + .build(); + public final DatabaseAccess DATABASE_1_USER_1_WRITE_OWN_ACCESS = DatabaseAccess.builder() .type(AccessType.WRITE_OWN) .hdbid(DATABASE_1_ID) diff --git a/lib/python/pyproject.toml b/lib/python/pyproject.toml index 5e12c02fbe220ad77772d66d14f75cdb978844e7..9ab7afffb88996efaa6cbc0cbe2d0d0db1bdf18a 100644 --- a/lib/python/pyproject.toml +++ b/lib/python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "dbrepo" -version = "1.9.1" +version = "1.9.2" description = "DBRepo Python Library" keywords = [ "DBRepo", diff --git a/lib/python/setup.py b/lib/python/setup.py index 0c57a4c3249be99c3edb0d304316cc6334d2bb78..a8beb0574cedadb98db62f110259ed09e38391ab 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.9.1", + version="1.9.2", description="A library for communicating with DBRepo", url="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9/", author="Martin Weise", diff --git a/make/build.mk b/make/build.mk index 2c1efca8568a59963ae2d5e0d3b44e6b33462260..152cecf0e0136015e9a75bfb60a61002bdbdcddb 100644 --- a/make/build.mk +++ b/make/build.mk @@ -22,7 +22,7 @@ build-ui: ## Build the UI. .PHONY: build-python-lib build-python-lib: ## Build the Python Library. - rm -rf ./dbrepo-analyse-service/lib/* ./dbrepo-search-service/lib/* ./dbrepo-dashboard-service/lib/* ./dbrepo-auth-service/init/lib/* + rm -rf ./dbrepo-analyse-service/lib/* ./dbrepo-analyse-service/Pipfile.lock ./dbrepo-search-service/lib/* ./dbrepo-search-service/Pipfile.lock ./dbrepo-dashboard-service/lib/* ./dbrepo-dashboard-service/Pipfile.lock ./dbrepo-auth-service/init/lib/* ./dbrepo-auth-service/init/Pipfile.lock python3 -m build --sdist ./lib/python python3 -m build --wheel ./lib/python cp -r ./lib/python/dist/dbrepo-${APP_VERSION}* ./dbrepo-analyse-service/lib