diff --git a/fc_openapi_20260323_143059.yaml b/fc_openapi_20260323_143059.yaml new file mode 100644 index 0000000..21e1f46 --- /dev/null +++ b/fc_openapi_20260323_143059.yaml @@ -0,0 +1,1632 @@ +openapi: 3.0.1 +security: + - OAuth2Auth: [] +info: + title: Eclipse XFSC Federated Catalogue + description: REST API of the XFSC catalogue + license: + name: Apache 2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + version: 1.0.0 +servers: + - url: "{baseUrl}" + description: Configurable server + variables: + baseUrl: + default: "https://fc-server.dev.simpl-europe.eu" + +components: + responses: + NotFound: + description: The specified resource was not found + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + Unauthorized: + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + Forbidden: + description: >- + Forbidden. The user does not have the permission to execute this + request. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + ServerError: + description: >- + May contain hints how to solve the error or indicate what went wrong at + the server. Must not outline any information about the internal + structure of the server. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + ClientError: + description: >- + May contain hints how to solve the error or indicate what was wrong in + the request. + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + Conflict: + description: HTTP Conflict 409 + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + Unprocessible: + description: HTTP Unprocessible Entity 422 + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + schemas: + Error: + type: object + properties: + code: + type: string + message: + type: string + required: + - code + - message + Statement: + type: object + properties: + statement: + type: string + example: Match (m:Movie) where m.released > 2000 RETURN m + parameters: + $ref: '#/components/schemas/Parameters' + required: + - statement + # discriminator: + # propertyName: type + # mapping: + # as: "#/components/schemas/AnnotatedStatement" + Parameters: + type: object + additionalProperties: + type: object + example: + name: "John" + limit: 10 + offset: 5 + Result: + type: object + additionalProperties: + type: object + QueryLanguage: + type: string + enum: + - OPENCYPHER + - SPARQL + - GRAPHQL + default: OPENCYPHER + AnnotatedStatement: + allOf: + - $ref: '#/components/schemas/Statement' + - type: object + properties: + servers: + type: array + uniqueItems: true + items: + type: string + description: known catalog servers already queried in distributed search scenario + annotations: + type: object + additionalProperties: + type: object + description: additional properties to tune query execution + example: + queryLanguage: SPARQL + timeout: 30 + withTotalCount: false + VerificationResult: + type: object + properties: + verificationTimestamp: + type: string + format : date-time + lifecycleStatus: #!! is not known when verifying external SDs -> Julius: You are supposed to compute the status (active, invalid, etc.) from the available information. That is the result of the validation. Maybe rename to just status + type: string # does the self-description have a lifecycle status in this catalogue? + description: Lifecycle-state an SD would get, if it would be added to the catalogue. + issuer: #!! Is this the participant? -> Julius: Yes, the participant that created the SD + type: string # contains the id of the issuers self-description if available #!! NOT FURTHER SPECIFIED + description: ID of the issues Self-Description, if available. + issuedDateTime: + type: string + format: date-time + validatorDids: + type: array + items: + type: string + description: The dids of validators, having signed parts of the Self-Description + required: + - verificationTimestamp + - lifecycleStatus #!! is not known when verifying external SDs. Remove from required -> Julius: You are supposed to compute the status (active, invalid, etc.) from the available information. That is the result of the validation. Maybe rename to just status + - issuer #!! Comment on issuer: if available, but still required?? Remove from required -> Julius: required + - issuedDateTime + - validatorDids + Participant: + type: object + properties: + id: + type: string + description: Global ID of the participant + name: + type: string + publicKey: #!! Can this be changed? If it is changed, are all SDs signed by the old key invalid? -> Julius: For the first version you can assume that SD go invalid when the TrustAnchor or participant key change + type: string + selfDescription: + type: string + User: + type: object + properties: + participantId: + type: string + description: Global ID of the associated participant + example: ExampleCompany + firstName: + type: string + example: John + lastName: + type: string + example: Doe + email: + type: string + roleIds: + type: array + items: + $ref: '#/components/schemas/Role' + required: + - participantId + - firstName + - lastName + - email + UserProfile: + allOf: + - $ref: '#/components/schemas/User' + - type: object + properties: + id: + type: string + description: Internal catalogue user id + example: ExampleCompany-John-Doe + username: + type: string + example: John Doe + required: + - id + - username + Role: #!! Changed Role from an object with a single String property to simply a String + type: string + example: Ro-MU-CA + Session: + type: object + properties: + userId: + type: string + creationDatetime: + type: string + format: date-time + status: #!! What is a status? + type: string + # seed: #!! We must have a seed to do pagination, user must be able to set it? -> Julius: ok + # type: string + roleIds: + type: array + items: + $ref: '#/components/schemas/Role' + SelfDescription: + type: object + properties: + sdHash: + type: string + id: #!! Added id / credentialSubject + type: string + status: + $ref: '#/components/schemas/SelfDescriptionStatus' + issuer: + type: string + validatorDids: + description: >- + The credentialSubjects of the parties that validated (parts of) the + Self-Description + type: array + items: + type: string + uploadDatetime: + type: string + format: date-time + example: '2022-03-01T13:00:00Z' + description: The time stamp (ISO8601) when the SD was uploaded. + statusDatetime: + type: string + format: date-time + example: '2022-05-11T15:30:00Z' + description: >- + The last time stamp (ISO8601) the status changed (for this + Catalogue) + SelfDescriptionStatus: + type: string + enum: + - active + - eol + - deprecated + - revoked + SelfDescriptionResult: + type: object + properties: + meta: + $ref: '#/components/schemas/SelfDescription' + content: + type: string + OntologySchema: + type: object + properties: + ontologies: + description: 'SchemaIds of ontologies, defining the terms of a schema' + type: array + items: + type: string + example: schemaId + shapes: + description: 'SchemaIds of shapes (SHACL Shapes Constraint Language) used to validate instances against the schema.' + type: array + items: + type: string + example: schemaId + vocabularies: + description: 'SchemaIds of controlled vocabularies used in the schema' + type: array + items: + type: string + example: schemaId + ResultPage: + type: object + properties: + totalCount: + type: integer + SelfDescriptions: + allOf: + - $ref: '#/components/schemas/ResultPage' + - type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/SelfDescriptionResult' + Participants: + allOf: + - $ref: '#/components/schemas/ResultPage' + - type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/Participant' + UserProfiles: + allOf: + - $ref: '#/components/schemas/ResultPage' + - type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/UserProfile' + Results: + allOf: + - $ref: '#/components/schemas/ResultPage' + - type: object + properties: + items: + type: array + items: + $ref: '#/components/schemas/Result' + + parameters: + OffsetParam: + name: offset + in: query + schema: + type: integer + minimum: 0 + default: 0 + required: false + description: The number of items to skip before starting to collect the result set. + LimitParam: + in: query + name: limit + schema: + type: integer + minimum: 1 + maximum: 1000 + default: 100 + required: false + description: The number of items to return. + OrderByParam: + in: query + name: orderBy + schema: + type: string + required: false + description: Results will be sorted by this field. + AscendingParam: + in: query + name: ascending + schema: + type: boolean + default: true + required: false + description: Ascending/Descending ordering. + StatusParam: + in: query + name: statuses + schema: + type: array + items: + $ref: '#/components/schemas/SelfDescriptionStatus' + explode: false + required: false + description: SelfDescription statuses + securitySchemes: + jwt: + type: http + scheme: bearer + bearerFormat: JWT +tags: + - name: SelfDescriptions + description: >- + Retrieving Self-Descriptions from the Catalogue. All Self-Descriptions are + JSON-LD files. They are referenced by their sha256 hash. Catalogues + synchronize by downloading changesets (lists of hashes) from known other + Catalogues and reading the full Self-Descriptions of entries that are + unknown to them. + externalDocs: + description: Find out more + url: http://gaiax.io + - name: Query + description: Send graph queries to this Catalogue. + - name: Schemas + description: >- + The format of the self-descriptions are defined by schemas in the + catalogue. Here you get information about the latest schema. + - name: Verification + description: The Catalogue provides a verification service for e.g. checking the syntax + - name: Participants + description: Participant Management operations + - name: Users + description: User Management operations + - name: Roles + description: Role Managemet operations + - name: Session + description: Management for auth sessions in the catalogue +paths: + /self-descriptions: + get: + tags: + - SelfDescriptions + summary: Get the list of metadata of Self-Descriptions in the Catalogue + operationId: readSelfDescriptions + parameters: #!! Added filter parameters for all(?) metadata fields + - name: uploadTimerange + in: query + description: >- + Filter for the time range when the Self-Description was uploaded to + the catalogue. The time range has to be specified as start time and + end time as ISO8601 timestamp separated by a `/`. + required: false + example: 2022-03-01T13:00:00Z/2022-05-11T15:30:00Z + schema: + type: string + - name: statusTimerange + in: query + description: >- + Filter for the time range when the status of the Self-Description + was last changed in the catalogue. The time range has to be + specified as start time and end time as ISO8601 timestamp separated + by a `/`. + required: false + example: 2022-03-01T13:00:00Z/2022-05-11T15:30:00Z + schema: + type: string + - name: issuers + in: query + description: >- + Filter for the issuer of the Self-Description. This is the unique ID + of the Participant that has prepared the Self-Description. + required: false + schema: + type: array + items: + type: string + explode: false + - name: validators + in: query + description: >- + Filter for a validator of the Self-Description. This is the unique + ID of the Participant that validated (part of) the Self-Description. + required: false + schema: + type: array + items: + type: string + explode: false + - name: statuses + in: query + description: Filter for the status of the Self-Description. + required: false + schema: + type: array + items: + $ref: '#/components/schemas/SelfDescriptionStatus' + explode: false + - name: ids + in: query + description: Filter for a id/credentialSubject of the Self-Description. + required: false + schema: + type: array + items: + type: string + explode: false + - name: hashes + in: query + description: Filter for a hash of the Self-Description. + required: false + schema: + type: array + items: + type: string + explode: false + - name: providedBy + in: query + description: Filter for Self-Descriptions by provider identifier from the providedBy field. + required: false + schema: + type: array + items: + type: string + explode: false + - name: withMeta + in: query + description: To add Self-Description Metadata to response or not. + required: false + schema: + type: boolean + default: true + - name: withContent + in: query + description: To add Self-Description Content to response or not. + required: false + schema: + type: boolean + default: false + - $ref: '#/components/parameters/OffsetParam' + - $ref: '#/components/parameters/LimitParam' + responses: + '200': + description: List of meta data of available Self-Descriptions. + content: + application/json: + schema: + $ref: '#/components/schemas/SelfDescriptions' + '400': + $ref: '#/components/responses/ClientError' + '401': + $ref: '#/components/responses/Unauthorized' + '500': + $ref: '#/components/responses/ServerError' + post: + tags: + - SelfDescriptions + summary: Add a new Service-Offering SelfDescription to the catalogue + operationId: addSelfDescription + requestBody: + description: The new SelfDescription + content: + application/json: + schema: + type: string + required: true + responses: + '201': + description: Created + headers: + location: + description: URL of the added Self-Description. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/SelfDescription' + '202': + description: The request was accepted but the validation is not finished yet. + headers: + location: + description: The URL of the status page. + schema: + type: string + retry-after: + description: >- + The delay the client have to wait before requesting the status + page. + schema: + type: integer + '400': + $ref: '#/components/responses/ClientError' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '409': + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/ServerError' + + /self-descriptions/service-offering-base-class/{baseClassName}: + put: + parameters: + - name: baseClassName + in: path + description: 'Name of the service Offering base class to set. By default it should be set to: https://w3id.org/gaia-x/core#ServiceOffering' + required: true + schema: + type: string + tags: + - SelfDescriptions + summary: Set base class for Service offering + operationId: updateServiceOfferingBaseClass + responses: + '200': + description: Created + '400': + $ref: '#/components/responses/ClientError' + '401': + $ref: '#/components/responses/Unauthorized' + '500': + $ref: '#/components/responses/ServerError' + + /self-descriptions/resource: + post: + tags: + - SelfDescriptions + summary: Add a new Resource SelfDescription to the catalogue + operationId: addResource + requestBody: + description: The new Resource SelfDescription + content: + application/json: + schema: + type: string + required: true + responses: + '201': + description: Created + headers: + location: + description: URL of the added Self-Description. + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/SelfDescription' + '400': + $ref: '#/components/responses/ClientError' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '409': + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/ServerError' + /self-descriptions/{selfDescriptionId}: + get: + tags: + - SelfDescriptions + summary: >- + Read a Self-Description by its id. This returns the content of the + self-description. + description: Returns a single Self-Description + operationId: readSelfDescriptionById + parameters: + - name: selfDescriptionId + in: path + description: id of the SelfDescription + required: true + schema: + type: string + responses: + '200': + description: The requested SelfDescription + content: + application/json: + schema: + type: string + '400': + $ref: '#/components/responses/ClientError' + '401': + $ref: '#/components/responses/Unauthorized' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + /self-descriptions/{self_description_hash}: + delete: + tags: + - SelfDescriptions + summary: Completely delete a self-description + operationId: deleteSelfDescription + parameters: + - name: self_description_hash + in: path + description: Hash of the SelfDescription + required: true + schema: + type: string + responses: + '200': + description: OK + '400': + $ref: '#/components/responses/ClientError' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + /self-descriptions/{self_description_hash}/revoke: + post: + tags: + - SelfDescriptions + summary: Change the lifecycle state of a SelfDescription to revoked. + operationId: updateSelfDescription + parameters: + - name: self_description_hash + in: path + description: Hash of the SelfDescription + required: true + schema: + type: string + responses: + '200': + description: Revoked + headers: + location: + description: URL of the added SelfDescription + schema: + type: string + content: + application/json: + schema: + $ref: '#/components/schemas/SelfDescription' + '400': + $ref: '#/components/responses/ClientError' + '401': + $ref: '#/components/responses/Unauthorized' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + + /query: #!! Suggestion: rename to query, and allow only a single query. If multiple queries are ever added in the future, add an endpoint queries. -> Julius: ok + get: + tags: + - Query + summary: Retrieve an HTML website to send openCypher queries to the Catalogue + operationId: querywebsite + responses: + '200': + description: HTML document that contains a query field for openCypher queries. + content: + text/html: + schema: + type: string + '400': + $ref: '#/components/responses/ClientError' + '500': + $ref: '#/components/responses/ServerError' + post: + tags: + - Query + summary: Send a query to the Catalogue + operationId: query + parameters: + - in: query + name: queryLanguage + schema: + $ref: '#/components/schemas/QueryLanguage' + required: false + - in: query + name: timeout + schema: + type: integer + default: 5 + required: false + - in: query + name: withTotalCount + schema: + type: boolean + default: true + required: false + requestBody: + description: >- + JSON object to send queries. Use "application/json" for openCypher + queries. A Catalogue may also support the other content types + depending on its supported query languages but only "application/json" + is mandatory. + content: + application/json: + schema: + $ref: '#/components/schemas/Statement' + responses: + '200': + description: successful query + content: + application/json: + schema: + $ref: '#/components/schemas/Results' + '400': ## Malformed Message: The receveived request cannot be processed, either because its syntax is ## incorrect or forbidden query clauses are used. For instance, it is not allowed to manipulate data ## through the query endpoint + $ref: '#/components/responses/ClientError' + '408': ## Query Timeout: the query took longer than the configured timeout + ## interval. The client needs to rewrite the query so it can be + ## processed faster. + $ref: '#/components/responses/ServerError' + '500': + $ref: '#/components/responses/ServerError' + /query/search: + post: + tags: + - Query + summary: Run distributed search query in the Catalogue + operationId: search + requestBody: + description: JSON object containing query with parameters and annotations + content: + application/json: + schema: + $ref: '#/components/schemas/AnnotatedStatement' + responses: + '200': + description: successful query + content: + application/json: + schema: + $ref: '#/components/schemas/Results' + '400': ## Wrong query + $ref: '#/components/responses/ClientError' + '408': ## Query Timeout: + $ref: '#/components/responses/ServerError' + '500': + $ref: '#/components/responses/ServerError' + + /schemas: + get: + tags: + - Schemas + summary: 'Get the full list of ontologies, shapes and vocabularies.' + description: 'The schema identifiers, returned by this endpoint can be used to download the schema files.' + operationId: getSchemas + responses: + '200': + description: 'References to ontologies, shapes and vocabularies.' + content: + application/json: + schema: + $ref: '#/components/schemas/OntologySchema' + '400': + $ref: '#/components/responses/ClientError' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + post: + tags: + - Schemas + summary: 'Add a new Schema to the catalogue.' + description: 'This endpoint accepts either an ontology (OWL file), shape (SHACL file) or controlled vocabulary (SKOS file), which is added to the schemas of the catalogue.' + operationId: addSchema + requestBody: + description: 'The file of the new schema. either an ontology (OWL file), shape (SHACL file) or controlled vocabulary (SKOS file).' + content: + application/rdf+xml: + schema: + type: string + description: 'OWL file describing the ontology of the schema or SKOS file describing the controlled vocabulary.' + application/ld+json: + schema: + type: string + description: 'OWL or SHACL file describing the ontology.' + application/json: + schema: + type: string + description: 'OWL or SHACL file describing the ontology.' + text/turtle: + schema: + type: string + description: 'SHACL file describing the ontology of the schema.' + required: true + responses: + '201': + description: 'Created' + headers: + location: + description: 'URL of the added Schema.' + schema: + type: string + '400': + $ref: '#/components/responses/ClientError' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + /schemas/{schemaId}: + get: + tags: + - Schemas + summary: Get a specific schema. + operationId: getSchema + parameters: + - name: schemaId + in: path + description: 'Identifier of the Schema.' + required: true + schema: + type: string + responses: + '200': + description: 'The schema for the given identifier. Depending on the type of the schema, either an ontology, shape graph or controlled vocabulary is returned.' + content: + application/rdf+xml: + schema: + type: string + description: 'OWL file describing the ontology of the schema or SKOS file describing the controlled vocabulary.' + text/turtle: + schema: + type: string + description: 'SHACL file describing the ontology of the schema.' + '400': + $ref: '#/components/responses/ClientError' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + put: + tags: + - Schemas + summary: 'Replace a schema. This is only allowed for ontologies with the same IRI.' + operationId: updateSchema + parameters: + - name: schemaId + in: path + description: 'Identifier of the Schema.' + required: true + schema: + type: string + requestBody: + description: 'The new ontology (OWL file).' + content: + application/rdf+xml: + schema: + type: string + description: 'OWL file describing the ontology.' + application/ld+json: + schema: + type: string + description: 'OWL or SHACL file describing the ontology.' + application/json: + schema: + type: string + description: 'OWL or SHACL file describing the ontology.' + text/turtle: + schema: + type: string + description: 'SHACL file describing the ontology of the schema.' + required: true + responses: + '200': + description: 'Updated.' + '400': + $ref: '#/components/responses/ClientError' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '409': + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/ServerError' + delete: + tags: + - Schemas + summary: 'Delete a Schema' + operationId: deleteSchema + parameters: + - name: schemaId + in: path + description: 'Identifier of the Schema' + required: true + schema: + type: string + responses: + '200': + description: 'Deleted Schema' + '400': + $ref: '#/components/responses/ClientError' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + /schemas/latest: + get: + tags: + - Schemas + summary: 'Get the latest schema for a given type. If no term is specified, then the composite schema is returned.' + operationId: getLatestSchema + parameters: + - name: type + in: query + description: 'Type of the schema.' + required: true + schema: + type: string + enum: + - ontology + - shape + - vocabulary + - name: term + in: query + description: 'The URI of the term of the requested Self-Description schema e.g. `http://w3id.org/gaia-x/service#ServiceOffering`' + required: false + schema: + type: string + responses: + '200': + description: 'The latest schemas for the given type or term.' + content: + application/rdf+xml: + schema: + type: string + description: 'OWL file describing the ontology of the schema or SKOS file describing the controlled vocabulary.' + text/turtle: + schema: + type: string + description: 'SHACL file describing the ontology of the schema.' + '400': + $ref: '#/components/responses/ClientError' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + /verification: + get: + tags: + - Verification + summary: Show a HTML page to verify (portions of) a signed Self-Description + operationId: verifyPage + responses: + '200': + description: >- + HTML document that contains a query field to verify (portions of) + Self-Descriptions. + content: + text/html: + schema: + type: string + '400': + $ref: '#/components/responses/ClientError' + '500': + $ref: '#/components/responses/ServerError' + post: + tags: + - Verification + summary: >- + Send a JSON-LD document to verify with the information from the + Catalogue + operationId: verify + parameters: + - name: verifySemantics + in: query + description: 'To verify SD semantics or not' + required: false + schema: + type: boolean + default: true + - name: verifySchema + in: query + description: 'To verify SD agains schema or not' + required: false + schema: + type: boolean + default: true + - name: verifyVPSignature + in: query + description: 'To verify VP signature or not' + required: false + schema: + type: boolean + default: true + - name: verifyVCSignature + in: query + description: 'To verify VC signature or not' + required: false + schema: + type: boolean + default: true + requestBody: + description: >- + JSON-LD document to be verified object to send queries. Use + "application/json" for openCypher queries. A Catalogue may also + support the other content types depending on its supported + query languages but only "application/json" is mandatory. + content: + application/json: + schema: + type: string + example: { + "@context": [ + "https://www.w3.org/2018/credentials/v1", + "https://w3id.org/security/suites/jws-2020/v1" + ], + "credentialSubject": { + "@context": { + "gax-validation": "http://w3id.org/gaia-x/validation#", + "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#", + "sh": "http://www.w3.org/ns/shacl#", + "simpl": "http://w3id.org/gaia-x/simpl#", + "skos": "http://www.w3.org/2004/02/skos/core#", + "xsd": "http://www.w3.org/2001/XMLSchema#" + }, + "@id": "did:web:registry.gaia-x.eu:DataOffering:3mwO1pOqDQ_fID9jc9Az1TS5JKIS_oinfKHe_PRG_01345", + "rdf:type": { + "@id": "simpl:DataOffering" + }, + "simpl:billingSchema": { + "rdf:type": { + "@id": "simpl:BillingSchema" + }, + "simpl:billingSchemaDocument": "Billing Schema 1", + "simpl:billingSchemaHashAlg": "SHA-256", + "simpl:billingSchemaHashValue": "7cf87b4138c3d4ca015ba54ccc21c2e879a1eaa60e0979859484550aaa76bded", + "simpl:billingSchemaURL": "https://files.dev.simpl-europe.eu/static/pdf/BillingSchema1.pdf" + }, + "simpl:contractTemplate": { + "rdf:type": { + "@id": "simpl:ContractTemplate" + }, + "simpl:contractTemplateDocument": "Contract Template 1", + "simpl:contractTemplateHashAlg": "SHA-256", + "simpl:contractTemplateHashValue": "27883d9aec35ab16a3934e6581ed1b7f1b16feb75ead991c07ceff2e4a96fe58", + "simpl:contractTemplateURL": "https://files.dev.simpl-europe.eu/static/pdf/ContractTemplate1.pdf" + }, + "simpl:dataProperties": { + "rdf:type": { + "@id": "simpl:DataProperties" + }, + "simpl:format": "test" + }, + "simpl:edcRegistration": { + "simpl:accessPolicyId": "12b5f80d-ec90-43bc-9d7c-ad1a2f5e0d7e", + "simpl:assetId": "2764f7d9-8044-407e-9eb4-d166c5d1eb85", + "simpl:contractDefinitionId": "ff23a62e-26f7-4a0d-b709-09c8ebe22cb2", + "simpl:servicePolicyId": "82c09c5c-eed9-4865-9a9f-6534cc84dd4a" + }, + "simpl:generalServiceProperties": { + "rdf:type": { + "@id": "simpl:GeneralServiceProperties" + }, + "simpl:description": "asset description", + "simpl:inLanguage": "en", + "simpl:name": "specialOne", + "simpl:offeringType": "data", + "simpl:serviceAccessPoint": { + "@type": "xsd:anyURI", + "@value": "https://sd-ui.dev.simpl-europe.eu" + } + }, + "simpl:offeringPrice": { + "rdf:type": { + "@id": "simpl:OfferingPrice" + }, + "simpl:currency": "EUR", + "simpl:license": { + "@type": "xsd:anyURI", + "@value": "https://sd-ui.dev.simpl-europe.eu" + }, + "simpl:price": { + "@type": "xsd:decimal", + "@value": 10000 + }, + "simpl:priceType": "free" + }, + "simpl:providerInformation": { + "rdf:type": { + "@id": "simpl:ProviderInformation" + }, + "simpl:contact": "test@test.com", + "simpl:providedBy": "test", + "simpl:signature": "test" + }, + "simpl:servicePolicy": { + "rdf:type": { + "@id": "simpl:ServicePolicy" + }, + "simpl:access-policy": "{\"profile\":\"http://www.w3.org/ns/odrl/2/odrl.jsonld\",\"target\":\"3mwO1pOqDQ_fID9jc9Az1TS5JKIS_oinfKHe\",\"assigner\":{\"uid\":\"participant_id_0001\",\"role\":\"http://www.w3.org/ns/odrl/2/assigner\"},\"uid\":\"a5bedff0-e3e3-4806-8c83-9a97002fae4e\",\"@context\":\"http://www.w3.org/ns/odrl.jsonld\",\"@type\":\"Set\",\"permission\":[{\"target\":\"3mwO1pOqDQ_fID9jc9Az1TS5JKIS_oinfKHe\",\"assignee\":{\"uid\":\"CONSUMER\",\"role\":\"http://www.w3.org/ns/odrl/2/assignee\"},\"action\":[\"http://simpl.eu/odrl/actions/search\"],\"constraint\":[]}]}", + "simpl:usage-policy": "{\"profile\":\"http://www.w3.org/ns/odrl/2/odrl.jsonld\",\"target\":\"3mwO1pOqDQ_fID9jc9Az1TS5JKIS_oinfKHe\",\"assigner\":{\"uid\":\"participant_id_0001\",\"role\":\"http://www.w3.org/ns/odrl/2/assigner\"},\"uid\":\"47b65a0c-d19d-4350-9225-13208ef649ff\",\"@context\":\"http://www.w3.org/ns/odrl.jsonld\",\"@type\":\"Set\",\"permission\":[{\"target\":\"3mwO1pOqDQ_fID9jc9Az1TS5JKIS_oinfKHe\",\"assignee\":{\"uid\":\"CONSUMER\",\"role\":\"http://www.w3.org/ns/odrl/2/assignee\"},\"action\":[\"http://www.w3.org/ns/odrl/2/use\"],\"constraint\":[{\"leftOperand\":\"http://www.w3.org/ns/odrl/2/deletion\",\"operator\":\"http://www.w3.org/ns/odrl/2/eq\",\"rightOperand\":\"after_use\"}]}]}" + }, + "simpl:slaAgreements": { + "rdf:type": { + "@id": "simpl:SlaAgreements" + }, + "simpl:slaAgreementsDocument": "Sla Agreements 1", + "simpl:slaAgreementsHashAlg": "SHA-256", + "simpl:slaAgreementsHashValue": "a75b83855522208dfb134f559447c8ca5864c6dc1d705c26f9b735ba175e26fe", + "simpl:slaAgreementsURL": "https://files.dev.simpl-europe.eu/static/pdf/SLAAgreement1.pdf" + }, + "simpl:edcConnector": { + "simpl:providerEndpointURL": "https://edc-provider.dev.simpl-europe.eu" + } + }, + "issuanceDate": "2024-11-21T12:24:20.208904119Z", + "issuer": "did:jwk:eyJjcnYiOiJFZDI1NTE5Iiwia2lkIjoiZ2FpYS14LWtleTEiLCJrdHkiOiJPS1AiLCJ4IjoiNmNiMXJwb3RkTDNzbk8wbjZ3bXpRWUJXeFhiUVFRTWFlQUFlNHJMMFRGNCJ9", + "proof": { + "created": "2024-11-21T12:24:20.217892237Z", + "jws": "eyJhbGciOiJVbmRlZmluZWQiLCJiNjQiOmZhbHNlLCJjcml0IjpbImI2NCJdfQ..ASIhxdYXcRXqX2NfWuuxgPtOmGCQ19gzpTlRK1h-mNyEiq3pXKkE__8esoQj-bi_gphLNlxhIebUlTo5eIgCCA", + "proofPurpose": "assertionMethod", + "type": "JsonWebSignature2020", + "verificationMethod": "did:jwk:eyJjcnYiOiJFZDI1NTE5Iiwia2lkIjoiZ2FpYS14LWtleTEiLCJrdHkiOiJPS1AiLCJ4IjoiNmNiMXJwb3RkTDNzbk8wbjZ3bXpRWUJXeFhiUVFRTWFlQUFlNHJMMFRGNCJ9#0" + }, + "type": "VerifiableCredential" + } + responses: + '200': + description: Verification result + content: + application/json: + schema: + $ref: '#/components/schemas/VerificationResult' + '400': + $ref: '#/components/responses/ClientError' + '422': + $ref: '#/components/responses/Unprocessible' + '500': + $ref: '#/components/responses/ServerError' + /participants: + get: #!! Needs pagination; Should this really include the entire Participant SD, or only the hash? + tags: + - Participants + summary: Get the registered participants + operationId: getParticipants + parameters: #!! Added pagination parameters + - $ref: '#/components/parameters/OffsetParam' + - $ref: '#/components/parameters/LimitParam' + # - $ref: '#/components/parameters/OrderByParam' + # - $ref: '#/components/parameters/AscendingParam' + responses: + '200': + description: List of registered participants + content: + application/json: + schema: + $ref: '#/components/schemas/Participants' + '400': + $ref: '#/components/responses/ClientError' + '500': + $ref: '#/components/responses/ServerError' + post: + tags: + - Participants + summary: Register a new participant in the catalogue + operationId: addParticipant + requestBody: + description: Participant Self-Description + required: true + content: + application/json: + schema: + type: string + responses: #!! Should contain a Location header with the link to the new participant? + '201': + description: Created Participant + content: + application/json: + schema: + $ref: '#/components/schemas/Participant' + headers: #!! Added location header with participant URL + location: + description: 'URL of the added Participant' + schema: + type: string + '400': + $ref: '#/components/responses/ClientError' + '403': + $ref: '#/components/responses/Forbidden' + '500': + $ref: '#/components/responses/ServerError' + /participants/{participantId}: + get: + tags: + - Participants + summary: Get the registered participant + operationId: getParticipant + parameters: + - in: path + name: participantId + required: true + description: The participantId to get. + schema: + type: string + responses: + '200': + description: The requested participant + content: + application/json: + schema: + $ref: '#/components/schemas/Participant' + '400': + $ref: '#/components/responses/ClientError' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + put: + tags: + - Participants + summary: Update a participant in the catalogue + operationId: updateParticipant + parameters: #!! fehlt da nicht irgendwie das update? + - in: path + name: participantId + required: true + description: The participant to update. + schema: + type: string + requestBody: #!! Added participant as request body + description: Participant Self-Description + required: true + content: + application/json: + schema: + type: string + responses: + '200': + description: Updated Participant + content: + application/json: + schema: + $ref: '#/components/schemas/Participant' + '400': + $ref: '#/components/responses/ClientError' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + delete: + tags: + - Participants + summary: Delete a participant in the catalogue + operationId: deleteParticipant + parameters: + - in: path + name: participantId + required: true + description: The participant to delete. + schema: + type: string + responses: + '200': + description: Deleted Participant + content: + application/json: + schema: + $ref: '#/components/schemas/Participant' + '400': + $ref: '#/components/responses/ClientError' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + /participants/{participantId}/users: + get: + tags: + - Participants + summary: Get all users of the registered participant + operationId: getParticipantUsers + parameters: + - in: path + name: participantId + required: true + description: The participant Id + schema: + type: string + #!! Added pagination parameters + - $ref: '#/components/parameters/OffsetParam' + - $ref: '#/components/parameters/LimitParam' + responses: + '200': + description: Users of the participant + content: + application/json: + schema: + $ref: '#/components/schemas/UserProfiles' + '400': + $ref: '#/components/responses/ClientError' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + /users: #!! This may conflict with an SSO setup using an external auth provider + get: #!! potentially long list needs pagination + tags: + - Users + summary: List the registered users + operationId: getUsers + parameters: #!! Added pagination parameters + - $ref: '#/components/parameters/OffsetParam' + - $ref: '#/components/parameters/LimitParam' + # - $ref: '#/components/parameters/OrderByParam' + # - $ref: '#/components/parameters/AscendingParam' + responses: + '200': + description: List of usernames + content: + application/json: + schema: + $ref: '#/components/schemas/UserProfiles' + '400': + $ref: '#/components/responses/ClientError' + '500': + $ref: '#/components/responses/ServerError' + post: + tags: + - Users + summary: Register a new user to the associated participant in the catalogue + operationId: addUser + requestBody: + description: User profile + content: + application/json: + schema: + $ref: '#/components/schemas/User' + responses: + '201': + description: Created User profile + content: + application/json: + schema: + $ref: '#/components/schemas/UserProfile' + headers: #!! Added location header with user URL + location: + description: 'URL of the added User' + schema: + type: string + '400': + $ref: '#/components/responses/ClientError' + '403': + $ref: '#/components/responses/Forbidden' + '409': + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/ServerError' + /users/{userId}: + get: + tags: + - Users + summary: Get the user profile + operationId: getUser + parameters: + - name: userId + in: path + required: true + schema: + type: string + responses: + '200': + description: User profile + content: + application/json: + schema: + $ref: '#/components/schemas/UserProfile' + '400': + $ref: '#/components/responses/ClientError' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + put: + tags: + - Users + summary: Update the user profile + operationId: updateUser + parameters: + - name: userId + in: path + required: true + schema: + type: string + requestBody: + description: 'Updated user data, Participant ID will be ignored if provided.' + required: true + content: #!! Participant ID should be ignored if provided + application/json: + schema: + $ref: '#/components/schemas/User' + responses: + '200': + description: Updated user profile + content: + application/json: + schema: + $ref: '#/components/schemas/UserProfile' + '400': + $ref: '#/components/responses/ClientError' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + delete: + tags: + - Users + summary: Delete a user + operationId: deleteUser + parameters: + - name: userId + in: path + required: true + schema: + type: string + responses: + '200': + description: Deleted user profile + content: + application/json: + schema: + $ref: '#/components/schemas/UserProfile' + '400': + $ref: '#/components/responses/ClientError' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '409': + $ref: '#/components/responses/Conflict' + '500': + $ref: '#/components/responses/ServerError' + /users/{userId}/roles: + get: + tags: + - Users + summary: Get roles of the user + operationId: getUserRoles + parameters: + - name: userId + in: path + required: true + schema: + type: string + responses: + '200': + description: User roles + content: + application/json: + schema: + type: array #!! Changed to array, since roles implies plural + items: + $ref: '#/components/schemas/Role' + '400': + $ref: '#/components/responses/ClientError' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + put: + tags: + - Users + summary: Update roles of the user + operationId: updateUserRoles + parameters: + - name: userId + in: path + required: true + schema: + type: string + requestBody: + description: List of roles which should be assigned to the user + content: + application/json: + schema: + type: array #!! Changed to array, since roles implies plural + items: + $ref: '#/components/schemas/Role' + responses: + '200': + description: All assigned roles of the user + content: + application/json: + schema: + $ref: '#/components/schemas/UserProfile' + '400': + $ref: '#/components/responses/ClientError' + '403': + $ref: '#/components/responses/Forbidden' + '404': + $ref: '#/components/responses/NotFound' + '500': + $ref: '#/components/responses/ServerError' + /roles: + get: + tags: + - Roles + summary: Get all registered roles in the catalogue + operationId: getAllRoles + responses: + '200': + description: All roles + content: + application/json: + schema: + type: array #!! Changed to array, since roles implies plural + items: + $ref: '#/components/schemas/Role' + '400': + $ref: '#/components/responses/ClientError' + '500': + $ref: '#/components/responses/ServerError' + + /session: #!! Changed to singular, since a user has only 1 session, and the get response is only one session. + get: + tags: + - Session + operationId: getCurrentSession + responses: + '200': + description: Get information on the current session + content: + application/json: + schema: + $ref: '#/components/schemas/Session' + '500': + $ref: '#/components/responses/ServerError' + delete: #!! This should be an implementation detail, logout is SSO-system dependent + tags: + - Session + operationId: logoutCurrentSession + responses: + '200': + description: The current session was closed + '500': + $ref: '#/components/responses/ServerError'