openapi: 3.0.0
info:
  version: 1.0.0-alpha
  title: Antragsmanagement API für Antragsverfahren und Berichtspflichten
  description: Übergreifende API Schnittstelle des Zustelldienstes.
  contact:
    name: FITKO
    url: 'https://www.fitko.de/'
  license:
    url: 'https://creativecommons.org/licenses/by-sa/4.0/'
    name: Creative Commons Attribution Share Alike 4.0 (CC BY-SA 4.0)
  termsOfService: 'https://www.fitko.de/'
servers:
  - url: 'https://sender-test.fiep-poc.de/beta8'
    description: Testsystem
tags:
  - name: Destination Management
  - name: Application Transfer
  - name: Application Retrieval
  - name: Technical
paths:
  /destinations:
    get:
      operationId: get-my-destinations
      summary: Selbst angelegte Zustellpunkte auflisten
      description: Mit diesem Request können alle selbst angelegten Zustellpunkte sowie deren Konfigurationen abgerufen werden.
      tags:
        - Destination Management
      security:
        - OAuth20:
            - 'destination:subscribe'
            - 'destination:manage'
      responses:
        '200':
          description: OK
          headers:
            Cache-Control:
              required: true
              description: Zustellpunkte dürfen aufgrund ihrer Schlüssel nicht gecached werden
              schema:
                type: string
                default: no-cache
                enum:
                  - no-cache
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DestinationList'
              examples:
                example-1:
                  $ref: '#/components/examples/DestinationList'
        '400':
          description: Bad Request
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
    post:
      operationId: create-destination
      summary: Zustellpunkt anlegen
      description: Erstellung eines neuen Zustellpunktes mit Konfiguration zum Empfang von Anträgen
      tags:
        - Destination Management
      security:
        - OAuth20:
            - 'destination:manage'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateDestination'
            examples:
              example-1:
                $ref: '#/components/examples/CreateDestination'
      responses:
        '201':
          description: Created
          headers:
            Cache-Control:
              $ref: '#/paths/~1destinations/get/responses/200/headers/Cache-Control'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Destination'
              examples:
                example-1:
                  $ref: '#/components/examples/Destination'
        '400':
          description: Bad Request
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
      callbacks:
        ApplicationSubmitted:
          '{$request.body#/callback}':
            post:
              requestBody:
                required: true
                content:
                  application/json:
                    schema:
                      $ref: '#/components/schemas/ListOfApplicationIds'
              responses:
                '202':
                  description: Accepted
  '/destinations/{destinationId}':
    parameters:
      - $ref: '#/components/parameters/destinationId'
    get:
      operationId: get-destination-info
      summary: Zustellpunkt abfragen
      description: Ruft die öffentlich zugänglichen Informationen über einen Zustellpunkt ab.
      tags:
        - Destination Management
      security:
        - OAuth20:
            - 'destination:subscribe'
            - 'destination:send'
      responses:
        '200':
          description: OK
          headers:
            Cache-Control:
              $ref: '#/paths/~1destinations/get/responses/200/headers/Cache-Control'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Destination'
              examples:
                example-1:
                  $ref: '#/components/examples/Destination'
        '401':
          description: Unauthorized
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
    put:
      operationId: update-destination
      summary: Zustellpunkt aktualisieren
      tags:
        - Destination Management
      security:
        - OAuth20:
            - 'destination:manage'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateDestination'
            examples:
              example-1:
                value:
                  contactInformation:
                    legalName: Max
                    address: 'Musterstr. 31, 10000 Berlin, Deutschland'
                    phone: '+49170123456789'
                    email: max@mustermann.not
                    unit: Department XYZ
                  schemas:
                    - schemaURI: 'urn:fitko:schema-x'
                  callback: 'http://127.0.0.1:4010/voluptas'
                  encryptionKid: my-key-id-0xfff
                  publicKeys:
                    keys:
                      - kty: RSA
                        kid: my-key-id-0xfff
      responses:
        '200':
          description: OK
          headers:
            Cache-Control:
              $ref: '#/paths/~1destinations/get/responses/200/headers/Cache-Control'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Destination'
              examples:
                example-1:
                  $ref: '#/components/examples/Destination'
        '400':
          description: Bad Request
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
    delete:
      operationId: delete-destination
      summary: Zustellpunkt löschen
      description: Löscht einen Zustellpunkt.
      tags:
        - Destination Management
      security:
        - OAuth20:
            - 'destination:manage'
      responses:
        '200':
          description: Zustellpunkt erfolgreich gelöscht.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmptyBody'
        '400':
          description: Bad Request
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
  /applications:
    post:
      operationId: create-application
      summary: Antrag anlegen
      description: Endpunkt zum Erstellen eines Antrags
      tags:
        - Application Transfer
      security:
        - OAuth20:
            - 'destination:send'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateApplication'
            examples:
              example-1:
                $ref: '#/components/examples/CreateApplication'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApplicationCreated'
              examples:
                example-1:
                  $ref: '#/components/examples/ApplicationCreated'
        '400':
          description: Bad Request
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '413':
          description: Request Entity Too Large
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
  '/applications/{applicationId}':
    parameters:
      - $ref: '#/components/parameters/applicationId'
    get:
      operationId: get-application
      summary: Antrag abrufen
      tags:
        - Application Retrieval
      security:
        - OAuth20:
            - 'destination:manage'
            - 'destination:subscribe'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Application'
              examples:
                example-1:
                  $ref: '#/components/examples/Application'
        '400':
          description: Bad Request
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
    post:
      operationId: submit-application
      summary: Antrag einreichen
      tags:
        - Application Transfer
      security:
        - OAuth20:
            - 'destination:send'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubmitApplication'
      responses:
        '202':
          description: Accepted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Application'
              examples:
                example-1:
                  $ref: '#/components/examples/Application'
        '400':
          description: Bad Request
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '413':
          description: Request Entity Too Large
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '415':
          description: Unsupported Media Type (wrong content type sent)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: Gesamtantrag unvollständig. Angekündigte Anlagen noch nicht hochgeladen.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
    put:
      operationId: acknowledge-application
      summary: Abholung des Antrags bestätigen
      tags:
        - Application Retrieval
      security:
        - OAuth20:
            - 'destination:subscribe'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EmptyBody'
            examples:
              example-1:
                $ref: '#/components/examples/EmptyBody'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmptyBody'
              examples:
                example-1:
                  $ref: '#/components/examples/EmptyBody'
        '400':
          description: Bad Request
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
  '/applications/{applicationId}/attachments/{attachmentId}':
    parameters:
      - $ref: '#/components/parameters/applicationId'
      - $ref: '#/components/parameters/attachmentId'
    get:
      operationId: get-application-attachment
      summary: Anhang abrufen
      description: Ruft einen Anhang des Antrags ab.
      tags:
        - Application Retrieval
      security:
        - OAuth20:
            - 'destination:manage'
            - 'destination:subscribe'
      responses:
        '200':
          description: OK
          content:
            application/jose:
              schema:
                $ref: '#/components/schemas/Attachment'
              examples:
                example-1:
                  $ref: '#/components/examples/EncryptedMessage'
        '400':
          description: Bad Request
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Not Found
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
    put:
      operationId: add-application-attachment
      summary: Anhang hinzufügen
      description: Upload des in announcedContentStructure angekündigten Anhangs als JSON Web Encryption unter der mitgeteilten UUID.
      tags:
        - Application Transfer
      security:
        - OAuth20:
            - 'destination:send'
      requestBody:
        required: true
        content:
          application/jose:
            schema:
              $ref: '#/components/schemas/CreateAttachment'
            examples:
              example-1:
                $ref: '#/components/examples/EncryptedMessage'
      responses:
        '201':
          description: Anhang erfolgreich hinzugefügt
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EmptyBody'
        '400':
          description: Bad Request
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '413':
          description: Request Entity Too Large
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
        '415':
          description: Unsupported Media Type (wrong content type sent)
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Error'
  /info:
    get:
      operationId: get-info
      summary: Rufe technische Serviceinformationen ab
      description: Für Debugging oder Informationszwecke angebotener Endpunkt
      tags:
        - Technical
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Info'
              examples:
                example-1:
                  $ref: '#/components/examples/Info'
  /status:
    get:
      operationId: get-status
      summary: Rufe Servicestatus ab
      description: Nützlich für Monitoring und Debugging
      tags:
        - Technical
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Status'
              example:
                status: UP
components:
  securitySchemes:
    OAuth20:
      description: 'Authentifizierungsmethode, um den Zugriff nach RFC8725 zu autorisieren'
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: 'https://sender-test-token.fiep-poc.de/auth/realms/test/protocol/openid-connect/token'
          scopes:
            'destination:send': Erlaubt das Versenden von Anträgen an Zustellpunkte
            'destination:manage': Erlaubt die Verwaltung der eigenen Zustellpunkte
            'destination:susbcribe': Erlaubt die Abholung von Anträgen und Dokumenten (Anhängen)
  parameters:
    applicationId:
      name: applicationId
      in: path
      required: true
      schema:
        type: string
        format: uuid
        minLength: 32
        maxLength: 36
      description: Die UUID des Antrags
    destinationId:
      name: destinationId
      in: path
      required: true
      schema:
        type: string
        format: uuid
        minLength: 32
        maxLength: 36
      description: Die UUID des Zustellpunktes
    attachmentId:
      name: attachmentId
      in: path
      required: true
      schema:
        type: string
        format: uuid
        minLength: 32
        maxLength: 36
      description: 'Die UUID des Anhangs. Wird vom Client erstellt, um auf diese z.B. in den Antragsfachdaten zu referenzieren.'
  schemas:
    AnnouncedContentStructure:
      type: object
      required:
        - data
        - attachments
      properties:
        data:
          type: boolean
        attachments:
          type: array
          minItems: 0
          items:
            type: string
            format: uuid
            minLength: 32
            maxLength: 36
    Application:
      title: Antrag
      description: Die Repräsentation eines Antrags
      type: object
      required:
        - destinationId
        - applicationId
        - attachments
        - currentStatus
      properties:
        destinationId:
          type: string
          format: uuid
          minLength: 32
          maxLength: 36
        applicationId:
          description: ID des Antrags
          type: string
          format: uuid
          minLength: 32
          maxLength: 36
        attachments:
          type: array
          items:
            type: string
            format: uuid
            minLength: 32
            maxLength: 36
        currentStatus:
          $ref: '#/components/schemas/ApplicationState'
        encryptedMetadata:
          title: JWE Encrypted Message
          description: 'Content that is encrypted with JSON Web Encryption Compact Serialization, RFC 7516'
          type: string
          pattern: '^[a-zA-Z0-9-_=.]+$'
        encryptedData:
          title: JWE Encrypted Message
          description: 'Content that is encrypted with JSON Web Encryption Compact Serialization, RFC 7516'
          type: string
          pattern: '^[a-zA-Z0-9-_=.]+$'
        statusHistory:
          type: array
          items:
            $ref: '#/components/schemas/StateTransition'
        announcedContentStructure:
          $ref: '#/components/schemas/AnnouncedContentStructure'
    ApplicationCreated:
      title: Erstellter Antrag
      description: Antwort bei Erzeugen eines Antrags für einen Zustellpunkt.
      type: object
      required:
        - applicationId
        - destinationId
      properties:
        destinationId:
          description: ID der Destination
          type: string
          format: uuid
          minLength: 32
          maxLength: 36
        applicationId:
          description: ID des Antrags
          type: string
          format: uuid
          minLength: 32
          maxLength: 36
    ApplicationSchema:
      title: Fachdatenschema
      description: 'Referenz auf ein Schema, das die Struktur der Fachdaten eines Antrags beschreibt.'
      type: object
      required:
        - schemaURI
      additionalProperties: false
      properties:
        schemaURI:
          type: string
          format: uri
          description: 'URI (URL oder URN) des Fachdaten-Schemas. Wird hier eine URL verwendet, sollte das Schema unter der angegebenen URL abrufbar sein. Eine Verfügbarkeit des Schemas unter der angegebenen URL darf jedoch nicht vorausgesetzt werden.'
        mimeType:
          type: string
          description: Mimetype (z.B. application/json oder application/xml) des referenzierten Schemas (z.B. XSD- oder JSON-Schema).
    ApplicationState:
      title: Antragsstatus
      description: |
        Beschreibt den Zustand eines Antrags: - `incomplete`: Der Antrag wurde angelegt und die Fachdaten/Dokumente können hinterlegt werden. - `queued`: Die Übertragung wurde vollständig eingeliefert, akzeptiert und sobald möglich weitergeleitet. - `forwarded`: Die Übertragung an die direkt angebundene Destination wurde abgeschlossen. - `delivered`: Der Erhalt des Antrags und aller Unterlagen wurde vom vorgesehenen Endpunkt bestätigt.
      type: string
      enum:
        - incomplete
        - queued
        - forwarded
        - delivered
    Attachment:
      title: Anhang
      description: Verschlüsselter Anhang im Format JSON Web Encryption (JWE) laut RFC7516
      type: string
      pattern: '^[a-zA-Z0-9-_=.]+$'
    ContactInformation:
      title: Kontakt
      description: Angaben zum Ansprechpartner des Zustellpunktes
      type: object
      additionalProperties: false
      required:
        - legalName
        - address
        - phone
        - email
      properties:
        legalName:
          type: string
          description: Juristischer Name der verantwortlichen Organisation
        address:
          type: string
          description: Adresse der verantwortlichen Organisation
        phone:
          type: string
          description: Telefonnummer der verantwortlichen Stelle
        email:
          type: string
          description: 'Funktionspostfachadresse der verantwortlichen Stelle. Falls nicht vorhanden, kann auch eine personalisierte Adresse des Supportverantwortlichen eingetragen werden.'
        unit:
          type: string
          description: 'Verantwortliche Untereinheit (Abteilung, Referat, etc.) der Organisation. Kann zur Vereinfachung von Klärungsfragen angegeben werden.'
    CreateApplication:
      title: Objekt zum Erzeugen eines Antrags
      description: 'Metadaten eines Antrags noch ohne ID, zum Anlegen eines neuen Antrags.'
      type: object
      additionalProperties: false
      required:
        - destinationId
        - announcedContentStructure
      properties:
        destinationId:
          type: string
          format: uuid
          minLength: 32
          maxLength: 36
        announcedContentStructure:
          $ref: '#/components/schemas/AnnouncedContentStructure'
    CreateAttachment:
      title: Objekt zum Erzeugen eines Dokuments
      description: 'Repräsentation eines Dokumentes, das mit einem Antrag verknüpft wird. JSON Web Encryption Compact Serialization, RFC 7516'
      type: string
      minLength: 1
      pattern: '^[a-zA-Z0-9-_=.]+$'
    CreateDestination:
      title: Objekt zum Erzeugen eines Zustellpunkts
      description: 'Notwendige Struktur, um einen Zustellpunkt zu hinterlegen.'
      type: object
      additionalProperties: false
      required:
        - contactInformation
        - schemas
        - callback
        - encryptionKid
        - publicKeys
      properties:
        contactInformation:
          $ref: '#/components/schemas/ContactInformation'
        schemas:
          uniqueItems: true
          minItems: 1
          type: array
          description: Auflistung aller unterstützten Antragsschemata des Zustellpunktes.
          items:
            $ref: '#/components/schemas/ApplicationSchema'
        callback:
          type: string
          minLength: 1
          format: uri
          description: 'Öffentlich erreichbare Callbackadresse, um Benachrichtigungen beim Vorliegen neuer Anträge zu empfangen.'
        encryptionKid:
          type: string
          maxLength: 64
          description: Öffentlicher Teil des Verschlüsselungsschlüssels der Destination. Ist im Attribut `publicKeys` abrufbar.
        publicKeys:
          $ref: '#/components/schemas/JWKS'
    Destination:
      title: Zustellpunkt
      description: Repräsentation eines Zustellpunktes mit den öffentlich einsehbaren Attributen
      type: object
      required:
        - destinationId
        - schemas
        - encryptionKid
        - publicKeys
        - contactInformation
        - callback
      properties:
        destinationId:
          type: string
          minLength: 32
          format: uuid
          maxLength: 36
          description: Identifikator des Zustellpunktes
        schemas:
          uniqueItems: true
          minItems: 1
          type: array
          description: Auflistung aller unterstützten Antragsschemata des Zustellpunktes.
          items:
            $ref: '#/components/schemas/ApplicationSchema'
        encryptionKid:
          type: string
          maxLength: 64
          description: Öffentlicher Teil des Verschlüsselungsschlüssels der Destination. Ist im Attribut `publicKeys` abrufbar.
        publicKeys:
          $ref: '#/components/schemas/JWKS'
        contactInformation:
          $ref: '#/components/schemas/ContactInformation'
        callback:
          type: string
          minLength: 1
          format: uri
          description: 'Öffentlich erreichbare Callbackadresse, um Benachrichtigungen beim Vorliegen neuer Anträge zu empfangen.'
    DestinationList:
      title: Liste selbst angelegter Zustellpunkte
      type: object
      required:
        - destinations
      properties:
        destinations:
          type: array
          minItems: 0
          items:
            $ref: '#/components/schemas/Destination'
          description: Eine Auflistung aller selbst angelegten Zustellpunkte
    EmptyBody:
      title: Leeres JSON-Objekt
      type: object
      additionalProperties: false
    Error:
      title: Fehler
      type: object
      description: Der Inhalt von HTTP Responses bei Fehlern nach RFC7807.
      required:
        - type
        - title
        - status
      properties:
        type:
          type: string
        title:
          type: string
        status:
          type: integer
          minimum: 100
          maximum: 599
        detail:
          type: string
        instance:
          type: string
          format: uri
    Info:
      title: Technisches Serviceinformationen
      type: object
      required:
        - version
      properties:
        version:
          $ref: '#/components/schemas/Version'
    JWK:
      title: JSON Web Key (JWK)
      type: object
      description: JSON Web Key - RFC 7517
      additionalProperties: false
      required:
        - kty
        - kid
      properties:
        kty:
          type: string
          description: Key Type
          enum:
            - EC
            - RSA
            - oct
            - OKP
        use:
          type: string
          description: Public Key Use
          enum:
            - sig
            - enc
        key_ops:
          type: array
          description: Key Operations
          items:
            type: string
            enum:
              - sign
              - verify
              - encrypt
              - decrypt
              - wrapKey
              - unwrapKey
              - deriveKey
              - deriveBits
        alg:
          type: string
          description: Algorithm
        kid:
          description: Key ID
          type: string
        x5u:
          type: string
          description: X.509 URL
          format: uri
        x5c:
          description: X.509 Certificate Chain
          type: array
          items:
            type: string
        x5t:
          type: string
        x5t#S256:
          type: string
    JWKS:
      title: JSON Web Key Set (JWKS)
      description: 'JWKS nach https://datatracker.ietf.org/doc/html/rfc7517#section-5'
      type: object
      required:
        - keys
      properties:
        keys:
          type: array
          uniqueItems: true
          minItems: 1
          items:
            $ref: '#/components/schemas/JWK'
    ListOfApplicationIds:
      title: Liste abholbereiter Anträge
      description: 'Liste von Destination-IDs aller Anträge, die für den Zustellpunkt zur Abholung bereitstehen'
      type: array
      minItems: 1
      items:
        type: string
        format: uuid
        minLength: 32
        maxLength: 36
    StateTransition:
      title: Statusübergang
      description: Stellt einen Statusübergang eines Antrags dar.
      type: object
      required:
        - sourceState
        - targetState
        - timestamp
      additionalProperties: false
      properties:
        sourceState:
          $ref: '#/components/schemas/ApplicationState'
        targetState:
          $ref: '#/components/schemas/ApplicationState'
        details:
          type: string
        timestamp:
          type: string
          format: date-time
    Status:
      title: Servicestatus
      type: object
      required:
        - status
      properties:
        status:
          type: string
    SubmitApplication:
      title: Antrag absenden
      description: Datenstruktur für den Abschluss eines Antrags.
      type: object
      required:
        - encryptedMetadata
      properties:
        encryptedMetadata:
          description: Verschlüsselte Antragsmetadaten im Format JSON Web Encryption (JWE) laut RFC7516
          type: string
          pattern: '^[a-zA-Z0-9-_=.]+$'
        encryptedData:
          description: Verschlüsselte Antragsdaten im Format JSON Web Encryption (JWE) laut RFC7516
          type: string
          pattern: '^[a-zA-Z0-9-_=.]+$'
    UpdateDestination:
      title: Aktualisierung eines Zustellpunktes
      description: 'Struktur mit Attributen, die aktualisiert werden sollen.'
      type: object
      additionalProperties: false
      required:
        - contactInformation
        - schemas
        - callback
        - encryptionKid
        - publicKeys
      properties:
        contactInformation:
          $ref: '#/components/schemas/ContactInformation'
        schemas:
          uniqueItems: true
          minItems: 1
          type: array
          description: Auflistung aller unterstützten Antragsschemata des Zustellpunktes.
          items:
            $ref: '#/components/schemas/ApplicationSchema'
        callback:
          type: string
          minLength: 1
          format: uri
          description: 'Öffentlich erreichbare Callbackadresse, um Benachrichtigungen beim Vorliegen neuer Anträge zu empfangen.'
        encryptionKid:
          type: string
          maxLength: 64
          description: Öffentlicher Teil des Verschlüsselungsschlüssels der Destination. Ist im Attribut `publicKeys` abrufbar.
        publicKeys:
          $ref: '#/components/schemas/JWKS'
    Version:
      title: Serviceversion
      type: object
      required:
        - major
        - minor
        - patch
      properties:
        major:
          type: integer
        minor:
          type: integer
        patch:
          type: integer
  examples:
    Application:
      value:
        destinationId: 879ee109-a690-4db8-ab32-424284184d7d
        applicationId: ce75a6b8-d72f-4b94-b09e-af6be35bc2ae
        attachments:
          - 879ee109-a690-4db8-ab32-424284184d7d
          - 2046f9f1-dc89-4440-9c24-c76a8f40d668
        encryptedMetadata: eyJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.nlXGAufYH36IABDy0En0LXEhGfC20IZSSchs27ADalHpRoTZKfXhc7hcMk8Y9V8yTP0jYbmrq6NtEg-QS2O5TQFD9Hluhpb631PBgKjPXHYX1Y6iUcR1sXxSUPjePi8F8PcZUZuUJLnhz6myyc9scdAq9BXG2cDJVgkfLI8eZdrqnrY24Hh32_7d5OKLFSpSDrBlqfyQuY8Wbs2h8Wy4Z4hwT1aWDO7b-SqJA181hUbNcF_rR4Mze3Fdtu-3uOIQYgLBBRmN1ZHDLk0EKNCI4B8MyDKLGPoM0ZomV5lVwVWjAMRI4CgQkIQ9rnm-Adof-GbegQL3yJSoNIWRWgzCnZBYZ638QgPllCMVW3WvEVvsgj0Hj16PbofqXTQ5S73LINfP6FZawfC0yMrYjSV_N2L0Lkp2KI3BkJcy-PcFhBnhwu2IsJGAlyDRCnXdVqig8m5yLHuSMQTpLW69LzPEskfsjhnNDR-CEBZpicjMfc-4CL6U7E7YoGc_99DzE5U5._JfqyKH23GiKsnDW.ZtMMjZ3GgcgHss8qbFRhrjl4L0kAfbco-oXICkk.VBHJ00FyDTYjOA_OYfiz5g
        encryptedData: eyJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.nlXGAufYH36IABDy0En0LXEhGfC20IZSSchs27ADalHpRoTZKfXhc7hcMk8Y9V8yTP0jYbmrq6NtEg-QS2O5TQFD9Hluhpb631PBgKjPXHYX1Y6iUcR1sXxSUPjePi8F8PcZUZuUJLnhz6myyc9scdAq9BXG2cDJVgkfLI8eZdrqnrY24Hh32_7d5OKLFSpSDrBlqfyQuY8Wbs2h8Wy4Z4hwT1aWDO7b-SqJA181hUbNcF_rR4Mze3Fdtu-3uOIQYgLBBRmN1ZHDLk0EKNCI4B8MyDKLGPoM0ZomV5lVwVWjAMRI4CgQkIQ9rnm-Adof-GbegQL3yJSoNIWRWgzCnZBYZ638QgPllCMVW3WvEVvsgj0Hj16PbofqXTQ5S73LINfP6FZawfC0yMrYjSV_N2L0Lkp2KI3BkJcy-PcFhBnhwu2IsJGAlyDRCnXdVqig8m5yLHuSMQTpLW69LzPEskfsjhnNDR-CEBZpicjMfc-4CL6U7E7YoGc_99DzE5U5._JfqyKH23GiKsnDW.ZtMMjZ3GgcgHss8qbFRhrjl4L0kAfbco-oXICkk.VBHJ00FyDTYjOA_OYfiz5g
        currentStatus: queued
        statusHistory:
          - sourceState: incomplete
            targetState: queued
            timestamp: '2021-01-30T08:30:00Z'
        announcedContentStructure:
          data: true
          attachments:
            - 879ee109-a690-4db8-ab32-424284184d7d
            - 2046f9f1-dc89-4440-9c24-c76a8f40d668
    ApplicationCreated:
      value:
        destinationId: 879ee109-a690-4db8-ab32-424284184d7d
        applicationId: ce75a6b8-d72f-4b94-b09e-af6be35bc2ae
    ApplicationState:
      value:
        status: queued
    CreateApplication:
      value:
        destinationId: 879ee109-a690-4db8-ab32-424284184d7d
        announcedContentStructure:
          data: true
          attachments:
            - 123ee109-a690-4db8-ab32-424284184d7d
            - 456ee109-a690-4db8-ab32-424284184d7d
    CreateDestination:
      value:
        contactInformation:
          legalName: Max
          address: 'Musterstr. 31, 10000 Berlin, Deutschland'
          phone: '+49170123456789'
          email: max@mustermann.not
          unit: Department XYZ
        schemas:
          - schemaURI: 'urn:fitko:schema-x'
        callback: 'http://127.0.0.1:4010/voluptas'
        encryptionKid: my-key-id-0xfff
        publicKeys:
          keys:
            - kty: RSA
              kid: my-key-id-0xfff
    Destination:
      value:
        destinationId: 7881dba9-4055-4854-8b6d-11ea5b7f3047
        schemas:
          - schemaURI: 'urn:fitko:schema-x'
        encryptionKid: my-key-id-0xfff
        publicKeys:
          keys:
            - kty: RSA
              kid: my-key-id-0xfff
        contactInformation:
          legalName: Max
          address: 'Musterstr. 31, 10000 Berlin, Deutschland'
          phone: '+49170123456789'
          email: max@mustermann.not
          unit: Department XYZ
        callback: 'http://127.0.0.1:4010/voluptas'
    DestinationList:
      value:
        destinations:
          - destinationId: de735e92-8ced-4298-a021-5f4aa124cc47
            schemas:
              - schemaURI: 'urn:fitko:schema-x'
            encryptionKid: my-key-id-0xfff
            publicKeys:
              keys:
                - kty: RSA
                  kid: my-key-id-0xfff
            contactInformation:
              legalName: Max
              address: 'Musterstr. 31, 10000 Berlin, Deutschland'
              phone: '+49170123456789'
              email: max@mustermann.not
              unit: Department XYZ
            callback: 'http://127.0.0.1:4010/voluptas'
          - destinationId: 2f59b8c6-3206-4734-aa21-a7b2a4d92f7a
            schemas:
              - schemaURI: 'urn:fitko:schema-x'
              - schemaURI: 'urn:fitko:schema-y'
                mimeType: application/xml
            encryptionKid: my-key-id-0xeee
            publicKeys:
              keys:
                - kty: RSA
                  kid: my-key-id-0xeee
            contactInformation:
              legalName: Max
              address: 'Musterstr. 31, 10000 Berlin, Deutschland'
              phone: '+49170123456789'
              email: max@mustermann.not
              unit: Department XYZ
            callback: 'http://127.0.0.1:4010/voluptas'
    EmptyBody:
      value: {}
    EncryptedMessage:
      value: eyJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.nlXGAufYH36IABDy0En0LXEhGfC20IZSSchs27ADalHpRoTZKfXhc7hcMk8Y9V8yTP0jYbmrq6NtEg-QS2O5TQFD9Hluhpb631PBgKjPXHYX1Y6iUcR1sXxSUPjePi8F8PcZUZuUJLnhz6myyc9scdAq9BXG2cDJVgkfLI8eZdrqnrY24Hh32_7d5OKLFSpSDrBlqfyQuY8Wbs2h8Wy4Z4hwT1aWDO7b-SqJA181hUbNcF_rR4Mze3Fdtu-3uOIQYgLBBRmN1ZHDLk0EKNCI4B8MyDKLGPoM0ZomV5lVwVWjAMRI4CgQkIQ9rnm-Adof-GbegQL3yJSoNIWRWgzCnZBYZ638QgPllCMVW3WvEVvsgj0Hj16PbofqXTQ5S73LINfP6FZawfC0yMrYjSV_N2L0Lkp2KI3BkJcy-PcFhBnhwu2IsJGAlyDRCnXdVqig8m5yLHuSMQTpLW69LzPEskfsjhnNDR-CEBZpicjMfc-4CL6U7E7YoGc_99DzE5U5._JfqyKH23GiKsnDW.ZtMMjZ3GgcgHss8qbFRhrjl4L0kAfbco-oXICkk.VBHJ00FyDTYjOA_OYfiz5g
    Info:
      value:
        version:
          major: 1
          minor: 0
          patch: 1
