openapi: "3.0.1"
info:
  description: "This is a set of APIs that are provided for Domain Data Management Service (DDMS) developers."
  version: "1.0.0"
  title: "DELFI Data Ecosystem Domain Extensions Services"
  termsOfService: "http://osdu.opengroup.org/terms/"
  contact:
    email: "osdu-sre@opengroup.org"
servers:
  - url: https://api.{environment}.csp.opengroup.org/dataecosystem
    variables:
      environment:
        default: p4d
        enum:
          - evd
          - evt
          - p4d

tags:
  - name: "registration"
    description: "APIs for registration"
    externalDocs:
      description: "Find out more"
      url: "https://test.devportal.apigee.io/solutions/dataecosystem/tutorials"

security:
  - Bearer: []

paths:
  "/registration/v1/ddms":
    post:
      tags:
        - "registration"
      summary: "Add a new DDMS to the Data Ecosystem"
      description: "Create a DDMS registration."
      operationId: "postDMS"
      parameters:
        - $ref: "#/components/parameters/correlation-id"
        - $ref: "#/components/parameters/data-partition-id"
      requestBody:
        content:
          application/json:
            schema:
              oneOf:
                - $ref: '#/components/schemas/DMSOpenAPISpec'
                - $ref: '#/components/schemas/DMSBasicSpec'
            example:
              name: logDMS
              description: "This DDMS is used to manage log data."
              contact:
                email: "osdu-sre@opengroup.org"
              servers:
                - url: "https://logstore/v1"
                  spec: "REST"
                  description: "Global logstore deployment"
                  isMultiDataPartition: true

      responses:
        '200':
          description: "Given DDMS has been registered."
          headers:
            "correlation-id":
              $ref: "#/components/headers/correlation-id"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DMSId'
        default:
          description: "Unexpected error"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

    get:
      tags:
        - "registration"
      summary: "List DMSs registered in the Data Ecosystem"
      description: "List DMSs registrations."
      operationId: "listDMS"
      parameters:
        - $ref: "#/components/parameters/correlation-id"
        - $ref: "#/components/parameters/data-partition-id"

      responses:
        '200':
          description: "List of registered DMSs."
          headers:
            "correlation-id":
              $ref: "#/components/headers/correlation-id"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DMSList'
        default:
          description: "Unexpected error"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  "/registration/v1/ddms/{id}":
    get:
      tags:
        - "registration"
      summary: "Get DMSs registered in the Data Ecosystem"
      description: "Get DDMS registration."
      operationId: "getDMS"
      parameters:
        - $ref: "#/components/parameters/correlation-id"
        - $ref: "#/components/parameters/data-partition-id"
        - name: id
          in: path
          required: true
          description: The id of the DDMS to retrieve
          schema:
            type: string
      responses:
        '200':
          description: "Registered DDMS."
          headers:
            "correlation-id":
              $ref: "#/components/headers/correlation-id"
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: '#/components/schemas/DMSOpenAPISpec'
                  - $ref: '#/components/schemas/DMSBasicSpec'
        default:
          description: "Unexpected error"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  "/registration/v1/types":
    get:
      tags:
        - "registration"
      summary: "List types registered in the Data Ecosystem"
      description: "List types registrations."
      operationId: "listTypes"
      parameters:
        - $ref: "#/components/parameters/correlation-id"
        - $ref: "#/components/parameters/data-partition-id"
        - name: dmsId
          in: query
          description: The id of the DDMS to filter the types on
          schema:
            type: string
      responses:
        '200':
          description: "List of registered types."
          headers:
            "correlation-id":
              $ref: "#/components/headers/correlation-id"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TypeList'
        default:
          description: "Unexpected error"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  "/registration/v1/types/{id}":
    get:
      tags:
        - "registration"
      summary: "Get type registered in the Data Ecosystem"
      description: "Get type registration."
      operationId: "getType"
      parameters:
        - $ref: "#/components/parameters/correlation-id"
        - $ref: "#/components/parameters/data-partition-id"
        - name: id
          in: path
          required: true
          description: The id of the type to retrieve
          schema:
            type: string
      responses:
        '200':
          description: "Registered type."
          headers:
            "correlation-id":
              $ref: "#/components/headers/correlation-id"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Type'
        default:
          description: "Unexpected error"
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

components:
  headers:
    correlation-id:
      description: "Shared DELFI correlation id. Same as input one if provided, a new one otherwise."
      required: true
      schema:
        type: string
      examples:
        basic:
          value: "123456789"
  parameters:
    correlation-id:
      name: "correlation-id"
      in: "header"
      description: "Shared DELFI correlation id"
      schema:
        type: string
      examples:
        basic:
          value: "123456789"
    data-partition-id:
      name: "data-partition-id"
      in: "header"
      description: "DELFI data partition id"
      required: true
      schema:
        type: string
      examples:
        osdu:
          value: "opendes"
        customer:
          value: "my-NAM"
    Osdu-Data-Legal:
      name: "Osdu-Data-Legal"
      in: "header"
      description: "Stringified json of legal object associated with this wellbore"
      schema:
        type: string
      examples:
        basic:
          value: "{\"tag\":\"osdu-default\"}"
          summary: "Basic legal information"
        withAncestry: # Distinct name
          value: "{\"tag\":\"osdu-default\",\"ancestry\":{}}"
          summary: "Legal information containing ancestry applicable to derived data"
    Osdu-Data-Acl:
      name: "Osdu-Data-Acl"
      in: "header"
      schema:
        description: "Stringified json of access control list associated with this wellbore"
        type: string
      examples:
        basic:
          value: "[{\"role\":\"viewer\", \"members\":[\"data.default.viewers@my-company-nam.osdu.opengroup.org\"]}]"
          summary: "Basic legal information"


  schemas:
    DMSOpenAPISpec:
      description: "OpenAPI specification for a DDMS. Root level annotation with x-osdu-data-ddms-name and x-osdu-data-isMultiDataPartition is required. x-osdu-data-ddms-name must match the name parameter."
      title: "DMSOpenAPISpec"
      type: object
      properties:
        id:
          type: string
          example: "logDMS"
        name:
          type: string
          example: "logDMS"
        openAPI:
          type: object
          example:
            {}
    DMSBasicSpec:
      description: "Basic registration details for a DDMS."
      title: "DMSBasicSpec"
      type: object
      properties:
        id:
          type: string
          example: "logDMS"
        name:
          type: string
          example: "logDMS"
        description:
          type: string
          example: "This DDMS is used to manage log data."
        contact:
          type: object
          properties:
            email:
              type: string
              example: "osdu-sre@opengroup.org"
        servers:
          type: array
          items:
            properties:
              url:
                type: string
                description: "A URL to the target host."
                example: "https://logstore/v1"
              type:
                type: string
                description: "Type of the endpoints server is providing."
                enum:
                  - REST
                  - gRPC
                example: REST
              description:
                type: string
                description: "An optional string describing the host designated by the URL."
                example: "Global logstore endpoint"
              isMultiDataPartition:
                type: boolean
                description: "Indicating if DDMS is single or multitenant. Set to true if it is multitenant."
                example: false
              apiKey:
                type: string
                description: "An optional apiKey for the DDMS."
                example: "12345678"
            required:
              - url
              - type
              - isMultiDataPartition
    DMSId:
      description: "Id of the registered DDMS"
      properties:
        id:
          type: string
          example: "logDMS1"
    DMSList:
      type: array
      items:
        anyOf:
          - $ref: "#/components/schemas/DMSOpenAPISpec"
          - $ref: "#/components/schemas/DMSBasicSpec"
    Type:
      description: "OpenAPI specification for a DDMS. Root level annotation with x-osdu-data-ddms-name is required and it must match name parameter."
      title: "DMSOpenAPISpec"
      type: object
      properties:
        id:
          type: string
          example: "logDMS:log"
        name:
          type: string
          example: "log"
        server:
          type: string
          example: "https://logstore/v1"
        operations:
          type: object
          properties:
            get:
              type: object
              properties:
                path:
                  type: string
                  example: "/logs/{id}"
                parameters:
                  type: array
                  items:
                    $ref: "#/components/schemas/Parameter"
                  example:
                    - name: "data-partition-id"
                      in: "header"
                    - name: "id"
                      in: "path"


    TypeList:
      type: array
      items:
        $ref: "#/components/schemas/Type"
    Parameter:
      required:
        - name
        - in
      properties:
        name:
          type: string
          example: "id"
        in:
          type: string
          enum:
            - header
            - path
            - query
          example: "path"
    Error:
      required:
        - code
        - message
      properties:
        code:
          type: integer
          format: int32
        message:
          type: string
  securitySchemes:
    # This section configures basic authentication with an API key.
    Bearer:
      type: apiKey
      name: "Authorization"
      in: "header"
    googleIdToken:
      description: "This API uses OAuth2 Google Id Token implicit grant flow."
      type: oauth2
      flows:
        implicit:
          authorizationUrl: ""
          x-google-issuer: "https://accounts.google.com"
          x-google-jwks_uri: "https://www.googleapis.com/oauth2/v3/certs"
          x-google-audiences: "245464679631-ktfdfpl147m1mjpbutl00b3cmffissgq.apps.googleusercontent.com"
          scopes: {}