diff --git a/.docs/.swagger/api-analyse.yaml b/.docs/.swagger/api-analyse.yaml new file mode 100644 index 0000000000000000000000000000000000000000..7f40ece861f2be0655618f639640a1f70eccf006 --- /dev/null +++ b/.docs/.swagger/api-analyse.yaml @@ -0,0 +1 @@ +{"definitions":{},"externalDocs":{"description":"Sourcecode Documentation","url":"https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services"},"info":{"contact":{"email":"andreas.rauber@tuwien.ac.at","name":"Prof. Andreas Rauber"},"description":"Service that analyses data structures","license":{"name":"Apache 2.0","url":"https://www.apache.org/licenses/LICENSE-2.0"},"title":"Database Repository Analyse Service API","version":"1.2.0"},"openapi":"3.0.0","paths":{"/api/analyse/determinedt":{"post":{"consumes":["application/json"],"description":"This is a simple API which returns the datatypes of a (path) csv file","parameters":[{"description":"to-do description","in":"body","name":"body","required":true,"schema":{"properties":{"enum":{"example":true,"type":"boolean"},"enum_tol":{"example":0.1},"filepath":{"example":"/data/testdt08.csv","type":"string"},"separator":{"example":",","type":"string"}},"type":"object"}}],"produces":["application/json"],"responses":{"200":{"description":"OK"},"405":{"description":"Invalid input"}},"summary":"Determine datatypes"}},"/api/analyse/determinepk":{"post":{"consumes":["application/json"],"description":"This is a simple API which returns the primary keys + ranking of a (path) csv file","parameters":[{"description":"to-do description","in":"body","name":"body","required":true,"schema":{"properties":{"filepath":{"example":"/data/testdt08.csv","type":"string"},"seperator":{"example":",","type":"string"}},"type":"object"}}],"produces":["application/json"],"responses":{"200":{"description":"OK"},"405":{"description":"Invalid input"}},"summary":"Determine primary keys"}}},"servers":[{"description":"Generated server url","url":"http://localhost:5000"},{"description":"Sandbox","url":"https://dbrepo2.tuwien.ac.at"}]} diff --git a/.docs/.swagger/api-container.yaml b/.docs/.swagger/api-container.yaml new file mode 100644 index 0000000000000000000000000000000000000000..2102e2f63cab2048d1c546149d233b3c141faf6d --- /dev/null +++ b/.docs/.swagger/api-container.yaml @@ -0,0 +1,2410 @@ +openapi: 3.0.1 +info: + title: Database Repository Container Service API + description: Service that manages the containers + contact: + name: Prof. Andreas Rauber + email: andreas.rauber@tuwien.ac.at + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0 + version: 1.2.0 +externalDocs: + description: Sourcecode Documentation + url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services +servers: +- url: http://localhost:9092 + description: Generated server url +- url: https://dbrepo2.tuwien.ac.at + description: Sandbox +paths: + /api/image/{id}: + get: + tags: + - image-endpoint + summary: Find some image + operationId: findById + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: Found image + content: + application/json: + schema: + $ref: '#/components/schemas/ImageDto' + "404": + description: Image could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + put: + tags: + - image-endpoint + summary: Update some image + operationId: update + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ImageChangeDto' + required: true + responses: + "202": + description: Updated image successfully + content: + application/json: + schema: + $ref: '#/components/schemas/ImageDto' + "404": + description: Image could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + delete: + tags: + - image-endpoint + summary: Delete some image + operationId: delete + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + responses: + "202": + description: Deleted image successfully + "404": + description: Image could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + /api/container/{id}: + get: + tags: + - container-endpoint + summary: Find some container + operationId: findById_1 + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + responses: + "502": + description: Docker client failed to connect + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Found container + content: + application/json: + schema: + $ref: '#/components/schemas/ContainerDto' + "404": + description: Container image could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + put: + tags: + - container-endpoint + summary: Modify some container + operationId: modify + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ContainerChangeDto' + required: true + responses: + "409": + description: Container is already started/stopped + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: Container or user could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Modification of container state is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Modified state of container successfully + content: + application/json: + schema: + $ref: '#/components/schemas/ContainerBriefDto' + security: + - bearerAuth: [] + delete: + tags: + - container-endpoint + summary: Delete some container + operationId: delete_1 + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + responses: + "410": + description: Container is already removed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "409": + description: Container is still running + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Deleted container successfully + security: + - bearerAuth: [] + /api/image: + get: + tags: + - image-endpoint + summary: Find all images + operationId: findAll + responses: + "200": + description: List images + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ContainerImage' + post: + tags: + - image-endpoint + summary: Create image + operationId: create + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ImageCreateDto' + required: true + responses: + "201": + description: Created image + content: + application/json: + schema: + $ref: '#/components/schemas/ImageDto' + "404": + description: User could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Image specification is invalid + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "502": + description: Docker client failed to connect + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "409": + description: Image already exists + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + /api/container: + get: + tags: + - container-endpoint + summary: Find all containers + operationId: findAll_1 + parameters: + - name: limit + in: query + required: false + schema: + type: integer + format: int32 + responses: + "200": + description: List containers + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ContainerBriefDto' + post: + tags: + - container-endpoint + summary: Create container + operationId: create_1 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ContainerCreateRequestDto' + required: true + responses: + "201": + description: Created a new container + content: + application/json: + schema: + $ref: '#/components/schemas/ContainerBriefDto' + "404": + description: Container image or user could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "409": + description: Container name already exists + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "502": + description: Docker client failed to connect + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] +components: + schemas: + ImageChangeDto: + required: + - dialect + - driver_class + - jdbc_method + - registry + type: object + properties: + registry: + type: string + example: docker.io/library + defaultPort: + maximum: 65535 + minimum: 1024 + type: integer + format: int32 + example: 5432 + environment: + type: array + items: + $ref: '#/components/schemas/ImageEnvItemDto' + dialect: + type: string + example: Postgres + driver_class: + type: string + example: org.postgresql.Driver + jdbc_method: + type: string + example: postgresql + ImageEnvItemDto: + required: + - iid + - key + - type + type: object + properties: + iid: + type: integer + format: int64 + key: + type: string + example: MARIADB_ROOT_PASSWORD + type: + type: string + example: PRIVILEGED_PASSWORD + enum: + - username + - password + - privileged_username + - privileged_password + ImageDateDto: + required: + - database_format + - example + - has_time + - id + - unix_format + type: object + properties: + id: + type: integer + format: int64 + example: + type: string + example: 30.01.2022 + database_format: + type: string + example: '%d.%c.%Y' + unix_format: + type: string + example: dd.MM.YYYY + has_time: + type: boolean + example: false + created_at: + type: string + format: date-time + ImageDto: + required: + - default_port + - dialect + - driver_class + - id + - jdbc_method + - registry + - repository + - tag + type: object + properties: + id: + type: integer + format: int64 + registry: + type: string + example: docker.io/library + repository: + type: string + example: mariadb + tag: + type: string + example: "10.5" + dialect: + type: string + example: org.hibernate.dialect.MariaDBDialect + hash: + type: string + example: sha256:c5ec7353d87dfc35067e7bffeb25d6a0d52dad41e8b7357213e3b12d6e7ff78e + compiled: + type: string + format: date-time + example: 2021-03-12T15:26:21.678396092Z + size: + type: integer + example: 314295447 + driver_class: + type: string + example: org.mariadb.jdbc.Driver + date_formats: + type: array + items: + $ref: '#/components/schemas/ImageDateDto' + jdbc_method: + type: string + example: mariadb + default_port: + type: integer + format: int32 + example: 3306 + ApiErrorDto: + required: + - code + - message + - status + type: object + properties: + status: + type: string + example: STATUS + enum: + - 100 CONTINUE + - 101 SWITCHING_PROTOCOLS + - 102 PROCESSING + - 103 EARLY_HINTS + - 103 CHECKPOINT + - 200 OK + - 201 CREATED + - 202 ACCEPTED + - 203 NON_AUTHORITATIVE_INFORMATION + - 204 NO_CONTENT + - 205 RESET_CONTENT + - 206 PARTIAL_CONTENT + - 207 MULTI_STATUS + - 208 ALREADY_REPORTED + - 226 IM_USED + - 300 MULTIPLE_CHOICES + - 301 MOVED_PERMANENTLY + - 302 FOUND + - 302 MOVED_TEMPORARILY + - 303 SEE_OTHER + - 304 NOT_MODIFIED + - 305 USE_PROXY + - 307 TEMPORARY_REDIRECT + - 308 PERMANENT_REDIRECT + - 400 BAD_REQUEST + - 401 UNAUTHORIZED + - 402 PAYMENT_REQUIRED + - 403 FORBIDDEN + - 404 NOT_FOUND + - 405 METHOD_NOT_ALLOWED + - 406 NOT_ACCEPTABLE + - 407 PROXY_AUTHENTICATION_REQUIRED + - 408 REQUEST_TIMEOUT + - 409 CONFLICT + - 410 GONE + - 411 LENGTH_REQUIRED + - 412 PRECONDITION_FAILED + - 413 PAYLOAD_TOO_LARGE + - 413 REQUEST_ENTITY_TOO_LARGE + - 414 URI_TOO_LONG + - 414 REQUEST_URI_TOO_LONG + - 415 UNSUPPORTED_MEDIA_TYPE + - 416 REQUESTED_RANGE_NOT_SATISFIABLE + - 417 EXPECTATION_FAILED + - 418 I_AM_A_TEAPOT + - 419 INSUFFICIENT_SPACE_ON_RESOURCE + - 420 METHOD_FAILURE + - 421 DESTINATION_LOCKED + - 422 UNPROCESSABLE_ENTITY + - 423 LOCKED + - 424 FAILED_DEPENDENCY + - 425 TOO_EARLY + - 426 UPGRADE_REQUIRED + - 428 PRECONDITION_REQUIRED + - 429 TOO_MANY_REQUESTS + - 431 REQUEST_HEADER_FIELDS_TOO_LARGE + - 451 UNAVAILABLE_FOR_LEGAL_REASONS + - 500 INTERNAL_SERVER_ERROR + - 501 NOT_IMPLEMENTED + - 502 BAD_GATEWAY + - 503 SERVICE_UNAVAILABLE + - 504 GATEWAY_TIMEOUT + - 505 HTTP_VERSION_NOT_SUPPORTED + - 506 VARIANT_ALSO_NEGOTIATES + - 507 INSUFFICIENT_STORAGE + - 508 LOOP_DETECTED + - 509 BANDWIDTH_LIMIT_EXCEEDED + - 510 NOT_EXTENDED + - 511 NETWORK_AUTHENTICATION_REQUIRED + message: + type: string + example: Error message + code: + type: string + example: error.service.code + ContainerChangeDto: + required: + - action + type: object + properties: + action: + type: string + enum: + - start + - stop + ContainerBriefDto: + required: + - creator + - hash + - id + - internal_name + - name + - running + type: object + properties: + id: + type: integer + format: int64 + hash: + type: string + example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50 + name: + type: string + example: Air Quality + creator: + $ref: '#/components/schemas/UserBriefDto' + running: + type: boolean + example: true + database: + $ref: '#/components/schemas/DatabaseBriefDto' + created: + type: string + format: date-time + internal_name: + type: string + example: air-quality + CreatorBriefDto: + required: + - firstname + - lastname + type: object + properties: + firstname: + type: string + example: Josiah + lastname: + type: string + example: Carberry + affiliation: + type: string + example: Wesleyan University + DatabaseBriefDto: + required: + - id + - name + - owner + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: Air Quality + description: + type: string + example: Air Quality in Austria + identifier: + $ref: '#/components/schemas/IdentifierBriefDto' + engine: + type: string + example: mariadb:10.5 + owner: + $ref: '#/components/schemas/UserBriefDto' + container: + $ref: '#/components/schemas/ContainerBriefDto' + creator: + $ref: '#/components/schemas/UserBriefDto' + created: + type: string + format: date-time + is_public: + type: boolean + example: true + IdentifierBriefDto: + required: + - container id + - creators + - database id + - id + - publication_year + - title + - type + type: object + properties: + id: + type: integer + format: int64 + title: + type: string + example: "Airquality Stephansplatz, Vienna, Austria" + type: + type: string + enum: + - database + - subset + doi: + type: string + example: 10.1038/nphys1170 + publisher: + type: string + example: TU Wien + creators: + type: array + items: + $ref: '#/components/schemas/CreatorBriefDto' + container id: + type: integer + format: int64 + example: 1 + database id: + type: integer + format: int64 + example: 1 + query id: + type: integer + format: int64 + example: 1 + publication_year: + type: integer + format: int32 + example: 2022 + UserBriefDto: + required: + - id + - username + type: object + properties: + id: + type: string + format: uuid + example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4 + username: + type: string + description: Only contains lowercase characters + example: jcarberry + name: + type: string + example: Josiah Carberry + orcid: + type: string + example: 0000-0002-1825-0097 + given_name: + type: string + example: Josiah + family_name: + type: string + example: Carberry + email_verified: + type: boolean + example: true + ImageCreateDto: + required: + - default_port + - dialect + - driver_class + - jdbc_method + - registry + - repository + - tag + type: object + properties: + registry: + type: string + example: docker.io/library + repository: + type: string + example: mariadb + tag: + type: string + dialect: + type: string + environment: + type: array + items: + $ref: '#/components/schemas/ImageEnvItemDto' + driver_class: + type: string + jdbc_method: + type: string + default_port: + maximum: 65535 + minimum: 1024 + type: integer + format: int32 + ContainerCreateRequestDto: + required: + - name + - repository + - tag + type: object + properties: + name: + type: string + example: Air Quality + repository: + type: string + example: mariadb + tag: + type: string + example: "10.5" + Constraints: + type: object + properties: + uniques: + type: array + items: + $ref: '#/components/schemas/Unique' + foreignKeys: + type: array + items: + $ref: '#/components/schemas/ForeignKey' + checks: + uniqueItems: true + type: array + items: + type: string + Container: + type: object + properties: + id: + type: integer + format: int64 + createdBy: + type: string + format: uuid + creator: + $ref: '#/components/schemas/User' + ownedBy: + type: string + format: uuid + owner: + $ref: '#/components/schemas/User' + name: + type: string + internalName: + type: string + hash: + type: string + imageId: + type: integer + format: int64 + port: + type: integer + format: int32 + database: + $ref: '#/components/schemas/Database' + image: + $ref: '#/components/schemas/ContainerImage' + ipAddress: + type: string + created: + type: string + format: date-time + lastModified: + type: string + format: date-time + ContainerImage: + type: object + properties: + id: + type: integer + format: int64 + repository: + type: string + registry: + type: string + tag: + type: string + driverClass: + type: string + dialect: + type: string + jdbcMethod: + type: string + hash: + type: string + compiled: + type: string + format: date-time + size: + type: integer + format: int64 + defaultPort: + type: integer + format: int32 + environment: + type: array + items: + $ref: '#/components/schemas/ContainerImageEnvironmentItem' + dateFormats: + type: array + items: + $ref: '#/components/schemas/ContainerImageDate' + containers: + type: array + items: + $ref: '#/components/schemas/Container' + created: + type: string + format: date-time + lastModified: + type: string + format: date-time + ContainerImageDate: + type: object + properties: + id: + type: integer + format: int64 + iid: + type: integer + format: int64 + image: + $ref: '#/components/schemas/ContainerImage' + example: + type: string + hasTime: + type: boolean + databaseFormat: + type: string + unixFormat: + type: string + createdAt: + type: string + format: date-time + ContainerImageEnvironmentItem: + type: object + properties: + id: + type: integer + format: int64 + iid: + type: integer + format: int64 + key: + type: string + value: + type: string + type: + type: string + enum: + - USERNAME + - PASSWORD + - PRIVILEGED_USERNAME + - PRIVILEGED_PASSWORD + image: + $ref: '#/components/schemas/ContainerImage' + created: + type: string + format: date-time + lastModified: + type: string + format: date-time + Creator: + type: object + properties: + id: + type: integer + format: int64 + pid: + type: integer + format: int64 + firstname: + type: string + lastname: + type: string + affiliation: + type: string + orcid: + type: string + identifier: + $ref: '#/components/schemas/Identifier' + created: + type: string + format: date-time + creator: + $ref: '#/components/schemas/User' + lastModified: + type: string + format: date-time + Credential: + type: object + properties: + id: + type: string + format: uuid + type: + type: string + userId: + type: string + format: uuid + createdDate: + type: integer + format: int64 + secretData: + type: string + credentialData: + type: string + priority: + type: integer + format: int32 + user: + $ref: '#/components/schemas/User' + Database: + type: object + properties: + id: + type: integer + format: int64 + createdBy: + type: string + format: uuid + creator: + $ref: '#/components/schemas/User' + ownedBy: + type: string + format: uuid + owner: + $ref: '#/components/schemas/User' + container: + $ref: '#/components/schemas/Container' + name: + type: string + internalName: + type: string + exchangeName: + type: string + description: + type: string + contactPerson: + type: string + format: uuid + contact: + $ref: '#/components/schemas/User' + identifier: + $ref: '#/components/schemas/Identifier' + tables: + type: array + items: + $ref: '#/components/schemas/Table' + views: + type: array + items: + $ref: '#/components/schemas/View' + isPublic: + type: boolean + created: + type: string + format: date-time + lastModified: + type: string + format: date-time + ForeignKey: + type: object + properties: + fkid: + type: integer + format: int64 + tid: + type: integer + format: int64 + tdbid: + type: integer + format: int64 + table: + $ref: '#/components/schemas/Table' + rtid: + type: integer + format: int64 + rtdbid: + type: integer + format: int64 + referencedTable: + $ref: '#/components/schemas/Table' + references: + type: array + items: + $ref: '#/components/schemas/ForeignKeyReference' + onUpdate: + type: string + enum: + - ReferenceType.RESTRICT + - ReferenceType.CASCADE + - ReferenceType.SET_NULL + - ReferenceType.NO_ACTION + - ReferenceType.SET_DEFAULT + onDelete: + type: string + enum: + - ReferenceType.RESTRICT + - ReferenceType.CASCADE + - ReferenceType.SET_NULL + - ReferenceType.NO_ACTION + - ReferenceType.SET_DEFAULT + ForeignKeyReference: + type: object + properties: + id: + type: integer + format: int64 + foreignKey: + $ref: '#/components/schemas/ForeignKey' + column: + $ref: '#/components/schemas/TableColumn' + referencedColumn: + $ref: '#/components/schemas/TableColumn' + Identifier: + required: + - publisher + type: object + properties: + id: + type: integer + format: int64 + containerId: + type: integer + format: int64 + databaseId: + type: integer + format: int64 + queryId: + type: integer + format: int64 + creator: + $ref: '#/components/schemas/User' + title: + type: string + description: + type: string + publisher: + type: string + language: + type: string + enum: + - LanguageType.AB + - LanguageType.AA + - LanguageType.AF + - LanguageType.AK + - LanguageType.SQ + - LanguageType.AM + - LanguageType.AR + - LanguageType.AN + - LanguageType.HY + - LanguageType.AS + - LanguageType.AV + - LanguageType.AE + - LanguageType.AY + - LanguageType.AZ + - LanguageType.BM + - LanguageType.BA + - LanguageType.EU + - LanguageType.BE + - LanguageType.BN + - LanguageType.BH + - LanguageType.BI + - LanguageType.BS + - LanguageType.BR + - LanguageType.BG + - LanguageType.MY + - LanguageType.CA + - LanguageType.KM + - LanguageType.CH + - LanguageType.CE + - LanguageType.NY + - LanguageType.ZH + - LanguageType.CU + - LanguageType.CV + - LanguageType.KW + - LanguageType.CO + - LanguageType.CR + - LanguageType.HR + - LanguageType.CS + - LanguageType.DA + - LanguageType.DV + - LanguageType.NL + - LanguageType.DZ + - LanguageType.EN + - LanguageType.EO + - LanguageType.ET + - LanguageType.EE + - LanguageType.FO + - LanguageType.FJ + - LanguageType.FI + - LanguageType.FR + - LanguageType.FF + - LanguageType.GD + - LanguageType.GL + - LanguageType.LG + - LanguageType.KA + - LanguageType.DE + - LanguageType.KI + - LanguageType.EL + - LanguageType.KL + - LanguageType.GN + - LanguageType.GU + - LanguageType.HT + - LanguageType.HA + - LanguageType.HE + - LanguageType.HZ + - LanguageType.HI + - LanguageType.HO + - LanguageType.HU + - LanguageType.IS + - LanguageType.IO + - LanguageType.IG + - LanguageType.ID + - LanguageType.IA + - LanguageType.IE + - LanguageType.IU + - LanguageType.IK + - LanguageType.GA + - LanguageType.IT + - LanguageType.JA + - LanguageType.JV + - LanguageType.KN + - LanguageType.KR + - LanguageType.KS + - LanguageType.KK + - LanguageType.RW + - LanguageType.KV + - LanguageType.KG + - LanguageType.KO + - LanguageType.KJ + - LanguageType.KU + - LanguageType.KY + - LanguageType.LO + - LanguageType.LA + - LanguageType.LV + - LanguageType.LB + - LanguageType.LI + - LanguageType.LN + - LanguageType.LT + - LanguageType.LU + - LanguageType.MK + - LanguageType.MG + - LanguageType.MS + - LanguageType.ML + - LanguageType.MT + - LanguageType.GV + - LanguageType.MI + - LanguageType.MR + - LanguageType.MH + - LanguageType.RO + - LanguageType.MN + - LanguageType.NA + - LanguageType.NV + - LanguageType.ND + - LanguageType.NG + - LanguageType.NE + - LanguageType.SE + - LanguageType.NO + - LanguageType.NB + - LanguageType.NN + - LanguageType.II + - LanguageType.OC + - LanguageType.OJ + - LanguageType.OR + - LanguageType.OM + - LanguageType.OS + - LanguageType.PI + - LanguageType.PA + - LanguageType.PS + - LanguageType.FA + - LanguageType.PL + - LanguageType.PT + - LanguageType.QU + - LanguageType.RM + - LanguageType.RN + - LanguageType.RU + - LanguageType.SM + - LanguageType.SG + - LanguageType.SA + - LanguageType.SC + - LanguageType.SR + - LanguageType.SN + - LanguageType.SD + - LanguageType.SI + - LanguageType.SK + - LanguageType.SL + - LanguageType.SO + - LanguageType.ST + - LanguageType.NR + - LanguageType.ES + - LanguageType.SU + - LanguageType.SW + - LanguageType.SS + - LanguageType.SV + - LanguageType.TL + - LanguageType.TY + - LanguageType.TG + - LanguageType.TA + - LanguageType.TT + - LanguageType.TE + - LanguageType.TH + - LanguageType.BO + - LanguageType.TI + - LanguageType.TO + - LanguageType.TS + - LanguageType.TN + - LanguageType.TR + - LanguageType.TK + - LanguageType.TW + - LanguageType.UG + - LanguageType.UK + - LanguageType.UR + - LanguageType.UZ + - LanguageType.VE + - LanguageType.VI + - LanguageType.VO + - LanguageType.WA + - LanguageType.CY + - LanguageType.FY + - LanguageType.WO + - LanguageType.XH + - LanguageType.YI + - LanguageType.YO + - LanguageType.ZA + - LanguageType.ZU + license: + $ref: '#/components/schemas/License' + type: + type: string + enum: + - DATABASE + - SUBSET + query: + type: string + queryNormalized: + type: string + queryHash: + type: string + resultHash: + type: string + execution: + type: string + format: date-time + resultNumber: + type: integer + format: int64 + publicationYear: + type: integer + format: int32 + publicationMonth: + type: integer + format: int32 + publicationDay: + type: integer + format: int32 + visibility: + type: string + enum: + - VisibilityType.EVERYONE + - VisibilityType.SELF + database: + $ref: '#/components/schemas/Database' + related: + type: array + items: + $ref: '#/components/schemas/RelatedIdentifier' + doi: + type: string + creators: + type: array + items: + $ref: '#/components/schemas/Creator' + created: + type: string + format: date-time + lastModified: + type: string + format: date-time + License: + type: object + properties: + identifier: + type: string + uri: + type: string + RelatedIdentifier: + type: object + properties: + id: + type: integer + format: int64 + iid: + type: integer + format: int64 + value: + type: string + type: + type: string + enum: + - DOI + - URL + - URN + - ARK + - arXiv + - bibcode + - EAN13 + - EISSN + - Handle + - IGSN + - ISBN + - ISTC + - LISSN + - LSID + - PMID + - PURL + - UPC + - w3id + relation: + type: string + enum: + - IsCitedBy + - Cites + - IsSupplementTo + - IsSupplementedBy + - IsContinuedBy + - Continues + - IsDescribedBy + - Describes + - HasMetadata + - IsMetadataFor + - HasVersion + - IsVersionOf + - IsNewVersionOf + - IsPreviousVersionOf + - IsPartOf + - HasPart + - IsPublishedIn + - IsReferencedBy + - References + - IsDocumentedBy + - Documents + - IsCompiledBy + - Compiles + - IsVariantFormOf + - IsOriginalFormOf + - IsIdenticalTo + - IsReviewedBy + - Reviews + - IsDerivedFrom + - IsSourceOf + - IsRequiredBy + - Requires + - IsObsoletedBy + - Obsoletes + creator: + $ref: '#/components/schemas/User' + created: + type: string + format: date-time + lastModified: + type: string + format: date-time + Role: + type: object + properties: + id: + type: string + format: uuid + name: + type: string + realmId: + type: string + format: uuid + users: + type: array + items: + $ref: '#/components/schemas/User' + Table: + type: object + properties: + id: + type: integer + format: int64 + tdbid: + type: integer + format: int64 + creator: + $ref: '#/components/schemas/User' + owner: + $ref: '#/components/schemas/User' + name: + type: string + internalName: + type: string + queueName: + type: string + routingKey: + type: string + description: + type: string + database: + $ref: '#/components/schemas/Database' + columns: + type: array + items: + $ref: '#/components/schemas/TableColumn' + constraints: + $ref: '#/components/schemas/Constraints' + created: + type: string + format: date-time + lastModified: + type: string + format: date-time + TableColumn: + type: object + properties: + id: + type: integer + format: int64 + tid: + type: integer + format: int64 + cdbid: + type: integer + format: int64 + dfid: + type: integer + format: int64 + dateFormat: + $ref: '#/components/schemas/ContainerImageDate' + table: + $ref: '#/components/schemas/Table' + view: + $ref: '#/components/schemas/View' + creator: + $ref: '#/components/schemas/User' + name: + type: string + autoGenerated: + type: boolean + internalName: + type: string + isPrimaryKey: + type: boolean + indexLength: + type: integer + format: int32 + alias: + type: string + columnType: + type: string + enum: + - TableColumnType.ENUM + - TableColumnType.NUMBER + - TableColumnType.DECIMAL + - TableColumnType.STRING + - TableColumnType.TEXT + - TableColumnType.BOOLEAN + - TableColumnType.DATE + - TableColumnType.TIMESTAMP + - TableColumnType.BLOB + length: + type: integer + format: int32 + isNullAllowed: + type: boolean + enumValues: + type: array + items: + type: string + ordinalPosition: + type: integer + format: int32 + created: + type: string + format: date-time + concept: + $ref: '#/components/schemas/TableColumnConcept' + unit: + $ref: '#/components/schemas/TableColumnUnit' + lastModified: + type: string + format: date-time + TableColumnConcept: + type: object + properties: + uri: + type: string + name: + type: string + description: + type: string + created: + type: string + format: date-time + columns: + type: array + items: + $ref: '#/components/schemas/TableColumn' + TableColumnUnit: + type: object + properties: + uri: + type: string + name: + type: string + description: + type: string + created: + type: string + format: date-time + columns: + type: array + items: + $ref: '#/components/schemas/TableColumn' + Unique: + type: object + properties: + uid: + type: integer + format: int64 + tid: + type: integer + format: int64 + tdbid: + type: integer + format: int64 + table: + $ref: '#/components/schemas/Table' + columns: + type: array + items: + $ref: '#/components/schemas/TableColumn' + User: + type: object + properties: + id: + type: string + format: uuid + username: + type: string + firstname: + type: string + lastname: + type: string + realmId: + type: string + format: uuid + email: + type: string + emailVerified: + type: boolean + enabled: + type: boolean + createdTimestamp: + type: integer + format: int64 + databasePassword: + type: string + attributes: + type: array + items: + $ref: '#/components/schemas/UserAttribute' + credentials: + type: array + items: + $ref: '#/components/schemas/Credential' + containers: + type: array + items: + $ref: '#/components/schemas/Container' + databases: + type: array + items: + $ref: '#/components/schemas/Database' + identifiers: + type: array + items: + $ref: '#/components/schemas/Identifier' + roles: + type: array + items: + $ref: '#/components/schemas/Role' + tables: + type: array + items: + $ref: '#/components/schemas/Table' + UserAttribute: + type: object + properties: + id: + type: string + format: uuid + userId: + type: string + format: uuid + name: + type: string + value: + type: string + user: + $ref: '#/components/schemas/User' + View: + type: object + properties: + id: + type: integer + format: int64 + vcid: + type: integer + format: int64 + vdbid: + type: integer + format: int64 + createdBy: + type: string + format: uuid + creator: + $ref: '#/components/schemas/User' + database: + $ref: '#/components/schemas/Database' + name: + type: string + internalName: + type: string + isPublic: + type: boolean + isInitialView: + type: boolean + query: + type: string + columns: + type: array + items: + $ref: '#/components/schemas/TableColumn' + created: + type: string + format: date-time + lastModified: + type: string + format: date-time + ColumnBriefDto: + required: + - column_type + - database_id + - id + - internal_name + - name + - table_id + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: date + database_id: + type: integer + format: int64 + table_id: + type: integer + format: int64 + internal_name: + type: string + example: mdb_date + column_type: + type: string + example: date + enum: + - enum + - number + - decimal + - string + - text + - boolean + - date + - timestamp + - blob + ContainerDto: + required: + - created + - hash + - id + - internal_name + - name + - running + type: object + properties: + id: + type: integer + format: int64 + hash: + type: string + example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50 + name: + type: string + example: Air Quality + state: + type: string + example: running + enum: + - created + - restarting + - running + - paused + - exited + - dead + database: + $ref: '#/components/schemas/DatabaseDto' + running: + type: boolean + example: true + image: + $ref: '#/components/schemas/ImageBriefDto' + port: + type: integer + format: int32 + owner: + $ref: '#/components/schemas/UserBriefDto' + created: + type: string + format: date-time + example: 2021-03-12T15:26:21.678396092Z + internal_name: + type: string + example: air-quality + ip_address: + type: string + CreatorDto: + required: + - firstname + - id + - lastname + type: object + properties: + id: + type: integer + format: int64 + firstname: + type: string + example: Josiah + lastname: + type: string + example: Carberry + affiliation: + type: string + example: Wesleyan University + orcid: + type: string + example: 0000-0002-1825-0097 + DatabaseAccessDto: + required: + - type + - user + type: object + properties: + user: + $ref: '#/components/schemas/UserDto' + type: + type: string + enum: + - read + - write_own + - write_all + created: + type: string + format: date-time + DatabaseDto: + required: + - creator + - exchange_name + - id + - internal_name + - name + - owner + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: Air Quality + identifier: + $ref: '#/components/schemas/IdentifierDto' + description: + type: string + example: Weather Australia 2009-2021 + tables: + type: array + items: + $ref: '#/components/schemas/TableBriefDto' + views: + type: array + items: + $ref: '#/components/schemas/ViewBriefDto' + image: + $ref: '#/components/schemas/ImageDto' + container: + $ref: '#/components/schemas/ContainerDto' + accesses: + type: array + items: + $ref: '#/components/schemas/DatabaseAccessDto' + creator: + $ref: '#/components/schemas/UserBriefDto' + owner: + $ref: '#/components/schemas/UserBriefDto' + created: + type: string + format: date-time + exchange_name: + type: string + example: dbrepo/air_quality + internal_name: + type: string + example: weather_australia + is_public: + type: boolean + example: true + IdentifierDto: + required: + - container id + - creators + - database id + - execution + - publication_year + - query + - query_hash + - query_normalized + - result_hash + - result_number + - title + - type + - visibility + type: object + properties: + id: + type: integer + format: int64 + type: + type: string + enum: + - database + - subset + title: + type: string + example: "Airquality Stephansplatz, Vienna, Austria" + description: + type: string + example: "Air quality reports at Stephansplatz, Vienna" + query: + type: string + example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ + \ = \"09:STEF\"" + execution: + type: string + format: date-time + visibility: + type: string + example: everyone + enum: + - everyone + - self + doi: + type: string + example: 10.1038/nphys1170 + publisher: + type: string + example: TU Wien + language: + type: string + enum: + - ab + - aa + - af + - ak + - sq + - am + - ar + - an + - hy + - as + - av + - ae + - ay + - az + - bm + - ba + - eu + - be + - bn + - bh + - bi + - bs + - br + - bg + - my + - ca + - km + - ch + - ce + - ny + - zh + - cu + - cv + - kw + - co + - cr + - hr + - cs + - da + - dv + - nl + - dz + - en + - eo + - et + - ee + - fo + - fj + - fi + - fr + - ff + - gd + - gl + - lg + - ka + - de + - ki + - el + - kl + - gn + - gu + - ht + - ha + - he + - hz + - hi + - ho + - hu + - is + - io + - ig + - id + - ia + - ie + - iu + - ik + - ga + - it + - ja + - jv + - kn + - kr + - ks + - kk + - rw + - kv + - kg + - ko + - kj + - ku + - ky + - lo + - la + - lv + - lb + - li + - ln + - lt + - lu + - mk + - mg + - ms + - ml + - mt + - gv + - mi + - mr + - mh + - ro + - mn + - na + - nv + - nd + - ng + - ne + - se + - "no" + - nb + - nn + - ii + - oc + - oj + - or + - om + - os + - pi + - pa + - ps + - fa + - pl + - pt + - qu + - rm + - rn + - ru + - sm + - sg + - sa + - sc + - sr + - sn + - sd + - si + - sk + - sl + - so + - st + - nr + - es + - su + - sw + - ss + - sv + - tl + - ty + - tg + - ta + - tt + - te + - th + - bo + - ti + - to + - ts + - tn + - tr + - tk + - tw + - ug + - uk + - ur + - uz + - ve + - vi + - vo + - wa + - cy + - fy + - wo + - xh + - yi + - yo + - za + - zu + license: + $ref: '#/components/schemas/LicenseDto' + creators: + type: array + items: + $ref: '#/components/schemas/CreatorDto' + created: + type: string + format: date-time + container id: + type: integer + format: int64 + example: 1 + database id: + type: integer + format: int64 + example: 1 + query id: + type: integer + format: int64 + example: 1 + query_normalized: + type: string + example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ + \ = \"09:STEF\"" + related: + type: array + items: + $ref: '#/components/schemas/RelatedIdentifierDto' + query_hash: + type: string + description: query hash in sha512 + result_hash: + type: string + result_number: + type: integer + format: int64 + example: 1 + publication_day: + type: integer + format: int32 + example: 15 + publication_month: + type: integer + format: int32 + example: 12 + publication_year: + type: integer + format: int32 + example: 2022 + last_modified: + type: string + format: date-time + ImageBriefDto: + required: + - id + - registry + - repository + - tag + type: object + properties: + id: + type: integer + format: int64 + registry: + type: string + example: docker.io/library + repository: + type: string + example: mariadb + tag: + type: string + example: "10.5" + LicenseDto: + required: + - identifier + - uri + type: object + properties: + identifier: + type: string + example: MIT + uri: + type: string + example: https://opensource.org/licenses/MIT + RelatedIdentifierDto: + required: + - created + - id + - value + type: object + properties: + id: + type: integer + format: int64 + value: + type: string + example: 10.70124/dc4zh-9ce78 + type: + type: string + example: DOI + enum: + - DOI + - URL + - URN + - ARK + - arXiv + - bibcode + - EAN13 + - EISSN + - Handle + - IGSN + - ISBN + - ISTC + - LISSN + - LSID + - PMID + - PURL + - UPC + - w3id + relation: + type: string + example: Cites + enum: + - IsCitedBy + - Cites + - IsSupplementTo + - IsSupplementedBy + - IsContinuedBy + - Continues + - IsDescribedBy + - Describes + - HasMetadata + - IsMetadataFor + - HasVersion + - IsVersionOf + - IsNewVersionOf + - IsPreviousVersionOf + - IsPartOf + - HasPart + - IsPublishedIn + - IsReferencedBy + - References + - IsDocumentedBy + - Documents + - IsCompiledBy + - Compiles + - IsVariantFormOf + - IsOriginalFormOf + - IsIdenticalTo + - IsReviewedBy + - Reviews + - IsDerivedFrom + - IsSourceOf + - IsRequiredBy + - Requires + - IsObsoletedBy + - Obsoletes + created: + type: string + format: date-time + last_modified: + type: string + format: date-time + TableBriefDto: + required: + - columns + - description + - id + - internal_name + - name + - owner + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: Air Quality + description: + type: string + example: Air Quality in Austria + owner: + $ref: '#/components/schemas/UserBriefDto' + columns: + type: array + items: + $ref: '#/components/schemas/ColumnBriefDto' + internal_name: + type: string + example: air_quality + UserAttributeDto: + type: object + properties: + name: + type: string + example: theme_dark + value: + type: string + example: "true" + UserDto: + required: + - email + - email_verified + - id + - username + type: object + properties: + id: + type: string + format: uuid + example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4 + username: + type: string + description: Only contains lowercase characters + example: jcarberry + name: + type: string + example: Josiah Carberry + orcid: + type: string + example: 0000-0002-1825-0097 + attributes: + type: array + items: + $ref: '#/components/schemas/UserAttributeDto' + containers: + type: array + items: + $ref: '#/components/schemas/ContainerDto' + databases: + type: array + items: + $ref: '#/components/schemas/ContainerDto' + identifiers: + type: array + items: + $ref: '#/components/schemas/ContainerDto' + email: + type: string + example: jcarberry@brown.edu + given_name: + type: string + example: Josiah + family_name: + type: string + example: Carberry + email_verified: + type: boolean + example: true + ViewBriefDto: + required: + - created + - creator + - id + - internal_name + - name + - query + - vdbid + type: object + properties: + id: + type: integer + format: int64 + vdbid: + type: integer + format: int64 + name: + type: string + example: Air Quality + query: + type: string + example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC + created: + type: string + format: date-time + creator: + $ref: '#/components/schemas/UserDto' + internal_name: + type: string + example: air_quality + is_public: + type: boolean + example: true + initial_view: + type: boolean + description: True if it is the default view for the database + example: true + last_modified: + type: string + format: date-time + securitySchemes: + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT diff --git a/.docs/.swagger/api-database.yaml b/.docs/.swagger/api-database.yaml new file mode 100644 index 0000000000000000000000000000000000000000..40b76995cc7f1fb0776ba1cd9e7dabb012ca377f --- /dev/null +++ b/.docs/.swagger/api-database.yaml @@ -0,0 +1,1626 @@ +openapi: 3.0.1 +info: + title: Database Repository Database Service API + description: Service that manages the databases + contact: + name: Prof. Andreas Rauber + email: andreas.rauber@tuwien.ac.at + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0 + version: 1.2.0 +externalDocs: + description: Sourcecode Documentation + url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services +servers: +- url: http://localhost:9092 + description: Generated server url +- url: https://dbrepo2.tuwien.ac.at + description: Sandbox +paths: + /api/container/{id}/database/{databaseId}/visibility: + put: + tags: + - database-endpoint + summary: Update database + operationId: visibility + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseModifyVisibilityDto' + required: true + responses: + "404": + description: Database or user could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Visibility modified successfully + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseDto' + "405": + description: Visibility modification is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}/transfer: + put: + tags: + - database-endpoint + summary: Transfer database + operationId: transfer + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseTransferDto' + required: true + responses: + "202": + description: Transfer of ownership was successful + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseDto' + "404": + description: Database or user could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Transfer of ownership is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}/access/{username}: + put: + tags: + - access-endpoint + summary: Modify access to some database + operationId: update + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: username + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseModifyAccessDto' + required: true + responses: + "404": + description: Database or user not found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Modify access query or database connection is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Modify access succeeded + "403": + description: Modify access not permitted when no access is granted in the + first place + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + delete: + tags: + - access-endpoint + summary: Revoke access to some database + operationId: revoke + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: username + in: path + required: true + schema: + type: string + responses: + "404": + description: User with access was not found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Modify access query or database connection is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Revoke of access not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Revoke of access not permitted as no access was found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Revoked access successfully + security: + - bearerAuth: [] + /api/container/{id}/database: + get: + tags: + - database-endpoint + summary: List databases + operationId: list + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: List of databases + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/DatabaseBriefDto' + post: + tags: + - database-endpoint + summary: Create database + operationId: create + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseCreateDto' + required: true + responses: + "201": + description: Created a new database + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseBriefDto' + "404": + description: "Container, user or database could not be found" + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "406": + description: Failed to create user at broker service or virtual host could + not be reached at broker service + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Database create permission is missing or grant permissions + at broker service failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "501": + description: Container image is not supported + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "503": + description: Connection to the database failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "502": + description: Connection to the container failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Database create query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "409": + description: Database name already exist or query store could not be created + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}/access: + get: + tags: + - access-endpoint + summary: Check access to some database + operationId: find + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "403": + description: No access to this database + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Found database access + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseAccessDto' + "405": + description: Check access is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + post: + tags: + - access-endpoint + summary: Give access to some database + operationId: create_1 + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseGiveAccessDto' + required: true + responses: + "202": + description: Granting access succeeded + "405": + description: Granting access not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Granting access query or database connection is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: Database or user not found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}: + get: + tags: + - database-endpoint + summary: Find some database + operationId: findById + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "405": + description: Database information is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: Database or container could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Database found successfully + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseDto' + security: + - bearerAuth: [] + delete: + tags: + - database-endpoint + summary: Delete some database + operationId: delete + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "400": + description: Database delete query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: Container or database could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Database delete permission is missing or revoke permissions + at broker service failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "501": + description: Container image is not supported + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "503": + description: Connection to the database failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "406": + description: Failed to delete user at broker service or virtual host could + not be reached at broker service + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "502": + description: Connection to the container failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "201": + description: Deleted a database + content: + application/json: + schema: + $ref: '#/components/schemas/DatabaseBriefDto' + security: + - bearerAuth: [] + /api/container/{id}/database/license: + get: + tags: + - license-endpoint + summary: Get all licenses + operationId: list_1 + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: List of licenses + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/LicenseDto' +components: + schemas: + DatabaseModifyVisibilityDto: + required: + - is_public + type: object + properties: + is_public: + type: boolean + example: true + ApiErrorDto: + required: + - code + - message + - status + type: object + properties: + status: + type: string + example: STATUS + enum: + - 100 CONTINUE + - 101 SWITCHING_PROTOCOLS + - 102 PROCESSING + - 103 EARLY_HINTS + - 103 CHECKPOINT + - 200 OK + - 201 CREATED + - 202 ACCEPTED + - 203 NON_AUTHORITATIVE_INFORMATION + - 204 NO_CONTENT + - 205 RESET_CONTENT + - 206 PARTIAL_CONTENT + - 207 MULTI_STATUS + - 208 ALREADY_REPORTED + - 226 IM_USED + - 300 MULTIPLE_CHOICES + - 301 MOVED_PERMANENTLY + - 302 FOUND + - 302 MOVED_TEMPORARILY + - 303 SEE_OTHER + - 304 NOT_MODIFIED + - 305 USE_PROXY + - 307 TEMPORARY_REDIRECT + - 308 PERMANENT_REDIRECT + - 400 BAD_REQUEST + - 401 UNAUTHORIZED + - 402 PAYMENT_REQUIRED + - 403 FORBIDDEN + - 404 NOT_FOUND + - 405 METHOD_NOT_ALLOWED + - 406 NOT_ACCEPTABLE + - 407 PROXY_AUTHENTICATION_REQUIRED + - 408 REQUEST_TIMEOUT + - 409 CONFLICT + - 410 GONE + - 411 LENGTH_REQUIRED + - 412 PRECONDITION_FAILED + - 413 PAYLOAD_TOO_LARGE + - 413 REQUEST_ENTITY_TOO_LARGE + - 414 URI_TOO_LONG + - 414 REQUEST_URI_TOO_LONG + - 415 UNSUPPORTED_MEDIA_TYPE + - 416 REQUESTED_RANGE_NOT_SATISFIABLE + - 417 EXPECTATION_FAILED + - 418 I_AM_A_TEAPOT + - 419 INSUFFICIENT_SPACE_ON_RESOURCE + - 420 METHOD_FAILURE + - 421 DESTINATION_LOCKED + - 422 UNPROCESSABLE_ENTITY + - 423 LOCKED + - 424 FAILED_DEPENDENCY + - 425 TOO_EARLY + - 426 UPGRADE_REQUIRED + - 428 PRECONDITION_REQUIRED + - 429 TOO_MANY_REQUESTS + - 431 REQUEST_HEADER_FIELDS_TOO_LARGE + - 451 UNAVAILABLE_FOR_LEGAL_REASONS + - 500 INTERNAL_SERVER_ERROR + - 501 NOT_IMPLEMENTED + - 502 BAD_GATEWAY + - 503 SERVICE_UNAVAILABLE + - 504 GATEWAY_TIMEOUT + - 505 HTTP_VERSION_NOT_SUPPORTED + - 506 VARIANT_ALSO_NEGOTIATES + - 507 INSUFFICIENT_STORAGE + - 508 LOOP_DETECTED + - 509 BANDWIDTH_LIMIT_EXCEEDED + - 510 NOT_EXTENDED + - 511 NETWORK_AUTHENTICATION_REQUIRED + message: + type: string + example: Error message + code: + type: string + example: error.service.code + ColumnBriefDto: + required: + - column_type + - database_id + - id + - internal_name + - name + - table_id + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: date + database_id: + type: integer + format: int64 + table_id: + type: integer + format: int64 + internal_name: + type: string + example: mdb_date + column_type: + type: string + example: date + enum: + - enum + - number + - decimal + - string + - text + - boolean + - date + - timestamp + - blob + ContainerDto: + required: + - created + - hash + - id + - internal_name + - name + - running + type: object + properties: + id: + type: integer + format: int64 + hash: + type: string + example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50 + name: + type: string + example: Air Quality + state: + type: string + example: running + enum: + - created + - restarting + - running + - paused + - exited + - dead + database: + $ref: '#/components/schemas/DatabaseDto' + running: + type: boolean + example: true + image: + $ref: '#/components/schemas/ImageBriefDto' + port: + type: integer + format: int32 + owner: + $ref: '#/components/schemas/UserBriefDto' + created: + type: string + format: date-time + example: 2021-03-12T15:26:21.678396092Z + internal_name: + type: string + example: air-quality + ip_address: + type: string + CreatorDto: + required: + - firstname + - id + - lastname + type: object + properties: + id: + type: integer + format: int64 + firstname: + type: string + example: Josiah + lastname: + type: string + example: Carberry + affiliation: + type: string + example: Wesleyan University + orcid: + type: string + example: 0000-0002-1825-0097 + DatabaseAccessDto: + required: + - type + - user + type: object + properties: + user: + $ref: '#/components/schemas/UserDto' + type: + type: string + enum: + - read + - write_own + - write_all + created: + type: string + format: date-time + DatabaseDto: + required: + - creator + - exchange_name + - id + - internal_name + - name + - owner + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: Air Quality + identifier: + $ref: '#/components/schemas/IdentifierDto' + description: + type: string + example: Weather Australia 2009-2021 + tables: + type: array + items: + $ref: '#/components/schemas/TableBriefDto' + views: + type: array + items: + $ref: '#/components/schemas/ViewBriefDto' + image: + $ref: '#/components/schemas/ImageDto' + container: + $ref: '#/components/schemas/ContainerDto' + accesses: + type: array + items: + $ref: '#/components/schemas/DatabaseAccessDto' + creator: + $ref: '#/components/schemas/UserBriefDto' + owner: + $ref: '#/components/schemas/UserBriefDto' + created: + type: string + format: date-time + exchange_name: + type: string + example: dbrepo/air_quality + internal_name: + type: string + example: weather_australia + is_public: + type: boolean + example: true + IdentifierDto: + required: + - container id + - creators + - database id + - execution + - publication_year + - query + - query_hash + - query_normalized + - result_hash + - result_number + - title + - type + - visibility + type: object + properties: + id: + type: integer + format: int64 + type: + type: string + enum: + - database + - subset + title: + type: string + example: "Airquality Stephansplatz, Vienna, Austria" + description: + type: string + example: "Air quality reports at Stephansplatz, Vienna" + query: + type: string + example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ + \ = \"09:STEF\"" + execution: + type: string + format: date-time + visibility: + type: string + example: everyone + enum: + - everyone + - self + doi: + type: string + example: 10.1038/nphys1170 + publisher: + type: string + example: TU Wien + language: + type: string + enum: + - ab + - aa + - af + - ak + - sq + - am + - ar + - an + - hy + - as + - av + - ae + - ay + - az + - bm + - ba + - eu + - be + - bn + - bh + - bi + - bs + - br + - bg + - my + - ca + - km + - ch + - ce + - ny + - zh + - cu + - cv + - kw + - co + - cr + - hr + - cs + - da + - dv + - nl + - dz + - en + - eo + - et + - ee + - fo + - fj + - fi + - fr + - ff + - gd + - gl + - lg + - ka + - de + - ki + - el + - kl + - gn + - gu + - ht + - ha + - he + - hz + - hi + - ho + - hu + - is + - io + - ig + - id + - ia + - ie + - iu + - ik + - ga + - it + - ja + - jv + - kn + - kr + - ks + - kk + - rw + - kv + - kg + - ko + - kj + - ku + - ky + - lo + - la + - lv + - lb + - li + - ln + - lt + - lu + - mk + - mg + - ms + - ml + - mt + - gv + - mi + - mr + - mh + - ro + - mn + - na + - nv + - nd + - ng + - ne + - se + - "no" + - nb + - nn + - ii + - oc + - oj + - or + - om + - os + - pi + - pa + - ps + - fa + - pl + - pt + - qu + - rm + - rn + - ru + - sm + - sg + - sa + - sc + - sr + - sn + - sd + - si + - sk + - sl + - so + - st + - nr + - es + - su + - sw + - ss + - sv + - tl + - ty + - tg + - ta + - tt + - te + - th + - bo + - ti + - to + - ts + - tn + - tr + - tk + - tw + - ug + - uk + - ur + - uz + - ve + - vi + - vo + - wa + - cy + - fy + - wo + - xh + - yi + - yo + - za + - zu + license: + $ref: '#/components/schemas/LicenseDto' + creators: + type: array + items: + $ref: '#/components/schemas/CreatorDto' + created: + type: string + format: date-time + container id: + type: integer + format: int64 + example: 1 + database id: + type: integer + format: int64 + example: 1 + query id: + type: integer + format: int64 + example: 1 + query_normalized: + type: string + example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ + \ = \"09:STEF\"" + related: + type: array + items: + $ref: '#/components/schemas/RelatedIdentifierDto' + query_hash: + type: string + description: query hash in sha512 + result_hash: + type: string + result_number: + type: integer + format: int64 + example: 1 + publication_day: + type: integer + format: int32 + example: 15 + publication_month: + type: integer + format: int32 + example: 12 + publication_year: + type: integer + format: int32 + example: 2022 + last_modified: + type: string + format: date-time + ImageBriefDto: + required: + - id + - registry + - repository + - tag + type: object + properties: + id: + type: integer + format: int64 + registry: + type: string + example: docker.io/library + repository: + type: string + example: mariadb + tag: + type: string + example: "10.5" + ImageDateDto: + required: + - database_format + - example + - has_time + - id + - unix_format + type: object + properties: + id: + type: integer + format: int64 + example: + type: string + example: 30.01.2022 + database_format: + type: string + example: '%d.%c.%Y' + unix_format: + type: string + example: dd.MM.YYYY + has_time: + type: boolean + example: false + created_at: + type: string + format: date-time + ImageDto: + required: + - default_port + - dialect + - driver_class + - id + - jdbc_method + - registry + - repository + - tag + type: object + properties: + id: + type: integer + format: int64 + registry: + type: string + example: docker.io/library + repository: + type: string + example: mariadb + tag: + type: string + example: "10.5" + dialect: + type: string + example: org.hibernate.dialect.MariaDBDialect + hash: + type: string + example: sha256:c5ec7353d87dfc35067e7bffeb25d6a0d52dad41e8b7357213e3b12d6e7ff78e + compiled: + type: string + format: date-time + example: 2021-03-12T15:26:21.678396092Z + size: + type: integer + example: 314295447 + driver_class: + type: string + example: org.mariadb.jdbc.Driver + date_formats: + type: array + items: + $ref: '#/components/schemas/ImageDateDto' + jdbc_method: + type: string + example: mariadb + default_port: + type: integer + format: int32 + example: 3306 + LicenseDto: + required: + - identifier + - uri + type: object + properties: + identifier: + type: string + example: MIT + uri: + type: string + example: https://opensource.org/licenses/MIT + RelatedIdentifierDto: + required: + - created + - id + - value + type: object + properties: + id: + type: integer + format: int64 + value: + type: string + example: 10.70124/dc4zh-9ce78 + type: + type: string + example: DOI + enum: + - DOI + - URL + - URN + - ARK + - arXiv + - bibcode + - EAN13 + - EISSN + - Handle + - IGSN + - ISBN + - ISTC + - LISSN + - LSID + - PMID + - PURL + - UPC + - w3id + relation: + type: string + example: Cites + enum: + - IsCitedBy + - Cites + - IsSupplementTo + - IsSupplementedBy + - IsContinuedBy + - Continues + - IsDescribedBy + - Describes + - HasMetadata + - IsMetadataFor + - HasVersion + - IsVersionOf + - IsNewVersionOf + - IsPreviousVersionOf + - IsPartOf + - HasPart + - IsPublishedIn + - IsReferencedBy + - References + - IsDocumentedBy + - Documents + - IsCompiledBy + - Compiles + - IsVariantFormOf + - IsOriginalFormOf + - IsIdenticalTo + - IsReviewedBy + - Reviews + - IsDerivedFrom + - IsSourceOf + - IsRequiredBy + - Requires + - IsObsoletedBy + - Obsoletes + created: + type: string + format: date-time + last_modified: + type: string + format: date-time + TableBriefDto: + required: + - columns + - description + - id + - internal_name + - name + - owner + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: Air Quality + description: + type: string + example: Air Quality in Austria + owner: + $ref: '#/components/schemas/UserBriefDto' + columns: + type: array + items: + $ref: '#/components/schemas/ColumnBriefDto' + internal_name: + type: string + example: air_quality + UserAttributeDto: + type: object + properties: + name: + type: string + example: theme_dark + value: + type: string + example: "true" + UserBriefDto: + required: + - id + - username + type: object + properties: + id: + type: string + format: uuid + example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4 + username: + type: string + description: Only contains lowercase characters + example: jcarberry + name: + type: string + example: Josiah Carberry + orcid: + type: string + example: 0000-0002-1825-0097 + given_name: + type: string + example: Josiah + family_name: + type: string + example: Carberry + email_verified: + type: boolean + example: true + UserDto: + required: + - email + - email_verified + - id + - username + type: object + properties: + id: + type: string + format: uuid + example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4 + username: + type: string + description: Only contains lowercase characters + example: jcarberry + name: + type: string + example: Josiah Carberry + orcid: + type: string + example: 0000-0002-1825-0097 + attributes: + type: array + items: + $ref: '#/components/schemas/UserAttributeDto' + containers: + type: array + items: + $ref: '#/components/schemas/ContainerDto' + databases: + type: array + items: + $ref: '#/components/schemas/ContainerDto' + identifiers: + type: array + items: + $ref: '#/components/schemas/ContainerDto' + email: + type: string + example: jcarberry@brown.edu + given_name: + type: string + example: Josiah + family_name: + type: string + example: Carberry + email_verified: + type: boolean + example: true + ViewBriefDto: + required: + - created + - creator + - id + - internal_name + - name + - query + - vdbid + type: object + properties: + id: + type: integer + format: int64 + vdbid: + type: integer + format: int64 + name: + type: string + example: Air Quality + query: + type: string + example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC + created: + type: string + format: date-time + creator: + $ref: '#/components/schemas/UserDto' + internal_name: + type: string + example: air_quality + is_public: + type: boolean + example: true + initial_view: + type: boolean + description: True if it is the default view for the database + example: true + last_modified: + type: string + format: date-time + DatabaseTransferDto: + required: + - username + type: object + properties: + username: + type: string + DatabaseModifyAccessDto: + required: + - type + type: object + properties: + type: + type: string + enum: + - read + - write_own + - write_all + DatabaseCreateDto: + required: + - is_public + - name + type: object + properties: + name: + type: string + example: Air Quality + is_public: + type: boolean + example: true + ContainerBriefDto: + required: + - creator + - hash + - id + - internal_name + - name + - running + type: object + properties: + id: + type: integer + format: int64 + hash: + type: string + example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50 + name: + type: string + example: Air Quality + creator: + $ref: '#/components/schemas/UserBriefDto' + running: + type: boolean + example: true + database: + $ref: '#/components/schemas/DatabaseBriefDto' + created: + type: string + format: date-time + internal_name: + type: string + example: air-quality + CreatorBriefDto: + required: + - firstname + - lastname + type: object + properties: + firstname: + type: string + example: Josiah + lastname: + type: string + example: Carberry + affiliation: + type: string + example: Wesleyan University + DatabaseBriefDto: + required: + - id + - name + - owner + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: Air Quality + description: + type: string + example: Air Quality in Austria + identifier: + $ref: '#/components/schemas/IdentifierBriefDto' + engine: + type: string + example: mariadb:10.5 + owner: + $ref: '#/components/schemas/UserBriefDto' + container: + $ref: '#/components/schemas/ContainerBriefDto' + creator: + $ref: '#/components/schemas/UserBriefDto' + created: + type: string + format: date-time + is_public: + type: boolean + example: true + IdentifierBriefDto: + required: + - container id + - creators + - database id + - id + - publication_year + - title + - type + type: object + properties: + id: + type: integer + format: int64 + title: + type: string + example: "Airquality Stephansplatz, Vienna, Austria" + type: + type: string + enum: + - database + - subset + doi: + type: string + example: 10.1038/nphys1170 + publisher: + type: string + example: TU Wien + creators: + type: array + items: + $ref: '#/components/schemas/CreatorBriefDto' + container id: + type: integer + format: int64 + example: 1 + database id: + type: integer + format: int64 + example: 1 + query id: + type: integer + format: int64 + example: 1 + publication_year: + type: integer + format: int32 + example: 2022 + DatabaseGiveAccessDto: + required: + - type + - username + type: object + properties: + username: + type: string + type: + type: string + enum: + - read + - write_own + - write_all + securitySchemes: + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT diff --git a/.docs/.swagger/api-identifier.yaml b/.docs/.swagger/api-identifier.yaml new file mode 100644 index 0000000000000000000000000000000000000000..002b392bb6df32db0e8153596b5d397297ffb6af --- /dev/null +++ b/.docs/.swagger/api-identifier.yaml @@ -0,0 +1,1333 @@ +openapi: 3.0.1 +info: + title: Database Repository Identifier Service API + description: Service that manages the identifiers + contact: + name: Prof. Andreas Rauber + email: andreas.rauber@tuwien.ac.at + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0 + version: 1.2.0 +externalDocs: + description: Sourcecode Documentation + url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services +servers: +- url: http://localhost:9096 + description: Generated server url +- url: https://dbrepo2.tuwien.ac.at + description: Sandbox +paths: + /api/pid/{id}: + put: + tags: + - persistence-endpoint + summary: Update some identifier + operationId: update + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/IdentifierUpdateDto' + required: true + responses: + "405": + description: Updating identifier not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Updated identifier + content: + application/json: + schema: + $ref: '#/components/schemas/IdentifierDto' + "404": + description: Identifier or user could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Identifier data is not valid to the form + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "406": + description: Updating identifier not allowed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + delete: + tags: + - persistence-endpoint + summary: Delete some identifier + operationId: delete + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + responses: + "404": + description: Identifier could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Deleting identifier not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Deleted identifier + security: + - bearerAuth: [] + /api/identifier: + get: + tags: + - identifier-endpoint + summary: Find identifiers + operationId: list + parameters: + - name: dbid + in: query + required: false + schema: + type: integer + format: int64 + - name: qid + in: query + required: false + schema: + type: integer + format: int64 + - name: type + in: query + required: false + schema: + type: string + enum: + - database + - subset + responses: + "200": + description: List identifiers + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/IdentifierDto' + post: + tags: + - identifier-endpoint + summary: Create identifier + operationId: create + parameters: + - name: Authorization + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/IdentifierCreateDto' + required: true + responses: + "406": + description: Creating identifier not allowed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Identifier form contains invalid request data + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "502": + description: Query information could not be retrieved + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "201": + description: Created identifier + content: + application/json: + schema: + $ref: '#/components/schemas/IdentifierDto' + "403": + description: Insufficient access rights or authorities + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Creating identifier not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "409": + description: Identifier for this resource already exists + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + /api/pid/{pid}: + get: + tags: + - persistence-endpoint + summary: Find some identifier + operationId: find + parameters: + - name: pid + in: path + required: true + schema: + type: integer + format: int64 + - name: Accept + in: header + required: true + schema: + type: string + responses: + "200": + description: Found identifier successfully + content: + application/json: + schema: + $ref: '#/components/schemas/IdentifierDto' + text/csv: {} + text/xml: {} + text/bibliography: {} + text/bibliography; style=apa: {} + text/bibliography; style=ieee: {} + text/bibliography; style=bibtex: {} + "404": + description: Identifier could not be exported from database as the resource + was not found + content: + text/csv: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: "Identifier could not be exported, the requested style is not\ + \ known" + content: + text/bibliography: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "502": + description: Identifier could not exported from database as it is not reachable + content: + text/csv: + schema: + $ref: '#/components/schemas/ApiErrorDto' +components: + schemas: + CreatorDto: + required: + - firstname + - id + - lastname + type: object + properties: + id: + type: integer + format: int64 + firstname: + type: string + example: Josiah + lastname: + type: string + example: Carberry + affiliation: + type: string + example: Wesleyan University + orcid: + type: string + example: 0000-0002-1825-0097 + IdentifierUpdateDto: + required: + - cid + - creators + - dbid + - publication_year + - title + - type + - visibility + type: object + properties: + cid: + type: integer + format: int64 + dbid: + type: integer + format: int64 + qid: + type: integer + format: int64 + doi: + type: string + example: 10.1038/nphys1170 + type: + type: string + enum: + - database + - subset + title: + type: string + example: "Airquality Stephansplatz, Vienna, Austria" + description: + type: string + example: "Air quality reports at Stephansplatz, Vienna" + visibility: + type: string + example: everyone + enum: + - everyone + - self + publisher: + type: string + example: TU Wien + language: + type: string + enum: + - ab + - aa + - af + - ak + - sq + - am + - ar + - an + - hy + - as + - av + - ae + - ay + - az + - bm + - ba + - eu + - be + - bn + - bh + - bi + - bs + - br + - bg + - my + - ca + - km + - ch + - ce + - ny + - zh + - cu + - cv + - kw + - co + - cr + - hr + - cs + - da + - dv + - nl + - dz + - en + - eo + - et + - ee + - fo + - fj + - fi + - fr + - ff + - gd + - gl + - lg + - ka + - de + - ki + - el + - kl + - gn + - gu + - ht + - ha + - he + - hz + - hi + - ho + - hu + - is + - io + - ig + - id + - ia + - ie + - iu + - ik + - ga + - it + - ja + - jv + - kn + - kr + - ks + - kk + - rw + - kv + - kg + - ko + - kj + - ku + - ky + - lo + - la + - lv + - lb + - li + - ln + - lt + - lu + - mk + - mg + - ms + - ml + - mt + - gv + - mi + - mr + - mh + - ro + - mn + - na + - nv + - nd + - ng + - ne + - se + - "no" + - nb + - nn + - ii + - oc + - oj + - or + - om + - os + - pi + - pa + - ps + - fa + - pl + - pt + - qu + - rm + - rn + - ru + - sm + - sg + - sa + - sc + - sr + - sn + - sd + - si + - sk + - sl + - so + - st + - nr + - es + - su + - sw + - ss + - sv + - tl + - ty + - tg + - ta + - tt + - te + - th + - bo + - ti + - to + - ts + - tn + - tr + - tk + - tw + - ug + - uk + - ur + - uz + - ve + - vi + - vo + - wa + - cy + - fy + - wo + - xh + - yi + - yo + - za + - zu + license: + $ref: '#/components/schemas/LicenseDto' + creators: + type: array + items: + $ref: '#/components/schemas/CreatorDto' + publication_day: + type: integer + format: int32 + example: 15 + publication_month: + type: integer + format: int32 + example: 12 + publication_year: + type: integer + format: int32 + example: 2022 + related_identifiers: + type: array + items: + $ref: '#/components/schemas/RelatedIdentifierCreateDto' + LicenseDto: + required: + - identifier + - uri + type: object + properties: + identifier: + type: string + example: MIT + uri: + type: string + example: https://opensource.org/licenses/MIT + RelatedIdentifierCreateDto: + required: + - value + type: object + properties: + value: + type: string + example: 10.70124/dc4zh-9ce78 + type: + type: string + example: DOI + enum: + - DOI + - URL + - URN + - ARK + - arXiv + - bibcode + - EAN13 + - EISSN + - Handle + - IGSN + - ISBN + - ISTC + - LISSN + - LSID + - PMID + - PURL + - UPC + - w3id + relation: + type: string + example: Cites + enum: + - IsCitedBy + - Cites + - IsSupplementTo + - IsSupplementedBy + - IsContinuedBy + - Continues + - IsDescribedBy + - Describes + - HasMetadata + - IsMetadataFor + - HasVersion + - IsVersionOf + - IsNewVersionOf + - IsPreviousVersionOf + - IsPartOf + - HasPart + - IsPublishedIn + - IsReferencedBy + - References + - IsDocumentedBy + - Documents + - IsCompiledBy + - Compiles + - IsVariantFormOf + - IsOriginalFormOf + - IsIdenticalTo + - IsReviewedBy + - Reviews + - IsDerivedFrom + - IsSourceOf + - IsRequiredBy + - Requires + - IsObsoletedBy + - Obsoletes + ApiErrorDto: + required: + - code + - message + - status + type: object + properties: + status: + type: string + example: STATUS + enum: + - 100 CONTINUE + - 101 SWITCHING_PROTOCOLS + - 102 PROCESSING + - 103 EARLY_HINTS + - 103 CHECKPOINT + - 200 OK + - 201 CREATED + - 202 ACCEPTED + - 203 NON_AUTHORITATIVE_INFORMATION + - 204 NO_CONTENT + - 205 RESET_CONTENT + - 206 PARTIAL_CONTENT + - 207 MULTI_STATUS + - 208 ALREADY_REPORTED + - 226 IM_USED + - 300 MULTIPLE_CHOICES + - 301 MOVED_PERMANENTLY + - 302 FOUND + - 302 MOVED_TEMPORARILY + - 303 SEE_OTHER + - 304 NOT_MODIFIED + - 305 USE_PROXY + - 307 TEMPORARY_REDIRECT + - 308 PERMANENT_REDIRECT + - 400 BAD_REQUEST + - 401 UNAUTHORIZED + - 402 PAYMENT_REQUIRED + - 403 FORBIDDEN + - 404 NOT_FOUND + - 405 METHOD_NOT_ALLOWED + - 406 NOT_ACCEPTABLE + - 407 PROXY_AUTHENTICATION_REQUIRED + - 408 REQUEST_TIMEOUT + - 409 CONFLICT + - 410 GONE + - 411 LENGTH_REQUIRED + - 412 PRECONDITION_FAILED + - 413 PAYLOAD_TOO_LARGE + - 413 REQUEST_ENTITY_TOO_LARGE + - 414 URI_TOO_LONG + - 414 REQUEST_URI_TOO_LONG + - 415 UNSUPPORTED_MEDIA_TYPE + - 416 REQUESTED_RANGE_NOT_SATISFIABLE + - 417 EXPECTATION_FAILED + - 418 I_AM_A_TEAPOT + - 419 INSUFFICIENT_SPACE_ON_RESOURCE + - 420 METHOD_FAILURE + - 421 DESTINATION_LOCKED + - 422 UNPROCESSABLE_ENTITY + - 423 LOCKED + - 424 FAILED_DEPENDENCY + - 425 TOO_EARLY + - 426 UPGRADE_REQUIRED + - 428 PRECONDITION_REQUIRED + - 429 TOO_MANY_REQUESTS + - 431 REQUEST_HEADER_FIELDS_TOO_LARGE + - 451 UNAVAILABLE_FOR_LEGAL_REASONS + - 500 INTERNAL_SERVER_ERROR + - 501 NOT_IMPLEMENTED + - 502 BAD_GATEWAY + - 503 SERVICE_UNAVAILABLE + - 504 GATEWAY_TIMEOUT + - 505 HTTP_VERSION_NOT_SUPPORTED + - 506 VARIANT_ALSO_NEGOTIATES + - 507 INSUFFICIENT_STORAGE + - 508 LOOP_DETECTED + - 509 BANDWIDTH_LIMIT_EXCEEDED + - 510 NOT_EXTENDED + - 511 NETWORK_AUTHENTICATION_REQUIRED + message: + type: string + example: Error message + code: + type: string + example: error.service.code + IdentifierDto: + required: + - container id + - creators + - database id + - execution + - publication_year + - query + - query_hash + - query_normalized + - result_hash + - result_number + - title + - type + - visibility + type: object + properties: + id: + type: integer + format: int64 + type: + type: string + enum: + - database + - subset + title: + type: string + example: "Airquality Stephansplatz, Vienna, Austria" + description: + type: string + example: "Air quality reports at Stephansplatz, Vienna" + query: + type: string + example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ + \ = \"09:STEF\"" + execution: + type: string + format: date-time + visibility: + type: string + example: everyone + enum: + - everyone + - self + doi: + type: string + example: 10.1038/nphys1170 + publisher: + type: string + example: TU Wien + language: + type: string + enum: + - ab + - aa + - af + - ak + - sq + - am + - ar + - an + - hy + - as + - av + - ae + - ay + - az + - bm + - ba + - eu + - be + - bn + - bh + - bi + - bs + - br + - bg + - my + - ca + - km + - ch + - ce + - ny + - zh + - cu + - cv + - kw + - co + - cr + - hr + - cs + - da + - dv + - nl + - dz + - en + - eo + - et + - ee + - fo + - fj + - fi + - fr + - ff + - gd + - gl + - lg + - ka + - de + - ki + - el + - kl + - gn + - gu + - ht + - ha + - he + - hz + - hi + - ho + - hu + - is + - io + - ig + - id + - ia + - ie + - iu + - ik + - ga + - it + - ja + - jv + - kn + - kr + - ks + - kk + - rw + - kv + - kg + - ko + - kj + - ku + - ky + - lo + - la + - lv + - lb + - li + - ln + - lt + - lu + - mk + - mg + - ms + - ml + - mt + - gv + - mi + - mr + - mh + - ro + - mn + - na + - nv + - nd + - ng + - ne + - se + - "no" + - nb + - nn + - ii + - oc + - oj + - or + - om + - os + - pi + - pa + - ps + - fa + - pl + - pt + - qu + - rm + - rn + - ru + - sm + - sg + - sa + - sc + - sr + - sn + - sd + - si + - sk + - sl + - so + - st + - nr + - es + - su + - sw + - ss + - sv + - tl + - ty + - tg + - ta + - tt + - te + - th + - bo + - ti + - to + - ts + - tn + - tr + - tk + - tw + - ug + - uk + - ur + - uz + - ve + - vi + - vo + - wa + - cy + - fy + - wo + - xh + - yi + - yo + - za + - zu + license: + $ref: '#/components/schemas/LicenseDto' + creators: + type: array + items: + $ref: '#/components/schemas/CreatorDto' + created: + type: string + format: date-time + container id: + type: integer + format: int64 + example: 1 + database id: + type: integer + format: int64 + example: 1 + query id: + type: integer + format: int64 + example: 1 + query_normalized: + type: string + example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ + \ = \"09:STEF\"" + related: + type: array + items: + $ref: '#/components/schemas/RelatedIdentifierDto' + query_hash: + type: string + description: query hash in sha512 + result_hash: + type: string + result_number: + type: integer + format: int64 + example: 1 + publication_day: + type: integer + format: int32 + example: 15 + publication_month: + type: integer + format: int32 + example: 12 + publication_year: + type: integer + format: int32 + example: 2022 + last_modified: + type: string + format: date-time + RelatedIdentifierDto: + required: + - created + - id + - value + type: object + properties: + id: + type: integer + format: int64 + value: + type: string + example: 10.70124/dc4zh-9ce78 + type: + type: string + example: DOI + enum: + - DOI + - URL + - URN + - ARK + - arXiv + - bibcode + - EAN13 + - EISSN + - Handle + - IGSN + - ISBN + - ISTC + - LISSN + - LSID + - PMID + - PURL + - UPC + - w3id + relation: + type: string + example: Cites + enum: + - IsCitedBy + - Cites + - IsSupplementTo + - IsSupplementedBy + - IsContinuedBy + - Continues + - IsDescribedBy + - Describes + - HasMetadata + - IsMetadataFor + - HasVersion + - IsVersionOf + - IsNewVersionOf + - IsPreviousVersionOf + - IsPartOf + - HasPart + - IsPublishedIn + - IsReferencedBy + - References + - IsDocumentedBy + - Documents + - IsCompiledBy + - Compiles + - IsVariantFormOf + - IsOriginalFormOf + - IsIdenticalTo + - IsReviewedBy + - Reviews + - IsDerivedFrom + - IsSourceOf + - IsRequiredBy + - Requires + - IsObsoletedBy + - Obsoletes + created: + type: string + format: date-time + last_modified: + type: string + format: date-time + CreatorCreateDto: + required: + - firstname + - lastname + type: object + properties: + firstname: + type: string + example: Josiah + lastname: + type: string + example: Carberry + affiliation: + type: string + example: Wesleyan University + orcid: + type: string + example: 0000-0002-1825-0097 + IdentifierCreateDto: + required: + - cid + - creators + - dbid + - publication_year + - title + - type + - visibility + type: object + properties: + cid: + type: integer + format: int64 + dbid: + type: integer + format: int64 + qid: + type: integer + format: int64 + type: + type: string + enum: + - database + - subset + title: + type: string + example: "Airquality Stephansplatz, Vienna, Austria" + description: + type: string + example: "Air quality reports at Stephansplatz, Vienna" + visibility: + type: string + example: everyone + enum: + - everyone + - self + publisher: + type: string + example: TU Wien + language: + type: string + enum: + - ab + - aa + - af + - ak + - sq + - am + - ar + - an + - hy + - as + - av + - ae + - ay + - az + - bm + - ba + - eu + - be + - bn + - bh + - bi + - bs + - br + - bg + - my + - ca + - km + - ch + - ce + - ny + - zh + - cu + - cv + - kw + - co + - cr + - hr + - cs + - da + - dv + - nl + - dz + - en + - eo + - et + - ee + - fo + - fj + - fi + - fr + - ff + - gd + - gl + - lg + - ka + - de + - ki + - el + - kl + - gn + - gu + - ht + - ha + - he + - hz + - hi + - ho + - hu + - is + - io + - ig + - id + - ia + - ie + - iu + - ik + - ga + - it + - ja + - jv + - kn + - kr + - ks + - kk + - rw + - kv + - kg + - ko + - kj + - ku + - ky + - lo + - la + - lv + - lb + - li + - ln + - lt + - lu + - mk + - mg + - ms + - ml + - mt + - gv + - mi + - mr + - mh + - ro + - mn + - na + - nv + - nd + - ng + - ne + - se + - "no" + - nb + - nn + - ii + - oc + - oj + - or + - om + - os + - pi + - pa + - ps + - fa + - pl + - pt + - qu + - rm + - rn + - ru + - sm + - sg + - sa + - sc + - sr + - sn + - sd + - si + - sk + - sl + - so + - st + - nr + - es + - su + - sw + - ss + - sv + - tl + - ty + - tg + - ta + - tt + - te + - th + - bo + - ti + - to + - ts + - tn + - tr + - tk + - tw + - ug + - uk + - ur + - uz + - ve + - vi + - vo + - wa + - cy + - fy + - wo + - xh + - yi + - yo + - za + - zu + license: + $ref: '#/components/schemas/LicenseDto' + creators: + type: array + items: + $ref: '#/components/schemas/CreatorCreateDto' + publication_day: + type: integer + format: int32 + example: 15 + publication_month: + type: integer + format: int32 + example: 12 + publication_year: + type: integer + format: int32 + example: 2022 + related_identifiers: + type: array + items: + $ref: '#/components/schemas/RelatedIdentifierCreateDto' + securitySchemes: + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT diff --git a/.docs/.swagger/api-metadata.yaml b/.docs/.swagger/api-metadata.yaml new file mode 100644 index 0000000000000000000000000000000000000000..bc1c717b5b0b8c20060728b7f1ec377f764cdbe9 --- /dev/null +++ b/.docs/.swagger/api-metadata.yaml @@ -0,0 +1,62 @@ +openapi: 3.0.1 +info: + title: Database Repository Metadata Service API + description: Service that manages the metadata + contact: + name: Prof. Andreas Rauber + email: andreas.rauber@tuwien.ac.at + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0 + version: 1.2.0 +externalDocs: + description: Sourcecode Documentation + url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services +servers: +- url: http://localhost:9099 + description: Generated server url +- url: https://dbrepo2.tuwien.ac.at + description: Sandbox +paths: + /api/oai: + get: + tags: + - metadata-endpoint + summary: Get the record + operationId: identify_1_1_1_1 + parameters: + - name: verb + in: query + - name: parameters + in: query + required: true + schema: + $ref: '#/components/schemas/OaiListIdentifiersParameters' + responses: + "200": + description: List containers + content: + text/xml: {} +components: + schemas: + OaiListIdentifiersParameters: + type: object + properties: + metadataPrefix: + type: string + from: + type: string + until: + type: string + set: + type: string + resumptionToken: + type: string + fromDate: + type: string + format: date-time + untilDate: + type: string + format: date-time + parametersString: + type: string diff --git a/.docs/.swagger/api-query.yaml b/.docs/.swagger/api-query.yaml new file mode 100644 index 0000000000000000000000000000000000000000..16168d93b08fc5f2d3b79131526ad2c8a027b0eb --- /dev/null +++ b/.docs/.swagger/api-query.yaml @@ -0,0 +1,2520 @@ +openapi: 3.0.1 +info: + title: Database Repository Query Service API + description: Service that manages the queries + contact: + name: Prof. Andreas Rauber + email: andreas.rauber@tuwien.ac.at + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0 + version: 1.2.0 +externalDocs: + description: Sourcecode Documentation + url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services +servers: +- url: http://localhost:9093 + description: Generated server url +- url: https://dbrepo2.tuwien.ac.at + description: Sandbox +paths: + /api/container/{id}/database/{databaseId}/table/{tableId}/history: + get: + tags: + - table-history-endpoint + summary: Find all history + operationId: getAll + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: tableId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "405": + description: Find table history is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Find table history successfully + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/TableHistoryDto' + "404": + description: "Table, database or user could not be found" + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "504": + description: Query store failed to query table history + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "503": + description: Connection to the database failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Table history query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + head: + tags: + - table-history-endpoint + summary: Find all history + operationId: getAll_1 + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: tableId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "405": + description: Find table history is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Find table history successfully + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/TableHistoryDto' + "404": + description: "Table, database or user could not be found" + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "504": + description: Query store failed to query table history + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "503": + description: Connection to the database failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Table history query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}/table/{tableId}/data: + get: + tags: + - table-data-endpoint + summary: Find data + operationId: getAll_2 + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: tableId + in: path + required: true + schema: + type: integer + format: int64 + - name: timestamp + in: query + required: false + schema: + type: string + format: date-time + - name: page + in: query + required: false + schema: + type: integer + format: int64 + - name: size + in: query + required: false + schema: + type: integer + format: int64 + - name: sortDirection + in: query + required: false + schema: + type: string + enum: + - asc + - desc + - name: sortColumn + in: query + required: false + schema: + type: string + responses: + "200": + description: OK + content: + '*/*': + schema: + $ref: '#/components/schemas/QueryResultDto' + security: + - bearerAuth: [] + put: + tags: + - table-data-endpoint + summary: Update data + operationId: update + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: tableId + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TableCsvUpdateDto' + required: true + responses: + "200": + description: OK + deprecated: true + security: + - bearerAuth: [] + post: + tags: + - table-data-endpoint + summary: Insert data + operationId: insert + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: tableId + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TableCsvDto' + required: true + responses: + "200": + description: OK + security: + - bearerAuth: [] + delete: + tags: + - table-data-endpoint + summary: Delete data + operationId: delete_1 + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: tableId + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TableCsvDeleteDto' + required: true + responses: + "200": + description: OK + security: + - bearerAuth: [] + head: + tags: + - table-data-endpoint + summary: Find data + operationId: getAll_3 + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: tableId + in: path + required: true + schema: + type: integer + format: int64 + - name: timestamp + in: query + required: false + schema: + type: string + format: date-time + - name: page + in: query + required: false + schema: + type: integer + format: int64 + - name: size + in: query + required: false + schema: + type: integer + format: int64 + - name: sortDirection + in: query + required: false + schema: + type: string + enum: + - asc + - desc + - name: sortColumn + in: query + required: false + schema: + type: string + responses: + "200": + description: OK + content: + '*/*': + schema: + $ref: '#/components/schemas/QueryResultDto' + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}/query/{queryId}: + get: + tags: + - store-endpoint + summary: Find some query + operationId: find_1 + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: queryId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: List queries + content: + application/json: + schema: + $ref: '#/components/schemas/QueryDto' + "404": + description: "Database, query or user could not be found" + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Find query is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "501": + description: Image is not supported + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "504": + description: Query store failed to select query + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "503": + description: Connection to the database failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + put: + tags: + - store-endpoint + summary: Persist some query + operationId: persist + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: queryId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "404": + description: "Database, query or user could not be found" + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "501": + description: Image is not supported + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Persist query successful + content: + application/json: + schema: + $ref: '#/components/schemas/QueryDto' + "405": + description: Persist query is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "504": + description: Query store failed to persist query + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "409": + description: Query is already persisted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}/view: + get: + tags: + - view-endpoint + summary: Find all views + operationId: findAll + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "404": + description: Database or user could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Find views is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Find views successfully + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ViewBriefDto' + security: + - bearerAuth: [] + post: + tags: + - view-endpoint + summary: Create a view + operationId: create + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ViewCreateDto' + required: true + responses: + "401": + description: Credentials missing + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: Database or user could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Create view is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Credentials missing + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "201": + description: Create view successfully + content: + application/json: + schema: + $ref: '#/components/schemas/ViewBriefDto' + "423": + description: Create view resulted in an invalid query statement + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Create view query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "503": + description: Connection to the database failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}/table/{tableId}/data/import: + post: + tags: + - table-data-endpoint + summary: Insert data from csv + operationId: importCsv + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: tableId + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ImportDto' + required: true + responses: + "200": + description: OK + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}/query: + get: + tags: + - store-endpoint + summary: Find queries + operationId: findAll_1 + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: persisted + in: query + required: false + schema: + type: boolean + responses: + "405": + description: Find all queries is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "501": + description: Image is not supported + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "504": + description: Query store failed to select query + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: "Database, container or user could not be found" + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "423": + description: Selection of time-versioned query resulted in an invalid query + statement + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "503": + description: Connection to the database failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: List queries + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/QueryBriefDto' + security: + - bearerAuth: [] + post: + tags: + - query-endpoint + summary: Execute query + operationId: execute + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: page + in: query + required: false + schema: + type: integer + format: int64 + - name: size + in: query + required: false + schema: + type: integer + format: int64 + - name: sortDirection + in: query + required: false + schema: + type: string + enum: + - asc + - desc + - name: sortColumn + in: query + required: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ExecuteStatementDto' + required: true + responses: + "200": + description: OK + content: + '*/*': + schema: + $ref: '#/components/schemas/QueryResultDto' + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}/view/{viewId}: + get: + tags: + - view-endpoint + summary: Find one view + operationId: find + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: viewId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: Find view successfully + content: + application/json: + schema: + $ref: '#/components/schemas/ViewDto' + "404": + description: "Database, view or user could not be found" + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Find view is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + delete: + tags: + - view-endpoint + summary: Delete one view + operationId: delete + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: viewId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "401": + description: Credentials missing + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Credentials missing + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: "Database, view or user could not be found" + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Delete view query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Delete view successfully + "423": + description: Delete view resulted in an invalid query statement + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "503": + description: Connection to the database failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Delete view is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}/view/{viewId}/data: + get: + tags: + - view-endpoint + summary: Find view data + operationId: data + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: viewId + in: path + required: true + schema: + type: integer + format: int64 + - name: page + in: query + required: false + schema: + type: integer + format: int64 + - name: size + in: query + required: false + schema: + type: integer + format: int64 + responses: + "200": + description: Find data successfully + content: + application/json: + schema: + $ref: '#/components/schemas/QueryResultDto' + "401": + description: Credentials missing + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "423": + description: Find data resulted in an invalid query statement + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Credentials missing + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "417": + description: Parsing of resulting columns failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "504": + description: Query store failed to query view data + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: "Database, view, container or user could not be found" + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Pagination not in valid range or find data query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "501": + description: Image is not supported + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Find data is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "503": + description: Connection to the database failed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}/view/{viewId}/data/count: + get: + tags: + - view-endpoint + summary: Find view data count + operationId: count + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: viewId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: integer + format: int64 + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}/table/{tableId}/export: + get: + tags: + - export-endpoint + summary: Export table + operationId: export + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: tableId + in: path + required: true + schema: + type: integer + format: int64 + - name: timestamp + in: query + required: false + schema: + type: string + format: date-time + responses: + "200": + description: OK + content: + '*/*': + schema: + type: string + format: binary + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}/table/{tableId}/data/count: + get: + tags: + - table-data-endpoint + summary: Find data + operationId: getCount + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: tableId + in: path + required: true + schema: + type: integer + format: int64 + - name: timestamp + in: query + required: false + schema: + type: string + format: date-time + responses: + "200": + description: OK + content: + '*/*': + schema: + type: integer + format: int64 + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}/query/{queryId}/export: + get: + tags: + - query-endpoint + summary: Exports some query + operationId: export_1 + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: queryId + in: path + required: true + schema: + type: integer + format: int64 + - name: Accept + in: header + required: true + schema: + type: string + responses: + "200": + description: OK + content: + '*/*': + schema: + type: object + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}/query/{queryId}/data: + get: + tags: + - query-endpoint + summary: Re-execute some query + operationId: reExecute + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: queryId + in: path + required: true + schema: + type: integer + format: int64 + - name: page + in: query + required: false + schema: + type: integer + format: int64 + - name: size + in: query + required: false + schema: + type: integer + format: int64 + - name: sortDirection + in: query + required: false + schema: + type: string + enum: + - asc + - desc + - name: sortColumn + in: query + required: false + schema: + type: string + responses: + "200": + description: OK + content: + '*/*': + schema: + $ref: '#/components/schemas/QueryResultDto' + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}/query/{queryId}/data/count: + get: + tags: + - query-endpoint + summary: Re-execute some query + operationId: reExecuteCount + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: queryId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: OK + content: + '*/*': + schema: + type: integer + format: int64 + security: + - bearerAuth: [] +components: + schemas: + ApiErrorDto: + required: + - code + - message + - status + type: object + properties: + status: + type: string + example: STATUS + enum: + - 100 CONTINUE + - 101 SWITCHING_PROTOCOLS + - 102 PROCESSING + - 103 EARLY_HINTS + - 103 CHECKPOINT + - 200 OK + - 201 CREATED + - 202 ACCEPTED + - 203 NON_AUTHORITATIVE_INFORMATION + - 204 NO_CONTENT + - 205 RESET_CONTENT + - 206 PARTIAL_CONTENT + - 207 MULTI_STATUS + - 208 ALREADY_REPORTED + - 226 IM_USED + - 300 MULTIPLE_CHOICES + - 301 MOVED_PERMANENTLY + - 302 FOUND + - 302 MOVED_TEMPORARILY + - 303 SEE_OTHER + - 304 NOT_MODIFIED + - 305 USE_PROXY + - 307 TEMPORARY_REDIRECT + - 308 PERMANENT_REDIRECT + - 400 BAD_REQUEST + - 401 UNAUTHORIZED + - 402 PAYMENT_REQUIRED + - 403 FORBIDDEN + - 404 NOT_FOUND + - 405 METHOD_NOT_ALLOWED + - 406 NOT_ACCEPTABLE + - 407 PROXY_AUTHENTICATION_REQUIRED + - 408 REQUEST_TIMEOUT + - 409 CONFLICT + - 410 GONE + - 411 LENGTH_REQUIRED + - 412 PRECONDITION_FAILED + - 413 PAYLOAD_TOO_LARGE + - 413 REQUEST_ENTITY_TOO_LARGE + - 414 URI_TOO_LONG + - 414 REQUEST_URI_TOO_LONG + - 415 UNSUPPORTED_MEDIA_TYPE + - 416 REQUESTED_RANGE_NOT_SATISFIABLE + - 417 EXPECTATION_FAILED + - 418 I_AM_A_TEAPOT + - 419 INSUFFICIENT_SPACE_ON_RESOURCE + - 420 METHOD_FAILURE + - 421 DESTINATION_LOCKED + - 422 UNPROCESSABLE_ENTITY + - 423 LOCKED + - 424 FAILED_DEPENDENCY + - 425 TOO_EARLY + - 426 UPGRADE_REQUIRED + - 428 PRECONDITION_REQUIRED + - 429 TOO_MANY_REQUESTS + - 431 REQUEST_HEADER_FIELDS_TOO_LARGE + - 451 UNAVAILABLE_FOR_LEGAL_REASONS + - 500 INTERNAL_SERVER_ERROR + - 501 NOT_IMPLEMENTED + - 502 BAD_GATEWAY + - 503 SERVICE_UNAVAILABLE + - 504 GATEWAY_TIMEOUT + - 505 HTTP_VERSION_NOT_SUPPORTED + - 506 VARIANT_ALSO_NEGOTIATES + - 507 INSUFFICIENT_STORAGE + - 508 LOOP_DETECTED + - 509 BANDWIDTH_LIMIT_EXCEEDED + - 510 NOT_EXTENDED + - 511 NETWORK_AUTHENTICATION_REQUIRED + message: + type: string + example: Error message + code: + type: string + example: error.service.code + TableHistoryDto: + required: + - event + - timestamp + - total + type: object + properties: + timestamp: + type: string + format: date-time + event: + type: string + total: + type: integer + format: int64 + example: 1 + QueryResultDto: + required: + - id + - result + type: object + properties: + result: + type: array + items: + type: object + additionalProperties: + type: object + id: + type: integer + format: int64 + result_number: + type: integer + format: int64 + example: 1 + TableCsvUpdateDto: + required: + - data + - keys + type: object + properties: + data: + type: object + additionalProperties: + type: object + keys: + type: object + additionalProperties: + type: object + ColumnBriefDto: + required: + - column_type + - database_id + - id + - internal_name + - name + - table_id + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: date + database_id: + type: integer + format: int64 + table_id: + type: integer + format: int64 + internal_name: + type: string + example: mdb_date + column_type: + type: string + example: date + enum: + - enum + - number + - decimal + - string + - text + - boolean + - date + - timestamp + - blob + ContainerDto: + required: + - created + - hash + - id + - internal_name + - name + - running + type: object + properties: + id: + type: integer + format: int64 + hash: + type: string + example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50 + name: + type: string + example: Air Quality + state: + type: string + example: running + enum: + - created + - restarting + - running + - paused + - exited + - dead + database: + $ref: '#/components/schemas/DatabaseDto' + running: + type: boolean + example: true + image: + $ref: '#/components/schemas/ImageBriefDto' + port: + type: integer + format: int32 + owner: + $ref: '#/components/schemas/UserBriefDto' + created: + type: string + format: date-time + example: 2021-03-12T15:26:21.678396092Z + internal_name: + type: string + example: air-quality + ip_address: + type: string + CreatorDto: + required: + - firstname + - id + - lastname + type: object + properties: + id: + type: integer + format: int64 + firstname: + type: string + example: Josiah + lastname: + type: string + example: Carberry + affiliation: + type: string + example: Wesleyan University + orcid: + type: string + example: 0000-0002-1825-0097 + DatabaseAccessDto: + required: + - type + - user + type: object + properties: + user: + $ref: '#/components/schemas/UserDto' + type: + type: string + enum: + - read + - write_own + - write_all + created: + type: string + format: date-time + DatabaseDto: + required: + - creator + - exchange_name + - id + - internal_name + - name + - owner + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: Air Quality + identifier: + $ref: '#/components/schemas/IdentifierDto' + description: + type: string + example: Weather Australia 2009-2021 + tables: + type: array + items: + $ref: '#/components/schemas/TableBriefDto' + views: + type: array + items: + $ref: '#/components/schemas/ViewBriefDto' + image: + $ref: '#/components/schemas/ImageDto' + container: + $ref: '#/components/schemas/ContainerDto' + accesses: + type: array + items: + $ref: '#/components/schemas/DatabaseAccessDto' + creator: + $ref: '#/components/schemas/UserBriefDto' + owner: + $ref: '#/components/schemas/UserBriefDto' + created: + type: string + format: date-time + exchange_name: + type: string + example: dbrepo/air_quality + internal_name: + type: string + example: weather_australia + is_public: + type: boolean + example: true + IdentifierDto: + required: + - container id + - creators + - database id + - execution + - publication_year + - query + - query_hash + - query_normalized + - result_hash + - result_number + - title + - type + - visibility + type: object + properties: + id: + type: integer + format: int64 + type: + type: string + enum: + - database + - subset + title: + type: string + example: "Airquality Stephansplatz, Vienna, Austria" + description: + type: string + example: "Air quality reports at Stephansplatz, Vienna" + query: + type: string + example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ + \ = \"09:STEF\"" + execution: + type: string + format: date-time + visibility: + type: string + example: everyone + enum: + - everyone + - self + doi: + type: string + example: 10.1038/nphys1170 + publisher: + type: string + example: TU Wien + language: + type: string + enum: + - ab + - aa + - af + - ak + - sq + - am + - ar + - an + - hy + - as + - av + - ae + - ay + - az + - bm + - ba + - eu + - be + - bn + - bh + - bi + - bs + - br + - bg + - my + - ca + - km + - ch + - ce + - ny + - zh + - cu + - cv + - kw + - co + - cr + - hr + - cs + - da + - dv + - nl + - dz + - en + - eo + - et + - ee + - fo + - fj + - fi + - fr + - ff + - gd + - gl + - lg + - ka + - de + - ki + - el + - kl + - gn + - gu + - ht + - ha + - he + - hz + - hi + - ho + - hu + - is + - io + - ig + - id + - ia + - ie + - iu + - ik + - ga + - it + - ja + - jv + - kn + - kr + - ks + - kk + - rw + - kv + - kg + - ko + - kj + - ku + - ky + - lo + - la + - lv + - lb + - li + - ln + - lt + - lu + - mk + - mg + - ms + - ml + - mt + - gv + - mi + - mr + - mh + - ro + - mn + - na + - nv + - nd + - ng + - ne + - se + - "no" + - nb + - nn + - ii + - oc + - oj + - or + - om + - os + - pi + - pa + - ps + - fa + - pl + - pt + - qu + - rm + - rn + - ru + - sm + - sg + - sa + - sc + - sr + - sn + - sd + - si + - sk + - sl + - so + - st + - nr + - es + - su + - sw + - ss + - sv + - tl + - ty + - tg + - ta + - tt + - te + - th + - bo + - ti + - to + - ts + - tn + - tr + - tk + - tw + - ug + - uk + - ur + - uz + - ve + - vi + - vo + - wa + - cy + - fy + - wo + - xh + - yi + - yo + - za + - zu + license: + $ref: '#/components/schemas/LicenseDto' + creators: + type: array + items: + $ref: '#/components/schemas/CreatorDto' + created: + type: string + format: date-time + container id: + type: integer + format: int64 + example: 1 + database id: + type: integer + format: int64 + example: 1 + query id: + type: integer + format: int64 + example: 1 + query_normalized: + type: string + example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ + \ = \"09:STEF\"" + related: + type: array + items: + $ref: '#/components/schemas/RelatedIdentifierDto' + query_hash: + type: string + description: query hash in sha512 + result_hash: + type: string + result_number: + type: integer + format: int64 + example: 1 + publication_day: + type: integer + format: int32 + example: 15 + publication_month: + type: integer + format: int32 + example: 12 + publication_year: + type: integer + format: int32 + example: 2022 + last_modified: + type: string + format: date-time + ImageBriefDto: + required: + - id + - registry + - repository + - tag + type: object + properties: + id: + type: integer + format: int64 + registry: + type: string + example: docker.io/library + repository: + type: string + example: mariadb + tag: + type: string + example: "10.5" + ImageDateDto: + required: + - database_format + - example + - has_time + - id + - unix_format + type: object + properties: + id: + type: integer + format: int64 + example: + type: string + example: 30.01.2022 + database_format: + type: string + example: '%d.%c.%Y' + unix_format: + type: string + example: dd.MM.YYYY + has_time: + type: boolean + example: false + created_at: + type: string + format: date-time + ImageDto: + required: + - default_port + - dialect + - driver_class + - id + - jdbc_method + - registry + - repository + - tag + type: object + properties: + id: + type: integer + format: int64 + registry: + type: string + example: docker.io/library + repository: + type: string + example: mariadb + tag: + type: string + example: "10.5" + dialect: + type: string + example: org.hibernate.dialect.MariaDBDialect + hash: + type: string + example: sha256:c5ec7353d87dfc35067e7bffeb25d6a0d52dad41e8b7357213e3b12d6e7ff78e + compiled: + type: string + format: date-time + example: 2021-03-12T15:26:21.678396092Z + size: + type: integer + example: 314295447 + driver_class: + type: string + example: org.mariadb.jdbc.Driver + date_formats: + type: array + items: + $ref: '#/components/schemas/ImageDateDto' + jdbc_method: + type: string + example: mariadb + default_port: + type: integer + format: int32 + example: 3306 + LicenseDto: + required: + - identifier + - uri + type: object + properties: + identifier: + type: string + example: MIT + uri: + type: string + example: https://opensource.org/licenses/MIT + QueryDto: + required: + - cid + - created + - creator + - dbid + - id + - is_persisted + - query + - query_hash + type: object + properties: + id: + type: integer + format: int64 + cid: + type: integer + format: int64 + dbid: + type: integer + format: int64 + creator: + $ref: '#/components/schemas/UserDto' + execution: + type: string + format: date-time + query: + type: string + example: SELECT `id` FROM `air_quality` + type: + type: string + example: query + enum: + - query + - view + identifier: + $ref: '#/components/schemas/IdentifierDto' + created: + type: string + format: date-time + query_normalized: + type: string + example: SELECT `id` FROM `air_quality` + query_hash: + type: string + example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76 + is_persisted: + type: boolean + example: true + result_hash: + type: string + example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76 + result_number: + type: integer + format: int64 + example: 1 + last_modified: + type: string + format: date-time + RelatedIdentifierDto: + required: + - created + - id + - value + type: object + properties: + id: + type: integer + format: int64 + value: + type: string + example: 10.70124/dc4zh-9ce78 + type: + type: string + example: DOI + enum: + - DOI + - URL + - URN + - ARK + - arXiv + - bibcode + - EAN13 + - EISSN + - Handle + - IGSN + - ISBN + - ISTC + - LISSN + - LSID + - PMID + - PURL + - UPC + - w3id + relation: + type: string + example: Cites + enum: + - IsCitedBy + - Cites + - IsSupplementTo + - IsSupplementedBy + - IsContinuedBy + - Continues + - IsDescribedBy + - Describes + - HasMetadata + - IsMetadataFor + - HasVersion + - IsVersionOf + - IsNewVersionOf + - IsPreviousVersionOf + - IsPartOf + - HasPart + - IsPublishedIn + - IsReferencedBy + - References + - IsDocumentedBy + - Documents + - IsCompiledBy + - Compiles + - IsVariantFormOf + - IsOriginalFormOf + - IsIdenticalTo + - IsReviewedBy + - Reviews + - IsDerivedFrom + - IsSourceOf + - IsRequiredBy + - Requires + - IsObsoletedBy + - Obsoletes + created: + type: string + format: date-time + last_modified: + type: string + format: date-time + TableBriefDto: + required: + - columns + - description + - id + - internal_name + - name + - owner + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: Air Quality + description: + type: string + example: Air Quality in Austria + owner: + $ref: '#/components/schemas/UserBriefDto' + columns: + type: array + items: + $ref: '#/components/schemas/ColumnBriefDto' + internal_name: + type: string + example: air_quality + UserAttributeDto: + type: object + properties: + name: + type: string + example: theme_dark + value: + type: string + example: "true" + UserBriefDto: + required: + - id + - username + type: object + properties: + id: + type: string + format: uuid + example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4 + username: + type: string + description: Only contains lowercase characters + example: jcarberry + name: + type: string + example: Josiah Carberry + orcid: + type: string + example: 0000-0002-1825-0097 + given_name: + type: string + example: Josiah + family_name: + type: string + example: Carberry + email_verified: + type: boolean + example: true + UserDto: + required: + - email + - email_verified + - id + - username + type: object + properties: + id: + type: string + format: uuid + example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4 + username: + type: string + description: Only contains lowercase characters + example: jcarberry + name: + type: string + example: Josiah Carberry + orcid: + type: string + example: 0000-0002-1825-0097 + attributes: + type: array + items: + $ref: '#/components/schemas/UserAttributeDto' + containers: + type: array + items: + $ref: '#/components/schemas/ContainerDto' + databases: + type: array + items: + $ref: '#/components/schemas/ContainerDto' + identifiers: + type: array + items: + $ref: '#/components/schemas/ContainerDto' + email: + type: string + example: jcarberry@brown.edu + given_name: + type: string + example: Josiah + family_name: + type: string + example: Carberry + email_verified: + type: boolean + example: true + ViewBriefDto: + required: + - created + - creator + - id + - internal_name + - name + - query + - vdbid + type: object + properties: + id: + type: integer + format: int64 + vdbid: + type: integer + format: int64 + name: + type: string + example: Air Quality + query: + type: string + example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC + created: + type: string + format: date-time + creator: + $ref: '#/components/schemas/UserDto' + internal_name: + type: string + example: air_quality + is_public: + type: boolean + example: true + initial_view: + type: boolean + description: True if it is the default view for the database + example: true + last_modified: + type: string + format: date-time + ViewCreateDto: + required: + - is_public + - name + - query + type: object + properties: + name: + type: string + example: Air Quality + query: + type: string + example: SELECT `id` FROM `air_quality` + is_public: + type: boolean + example: true + TableCsvDto: + required: + - data + type: object + properties: + data: + type: object + additionalProperties: + type: object + ImportDto: + required: + - location + - separator + type: object + properties: + location: + type: string + example: /tmp/file.csv + separator: + type: string + example: "," + quote: + type: string + example: '"' + skip_lines: + minimum: 0 + type: integer + format: int64 + false_element: + type: string + true_element: + type: string + null_element: + type: string + example: NA + ExecuteStatementDto: + required: + - statement + type: object + properties: + statement: + type: string + example: SELECT `id` FROM `air_quality` + timestamp: + type: string + description: Execute query for data at this timestamp + format: date-time + ViewDto: + required: + - created + - creator + - database + - id + - internalName + - name + - query + - vdbid + type: object + properties: + id: + type: integer + format: int64 + vdbid: + type: integer + format: int64 + database: + $ref: '#/components/schemas/DatabaseDto' + name: + type: string + example: Air Quality + internalName: + type: string + example: air_quality + query: + type: string + example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC + created: + type: string + format: date-time + creator: + $ref: '#/components/schemas/UserDto' + is_public: + type: boolean + example: true + initial_view: + type: boolean + description: True if it is the default view for the database + example: true + last_modified: + type: string + format: date-time + CreatorBriefDto: + required: + - firstname + - lastname + type: object + properties: + firstname: + type: string + example: Josiah + lastname: + type: string + example: Carberry + affiliation: + type: string + example: Wesleyan University + IdentifierBriefDto: + required: + - container id + - creators + - database id + - id + - publication_year + - title + - type + type: object + properties: + id: + type: integer + format: int64 + title: + type: string + example: "Airquality Stephansplatz, Vienna, Austria" + type: + type: string + enum: + - database + - subset + doi: + type: string + example: 10.1038/nphys1170 + publisher: + type: string + example: TU Wien + creators: + type: array + items: + $ref: '#/components/schemas/CreatorBriefDto' + container id: + type: integer + format: int64 + example: 1 + database id: + type: integer + format: int64 + example: 1 + query id: + type: integer + format: int64 + example: 1 + publication_year: + type: integer + format: int32 + example: 2022 + QueryBriefDto: + required: + - cid + - created + - creator + - dbid + - id + - query + - query_hash + type: object + properties: + id: + type: integer + format: int64 + cid: + type: integer + format: int64 + dbid: + type: integer + format: int64 + creator: + $ref: '#/components/schemas/UserDto' + execution: + type: string + format: date-time + query: + type: string + example: SELECT `id` FROM `air_quality` + type: + type: string + example: query + enum: + - query + - view + identifier: + $ref: '#/components/schemas/IdentifierBriefDto' + created: + type: string + format: date-time + query_normalized: + type: string + example: SELECT `id` FROM `air_quality` + query_hash: + type: string + example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76 + result_hash: + type: string + example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76 + result_number: + type: integer + format: int64 + example: 1 + last_modified: + type: string + format: date-time + TableCsvDeleteDto: + required: + - keys + type: object + properties: + keys: + type: object + additionalProperties: + type: object + securitySchemes: + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT diff --git a/.docs/.swagger/api-semantics.yaml b/.docs/.swagger/api-semantics.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c001c6d7bb3539f64f83b76b093d90ac679ce30b --- /dev/null +++ b/.docs/.swagger/api-semantics.yaml @@ -0,0 +1,685 @@ +openapi: 3.0.1 +info: + title: Database Repository Semantic Service API + description: Service that manages the tables + contact: + name: Prof. Andreas Rauber + email: andreas.rauber@tuwien.ac.at + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0 + version: 1.2.0 +externalDocs: + description: Sourcecode Documentation + url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services +servers: +- url: http://localhost:9097 + description: Generated server url +- url: https://dbrepo2.tuwien.ac.at + description: Sandbox +paths: + /api/semantic/ontology/{id}: + get: + tags: + - ontology-endpoint + summary: Find one ontology + operationId: find + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: Find one ontology + content: + application/json: + schema: + $ref: '#/components/schemas/OntologyDto' + "404": + description: Could not find ontology + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + put: + tags: + - ontology-endpoint + summary: Update an ontology + operationId: update + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OntologyModifyDto' + required: true + responses: + "202": + description: Updated ontology successfully + content: + application/json: + schema: + $ref: '#/components/schemas/OntologyDto' + "404": + description: Could not find ontology + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + delete: + tags: + - ontology-endpoint + summary: Delete an ontology + operationId: delete + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + responses: + "202": + description: Deleted ontology successfully + content: + application/json: {} + "404": + description: Could not find ontology + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + /api/semantic/unit: + get: + tags: + - semantics-endpoint + summary: List semantic units + operationId: findAllUnits + responses: + "200": + description: Find all semantic units + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/UnitDto' + post: + tags: + - semantics-endpoint + summary: Save a semantic unit + operationId: saveUnit + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UnitSaveDto' + required: true + responses: + "202": + description: Saved a semantic unit + content: + application/json: + schema: + $ref: '#/components/schemas/UnitDto' + security: + - bearerAuth: [] + /api/semantic/ontology: + get: + tags: + - ontology-endpoint + summary: List all ontologies + operationId: findAll + responses: + "200": + description: List all ontologies + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/OntologyDto' + post: + tags: + - ontology-endpoint + summary: Register a new ontology + operationId: create + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/OntologyCreateDto' + required: true + responses: + "201": + description: Registered ontology successfully + content: + application/json: + schema: + $ref: '#/components/schemas/OntologyDto' + security: + - bearerAuth: [] + /api/semantic/concept: + get: + tags: + - semantics-endpoint + summary: List semantic concepts + operationId: findAllConcepts + responses: + "200": + description: Find all semantic concepts + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ConceptDto' + post: + tags: + - semantics-endpoint + summary: Create or update a semantic concept + operationId: saveUnit_1 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ConceptSaveDto' + required: true + responses: + "202": + description: Saved a semantic concept + content: + application/json: + schema: + $ref: '#/components/schemas/ConceptDto' + security: + - bearerAuth: [] + /api/semantic/ontology/{id}/entity: + get: + tags: + - query-endpoint + summary: Find entities + operationId: find_1 + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: label + in: query + required: false + schema: + type: string + - name: uri + in: query + required: false + schema: + type: string + responses: + "200": + description: Found entities + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/EntityDto' + "417": + description: Generated query or uri is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: Could not find ontology + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Filter params are invalid + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + /api/semantic/database/{databaseId}/table/{tableId}: + get: + tags: + - table-endpoint + summary: Suggest table semantics + operationId: analyseTable + parameters: + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: tableId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "417": + description: Generated query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: Could not find the table + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Suggested table semantics successfully + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/TableColumnEntityDto' + security: + - bearerAuth: [] + /api/semantic/database/{databaseId}/table/{tableId}/column/{columnId}: + get: + tags: + - table-endpoint + summary: Suggest table column semantics + operationId: analyseTableColumn + parameters: + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: tableId + in: path + required: true + schema: + type: integer + format: int64 + - name: columnId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "417": + description: Generated query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Suggested table column semantics successfully + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/TableColumnEntityDto' + "404": + description: Could not find the table column + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] +components: + schemas: + OntologyModifyDto: + required: + - prefix + - uri + type: object + properties: + uri: + type: string + example: Ontology URI + prefix: + type: string + example: Ontology prefix + sparql_endpoint: + type: string + example: Ontology SPARQL endpoint + OntologyDto: + required: + - created + - id + - prefix + - rdf + - sparql + - uri + type: object + properties: + id: + type: integer + format: int64 + uri: + type: string + example: Ontology URI + prefix: + type: string + example: Ontology prefix + sparql: + type: boolean + example: true + rdf: + type: boolean + example: true + creator: + $ref: '#/components/schemas/UserBriefDto' + created: + type: string + format: date-time + example: 2021-03-12T15:26:21.678396092Z + sparql_endpoint: + type: string + example: Ontology SPARQL endpoint + UserBriefDto: + required: + - id + - username + type: object + properties: + id: + type: string + format: uuid + example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4 + username: + type: string + description: Only contains lowercase characters + example: jcarberry + name: + type: string + example: Josiah Carberry + orcid: + type: string + example: 0000-0002-1825-0097 + given_name: + type: string + example: Josiah + family_name: + type: string + example: Carberry + email_verified: + type: boolean + example: true + ApiErrorDto: + required: + - code + - message + - status + type: object + properties: + status: + type: string + example: STATUS + enum: + - 100 CONTINUE + - 101 SWITCHING_PROTOCOLS + - 102 PROCESSING + - 103 EARLY_HINTS + - 103 CHECKPOINT + - 200 OK + - 201 CREATED + - 202 ACCEPTED + - 203 NON_AUTHORITATIVE_INFORMATION + - 204 NO_CONTENT + - 205 RESET_CONTENT + - 206 PARTIAL_CONTENT + - 207 MULTI_STATUS + - 208 ALREADY_REPORTED + - 226 IM_USED + - 300 MULTIPLE_CHOICES + - 301 MOVED_PERMANENTLY + - 302 FOUND + - 302 MOVED_TEMPORARILY + - 303 SEE_OTHER + - 304 NOT_MODIFIED + - 305 USE_PROXY + - 307 TEMPORARY_REDIRECT + - 308 PERMANENT_REDIRECT + - 400 BAD_REQUEST + - 401 UNAUTHORIZED + - 402 PAYMENT_REQUIRED + - 403 FORBIDDEN + - 404 NOT_FOUND + - 405 METHOD_NOT_ALLOWED + - 406 NOT_ACCEPTABLE + - 407 PROXY_AUTHENTICATION_REQUIRED + - 408 REQUEST_TIMEOUT + - 409 CONFLICT + - 410 GONE + - 411 LENGTH_REQUIRED + - 412 PRECONDITION_FAILED + - 413 PAYLOAD_TOO_LARGE + - 413 REQUEST_ENTITY_TOO_LARGE + - 414 URI_TOO_LONG + - 414 REQUEST_URI_TOO_LONG + - 415 UNSUPPORTED_MEDIA_TYPE + - 416 REQUESTED_RANGE_NOT_SATISFIABLE + - 417 EXPECTATION_FAILED + - 418 I_AM_A_TEAPOT + - 419 INSUFFICIENT_SPACE_ON_RESOURCE + - 420 METHOD_FAILURE + - 421 DESTINATION_LOCKED + - 422 UNPROCESSABLE_ENTITY + - 423 LOCKED + - 424 FAILED_DEPENDENCY + - 425 TOO_EARLY + - 426 UPGRADE_REQUIRED + - 428 PRECONDITION_REQUIRED + - 429 TOO_MANY_REQUESTS + - 431 REQUEST_HEADER_FIELDS_TOO_LARGE + - 451 UNAVAILABLE_FOR_LEGAL_REASONS + - 500 INTERNAL_SERVER_ERROR + - 501 NOT_IMPLEMENTED + - 502 BAD_GATEWAY + - 503 SERVICE_UNAVAILABLE + - 504 GATEWAY_TIMEOUT + - 505 HTTP_VERSION_NOT_SUPPORTED + - 506 VARIANT_ALSO_NEGOTIATES + - 507 INSUFFICIENT_STORAGE + - 508 LOOP_DETECTED + - 509 BANDWIDTH_LIMIT_EXCEEDED + - 510 NOT_EXTENDED + - 511 NETWORK_AUTHENTICATION_REQUIRED + message: + type: string + example: Error message + code: + type: string + example: error.service.code + UnitSaveDto: + required: + - description + - name + - uri + type: object + properties: + uri: + type: string + name: + type: string + description: + type: string + ColumnBriefDto: + required: + - column_type + - database_id + - id + - internal_name + - name + - table_id + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: date + database_id: + type: integer + format: int64 + table_id: + type: integer + format: int64 + internal_name: + type: string + example: mdb_date + column_type: + type: string + example: date + enum: + - enum + - number + - decimal + - string + - text + - boolean + - date + - timestamp + - blob + UnitDto: + required: + - columns + - created + - uri + type: object + properties: + uri: + type: string + name: + type: string + description: + type: string + created: + type: string + format: date-time + columns: + type: array + items: + $ref: '#/components/schemas/ColumnBriefDto' + OntologyCreateDto: + required: + - prefix + - uri + type: object + properties: + uri: + type: string + example: Ontology URI + prefix: + type: string + example: Ontology prefix + sparql_endpoint: + type: string + example: Ontology SPARQL endpoint + ConceptSaveDto: + required: + - description + - name + - uri + type: object + properties: + uri: + type: string + name: + type: string + description: + type: string + ConceptDto: + required: + - columns + - created + - uri + type: object + properties: + uri: + type: string + name: + type: string + description: + type: string + created: + type: string + format: date-time + columns: + type: array + items: + $ref: '#/components/schemas/ColumnBriefDto' + EntityDto: + required: + - label + - uri + type: object + properties: + uri: + type: string + example: https://www.wikidata.org/entity/Q1686799 + label: + type: string + example: Apache Jena + description: + type: string + example: open source semantic web framework for Java + TableColumnEntityDto: + required: + - columnId + - databaseId + - tableId + - uri + type: object + properties: + databaseId: + type: integer + format: int64 + example: 1 + tableId: + type: integer + format: int64 + example: 1 + columnId: + type: integer + format: int64 + example: 1 + uri: + type: string + example: https://www.wikidata.org/entity/Q1686799 + label: + type: string + example: Apache Jena + description: + type: string + example: open source semantic web framework for Java + securitySchemes: + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT diff --git a/.docs/.swagger/api-table.yaml b/.docs/.swagger/api-table.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9639c5fc4e24d730136b88d16a7b5a526dc469d4 --- /dev/null +++ b/.docs/.swagger/api-table.yaml @@ -0,0 +1,860 @@ +openapi: 3.0.1 +info: + title: Database Repository Table Service API + description: Service that manages the tables + contact: + name: Prof. Andreas Rauber + email: andreas.rauber@tuwien.ac.at + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0 + version: 1.2.0 +externalDocs: + description: Sourcecode Documentation + url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services +servers: +- url: http://localhost:9094 + description: Generated server url +- url: https://dbrepo2.tuwien.ac.at + description: Sandbox +paths: + /api/container/{id}/database/{databaseId}/table/{tableId}/column/{columnId}: + put: + tags: + - table-column-endpoint + summary: Update a table column semantic mapping + operationId: update + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: tableId + in: path + required: true + schema: + type: integer + format: int64 + - name: columnId + in: path + required: true + schema: + type: integer + format: int64 + - name: Authorization + in: header + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ColumnSemanticsUpdateDto' + required: true + responses: + "404": + description: "Table, database, semantic concept, unit of measurement or\ + \ container could not be found" + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Updated column semantics successfully + content: + application/json: + schema: + $ref: '#/components/schemas/ColumnDto' + "403": + description: Access to the database is forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Update semantic concept query is malformed or update unit of + measurement query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Update column semantics not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ColumnDto' + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}/table: + get: + tags: + - table-endpoint + summary: List all tables + operationId: list + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "404": + description: Database could not be found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: List tables not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: List tables + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/TableBriefDto' + security: + - bearerAuth: [] + post: + tags: + - table-endpoint + summary: Create a table + operationId: create + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TableCreateDto' + required: true + responses: + "501": + description: Image is not supported + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "504": + description: Broker service failed to create queue + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: "Database, container or user could not be found" + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "409": + description: Create table conflicts with existing table name + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Create table not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "201": + description: Created a new table + content: + application/json: + schema: + $ref: '#/components/schemas/TableBriefDto' + "400": + description: Create table query is malformed + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + /api/container/{id}/database/{databaseId}/table/{tableId}: + get: + tags: + - table-endpoint + summary: Get information about table + operationId: findById + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: tableId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "405": + description: Find table not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Find table successfully + content: + application/json: + schema: + $ref: '#/components/schemas/TableDto' + "403": + description: Access to the database is forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: "Table, database or container could not be found" + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + delete: + tags: + - table-endpoint + summary: Delete a table + operationId: delete + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + - name: databaseId + in: path + required: true + schema: + type: integer + format: int64 + - name: tableId + in: path + required: true + schema: + type: integer + format: int64 + responses: + "501": + description: Image is not supported + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Delete table successfully + content: + application/json: + schema: + $ref: '#/components/schemas/TableDto' + "405": + description: Delete table not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "423": + description: Delete table resulted in an invalid state + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "400": + description: Delete table query resulted in an invalid query statement + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "403": + description: Access to the database is forbidden + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: "Table, database or container could not be found" + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] +components: + schemas: + ColumnSemanticsUpdateDto: + type: object + properties: + concept_uri: + type: string + unit_uri: + type: string + ApiErrorDto: + required: + - code + - message + - status + type: object + properties: + status: + type: string + example: STATUS + enum: + - 100 CONTINUE + - 101 SWITCHING_PROTOCOLS + - 102 PROCESSING + - 103 EARLY_HINTS + - 103 CHECKPOINT + - 200 OK + - 201 CREATED + - 202 ACCEPTED + - 203 NON_AUTHORITATIVE_INFORMATION + - 204 NO_CONTENT + - 205 RESET_CONTENT + - 206 PARTIAL_CONTENT + - 207 MULTI_STATUS + - 208 ALREADY_REPORTED + - 226 IM_USED + - 300 MULTIPLE_CHOICES + - 301 MOVED_PERMANENTLY + - 302 FOUND + - 302 MOVED_TEMPORARILY + - 303 SEE_OTHER + - 304 NOT_MODIFIED + - 305 USE_PROXY + - 307 TEMPORARY_REDIRECT + - 308 PERMANENT_REDIRECT + - 400 BAD_REQUEST + - 401 UNAUTHORIZED + - 402 PAYMENT_REQUIRED + - 403 FORBIDDEN + - 404 NOT_FOUND + - 405 METHOD_NOT_ALLOWED + - 406 NOT_ACCEPTABLE + - 407 PROXY_AUTHENTICATION_REQUIRED + - 408 REQUEST_TIMEOUT + - 409 CONFLICT + - 410 GONE + - 411 LENGTH_REQUIRED + - 412 PRECONDITION_FAILED + - 413 PAYLOAD_TOO_LARGE + - 413 REQUEST_ENTITY_TOO_LARGE + - 414 URI_TOO_LONG + - 414 REQUEST_URI_TOO_LONG + - 415 UNSUPPORTED_MEDIA_TYPE + - 416 REQUESTED_RANGE_NOT_SATISFIABLE + - 417 EXPECTATION_FAILED + - 418 I_AM_A_TEAPOT + - 419 INSUFFICIENT_SPACE_ON_RESOURCE + - 420 METHOD_FAILURE + - 421 DESTINATION_LOCKED + - 422 UNPROCESSABLE_ENTITY + - 423 LOCKED + - 424 FAILED_DEPENDENCY + - 425 TOO_EARLY + - 426 UPGRADE_REQUIRED + - 428 PRECONDITION_REQUIRED + - 429 TOO_MANY_REQUESTS + - 431 REQUEST_HEADER_FIELDS_TOO_LARGE + - 451 UNAVAILABLE_FOR_LEGAL_REASONS + - 500 INTERNAL_SERVER_ERROR + - 501 NOT_IMPLEMENTED + - 502 BAD_GATEWAY + - 503 SERVICE_UNAVAILABLE + - 504 GATEWAY_TIMEOUT + - 505 HTTP_VERSION_NOT_SUPPORTED + - 506 VARIANT_ALSO_NEGOTIATES + - 507 INSUFFICIENT_STORAGE + - 508 LOOP_DETECTED + - 509 BANDWIDTH_LIMIT_EXCEEDED + - 510 NOT_EXTENDED + - 511 NETWORK_AUTHENTICATION_REQUIRED + message: + type: string + example: Error message + code: + type: string + example: error.service.code + ColumnBriefDto: + required: + - column_type + - database_id + - id + - internal_name + - name + - table_id + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: date + database_id: + type: integer + format: int64 + table_id: + type: integer + format: int64 + internal_name: + type: string + example: mdb_date + column_type: + type: string + example: date + enum: + - enum + - number + - decimal + - string + - text + - boolean + - date + - timestamp + - blob + ColumnDto: + required: + - auto_generated + - column_type + - id + - internal_name + - is_null_allowed + - is_primary_key + - is_public + - name + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: Date + length: + type: integer + format: int32 + example: 255 + concept: + $ref: '#/components/schemas/ConceptDto' + unit: + $ref: '#/components/schemas/UnitDto' + internal_name: + type: string + example: mdb_date + date_format: + $ref: '#/components/schemas/ImageDateDto' + auto_generated: + type: boolean + example: false + is_primary_key: + type: boolean + example: true + index_length: + type: integer + format: int32 + column_type: + type: string + example: string + enum: + - enum + - number + - decimal + - string + - text + - boolean + - date + - timestamp + - blob + is_public: + type: boolean + example: true + is_null_allowed: + type: boolean + example: false + enum_values: + type: array + items: + type: string + ConceptDto: + required: + - columns + - created + - uri + type: object + properties: + uri: + type: string + name: + type: string + description: + type: string + created: + type: string + format: date-time + columns: + type: array + items: + $ref: '#/components/schemas/ColumnBriefDto' + ImageDateDto: + required: + - database_format + - example + - has_time + - id + - unix_format + type: object + properties: + id: + type: integer + format: int64 + example: + type: string + example: 30.01.2022 + database_format: + type: string + example: '%d.%c.%Y' + unix_format: + type: string + example: dd.MM.YYYY + has_time: + type: boolean + example: false + created_at: + type: string + format: date-time + UnitDto: + required: + - columns + - created + - uri + type: object + properties: + uri: + type: string + name: + type: string + description: + type: string + created: + type: string + format: date-time + columns: + type: array + items: + $ref: '#/components/schemas/ColumnBriefDto' + ColumnCreateDto: + required: + - name + - null_allowed + - primary_key + - type + type: object + properties: + name: + type: string + example: Date + type: + type: string + example: string + enum: + - enum + - number + - decimal + - string + - text + - boolean + - date + - timestamp + - blob + length: + type: integer + format: int32 + example: 255 + dfid: + type: integer + description: date format id + format: int64 + primary_key: + type: boolean + example: false + index_length: + type: integer + format: int32 + null_allowed: + type: boolean + example: true + enum_values: + type: array + description: "enum values, only considered when type = ENUM" + items: + type: string + description: "enum values, only considered when type = ENUM" + ConstraintsCreateDto: + type: object + properties: + uniques: + type: array + items: + type: array + items: + type: string + checks: + type: array + items: + type: string + foreign_keys: + type: array + items: + $ref: '#/components/schemas/ForeignKeyCreateDto' + ForeignKeyCreateDto: + type: object + properties: + columns: + type: array + items: + type: string + referenced_table: + type: string + referenced_columns: + type: array + items: + type: string + on_update: + type: string + enum: + - restrict + - cascade + - set_null + - no_action + - set_default + on_delete: + type: string + enum: + - restrict + - cascade + - set_null + - no_action + - set_default + TableCreateDto: + required: + - columns + - description + - name + type: object + properties: + name: + type: string + example: Air Quality + description: + type: string + example: Air Quality in Austria + columns: + type: array + items: + $ref: '#/components/schemas/ColumnCreateDto' + constraints: + $ref: '#/components/schemas/ConstraintsCreateDto' + TableBriefDto: + required: + - columns + - description + - id + - internal_name + - name + - owner + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: Air Quality + description: + type: string + example: Air Quality in Austria + owner: + $ref: '#/components/schemas/UserBriefDto' + columns: + type: array + items: + $ref: '#/components/schemas/ColumnBriefDto' + internal_name: + type: string + example: air_quality + UserBriefDto: + required: + - id + - username + type: object + properties: + id: + type: string + format: uuid + example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4 + username: + type: string + description: Only contains lowercase characters + example: jcarberry + name: + type: string + example: Josiah Carberry + orcid: + type: string + example: 0000-0002-1825-0097 + given_name: + type: string + example: Josiah + family_name: + type: string + example: Carberry + email_verified: + type: boolean + example: true + ConstraintsDto: + type: object + properties: + uniques: + type: array + items: + type: array + items: + $ref: '#/components/schemas/ColumnDto' + checks: + type: array + items: + type: string + foreign_keys: + type: array + items: + $ref: '#/components/schemas/ForeignKeyDto' + ForeignKeyDto: + type: object + properties: + columns: + type: array + items: + $ref: '#/components/schemas/ColumnDto' + referenced_table: + $ref: '#/components/schemas/TableBriefDto' + referenced_columns: + type: array + items: + $ref: '#/components/schemas/ColumnDto' + on_update: + type: string + enum: + - restrict + - cascade + - set_null + - no_action + - set_default + on_delete: + type: string + enum: + - restrict + - cascade + - set_null + - no_action + - set_default + TableDto: + required: + - columns + - creator + - description + - id + - internal_name + - is_public + - name + - owner + - queue_name + - routing_key + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: Air Quality + creator: + $ref: '#/components/schemas/UserBriefDto' + owner: + $ref: '#/components/schemas/UserBriefDto' + description: + type: string + example: Air Quality in Austria + created: + type: string + format: date-time + columns: + type: array + items: + $ref: '#/components/schemas/ColumnDto' + constraints: + $ref: '#/components/schemas/ConstraintsDto' + internal_name: + type: string + example: air_quality + queue_name: + type: string + example: dbrepo/air_quality/air_quality + routing_key: + type: string + example: dbrepo/air_quality/air_quality/1 + is_public: + type: boolean + example: true + securitySchemes: + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT diff --git a/.docs/.swagger/api-user.yaml b/.docs/.swagger/api-user.yaml new file mode 100644 index 0000000000000000000000000000000000000000..56bd25f5380528b7f08b44b29c83363103d9bd93 --- /dev/null +++ b/.docs/.swagger/api-user.yaml @@ -0,0 +1,1521 @@ +openapi: 3.0.1 +info: + title: Database Repository User Service API + description: Service that manages the users + contact: + name: Prof. Andreas Rauber + email: andreas.rauber@tuwien.ac.at + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0 + version: 1.2.0 +externalDocs: + description: Wiki Documentation + url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/wikis +servers: +- url: http://localhost:9098 + description: Generated server url +paths: + /api/user/{id}: + get: + tags: + - user-endpoint + summary: Get a user info + operationId: find + parameters: + - name: id + in: path + required: true + schema: + type: string + responses: + "404": + description: User was not found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Find user is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "200": + description: Found user + content: + application/json: + schema: + $ref: '#/components/schemas/UserDto' + security: + - bearerAuth: [] + put: + tags: + - user-endpoint + summary: Modify user information + operationId: modify + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserUpdateDto' + required: true + responses: + "202": + description: Modified user information + content: + application/json: + schema: + $ref: '#/components/schemas/UserDto' + "405": + description: Modify user is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: User attribute was not found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + security: + - bearerAuth: [] + /api/user/{id}/theme: + put: + tags: + - user-endpoint + summary: Modify user theme + operationId: theme + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserThemeSetDto' + required: true + responses: + "405": + description: Modify user is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: User or user attribute was not found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Modified user theme + content: + application/json: + schema: + $ref: '#/components/schemas/UserDto' + security: + - bearerAuth: [] + /api/user/{id}/password: + put: + tags: + - user-endpoint + summary: Modify user password + operationId: password + parameters: + - name: id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserPasswordDto' + required: true + responses: + "404": + description: User was not found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "405": + description: Modify user is not permitted + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "202": + description: Modified user password + content: + application/json: + schema: + $ref: '#/components/schemas/UserDto' + security: + - bearerAuth: [] + /api/maintenance/message/{id}: + get: + tags: + - maintenance-endpoint + summary: Find one maintenance message + operationId: find_1 + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + responses: + "200": + description: Get messages + content: + application/json: + schema: + $ref: '#/components/schemas/BannerMessageDto' + put: + tags: + - maintenance-endpoint + summary: Update maintenance message + operationId: update + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BannerMessageUpdateDto' + required: true + responses: + "404": + description: Could not find message + content: + application/json: + schema: + $ref: '#/components/schemas/BannerMessageNotFoundException' + "202": + description: Updated message + content: + application/json: + schema: + $ref: '#/components/schemas/BannerMessageBriefDto' + delete: + tags: + - maintenance-endpoint + summary: Delete maintenance message + operationId: delete + parameters: + - name: id + in: path + required: true + schema: + type: integer + format: int64 + responses: + "202": + description: Deleted message + content: + application/json: {} + "404": + description: Could not find message + content: + application/json: + schema: + $ref: '#/components/schemas/BannerMessageNotFoundException' + /api/user: + get: + tags: + - user-endpoint + summary: Find all users + operationId: findAll + responses: + "200": + description: List users + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/UserBriefDto' + post: + tags: + - user-endpoint + summary: Create user + operationId: create + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SignupRequestDto' + required: true + responses: + "409": + description: User with username already exists + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "404": + description: Realm or default role not found + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + "201": + description: Created user + content: + application/json: + schema: + $ref: '#/components/schemas/UserBriefDto' + "417": + description: User with e-mail already exists + content: + application/json: + schema: + $ref: '#/components/schemas/ApiErrorDto' + /api/maintenance/message: + get: + tags: + - maintenance-endpoint + summary: Find maintenance messages + operationId: list + responses: + "200": + description: List messages + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/BannerMessageDto' + post: + tags: + - maintenance-endpoint + summary: Create maintenance message + operationId: create_1 + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/BannerMessageCreateDto' + required: true + responses: + "201": + description: Created message + content: + application/json: + schema: + $ref: '#/components/schemas/BannerMessageBriefDto' + /api/maintenance/message/active: + get: + tags: + - maintenance-endpoint + summary: Find active maintenance messages + operationId: active + responses: + "200": + description: List messages + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/BannerMessageBriefDto' +components: + schemas: + UserUpdateDto: + type: object + properties: + firstname: + type: string + example: Josiah + lastname: + type: string + example: Carberry + affiliation: + type: string + example: Brown University + orcid: + type: string + example: 0000-0002-1825-0097 + ColumnBriefDto: + required: + - column_type + - database_id + - id + - internal_name + - name + - table_id + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: date + database_id: + type: integer + format: int64 + table_id: + type: integer + format: int64 + internal_name: + type: string + example: mdb_date + column_type: + type: string + example: date + enum: + - enum + - number + - decimal + - string + - text + - boolean + - date + - timestamp + - blob + ContainerDto: + required: + - created + - hash + - id + - internal_name + - name + - running + type: object + properties: + id: + type: integer + format: int64 + hash: + type: string + example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50 + name: + type: string + example: Air Quality + state: + type: string + example: running + enum: + - created + - restarting + - running + - paused + - exited + - dead + database: + $ref: '#/components/schemas/DatabaseDto' + running: + type: boolean + example: true + image: + $ref: '#/components/schemas/ImageBriefDto' + port: + type: integer + format: int32 + owner: + $ref: '#/components/schemas/UserBriefDto' + created: + type: string + format: date-time + example: 2021-03-12T15:26:21.678396092Z + internal_name: + type: string + example: air-quality + ip_address: + type: string + CreatorDto: + required: + - firstname + - id + - lastname + type: object + properties: + id: + type: integer + format: int64 + firstname: + type: string + example: Josiah + lastname: + type: string + example: Carberry + affiliation: + type: string + example: Wesleyan University + orcid: + type: string + example: 0000-0002-1825-0097 + DatabaseAccessDto: + required: + - type + - user + type: object + properties: + user: + $ref: '#/components/schemas/UserDto' + type: + type: string + enum: + - read + - write_own + - write_all + created: + type: string + format: date-time + DatabaseDto: + required: + - creator + - exchange_name + - id + - internal_name + - name + - owner + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: Air Quality + identifier: + $ref: '#/components/schemas/IdentifierDto' + description: + type: string + example: Weather Australia 2009-2021 + tables: + type: array + items: + $ref: '#/components/schemas/TableBriefDto' + views: + type: array + items: + $ref: '#/components/schemas/ViewBriefDto' + image: + $ref: '#/components/schemas/ImageDto' + container: + $ref: '#/components/schemas/ContainerDto' + accesses: + type: array + items: + $ref: '#/components/schemas/DatabaseAccessDto' + creator: + $ref: '#/components/schemas/UserBriefDto' + owner: + $ref: '#/components/schemas/UserBriefDto' + created: + type: string + format: date-time + exchange_name: + type: string + example: dbrepo/air_quality + internal_name: + type: string + example: weather_australia + is_public: + type: boolean + example: true + IdentifierDto: + required: + - container id + - creators + - database id + - execution + - publication_year + - query + - query_hash + - query_normalized + - result_hash + - result_number + - title + - type + - visibility + type: object + properties: + id: + type: integer + format: int64 + type: + type: string + enum: + - database + - subset + title: + type: string + example: "Airquality Stephansplatz, Vienna, Austria" + description: + type: string + example: "Air quality reports at Stephansplatz, Vienna" + query: + type: string + example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ + \ = \"09:STEF\"" + execution: + type: string + format: date-time + visibility: + type: string + example: everyone + enum: + - everyone + - self + doi: + type: string + example: 10.1038/nphys1170 + publisher: + type: string + example: TU Wien + language: + type: string + enum: + - ab + - aa + - af + - ak + - sq + - am + - ar + - an + - hy + - as + - av + - ae + - ay + - az + - bm + - ba + - eu + - be + - bn + - bh + - bi + - bs + - br + - bg + - my + - ca + - km + - ch + - ce + - ny + - zh + - cu + - cv + - kw + - co + - cr + - hr + - cs + - da + - dv + - nl + - dz + - en + - eo + - et + - ee + - fo + - fj + - fi + - fr + - ff + - gd + - gl + - lg + - ka + - de + - ki + - el + - kl + - gn + - gu + - ht + - ha + - he + - hz + - hi + - ho + - hu + - is + - io + - ig + - id + - ia + - ie + - iu + - ik + - ga + - it + - ja + - jv + - kn + - kr + - ks + - kk + - rw + - kv + - kg + - ko + - kj + - ku + - ky + - lo + - la + - lv + - lb + - li + - ln + - lt + - lu + - mk + - mg + - ms + - ml + - mt + - gv + - mi + - mr + - mh + - ro + - mn + - na + - nv + - nd + - ng + - ne + - se + - "no" + - nb + - nn + - ii + - oc + - oj + - or + - om + - os + - pi + - pa + - ps + - fa + - pl + - pt + - qu + - rm + - rn + - ru + - sm + - sg + - sa + - sc + - sr + - sn + - sd + - si + - sk + - sl + - so + - st + - nr + - es + - su + - sw + - ss + - sv + - tl + - ty + - tg + - ta + - tt + - te + - th + - bo + - ti + - to + - ts + - tn + - tr + - tk + - tw + - ug + - uk + - ur + - uz + - ve + - vi + - vo + - wa + - cy + - fy + - wo + - xh + - yi + - yo + - za + - zu + license: + $ref: '#/components/schemas/LicenseDto' + creators: + type: array + items: + $ref: '#/components/schemas/CreatorDto' + created: + type: string + format: date-time + container id: + type: integer + format: int64 + example: 1 + database id: + type: integer + format: int64 + example: 1 + query id: + type: integer + format: int64 + example: 1 + query_normalized: + type: string + example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ + \ = \"09:STEF\"" + related: + type: array + items: + $ref: '#/components/schemas/RelatedIdentifierDto' + query_hash: + type: string + description: query hash in sha512 + result_hash: + type: string + result_number: + type: integer + format: int64 + example: 1 + publication_day: + type: integer + format: int32 + example: 15 + publication_month: + type: integer + format: int32 + example: 12 + publication_year: + type: integer + format: int32 + example: 2022 + last_modified: + type: string + format: date-time + ImageBriefDto: + required: + - id + - registry + - repository + - tag + type: object + properties: + id: + type: integer + format: int64 + registry: + type: string + example: docker.io/library + repository: + type: string + example: mariadb + tag: + type: string + example: "10.5" + ImageDateDto: + required: + - database_format + - example + - has_time + - id + - unix_format + type: object + properties: + id: + type: integer + format: int64 + example: + type: string + example: 30.01.2022 + database_format: + type: string + example: '%d.%c.%Y' + unix_format: + type: string + example: dd.MM.YYYY + has_time: + type: boolean + example: false + created_at: + type: string + format: date-time + ImageDto: + required: + - default_port + - dialect + - driver_class + - id + - jdbc_method + - registry + - repository + - tag + type: object + properties: + id: + type: integer + format: int64 + registry: + type: string + example: docker.io/library + repository: + type: string + example: mariadb + tag: + type: string + example: "10.5" + dialect: + type: string + example: org.hibernate.dialect.MariaDBDialect + hash: + type: string + example: sha256:c5ec7353d87dfc35067e7bffeb25d6a0d52dad41e8b7357213e3b12d6e7ff78e + compiled: + type: string + format: date-time + example: 2021-03-12T15:26:21.678396092Z + size: + type: integer + example: 314295447 + driver_class: + type: string + example: org.mariadb.jdbc.Driver + date_formats: + type: array + items: + $ref: '#/components/schemas/ImageDateDto' + jdbc_method: + type: string + example: mariadb + default_port: + type: integer + format: int32 + example: 3306 + LicenseDto: + required: + - identifier + - uri + type: object + properties: + identifier: + type: string + example: MIT + uri: + type: string + example: https://opensource.org/licenses/MIT + RelatedIdentifierDto: + required: + - created + - id + - value + type: object + properties: + id: + type: integer + format: int64 + value: + type: string + example: 10.70124/dc4zh-9ce78 + type: + type: string + example: DOI + enum: + - DOI + - URL + - URN + - ARK + - arXiv + - bibcode + - EAN13 + - EISSN + - Handle + - IGSN + - ISBN + - ISTC + - LISSN + - LSID + - PMID + - PURL + - UPC + - w3id + relation: + type: string + example: Cites + enum: + - IsCitedBy + - Cites + - IsSupplementTo + - IsSupplementedBy + - IsContinuedBy + - Continues + - IsDescribedBy + - Describes + - HasMetadata + - IsMetadataFor + - HasVersion + - IsVersionOf + - IsNewVersionOf + - IsPreviousVersionOf + - IsPartOf + - HasPart + - IsPublishedIn + - IsReferencedBy + - References + - IsDocumentedBy + - Documents + - IsCompiledBy + - Compiles + - IsVariantFormOf + - IsOriginalFormOf + - IsIdenticalTo + - IsReviewedBy + - Reviews + - IsDerivedFrom + - IsSourceOf + - IsRequiredBy + - Requires + - IsObsoletedBy + - Obsoletes + created: + type: string + format: date-time + last_modified: + type: string + format: date-time + TableBriefDto: + required: + - columns + - description + - id + - internal_name + - name + - owner + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + example: Air Quality + description: + type: string + example: Air Quality in Austria + owner: + $ref: '#/components/schemas/UserBriefDto' + columns: + type: array + items: + $ref: '#/components/schemas/ColumnBriefDto' + internal_name: + type: string + example: air_quality + UserAttributeDto: + type: object + properties: + name: + type: string + example: theme_dark + value: + type: string + example: "true" + UserBriefDto: + required: + - id + - username + type: object + properties: + id: + type: string + format: uuid + example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4 + username: + type: string + description: Only contains lowercase characters + example: jcarberry + name: + type: string + example: Josiah Carberry + orcid: + type: string + example: 0000-0002-1825-0097 + given_name: + type: string + example: Josiah + family_name: + type: string + example: Carberry + email_verified: + type: boolean + example: true + UserDto: + required: + - email + - email_verified + - id + - username + type: object + properties: + id: + type: string + format: uuid + example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4 + username: + type: string + description: Only contains lowercase characters + example: jcarberry + name: + type: string + example: Josiah Carberry + orcid: + type: string + example: 0000-0002-1825-0097 + attributes: + type: array + items: + $ref: '#/components/schemas/UserAttributeDto' + containers: + type: array + items: + $ref: '#/components/schemas/ContainerDto' + databases: + type: array + items: + $ref: '#/components/schemas/ContainerDto' + identifiers: + type: array + items: + $ref: '#/components/schemas/ContainerDto' + email: + type: string + example: jcarberry@brown.edu + given_name: + type: string + example: Josiah + family_name: + type: string + example: Carberry + email_verified: + type: boolean + example: true + ViewBriefDto: + required: + - created + - creator + - id + - internal_name + - name + - query + - vdbid + type: object + properties: + id: + type: integer + format: int64 + vdbid: + type: integer + format: int64 + name: + type: string + example: Air Quality + query: + type: string + example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC + created: + type: string + format: date-time + creator: + $ref: '#/components/schemas/UserDto' + internal_name: + type: string + example: air_quality + is_public: + type: boolean + example: true + initial_view: + type: boolean + description: True if it is the default view for the database + example: true + last_modified: + type: string + format: date-time + ApiErrorDto: + required: + - code + - message + - status + type: object + properties: + status: + type: string + example: STATUS + enum: + - 100 CONTINUE + - 101 SWITCHING_PROTOCOLS + - 102 PROCESSING + - 103 EARLY_HINTS + - 103 CHECKPOINT + - 200 OK + - 201 CREATED + - 202 ACCEPTED + - 203 NON_AUTHORITATIVE_INFORMATION + - 204 NO_CONTENT + - 205 RESET_CONTENT + - 206 PARTIAL_CONTENT + - 207 MULTI_STATUS + - 208 ALREADY_REPORTED + - 226 IM_USED + - 300 MULTIPLE_CHOICES + - 301 MOVED_PERMANENTLY + - 302 FOUND + - 302 MOVED_TEMPORARILY + - 303 SEE_OTHER + - 304 NOT_MODIFIED + - 305 USE_PROXY + - 307 TEMPORARY_REDIRECT + - 308 PERMANENT_REDIRECT + - 400 BAD_REQUEST + - 401 UNAUTHORIZED + - 402 PAYMENT_REQUIRED + - 403 FORBIDDEN + - 404 NOT_FOUND + - 405 METHOD_NOT_ALLOWED + - 406 NOT_ACCEPTABLE + - 407 PROXY_AUTHENTICATION_REQUIRED + - 408 REQUEST_TIMEOUT + - 409 CONFLICT + - 410 GONE + - 411 LENGTH_REQUIRED + - 412 PRECONDITION_FAILED + - 413 PAYLOAD_TOO_LARGE + - 413 REQUEST_ENTITY_TOO_LARGE + - 414 URI_TOO_LONG + - 414 REQUEST_URI_TOO_LONG + - 415 UNSUPPORTED_MEDIA_TYPE + - 416 REQUESTED_RANGE_NOT_SATISFIABLE + - 417 EXPECTATION_FAILED + - 418 I_AM_A_TEAPOT + - 419 INSUFFICIENT_SPACE_ON_RESOURCE + - 420 METHOD_FAILURE + - 421 DESTINATION_LOCKED + - 422 UNPROCESSABLE_ENTITY + - 423 LOCKED + - 424 FAILED_DEPENDENCY + - 425 TOO_EARLY + - 426 UPGRADE_REQUIRED + - 428 PRECONDITION_REQUIRED + - 429 TOO_MANY_REQUESTS + - 431 REQUEST_HEADER_FIELDS_TOO_LARGE + - 451 UNAVAILABLE_FOR_LEGAL_REASONS + - 500 INTERNAL_SERVER_ERROR + - 501 NOT_IMPLEMENTED + - 502 BAD_GATEWAY + - 503 SERVICE_UNAVAILABLE + - 504 GATEWAY_TIMEOUT + - 505 HTTP_VERSION_NOT_SUPPORTED + - 506 VARIANT_ALSO_NEGOTIATES + - 507 INSUFFICIENT_STORAGE + - 508 LOOP_DETECTED + - 509 BANDWIDTH_LIMIT_EXCEEDED + - 510 NOT_EXTENDED + - 511 NETWORK_AUTHENTICATION_REQUIRED + message: + type: string + example: Error message + code: + type: string + example: error.service.code + UserThemeSetDto: + required: + - theme_dark + type: object + properties: + theme_dark: + type: boolean + example: true + UserPasswordDto: + required: + - password + type: object + properties: + password: + type: string + BannerMessageUpdateDto: + required: + - message + - type + type: object + properties: + type: + type: string + enum: + - error + - warning + - info + message: + type: string + example: Maintenance starts on 8am on Monday + link: + type: string + example: https://example.com + link_text: + type: string + example: More + display_start: + type: string + format: date-time + display_end: + type: string + format: date-time + BannerMessageNotFoundException: + type: object + properties: + cause: + type: object + properties: + stackTrace: + type: array + items: + type: object + properties: + classLoaderName: + type: string + moduleName: + type: string + moduleVersion: + type: string + methodName: + type: string + fileName: + type: string + lineNumber: + type: integer + format: int32 + nativeMethod: + type: boolean + className: + type: string + message: + type: string + suppressed: + type: array + items: + type: object + properties: + stackTrace: + type: array + items: + type: object + properties: + classLoaderName: + type: string + moduleName: + type: string + moduleVersion: + type: string + methodName: + type: string + fileName: + type: string + lineNumber: + type: integer + format: int32 + nativeMethod: + type: boolean + className: + type: string + message: + type: string + localizedMessage: + type: string + localizedMessage: + type: string + stackTrace: + type: array + items: + type: object + properties: + classLoaderName: + type: string + moduleName: + type: string + moduleVersion: + type: string + methodName: + type: string + fileName: + type: string + lineNumber: + type: integer + format: int32 + nativeMethod: + type: boolean + className: + type: string + message: + type: string + suppressed: + type: array + items: + type: object + properties: + stackTrace: + type: array + items: + type: object + properties: + classLoaderName: + type: string + moduleName: + type: string + moduleVersion: + type: string + methodName: + type: string + fileName: + type: string + lineNumber: + type: integer + format: int32 + nativeMethod: + type: boolean + className: + type: string + message: + type: string + localizedMessage: + type: string + localizedMessage: + type: string + BannerMessageBriefDto: + required: + - message + - type + type: object + properties: + type: + type: string + enum: + - error + - warning + - info + message: + type: string + example: Maintenance starts on 8am on Monday + link: + type: string + example: https://example.com + link_text: + type: string + example: More + SignupRequestDto: + required: + - email + - password + - username + type: object + properties: + username: + pattern: "^[a-z0-9]{3,}$" + type: string + example: user + email: + type: string + example: user@example.com + password: + type: string + BannerMessageCreateDto: + required: + - message + - type + type: object + properties: + type: + type: string + enum: + - error + - warning + - info + message: + type: string + example: Maintenance starts on 8am on Monday + link: + type: string + example: https://example.com + link_text: + type: string + example: More + display_start: + type: string + format: date-time + display_end: + type: string + format: date-time + BannerMessageDto: + required: + - id + - message + - type + type: object + properties: + id: + type: integer + format: int64 + type: + type: string + enum: + - error + - warning + - info + message: + type: string + example: Maintenance starts on 8am on Monday + link: + type: string + example: https://example.com + link_text: + type: string + example: More + display_start: + type: string + format: date-time + display_end: + type: string + format: date-time + securitySchemes: + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT diff --git a/.docs/.swagger/dist.tar.gz b/.docs/.swagger/dist.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..c23425955d630805b73530bf20cad4c28369bcb1 Binary files /dev/null and b/.docs/.swagger/dist.tar.gz differ diff --git a/.docs/.swagger/fetch.sh b/.docs/.swagger/fetch.sh new file mode 100644 index 0000000000000000000000000000000000000000..378878f0ad59e76184a4ed1febf6784e34d4256d --- /dev/null +++ b/.docs/.swagger/fetch.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# This script is executed before pushing to the pipeline for the moment. +# @author: Martin Weise + +declare -A services +services[5000]=analyse +services[9050]=mirror +services[9093]=data +services[9099]=metadata + +function retrieve () { + if [[ "$2" == analyse ]]; then + echo "... retrieve json api from localhost:$1" + wget "http://localhost:$1/api-$2.json" -O "./.docs/.swagger/api-$2.yaml" -q + else + echo "... retrieve yaml api from localhost:$1" + wget "http://localhost:$1/v3/api-docs.yaml" -O "./.docs/.swagger/api-$2.yaml" -q + fi +} + +for key in "${!services[@]}"; do + echo "Generating ${services[$key]} API" + retrieve "$key" "${services[$key]}" +done \ No newline at end of file diff --git a/.docs/.swagger/generate.sh b/.docs/.swagger/generate.sh new file mode 100644 index 0000000000000000000000000000000000000000..86268305f3b353e5a472fc3a48a2c2c12710ed25 --- /dev/null +++ b/.docs/.swagger/generate.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# clean up +echo "clean up ./dist ./site" +rm -rf ./dist ./site + +# ensure target directories are present +echo "ensure target directory ./site are present" +mkdir -p ./site + +# extract static site +echo "extract static site .docs/.swagger/dist.tar.gz" +tar xzf .docs/.swagger/dist.tar.gz +for service in "analyse" "mirror" "data" "metadata" "upload"; do + mkdir -p ./site/$service + echo "extract static site ./dist -> ./site/$service" + cp -r ./dist/* ./site/$service + echo "placing .docs/.swagger/api-$service.yaml -> ./site/$service/api.yaml" + cp ".docs/.swagger/api-$service.yaml" "./site/$service/api.yaml" +done diff --git a/.docs/contact.md b/.docs/contact.md new file mode 100644 index 0000000000000000000000000000000000000000..c299b470a214a6a5fc7abcbedf7d9a135ce8c0aa --- /dev/null +++ b/.docs/contact.md @@ -0,0 +1,39 @@ +--- +author: Martin Weise +hide: +- navigation +--- + +# Contact + +## Team + +### Project Management + +Ao.univ.Prof. Dr. [Andreas Rauber](https://www.ifs.tuwien.ac.at/~andi)<br /> +Technische Universität Wien<br /> +Research Unit Data Science<br /> +Favoritenstraße 9-11<br /> +A-1040 Vienna, Austria + +### Development + +Projektass. Dipl.-Ing. [Martin Weise](https://ec.tuwien.ac.at/~weise/)<br /> +Technische Universität Wien<br /> +Research Unit Data Science<br /> +Favoritenstraße 9-11<br /> +A-1040 Vienna, Austria + +## Contributors (alphabetically) + +- Ganguly, Raman +- Gergely, Eva +- Grantner, Tobias +- Karnbach, Geoffrey +- Michlits, Cornelia +- Rauber, Andreas +- Staudinger, Moritz +- Stytsenko, Kirill +- Taha, Josef +- Tsepelakis, Sotiris +- Weise, Martin diff --git a/.docs/customization.md b/.docs/customization.md new file mode 100644 index 0000000000000000000000000000000000000000..af996d9c644c2964a92961c94bbc3b0e72c17404 --- /dev/null +++ b/.docs/customization.md @@ -0,0 +1,56 @@ +--- +author: Martin Weise +hide: +- navigation +--- + +# Customization + +!!! info "Abstract" + + On this page, we showcase the customization capabilities of DBRepo to e.g. whitelabel your deployment. + +## Custom Title + +The default title is "Database Repository" and can be replaced by changing the `TITLE` environment variable. + +## Custom Logo + +The default placeholder logo consists of the two universities that developed this software. You can replace it by +mounting your own logo with a volume. + +```console +docker run -v /path/to/your_logo.png:/logo.png ... +``` + +In case your logo is not in PNG format, you need to change the environment variable `LOGO` accordingly, e.g. for a logo +in JPEG format, set `LOGO: "/logo.JPEG"` in the `.env` file and start the container with a volume. + +```console +docker run -v /path/to/your_logo.JPEG:/logo.JPEG ... +``` + +<figure markdown> + +<figcaption>Custom logo which replaces the default placeholder logo</figcaption> +</figure> + +## Custom Icon + +The default placeholder icon can be replaced by mounting your own icon with a volume. + +```console +docker run -v /path/to/your_logo.ico:/favicon.ico ... +``` + +<figure markdown> + +<figcaption>Custom icon which replaces the default placeholder icon</figcaption> +</figure> + +In case your icon is not in ICO format, you need to change the environment variable `ICON` accordingly, e.g. for an icon +in GIF format, set `ICON: "/favicon.GIF"` in the `.env` file and start the container with a volume. + +```console +docker run -v /path/to/favicon.GIF:/favicon.GIF ... +``` diff --git a/.docs/deployment.md b/.docs/deployment.md new file mode 100644 index 0000000000000000000000000000000000000000..b3a35b8525f2a644b569f6d959cc9c38cba443dd --- /dev/null +++ b/.docs/deployment.md @@ -0,0 +1,76 @@ +--- +author: Martin Weise +hide: +- navigation +--- + +# Deployment + +!!! info "Abstract" + + We modified some services and exchanged them with reviewed, open-source implementations that extend the functionality + even more from version 1.2 onwards. On this page, some of the configuration possible is summarized. + +## Authentication Service + +## Broker Service + +### Authentication + +The RabbitMQ client can be authenticated through plain (username, password) and OAuth2 mechanisms. Note that the access +token already contains a field `client_id=foo`, so the username is optional in `PlainCredentials()`. + +=== "Plain" + + ``` py + import pika + + credentials = pika.credentials.PlainCredentials("foo", "bar") + parameters = pika.ConnectionParameters('localhost', 5672, '/', credentials) + connection = pika.BlockingConnection(parameters) + channel = connection.channel() + channel.queue_declare(queue='test', durable=True) + channel.basic_publish(exchange='', + routing_key='test', + body=b'Hello World!') + print(" [x] Sent 'Hello World!'") + connection.close() + ``` + +=== "OAuth2" + + ``` py + import pika + + credentials = pika.credentials.PlainCredentials("", "THE_ACCESS_TOKEN") + parameters = pika.ConnectionParameters('localhost', 5672, '/', credentials) + connection = pika.BlockingConnection(parameters) + channel = connection.channel() + channel.queue_declare(queue='test', durable=True) + channel.basic_publish(exchange='', + routing_key='test', + body=b'Hello World!') + print(" [x] Sent 'Hello World!'") + connection.close() + ``` + +## Identifier Service + +From version 1.2 onwards there are two modes for the Identifier Service: + +1. Persistent Identifier (PID) +2. Digital Object Identifier (DOI) + +By default, the URI mode is used, creating a PID for databases or subsets. If starting the Identifier Service in DOI mode, +a DOI is minted for persistent identification of databases or subsets. Using the DOI system is entirely *optional* and +should not be done for test-deployments. + +<figure markdown> + +<figcaption>Minting a test-DOI for a subset</figcaption> +</figure> + +## Gateway Service + +From version 1.2 onwards we use both HTTP and HTTPS to serve the API, especially for the Authentication Service. The Discovery +Service lists both the non-secure and secure ports. diff --git a/.docs/docker/mweise.pub b/.docs/docker/mweise.pub new file mode 100644 index 0000000000000000000000000000000000000000..4057727e50fb5ab4a2feb052257a4e0cf4ce2706 --- /dev/null +++ b/.docs/docker/mweise.pub @@ -0,0 +1,6 @@ +-----BEGIN PUBLIC KEY----- +role: mweise + +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEiF4l7rlcaope9LGiodp6yHRtsUek +WjYX8mVi3AAcuoXvKtnbRZTwX78FOID2zZiQSsHWIcuMDOKJfubNzWrtMw== +-----END PUBLIC KEY----- diff --git a/.docs/get-started.md b/.docs/get-started.md new file mode 100644 index 0000000000000000000000000000000000000000..eecbd290c004609a88bad70c2d29f0a47f5b6903 --- /dev/null +++ b/.docs/get-started.md @@ -0,0 +1,152 @@ +--- +author: Martin Weise +hide: + +- navigation + +--- + +# Get Started + +!!! info "Abstract" + + In this short getting started guide we show the dependencies to run the database repository and perform a small, + local, test deployment for quickly trying out the features that the repository offers. + +## Requirements + +### Hardware + +For this small, local, test deployment any modern hardware would suffice, we recommend a dedicated virtual machine with +the following settings. Note that most of the CPU and RAM resources will be needed for starting the infrastructure, +this is because of Docker. + +- 8 CPU cores +- 16GB RAM memory +- 100GB SSD memory available + +### Software + +Install Docker Engine for your operating system. There are excellent guides available for Linux, we highly recommend +to use a stable distribution such as [Debian](https://docs.docker.com/desktop/install/debian/). In the following guide +we only consider Debian. + +## Deployment + +### Docker Compose + +We maintain a rapid prototype deployment option through Docker Compose (v2.17.0 and newer). This deployment creates the +core infrastructure and a single Docker container for all user-generated databases. + +Download the +latest [`docker-compose.yml`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/docker-compose.prod.yml), +nginx reverse proxy +conf [`dbrepo.conf`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/dbrepo.conf) +and [`.env`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/.env.unix.example): + + curl -o docker-compose.yml https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/docker-compose.prod.yml + curl -o dbrepo.conf https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/dbrepo.conf + curl -o .env https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/.env.unix.example + +Increase the virtual memory max swap limit for OpenSearch to at least 262144 on the *host machine* according +to [the official manual](https://opensearch.org/docs/1.0/opensearch/install/important-settings/), you need *sudo* +permissions for this (check first with `cat /proc/sys/vm/max_map_count`): + + echo "vm.max_map_count=262144" >> /etc/sysctl.conf + sysctl -p + +Start the services: + + docker compose pull + docker compose up -d + +View the logs: + + docker compose logs -f + +The Metadata Database still needs to know that the Docker container that holds all user-generated databases exists, we +need to insert it: + + mariadb -h 127.0.0.1 -D fda -u root -pdbrepo -e "INSERT INTO `fda`.`mdb_containers` \ + (name, internal_name, image_id, host, port, privileged_username, privileged_password) \ + VALUES ('MariaDB 10.5', 'mariadb_10_5', 1, 'user-db', 3306, 'root', 'dbrepo')" + +You should now be able to view the front end at <a href="http://127.0.0.1:80" target="_blank">http://127.0.0.1:80</a> + +Please be warned that the default configuration is not intended for public deployments. It is only intended to have a +running system within minutes to play around within the system and explore features. + +!!! warning "Known security issues with the default configuration" + + The system is auto-configured for a small, local, test deployment and is *not* secure! You need to make modifications + in various places to make it secure: + + * **Authentication Service**: + + a. You need to use your own instance or configure a secure instance using a (self-signed) certificate. + Additionally, when serving from a non-default Authentication Service, you need to put it into the + `JWT_ISSUER` environment variable (`.env`). + + b. You need to change the default admin user `fda` password in Realm + master > Users > fda > Credentials > Reset password. + + c. You need to change the client secrets for the clients `dbrepo-client` and `broker-client`. Do this in Realm + dbrepo > Clients > dbrepo-client > Credentials > Client secret > Regenerate. Do the same for the + broker-client. + + d. You need to regenerate the public key of the `RS256` algorithm which is shared with all services to verify + the signature of JWT tokens. Add your securely generated private key in Realm + dbrepo > Realm settings > Keys > Providers > Add provider > rsa. + + * **Broker Service**: by default, this service is configured with an administrative user that has major privileges. + You need to change the password of the user *fda* in Admin > Update this user > Password. We found this + [simple guide](https://onlinehelp.coveo.com/en/ces/7.0/administrator/changing_the_rabbitmq_administrator_password.htm) + to be very useful. + + * **Search Database**: by default, this service is configured to require authentication with an administrative user + that is allowed to write into the indizes. Following + this [simple guide](https://www.elastic.co/guide/en/elasticsearch/reference/8.7/reset-password.html), this can be + achieved using the command line. + + * **Gateway Service**: by default, no HTTPS is used that protects the services behind. You need to provide a trusted + SSL/TLS certificate in the configuration file or use your own proxy in front of the Gateway Service. See this + [simple guide](http://nginx.org/en/docs/http/configuring_https_servers.html) on how to install a SSL/TLS + certificate on NGINX. + +##### Migration from 1.2 to 1.3 + +In case you have a previous deployment from version 1.2, shut down the containers and back them up manually. You can do +this by using the `busybox` image. Replace `deadbeef` with your container name or hash: + +```console +export NAME=dbrepo-userdb-xyz +docker run --rm --volumes-from $NAME -v /home/$USER/backup:/backup busybox tar pcvfz /backup/$NAME.tar.gz /var/lib/mysql +``` + +!!! danger "Wipe all traces of DBRepo from your system" + + To erase all traces of DBRepo from your computer or virtual machine, the following commands delete all containers, + volumes and networks that are present, execute the following **dangerous** command. It will **wipe** all information + about DBRepo from your system (excluding the images). + + ```console + docker container stop $(docker container ls -aq -f name=^/dbrepo-.*) || true + docker container rm $(docker container ls -aq -f name=^/dbrepo-.*) || true + docker volume rm $(docker volume ls -q -f name=^dbrepo-.*) || true + docker network rm $(docker network ls -q -f name=^dbrepo-.*) || true + ``` + +You can restore the volume *after* downloading the new 1.3 images and creating the infrastructure: + +```console +export NAME=dbrepo-userdb-xyz +export PORT=12345 +docker container create -h $NAME --name $NAME -p $PORT:3306 -e MARIADB_ROOT_PASSWORD=mariadb --network userdb -v /backup mariadb:10.5 +docker run --rm --volumes-from $NAME -v /home/$USER/backup/.tar.gz:/backup/$NAME.tar.gz busybox sh -c 'cd /backup && tar xvfz /backup/$NAME.tar.gz && cp -r /backup/var/lib/mysql/* /var/lib/mysql' +``` + +Future releases will be backwards compatible and will come with migration scripts. + +### Kubernetes + +We maintain a RKE2 Kubernetes deployment from version 1.3 onwards. More on that when the release date is fixed. diff --git a/.docs/images/DS-icon_white_hiRes.png b/.docs/images/DS-icon_white_hiRes.png new file mode 100644 index 0000000000000000000000000000000000000000..862c2124ca4190ff6a12de31aeffa08f8e77f300 Binary files /dev/null and b/.docs/images/DS-icon_white_hiRes.png differ diff --git a/.docs/images/TU_Signet_weiss_transparent_300dpi_RGB.png b/.docs/images/TU_Signet_weiss_transparent_300dpi_RGB.png new file mode 100644 index 0000000000000000000000000000000000000000..3d21cd14e55afc972f3903b2cbdf4f3b3c8cebf6 Binary files /dev/null and b/.docs/images/TU_Signet_weiss_transparent_300dpi_RGB.png differ diff --git a/.docs/images/architecture-ui.png b/.docs/images/architecture-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..ec4d56dcfdb5df8f414139df0e360a84fe6f84fa Binary files /dev/null and b/.docs/images/architecture-ui.png differ diff --git a/.docs/images/architecture.png b/.docs/images/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..f2353af4120193e1d777f1c1eaf8fad95a5c761c Binary files /dev/null and b/.docs/images/architecture.png differ diff --git a/.docs/images/auth-create.png b/.docs/images/auth-create.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc593be612a46a1664e231d1ada9b33ef858ac9 Binary files /dev/null and b/.docs/images/auth-create.png differ diff --git a/.docs/images/custom_icon.png b/.docs/images/custom_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fde478eaffef802311bc0a370931bf6a30f3eb82 Binary files /dev/null and b/.docs/images/custom_icon.png differ diff --git a/.docs/images/custom_logo.png b/.docs/images/custom_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b84dcdae2f5fd04d84245c05b20b0ad9ad342b12 Binary files /dev/null and b/.docs/images/custom_logo.png differ diff --git a/.docs/images/deployment-tuwien.png b/.docs/images/deployment-tuwien.png new file mode 100644 index 0000000000000000000000000000000000000000..642b1de2fe6dfa660b1978bbacb24f7e70cb2886 Binary files /dev/null and b/.docs/images/deployment-tuwien.png differ diff --git a/.docs/images/deployment.png b/.docs/images/deployment.png new file mode 100644 index 0000000000000000000000000000000000000000..14e87c96cd53a7ad763e178490ed0b342caacc45 Binary files /dev/null and b/.docs/images/deployment.png differ diff --git a/.docs/images/groups-roles.png b/.docs/images/groups-roles.png new file mode 100644 index 0000000000000000000000000000000000000000..8762013cda252dd93e4278df9f5e3994c4d6a8cb Binary files /dev/null and b/.docs/images/groups-roles.png differ diff --git a/.docs/images/identifier-doi.png b/.docs/images/identifier-doi.png new file mode 100644 index 0000000000000000000000000000000000000000..114f42c224a95651fbd7216b5d8c3d5e0a826898 Binary files /dev/null and b/.docs/images/identifier-doi.png differ diff --git a/.docs/images/illustration.jpg b/.docs/images/illustration.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5596c0087ae3fa5820360a6274b63afaa44c4e87 Binary files /dev/null and b/.docs/images/illustration.jpg differ diff --git a/.docs/images/signet.png b/.docs/images/signet.png new file mode 100644 index 0000000000000000000000000000000000000000..08990d0b527dddbc1339fae08c9e0a4051748903 Binary files /dev/null and b/.docs/images/signet.png differ diff --git a/.docs/images/signet_black.png b/.docs/images/signet_black.png new file mode 100644 index 0000000000000000000000000000000000000000..7dbb087a3420da8535f2542c76f76a3916beb961 Binary files /dev/null and b/.docs/images/signet_black.png differ diff --git a/.docs/images/signet_white.png b/.docs/images/signet_white.png new file mode 100644 index 0000000000000000000000000000000000000000..4a154120f6a7c172168096ad25da80711dc9cf8b Binary files /dev/null and b/.docs/images/signet_white.png differ diff --git a/.docs/index.md b/.docs/index.md new file mode 100644 index 0000000000000000000000000000000000000000..f3c3db46fe0b0fe30904060a1beb080d9147e733 --- /dev/null +++ b/.docs/index.md @@ -0,0 +1,44 @@ +--- +title: Home +author: Martin Weise +hide: +- navigation +--- + +# DBRepo: A Database Repository to Support Research + +## Problem Statement + +Digital repositories see themselves more frequently encountered with the problem of making databases accessible in their +collection. Challenges revolve around organizing, searching and retrieving content stored within databases and +constitute a major technical burden as their internal representation greatly differs from static documents most digital +repositories are designed for. + +[Get Started](/infrastructures/dbrepo/1.3/get-started){ .action-button .md-button .md-button--primary } +[Learn More](/infrastructures/dbrepo/system){ .action-button .md-button .md-button--secondary } + +## Application Areas + +We present a database repository system that allows researchers to ingest data into a central, versioned repository +through common interfaces, provides efficient access to arbitrary subsets of data even when the underlying data store is +evolving, allows reproducing of query results and supports findable-, accessible-, interoperable- and reusable data. + +## Releases + +| Release | Links | Status | +|---------|---------------------------------------------------------------------------------------------------------------------------------------------|------------------| +| 1.3 | [Docs](/infrastructures/dbrepo/1.3/) │ [Source](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tree/master) | Release Candidate | +| latest | [Docs](/infrastructures/dbrepo/latest/) │ [Source](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tree/dev) | Developer Preview | + +Non-maintained releases: + +| Release | Links | Status | +|---------|-----------------------------------------------------------------------------------------------------------|--------| +| 1.2 | [Source](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases/v1.1.1-alpha) | EOL | +| 1.1 | [Source](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags/v1.1.0-alpha) | EOL | + +## More Information + +- Demonstration instance [https://dbrepo1.ec.tuwien.ac.at](https://dbrepo1.ec.tuwien.ac.at) +- Sandbox instance [https://dbrepo2.ec.tuwien.ac.at](https://dbrepo2.ec.tuwien.ac.at) +- System description [https://doi.org/10.2218/ijdc.v17i1.825](https://doi.org/10.2218/ijdc.v17i1.825) diff --git a/.docs/overrides/main.html b/.docs/overrides/main.html new file mode 100644 index 0000000000000000000000000000000000000000..f822d1d94f61ac53ebe86891337968c68d330e02 --- /dev/null +++ b/.docs/overrides/main.html @@ -0,0 +1,24 @@ +{% extends "base.html" %} + +{% block announce %} +<label for="version">Version</label> +<select style="margin-left:8px;" id="version" name="version" onchange="switchVersion(this.options[this.selectedIndex].value)"> + <option value="latest">latest</option> + <option value="1.3">1.3</option> +</select> +<script> + function getVersion() { + const segments = location.pathname.split('/') + if (segments.length === 5) { + return segments[3] + } else { + return '1.3' + } + } + function switchVersion(value) { + if (!value) { return } + this.location.href = location.protocol + '//' + location.host + '/infrastructures/dbrepo/' + value + '/' + } + document.getElementById("version").value = getVersion() +</script> +{% endblock %} diff --git a/.docs/publications.md b/.docs/publications.md new file mode 100644 index 0000000000000000000000000000000000000000..6cbac0fd445769866b0ff098542af32dbbcaa527 --- /dev/null +++ b/.docs/publications.md @@ -0,0 +1,40 @@ +--- +author: Martin Weise +hide: +- navigation +--- + +# Publications + +## Refereed + +##### 2022 + +1. Ekaputra, F. E., Weise, M., Flicker, K., Salleh, M. R., Rahman, N. A., Miksa, T., & Rauber, A. (2022). Towards A + Data Repository for Educational Factories. *Proceedings of the 8th International Conference on Data and Software + Engineering*, pp. 149-154. DOI: [10.1109/ICoDSE56892.2022.9971958](https://doi.org/10.1109/ICoDSE56892.2022.9971958). + +2. Weise, M., Staudinger, M., Michlits, C., Gergely, E., Stytsenko, K., Ganguly, R., & Rauber, A. (2022). + DBRepo: a Semantic Digital Repository for Relational Databases. *International Journal of Digital Curation*, + 17(1), 11. DOI: [10.2218/ijdc.v17i1.825](https://doi.org/10.2218/ijdc.v17i1.825) + +##### 2021 + +1. Weise, M., Michlits, C., Staudinger, M., Gergely, E., Stytsenko, K., Ganguly, R. and Rauber A., 2021. FDA-DBRepo: A + Data Preservation Repository Supporting FAIR Principles, Data Versioning and Reproducible Queries. *Proceedings of + the 17th International Conference on Digital Preservation*, Beijing, China, p.34. + DOI: [10.17605/OSF.IO/B7NX5](http://doi.org/10.17605/OSF.IO/B7NX5) + +## Other + +1. Weise, M. (2023). A Repository and Compute Environment for Sensitive Data. FAIRness for Closed Data, + at *EMBL Bioimaging and the European Open Science Cloud*, (Heidelberg, Germany). April, 19-20th, 2023. + DOI: [10.34726/3946](https://doi.org/10.34726/3946) + +2. Staudinger, M. (2022). DBRepo: A Repository to Save Research Databases. [Online]. + URL: [https://www.tuwien.at/en/tu-wien/news/news-articles/news/dbrepo](https://www.tuwien.at/en/tu-wien/news/news-articles/news/dbrepo) + accessed 2022-04-12 + +2. Gergely, E. (2021). Better Support for Research: Current Cooperation Projects. [Online]. + URL: [https://zid.univie.ac.at/it-news/artikel/news/cluster-forschungsdaten/](https://zid.univie.ac.at/it-news/artikel/news/cluster-forschungsdaten/) + accessed 2022-04-12 diff --git a/.docs/redirect.html b/.docs/redirect.html new file mode 100644 index 0000000000000000000000000000000000000000..ebe3f2d128c981bf8e1a4fc61c0dfaf9826c1117 --- /dev/null +++ b/.docs/redirect.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Redirect Notice</title> + <meta http-equiv="Refresh" content="0; url='https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.3/'" /> +</head> +<body> +<h1>Redirect Notice</h1> +<p> + This page should automatically open the documentation for version 1.3. In case this page does not load the site is + available at: +</p> +<p> + <a href="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.3/">https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.3/</a> +</p> +</body> +</html> + diff --git a/.docs/requirements.txt b/.docs/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..1df697b8b2fc6e9019545dffdb813e149bbf823f --- /dev/null +++ b/.docs/requirements.txt @@ -0,0 +1,7 @@ +mkdocs==1.4.3 +mkdocs-material==9.1.17 +mkdocs-with-pdf==0.9.3 +mkdocs-material-extensions>=1.0.3 +requests>=2.27.0 +py-dotenv>=0.1 +python-dotenv==1.0.0 diff --git a/.docs/stylesheets/extra.css b/.docs/stylesheets/extra.css new file mode 100644 index 0000000000000000000000000000000000000000..5aaf0f0125875ecdabada48c38e1df2974369d3e --- /dev/null +++ b/.docs/stylesheets/extra.css @@ -0,0 +1,26 @@ +:root { + --md-primary-fg-color: #1976d2; + --md-accent-fg-color: #166abc /* darken 10% */; + --md-primary-fg-color--dark: #135fa9 /* darken 10% */; +} + +.md-main .md-content a:not(.action-button), +.md-main .md-content a:not(.action-button) { + color: var(--md-typeset-color); + border-bottom: 2px solid var(--md-primary-fg-color); +} + +.md-main .md-content a:not(.action-button):focus, +.md-main .md-content a:not(.action-button):hover { + color: var(--md-typeset-color); + border-bottom: 2px solid var(--md-primary-fg-color--dark); +} + +.md-banner { + background-color: var(--md-primary-fg-color--dark); +} + +[data-md-component=announce] .md-banner__inner { + margin-top: 0.2rem; + margin-bottom: 0.2rem; +} diff --git a/.docs/system.md b/.docs/system.md new file mode 100644 index 0000000000000000000000000000000000000000..93e96237eca51da0c16559fad8cf8d58508ebf42 --- /dev/null +++ b/.docs/system.md @@ -0,0 +1,497 @@ +--- +author: Martin Weise +hide: + +- navigation + +--- + +# System + +!!! info "Abstract" + + This is the full system description from a technical/developer view. + +We invite all open-source developers to help us fixing bugs and introducing features to the source code. Get involved by +sending a mail to Prof. Andreas Rauber and Projektass. Martin Weise. + +## Architecture + +The repository is designed as a microservice architecture to ensure scalability and the utilization of various +technologies. The conceptualized microservices operate the basic database operations, data versioning as well as +*findability*, *accessability*, *interoperability* and *reuseability* (FAIR). + +<figure markdown> + +<figcaption>Architecture</figcaption> +</figure> + +## Services + +View the docker images for the documentation of the service. + +### Analyse Service + +!!! debug "Debug Information" + + * Ports: 5000/tcp + * Prometheus: `http://:5000/metrics` + * Swagger UI: `http://:5000/swagger-ui/index.html` <a href="/infrastructures/dbrepo/swagger/analyse" target="_blank">:fontawesome-solid-square-up-right: view online</a> + +It suggests data types for the FAIR Portal when creating a table from a *comma separated values* (CSV) file. It +recommends enumerations for columns and returns e.g. a list of potential primary key candidates. The researcher is able +to confirm these suggestions manually. Moreover, the *Analyze Service* determines basic statistical properties of +numerical columns. + +### Authentication Service + +!!! debug "Debug Information" + + * Ports: 8080/tcp, 8443/tcp + * Admin Console: `http://:8443/` + +Very specific to the deployment of the organization. In our reference implementation we implement a *security assertion +markup language* (SAML) service provider and use our institutional SAML identity provider for obtaining account data +through an encrypted channel. + +From version 1.2 onwards we use Keycloak for authentication and deprecated the previous Spring Boot application. +Consequently, +the authentication will be through Keycloak. + +!!! warning "Unsupported Keycloak features" + + Due to no demand at the time, we currently do not support the following Keycloak features: + + * E-Mail verification + * Temporary passwords + +By default, the Authentication Service comes with a self-signed certificate valid 3 months from build date. For +deployment it is *highly encouraged* to use your own certificate, properly issued by a trusted PKI, e.g. GÉANT. For +local deployments you can use the self-signed certificate. You need to accept the risk in most browsers when visiting +the [admin panel](https://localhost:8443/admin/). + +Sign in with the default credentials (username `fda`, password `fda`) or the one you configured during set-up. Be +default, users are created using the frontend and the sign-up page. But it is also possible to create users from +Keycloak, they will still act as "self-sign-up" created users. Since we do not support all features of Keycloak, leave +out required user actions as they will not be enforced, also the temporary password. + +Each user has attributes associated to them. In case you manually create a user in Keycloak directly, you need to add +them in Users > Add user > Attributes: + +* `theme_dark` (*boolean*, default: false) +* `orcid` (*string*) +* `affiliation` (*string*) + +#### Groups + +The authorization scheme follows a group-based access control (GBAC). Users are organized in three distinct +(non-overlapping) groups: + +1. Researchers (*default*) +2. Developers +3. Data Stewards + +Based on the membership in one of these groups, the user is assigned a set of roles that authorize specific actions. By +default, all users are assigned to the `researchers` group. + +#### Roles + +We organize the roles into default- and escalated composite roles. There are three composite roles, one for each group. +Each of the composite role has a set of other associated composite roles. + +<figure markdown> + +<figcaption>Three groups (Researchers, Developers, Data Stewards) and their composite roles associated.</figcaption> +</figure> + +There is one role for one specific action in the services. For example: the `create-database` role authorizes a user to +create a database in a Docker container. Therefore, +the [`DatabaseEndpoint.java`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/blob/a5bdd1e2169bae6497e2f7eee82dad8b9b059850/fda-database-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java#L78) +endpoint requires a JWT access token with this authority. + +```java +@PostMapping +@PreAuthorize("hasAuthority('create-database')") +public ResponseEntity<DatabaseBriefDto> create(@NotNull Long containerId, + @Valid @RequestBody DatabaseCreateDto createDto, + @NotNull Principal principal) { +... +} +``` + +##### Default Container Handling + +| Name | Description | +|--------------------------|--------------------------------------| +| `create-container` | Can create a container | +| `find-container` | Can find a specific container | +| `list-containers` | Can list all containers | +| `modify-container-state` | Can start and stop the own container | + +##### Default Database Handling + +| Name | Description | +|------------------------------|------------------------------------------------------| +| `check-database-access` | Can check the access to a database of a user | +| `create-database` | Can create a database | +| `create-database-access` | Can give a new access to a database of a user | +| `delete-database-access` | Can delete the access to a database of a user | +| `find-database` | Can find a specific database in a container | +| `list-databases` | Can list all databases in a container | +| `modify-database-visibility` | Can modify the database visibility (public, private) | +| `modify-database-owner` | Can modify the database owner | +| `update-database-access` | Can update the access to a database of a user | + +##### Default Table Handling + +| Name | Description | +|---------------------------------|------------------------------------------------------| +| `create-table` | Can create a table | +| `find-tables` | Can list a specific table in a database | +| `list-tables` | Can list all tables | +| `modify-table-column-semantics` | Can modify the column semantics of a specific column | + +##### Default Query Handling + +| Name | Description | +|---------------------------|-----------------------------------------------| +| `create-database-view` | Can create a view in a database | +| `delete-database-view` | Can delete a view in a database | +| `delete-table-data` | Can delete data in a table | +| `execute-query` | Can execute a query statement | +| `export-query-data` | Can export the data that a query has produced | +| `export-table-data` | Can export the data stored in a table | +| `find-database-view` | Can find a specific database view | +| `find-query` | Can find a specific query in the query store | +| `insert-table-data` | Can insert data into a table | +| `list-database-views` | Can list all database views | +| `list-queries` | Can list all queries in the query store | +| `persist-query` | Can persist a query in the query store | +| `re-execute-query` | Can re-execute a query to reproduce a result | +| `view-database-view-data` | Can view the data produced by a database view | +| `view-table-data` | Can view the data in a table | +| `view-table-history` | Can view the data history of a table | + +##### Default Identifier Handling + +| Name | Description | +|---------------------|---------------------------------------------| +| `create-identifier` | Can create an identifier (subset, database) | +| `find-identifier` | Can find a specific identifier | +| `list-identifier` | Can list all identifiers | + +##### Default User Handling + +| Name | Description | +|---------------------------|-----------------------------------------| +| `modify-user-theme` | Can modify the user theme (light, dark) | +| `modify-user-information` | Can modify the user information | + +##### Default Maintenance Handling + +| Name | Description | +|------------------------------|------------------------------------------| +| `create-maintenance-message` | Can create a maintenance message banner | +| `delete-maintenance-message` | Can delete a maintenance message banner | +| `find-maintenance-message` | Can find a maintenance message banner | +| `list-maintenance-messages` | Can list all maintenance message banners | +| `update-maintenance-message` | Can update a maintenance message banner | + +##### Default Semantics Handling + +| Name | Description | +|---------------------------|-----------------------------------------------------------------| +| `create-semantic-unit` | Can save a previously unknown unit for a table column | +| `create-semantic-concept` | Can save a previously unknown concept for a table column | +| `execute-semantic-query` | Can query remote SPARQL endpoints to get labels and description | +| `table-semantic-analyse` | Can automatically suggest units and concepts for a table | + +##### Escalated User Handling + +| Name | Description | +|-------------|-----------------------------------------------| +| `find-user` | Can list user information for a specific user | + +##### Escalated Container Handling + +| Name | Description | +|----------------------------------|----------------------------------------------| +| `delete-container` | Can delete any container | +| `modify-foreign-container-state` | Can modify any container state (start, stop) | + +##### Escalated Database Handling + +| Name | Description | +|-------------------|------------------------------------------| +| `delete-database` | Can delete any database in any container | + +##### Escalated Table Handling + +| Name | Description | +|----------------|--------------------------------------| +| `delete-table` | Can delete any table in any database | + +##### Escalated Query Handling + +| Name | Description | +|------|-------------| +| / | | + +##### Escalated Identifier Handling + +| Name | Description | +|------------------------------|---------------------------------------------------| +| `create-foreign-identifier` | Can create an identifier to any database or query | +| `delete-identifier` | Can delete any identifier | +| `modify-identifier-metadata` | Can modify any identifier metadata | + +##### Escalated Semantics Handling + +| Name | Description | +|-----------------------------------------|----------------------------------------------| +| `create-ontology` | Can register a new ontology | +| `delete-ontology` | Can unregister an ontology | +| `list-ontologies` | Can list all ontologies | +| `modify-foreign-table-column-semantics` | Can modify any table column concept and unit | +| `update-ontology` | Can update ontology metadata | +| `update-semantic-concept` | Can update own table column concept | +| `update-semantic-unit` | Can update own table column unit | + +#### API + +##### Obtain Access Token + +Access tokens are needed for almost all operations. + +=== "Terminal" + + ``` console + curl -X POST \ + -d "username=foo&password=bar&grant_type=password&client_id=dbrepo-client&scope=openid&client_secret=MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG" \ + http://localhost/api/auth/realms/dbrepo/protocol/openid-connect/token + ``` + +=== "Python" + + ``` py + import requests + + auth = requests.post("http://localhost/api/auth/realms/dbrepo/protocol/openid-connect/token", data={ + "username": "foo", + "password": "bar", + "grant_type": "password", + "client_id": "dbrepo-client", + "scope": "openid", + "client_secret": "MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG" + }) + print(auth.json()["access_token"]) + ``` + +##### Refresh Access Token + +Using the response from above, a new access token can be created via the refresh token provided. + +=== "Terminal" + + ``` console + curl -X POST \ + -d "grant_type=refresh_token&client_id=dbrepo-client&refresh_token=THE_REFRESH_TOKEN&client_secret=MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG" \ + http://localhost/api/auth/realms/dbrepo/protocol/openid-connect/token + ``` + +=== "Python" + + ``` py + import requests + + auth = requests.post("http://localhost/api/auth/realms/dbrepo/protocol/openid-connect/token", data={ + "grant_type": "refresh_token", + "client_id": "dbrepo-client", + "client_secret": "MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG", + "refresh_token": "THE_REFRESH_TOKEN" + }) + print(auth.json()["access_token"]) + ``` + +### Broker Service + +!!! debug "Debug Information" + + * Ports: 5672/tcp, 15672/tcp + * RabbitMQ Management Plugin: `http://:15672` + * RabbitMQ Prometheus Plugin: `http://:15692/metrics` + +It holds exchanges and topics responsible for holding AMQP messages for later consumption. We +use [RabbitMQ](https://www.rabbitmq.com/) in the implementation. The AMQP endpoint listens to port `5672` for +regular declares and offers a management interface at port `15672`. + +The default credentials are: + +* Username: `fda` +* Password: `fda` + +### Container Service + +!!! debug "Debug Information" + + * Ports: 9091/tcp + * Info: `http://:9091/actuator/info` + * Health: `http://:9091/actuator/health` + * Prometheus: `http://:9091/actuator/prometheus` + * Swagger UI: `http://:9091/swagger-ui/index.html` <a href="/infrastructures/dbrepo/swagger/container" target="_blank">:fontawesome-solid-square-up-right: view online</a> + +It is responsible for Docker container lifecycle operations and updating the local copy of the Docker images. + +### Database Service + +!!! debug "Debug Information" + + * Ports: 9092/tcp + * Info: `http://:9092/actuator/info` + * Health: `http://:9092/actuator/health` + * Prometheus: `http://:9092/actuator/prometheus` + * Swagger UI: `http://:9092/swagger-ui/index.html` <a href="/infrastructures/dbrepo/swagger/database" target="_blank">:fontawesome-solid-square-up-right: view online</a> + +It creates the databases inside a Docker container and the Query Store. Currently, we only +support [MariaDB](https://mariadb.org/) images that allow table versioning with low programmatic effort. + +### Gateway Service + +!!! debug "Debug Information" + + * Ports: 9095/tcp + * Info: `http://:9095/actuator/info` + * Health: `http://:9095/actuator/health` + * Prometheus: `http://:9095/actuator/prometheus` + +Provides a single point of access to the *application programming interface* (API) and configures a +standard [NGINX](https://www.nginx.com/) reverse proxy for load balancing, SSL/TLS configuration. + +### Identifier Service + +!!! debug "Debug Information" + + * Ports: 9096/tcp + * Info: `http://:9096/actuator/info` + * Health: `http://:9096/actuator/health` + * Prometheus: `http://:9096/actuator/prometheus` + * Swagger UI: `http://:9096/swagger-ui/index.html` <a href="/infrastructures/dbrepo/swagger/identifier" target="_blank">:fontawesome-solid-square-up-right: view online</a> + +This microservice is responsible for creating and resolving a *persistent identifier* (PID) attached to a query to +obtain the metadata attached to it and allow re-execution of a query. We store both the query and hashes of the query +and result set to allow equality checks of the originally obtained result set and the currently obtained result set. In +the reference implementation we currently only use a numerical id column and plan to integrate *digital object +identifier* (DOI) through our institutional library soon. + +### Metadata Database + +!!! debug "Debug Information" + + * Ports: 3306/tcp, 9100/tcp + * Prometheus: `http://:9100/metrics` + +It is the core component of the project. It is a relational database that contains metadata about all researcher +databases +created in the database repository like column names, check expressions, value enumerations or key/value constraints and +relevant data for citing data sets. Additionally, the concept, e.g. URI of units of measurements of numerical columns is +stored in the Metadata Database in order to provide semantic knowledge context. We use MariaDB for its rich capabilities +in the reference implementation. + +The default credentials are `root:dbrepo` for the database `fda`. Connect to the database via the JDBC connector on +port `3306`. + +### Metadata Service + +!!! debug "Debug Information" + + * Ports: 9099/tcp + * Info: `http://:9099/actuator/info` + * Health: `http://:9099/actuator/health` + * Prometheus: `http://:9099/actuator/prometheus` + * Swagger UI: `http://:9099/swagger-ui/index.html` <a href="/infrastructures/dbrepo/swagger/metadata" target="_blank">:fontawesome-solid-square-up-right: view online</a> + +This service provides an OAI-PMH endpoint for metadata crawler. + +### Query Service + +!!! debug "Debug Information" + + * Ports: 9093/tcp + * Info: `http://:9093/actuator/info` + * Health: `http://:9093/actuator/health` + * Prometheus: `http://:9093/actuator/prometheus` + * Swagger UI: `http://:9093/swagger-ui/index.html` <a href="/infrastructures/dbrepo/swagger/query" target="_blank">:fontawesome-solid-square-up-right: view online</a> + +It provides an interface to insert data into the tables created by the Table Service. It also allows for view-only, +paginated and versioned query execution to the raw data and consumes messages in the message queue from the Broker +Service. + +### Search Database + +!!! debug "Debug Information" + + * Ports: 9200/tcp + * Indexes: `http://:9200/_all` + * Health: `http://:9200/_cluster/health/` + +It processes search requests from the Gateway Service for full-text lookups in the metadata database. We use +[Elasticsearch](https://www.elastic.co/) in the reference implementation. The search database implements Elastic Search +and creates a retrievable index on all databases that is getting updated with each save operation on databases in the +metadata database. + +All requests need to be authenticated, by default the credentials `elastic:elastic` are used. + +### Semantics Service + +!!! debug "Debug Information" + + * Ports: 9097/tcp + * Info: `http://:9097/actuator/info` + * Health: `http://:9097/actuator/health` + * Prometheus: `http://:9097/actuator/prometheus` + * Swagger UI: `http://:9097/swagger-ui/index.html` <a href="/infrastructures/dbrepo/swagger/semantics" target="_blank">:fontawesome-solid-square-up-right: view online</a> + +It is designed to map terms in the domain of units of measurement to controlled vocabulary, modelled in +the [ontology of units of measure](https://github.com/HajoRijgersberg/OM). This service validates researcher provided in +units and provides a *uniform resource identifier* (URI) to the related concept, which will be stored in the system. +Furthermore, there is a method for auto-completing text and listing a description as well as commonly used unit symbols. + +### Table Service + +!!! debug "Debug Information" + + * Ports: 9094/tcp + * Info: `http://:9094/actuator/info` + * Health: `http://:9094/actuator/health` + * Prometheus: `http://:9094/actuator/prometheus` + * Swagger UI: `http://:9094/swagger-ui/index.html` <a href="/infrastructures/dbrepo/swagger/table" target="_blank">:fontawesome-solid-square-up-right: view online</a> + +This microservice handles table operations inside a database that is managed by the Database Service. We +use [Hibernate](https://hibernate.org/orm/) for schema and data ingest operations. + +### UI + +!!! debug "Debug Information" + + * Ports: 3000/tcp, 9100/tcp + * Prometheus: `http://:9100/metrics` + * UI: `http://:3000/` + +It provides a *graphical user interface* (GUI) for a researcher to interact with the database repository's API. + +<figure markdown> + +<figcaption>Architecture of the UI microservice</figcaption> +</figure> + +### User Service + +!!! debug "Debug Information" + + * Ports: 9098/tcp + * Info: `http://:9098/actuator/info` + * Health: `http://:9098/actuator/health` + * Prometheus: `http://:9098/actuator/prometheus` + * Swagger UI: `http://:9098/swagger-ui/index.html` <a href="/infrastructures/dbrepo/swagger/user" target="_blank">:fontawesome-solid-square-up-right: view online</a> + +This microservice handles user information. diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000000000000000000000000000000000000..11f0e4828c10502dc9a58bc6500f319faa879b1c --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,57 @@ +site_name: Database Repository +repo_url: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services +repo_name: fda-services +site_author: Research Unit Data Science, Technische Universität Wien +copyright: CC-BY 4.0 Technische Universität Wien & Universität Wien +nav: + - Home: index.md + - get-started.md + - customization.md + - system.md + - publications.md + - contact.md +extra_css: + - stylesheets/extra.css +theme: + favicon: images/signet_white.png + custom_dir: docs/overrides + logo: images/signet_white.png + font: + text: IBM Plex Serif + code: IBM Plex Mono + features: + - navigation.tabs + - navigation.tabs.sticky + - content.code.annotate + icon: + repo: fontawesome/brands/git-alt + palette: + scheme: default + primary: custom + font: + code: Roboto Mono + toggle: + icon: material/weather-night + name: Switch to light mode + name: material +markdown_extensions: + - attr_list + - md_in_html + - admonition + - pymdownx.details + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + - toc: + permalink: True + - pymdownx.emoji: + emoji_index: !!python/name:materialx.emoji.twemoji + emoji_generator: !!python/name:materialx.emoji.to_svg + options: + custom_icons: + - overrides/.icons +extra: + homepage: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/ + social: + - icon: fontawesome/brands/gitlab + link: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services