From e3a8196f1a6aebcf034049de4605f1fd298c530e Mon Sep 17 00:00:00 2001 From: Andreas Huber <anh@fjd.de> Date: Wed, 11 Mar 2020 15:07:37 +0100 Subject: [PATCH] Initialer Checkin --- README.md | 2 - assets/images/REST_Resourcen.svg | 369 ++++++++ docs/README.md | 8 + docs/callback.md | 46 + docs/ids.md | 24 + docs/resourcen.md | 100 +++ docs/sender.md | 95 ++ docs/subscriber.md | 100 +++ .../application/applicant-contact-info.json | 49 ++ .../application/applicant-organization.json | 95 ++ models/application/applicant-person.json | 26 + models/application/applicant.json | 15 + models/application/document.json | 107 +++ models/application/metadata-no-id.json | 165 ++++ models/application/metadata.json | 121 +++ models/application/payment-info.json | 56 ++ models/application/public-service-type.json | 54 ++ models/application/schema.json | 32 + models/common/address-international.json | 29 + models/common/address-national.json | 31 + models/common/authentification-info.json | 28 + models/common/base64url.json | 8 + models/common/eID-natural-person.json | 17 + models/common/eID-org-acting-person.json | 49 ++ models/common/fim-id.json | 32 + models/common/id-string.json | 7 + models/common/identifier.json | 59 ++ models/common/language.json | 46 + models/common/mime-type.json | 7 + models/common/phone.json | 27 + models/common/phonenr.json | 7 + models/destination-no-id.json | 63 ++ models/destination.json | 50 ++ models/error.json | 23 + models/person/abstract-person.json | 74 ++ models/person/individual.json | 47 + models/person/organization.json | 28 + models/person/public-organization.json | 12 + models/status.json | 28 + reference/callback.json | 91 ++ reference/sender.json | 653 ++++++++++++++ reference/subscriber.json | 816 ++++++++++++++++++ 42 files changed, 3694 insertions(+), 2 deletions(-) delete mode 100644 README.md create mode 100644 assets/images/REST_Resourcen.svg create mode 100644 docs/README.md create mode 100644 docs/callback.md create mode 100644 docs/ids.md create mode 100644 docs/resourcen.md create mode 100644 docs/sender.md create mode 100644 docs/subscriber.md create mode 100644 models/application/applicant-contact-info.json create mode 100644 models/application/applicant-organization.json create mode 100644 models/application/applicant-person.json create mode 100644 models/application/applicant.json create mode 100644 models/application/document.json create mode 100644 models/application/metadata-no-id.json create mode 100644 models/application/metadata.json create mode 100644 models/application/payment-info.json create mode 100644 models/application/public-service-type.json create mode 100644 models/application/schema.json create mode 100644 models/common/address-international.json create mode 100644 models/common/address-national.json create mode 100644 models/common/authentification-info.json create mode 100644 models/common/base64url.json create mode 100644 models/common/eID-natural-person.json create mode 100644 models/common/eID-org-acting-person.json create mode 100644 models/common/fim-id.json create mode 100644 models/common/id-string.json create mode 100644 models/common/identifier.json create mode 100644 models/common/language.json create mode 100644 models/common/mime-type.json create mode 100644 models/common/phone.json create mode 100644 models/common/phonenr.json create mode 100644 models/destination-no-id.json create mode 100644 models/destination.json create mode 100644 models/error.json create mode 100644 models/person/abstract-person.json create mode 100644 models/person/individual.json create mode 100644 models/person/organization.json create mode 100644 models/person/public-organization.json create mode 100644 models/status.json create mode 100644 reference/callback.json create mode 100644 reference/sender.json create mode 100644 reference/subscriber.json diff --git a/README.md b/README.md deleted file mode 100644 index 8a49ed4d..00000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# fiep-poc -FIEP PoC diff --git a/assets/images/REST_Resourcen.svg b/assets/images/REST_Resourcen.svg new file mode 100644 index 00000000..3c346916 --- /dev/null +++ b/assets/images/REST_Resourcen.svg @@ -0,0 +1,369 @@ +<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill-opacity="1" color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" width="600" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" height="470" font-family="'Dialog'" font-style="normal" stroke-linejoin="miter" font-size="12px" stroke-dashoffset="0" image-rendering="auto"> + <!--Generated by ySVG 2.5--> + <defs id="genericDefs"/> + <g> + <defs id="defs1"> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath1"> + <path d="M0 0 L600 0 L600 470 L0 470 L0 0 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2"> + <path d="M-15 -135 L585 -135 L585 335 L-15 335 L-15 -135 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath3"> + <path d="M210 0 L360 0 L360 50 L210 50 L210 0 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath4"> + <path d="M210 220 L360 220 L360 270 L210 270 L210 220 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath5"> + <path d="M420 270 L570 270 L570 320 L420 320 L420 270 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath6"> + <path d="M0 220 L150 220 L150 250 L0 250 L0 220 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath7"> + <path d="M420 220 L570 220 L570 250 L420 250 L420 220 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath8"> + <path d="M0 0 L150 0 L150 50 L0 50 L0 0 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath9"> + <path d="M210 120 L360 120 L360 150 L210 150 L210 120 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath10"> + <path d="M420 110 L570 110 L570 160 L420 160 L420 110 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath11"> + <path d="M210 -120 L360 -120 L360 -70 L210 -70 L210 -120 Z"/> + </clipPath> + <clipPath clipPathUnits="userSpaceOnUse" id="clipPath12"> + <path d="M0 0 L0 18 L43 18 L43 0 Z"/> + </clipPath> + <script type="text/ecmascript"> + <![CDATA[ var SVGDocument = null; + var SVGRoot = null; + var TrueCoords = null; + var lastElement = null; + var initialized = null; + var tipGroup; + function Init(evt) + { + SVGDocument = evt.target.ownerDocument; + SVGRoot = SVGDocument.documentElement; + TrueCoords = SVGRoot.createSVGPoint(); + initialized = evt; + }; + function GetTrueCoords(evt) + { + var newScale = SVGRoot.currentScale; + var translation = SVGRoot.currentTranslate; + TrueCoords.x = (evt.clientX - translation.x)/newScale; + TrueCoords.y = (evt.clientY - translation.y)/newScale; + }; + function HideTooltip( evt ) + { + if(initialized == null) { + Init(evt); + } + if(tipGroup != null) { + tipGroup.setAttributeNS(null, 'visibility', 'hidden'); + } + }; + function ShowTooltip( evt ) + { + if(initialized == null) { + Init(evt); + } + GetTrueCoords( evt ); + var tipScale = 1/SVGRoot.currentScale; + var targetElement = evt.currentTarget; + if ( lastElement != targetElement ) + { + var targetId = targetElement.getAttributeNS(null, 'id'); + var tipId = 'tooltip.' + targetId; + tipGroup = SVGDocument.getElementById(tipId); + var xPos = TrueCoords.x + (10 * tipScale); + var yPos = TrueCoords.y + (10 * tipScale); + tipGroup.setAttributeNS(null, 'transform', 'translate(' + xPos + ',' + yPos + ') scale(' + tipScale + ')'); + tipGroup.setAttributeNS(null, 'visibility', 'visible'); + } + }; +]]> + </script> + </defs> + <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="translate(15,135)" stroke="white"> + <rect x="-15" width="600" height="470" y="-135" clip-path="url(#clipPath2)" stroke="none"/> + </g> + <g id="y.node.0"> + <g fill="rgb(158,190,255)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(158,190,255)"> + <rect x="210" width="150" height="50" y="0" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,15,135)" fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(0,53,158)" stroke-width="2" stroke-miterlimit="1.45"> + <rect fill="none" x="210" width="150" height="50" y="0"/> + </g> + <g> + <g stroke-linecap="butt" font-size="13px" transform="matrix(1,0,0,1,15,135)" fill="rgb(0,32,97)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke="rgb(0,32,97)" font-weight="bold" stroke-miterlimit="1.45"> + <text x="246.3555" xml:space="preserve" y="17.5684" clip-path="url(#clipPath3)" stroke="none">Destination</text> + </g> + </g> + <g fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(0,53,158)"> + <line y2="25" fill="none" x1="211" clip-path="url(#clipPath3)" x2="359" y1="25"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <text x="215" xml:space="preserve" y="41.9121" clip-path="url(#clipPath3)" stroke="none">destination-id</text> + </g> + <g fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(0,53,158)"> + <line y2="49" fill="none" x1="211" clip-path="url(#clipPath3)" x2="359" y1="49"/> + </g> + </g> + <g onmouseout="HideTooltip(evt)" id="y.node.1" onmousemove="ShowTooltip(evt)"> + <g fill="rgb(158,190,255)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(158,190,255)"> + <rect x="210" width="150" height="50" y="220" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,15,135)" fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(0,53,158)" stroke-width="2" stroke-miterlimit="1.45"> + <rect fill="none" x="210" width="150" height="50" y="220"/> + </g> + <g> + <g stroke-linecap="butt" font-size="13px" transform="matrix(1,0,0,1,15,135)" fill="rgb(0,32,97)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke="rgb(0,32,97)" font-weight="bold" stroke-miterlimit="1.45"> + <text x="216.1755" xml:space="preserve" y="237.5684" clip-path="url(#clipPath4)" stroke="none">ApplicationMetadata</text> + </g> + </g> + <g fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(0,53,158)"> + <line y2="245" fill="none" x1="211" clip-path="url(#clipPath4)" x2="359" y1="245"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <text x="215" xml:space="preserve" y="261.9121" clip-path="url(#clipPath4)" stroke="none">application-id</text> + </g> + <g fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(0,53,158)"> + <line y2="269" fill="none" x1="211" clip-path="url(#clipPath4)" x2="359" y1="269"/> + </g> + </g> + <g onmouseout="HideTooltip(evt)" id="y.node.2" onmousemove="ShowTooltip(evt)"> + <g fill="rgb(158,190,255)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(158,190,255)"> + <rect x="420" width="150" height="50" y="270" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,15,135)" fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(0,53,158)" stroke-width="2" stroke-miterlimit="1.45"> + <rect fill="none" x="420" width="150" height="50" y="270"/> + </g> + <g> + <g stroke-linecap="butt" font-size="13px" transform="matrix(1,0,0,1,15,135)" fill="rgb(0,32,97)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke="rgb(0,32,97)" font-weight="bold" stroke-miterlimit="1.45"> + <text x="422.8748" xml:space="preserve" y="287.5684" clip-path="url(#clipPath5)" stroke="none">ApplicationDocument</text> + </g> + </g> + <g fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(0,53,158)"> + <line y2="295" fill="none" x1="421" clip-path="url(#clipPath5)" x2="569" y1="295"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <text x="425" xml:space="preserve" y="311.9121" clip-path="url(#clipPath5)" stroke="none">doc-id</text> + </g> + <g fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(0,53,158)"> + <line y2="319" fill="none" x1="421" clip-path="url(#clipPath5)" x2="569" y1="319"/> + </g> + </g> + <g id="y.node.3"> + <g fill="rgb(158,190,255)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(158,190,255)"> + <rect x="0" width="150" height="30" y="220" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,15,135)" fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(0,53,158)" stroke-width="2" stroke-miterlimit="1.45"> + <rect fill="none" x="0" width="150" height="30" y="220"/> + </g> + <g> + <g stroke-linecap="butt" font-size="13px" transform="matrix(1,0,0,1,15,135)" fill="rgb(0,32,97)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke="rgb(0,32,97)" font-weight="bold" stroke-miterlimit="1.45"> + <text x="54.2527" xml:space="preserve" y="237.5684" clip-path="url(#clipPath6)" stroke="none">Status</text> + </g> + </g> + </g> + <g id="y.node.4"> + <g fill="rgb(158,190,255)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(158,190,255)"> + <rect x="420" width="150" height="30" y="220" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,15,135)" fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(0,53,158)" stroke-width="2" stroke-miterlimit="1.45"> + <rect fill="none" x="420" width="150" height="30" y="220"/> + </g> + <g> + <g stroke-linecap="butt" font-size="13px" transform="matrix(1,0,0,1,15,135)" fill="rgb(0,32,97)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke="rgb(0,32,97)" font-weight="bold" stroke-miterlimit="1.45"> + <text x="441.4924" xml:space="preserve" y="237.5684" clip-path="url(#clipPath7)" stroke="none">ApplicationData</text> + </g> + </g> + </g> + <g id="y.node.5"> + <g fill="rgb(217,230,255)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(217,230,255)"> + <rect x="0" width="150" height="50" y="0" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,15,135)" fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke-dasharray="12,4" stroke="rgb(0,53,158)" stroke-width="2" stroke-miterlimit="1.45"> + <rect fill="none" x="0" width="150" height="50" y="0"/> + </g> + <g> + <g stroke-linecap="butt" font-size="13px" transform="matrix(1,0,0,1,15,135)" fill="rgb(0,32,97)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke="rgb(0,32,97)" stroke-miterlimit="1.45"> + <text x="53.8623" xml:space="preserve" y="17.5684" clip-path="url(#clipPath8)" stroke="none">Source</text> + </g> + </g> + <g fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(0,53,158)"> + <line y2="25" fill="none" x1="1" clip-path="url(#clipPath8)" x2="149" y1="25"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <text x="5" xml:space="preserve" y="41.9121" clip-path="url(#clipPath8)" stroke="none">source-id</text> + </g> + <g fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(0,53,158)"> + <line y2="49" fill="none" x1="1" clip-path="url(#clipPath8)" x2="149" y1="49"/> + </g> + </g> + <g id="y.node.6"> + <g fill="rgb(158,190,255)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(158,190,255)"> + <rect x="210" width="150" height="30" y="120" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,15,135)" fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(0,53,158)" stroke-width="2" stroke-miterlimit="1.45"> + <rect fill="none" x="210" width="150" height="30" y="120"/> + </g> + <g> + <g stroke-linecap="butt" font-size="13px" transform="matrix(1,0,0,1,15,135)" fill="rgb(0,32,97)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke="rgb(0,32,97)" font-weight="bold" stroke-miterlimit="1.45"> + <text x="263.491" xml:space="preserve" y="137.5684" clip-path="url(#clipPath9)" stroke="none">Queue</text> + </g> + </g> + </g> + <g id="y.node.7"> + <g fill="rgb(158,190,255)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(158,190,255)"> + <rect x="420" width="150" height="50" y="110" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,15,135)" fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke="rgb(0,53,158)" stroke-width="2" stroke-miterlimit="1.45"> + <rect fill="none" x="420" width="150" height="50" y="110"/> + </g> + <g> + <g stroke-linecap="butt" font-size="13px" transform="matrix(1,0,0,1,15,135)" fill="rgb(0,32,97)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke="rgb(0,32,97)" font-weight="bold" stroke-miterlimit="1.45"> + <text x="431.5488" xml:space="preserve" y="127.5684" clip-path="url(#clipPath10)" stroke="none">ApplicationSchema</text> + </g> + </g> + <g fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(0,53,158)"> + <line y2="135" fill="none" x1="421" clip-path="url(#clipPath10)" x2="569" y1="135"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <text x="425" xml:space="preserve" y="151.9121" clip-path="url(#clipPath10)" stroke="none">schema-id</text> + </g> + <g fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(0,53,158)"> + <line y2="159" fill="none" x1="421" clip-path="url(#clipPath10)" x2="569" y1="159"/> + </g> + </g> + <g id="y.node.8"> + <g fill="rgb(217,230,255)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(217,230,255)"> + <rect x="210" width="150" height="50" y="-120" stroke="none"/> + </g> + <g stroke-linecap="butt" transform="matrix(1,0,0,1,15,135)" fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" stroke-dasharray="12,4" stroke="rgb(0,53,158)" stroke-width="2" stroke-miterlimit="1.45"> + <rect fill="none" x="210" width="150" height="50" y="-120"/> + </g> + <g> + <g stroke-linecap="butt" font-size="13px" transform="matrix(1,0,0,1,15,135)" fill="rgb(0,32,97)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke="rgb(0,32,97)" stroke-miterlimit="1.45"> + <text x="251.8208" xml:space="preserve" y="-102.4316" clip-path="url(#clipPath11)" stroke="none">Subscriber</text> + </g> + </g> + <g fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(0,53,158)"> + <line y2="-94" fill="none" x1="211" clip-path="url(#clipPath11)" x2="359" y1="-94"/> + </g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <text x="215" xml:space="preserve" y="-78.0879" clip-path="url(#clipPath11)" stroke="none">subscriber-id</text> + </g> + <g fill="rgb(0,53,158)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke="rgb(0,53,158)"> + <line y2="-70" fill="none" x1="211" clip-path="url(#clipPath11)" x2="359" y1="-70"/> + </g> + </g> + <g id="y.edge.0"> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <path fill="none" d="M285 277.0366 L285 307.5 L419.967 307.5"/> + <path d="M285 270.0366 L290 277.0366 L285 284.0366 L280 277.0366 Z" stroke="none"/> + </g> + <g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <text x="390.748" xml:space="preserve" y="300.9688" stroke="none">0+</text> + </g> + </g> + </g> + <g id="y.edge.1"> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <path fill="none" d="M202.9707 235 L150.0293 235"/> + <path d="M209.9707 235 L202.9707 240 L195.9707 235 L202.9707 230 Z" stroke="none"/> + </g> + <g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <text x="162.125" xml:space="preserve" y="228.4688" stroke="none">1+</text> + </g> + </g> + </g> + <g id="y.edge.2"> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <path fill="none" d="M367.0293 235 L419.9707 235"/> + <path d="M360.0293 235 L367.0293 230 L374.0293 235 L367.0293 240 Z" stroke="none"/> + </g> + <g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <text x="400.2871" xml:space="preserve" y="228.4688" stroke="none">1</text> + </g> + </g> + </g> + <g id="y.edge.8"> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <path fill="none" d="M238.3333 219.9609 L238.3333 180 L75 180 L75 58.0317"/> + <path d="M75 50.0317 L70 62.0317 L75 59.0317 L80 62.0317 Z" stroke="none"/> + </g> + </g> + <g id="y.edge.7"> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <path fill="none" d="M285 57.0342 L285 119.9658"/> + <path d="M285 50.0342 L290 57.0342 L285 64.0342 L280 57.0342 Z" stroke="none"/> + </g> + <g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <text x="273.4121" xml:space="preserve" y="105.3438" stroke="none">1</text> + </g> + </g> + </g> + <g id="y.edge.3"> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <path fill="none" d="M285 157.0122 L285 220.0008"/> + <path fill="white" d="M285 150.0122 L290 157.0122 L285 164.0122 L280 157.0122 Z" stroke="none"/> + <path fill="none" d="M285 150.0122 L290 157.0122 L285 164.0122 L280 157.0122 Z"/> + </g> + </g> + <g id="y.edge.4"> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <path fill="none" d="M367.033 25 L495 25 L495 109.9585"/> + <path fill="white" d="M360.033 25 L367.033 20 L374.033 25 L367.033 30 Z" stroke="none"/> + <path fill="none" d="M360.033 25 L367.033 20 L374.033 25 L367.033 30 Z"/> + </g> + <g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <text x="499" xml:space="preserve" y="95.3438" stroke="none">0+</text> + </g> + </g> + </g> + <g id="y.edge.5"> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <path fill="none" d="M330 212.9707 L330 190 L495 190 L495 160.0391"/> + <path fill="white" d="M330 219.9707 L325 212.9707 L330 205.9707 L335 212.9707 Z" stroke="none"/> + <path fill="none" d="M330 219.9707 L325 212.9707 L330 205.9707 L335 212.9707 Z"/> + </g> + <g> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <text x="468.2305" xml:space="preserve" y="183.7266" stroke="none">0..1</text> + </g> + </g> + </g> + <g id="y.edge.6"> + <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,135)" stroke-linecap="butt"> + <path fill="none" d="M285 -63.0098 L285 -0.005"/> + <path fill="white" d="M285 -70.0098 L290 -63.0098 L285 -56.0098 L280 -63.0098 Z" stroke="none"/> + <path fill="none" d="M285 -70.0098 L290 -63.0098 L285 -56.0098 L280 -63.0098 Z"/> + </g> + </g> + <g visibility="hidden" id="tooltip.y.node.1" pointer-events="none"> + <g fill="rgb(255,255,204)" text-rendering="geometricPrecision" font-size="11px" shape-rendering="geometricPrecision" font-family="'Lucida Grande'" stroke="rgb(255,255,204)"> + <rect x="0" width="43" height="18" y="0" clip-path="url(#clipPath12)" stroke="none"/> + <text fill="black" x="3" xml:space="preserve" y="13" clip-path="url(#clipPath12)" stroke="none">Antrag</text> + </g> + </g> + <g visibility="hidden" id="tooltip.y.node.2" pointer-events="none"> + <g fill="rgb(255,255,204)" text-rendering="geometricPrecision" font-size="11px" shape-rendering="geometricPrecision" font-family="'Lucida Grande'" stroke="rgb(255,255,204)"> + <rect x="0" width="43" height="18" y="0" clip-path="url(#clipPath12)" stroke="none"/> + <text fill="black" x="3" xml:space="preserve" y="13" clip-path="url(#clipPath12)" stroke="none">Anlage</text> + </g> + </g> + </g> +</svg> diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..6dc3a4a6 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,8 @@ +# FIEP PoC +## Resourcen +- [Resourcen](./resourcen.md) +- [IDs](./ids.md) + +## APIs +- [Application Sender API](./sender.md) +- [Application Subscriber API](./subscriber.md) diff --git a/docs/callback.md b/docs/callback.md new file mode 100644 index 00000000..f241a3a4 --- /dev/null +++ b/docs/callback.md @@ -0,0 +1,46 @@ +# Callback +## Callback registrieren +Beim [anlegen](../reference/subscriber.json/paths/~1{subscriber-id}~1destinations/post) oder [aktualisieren](../reference/subscriber.json/paths/~1{subscriber-id}~1destinations~1{destination-id}/put) einer Destination sollte ein Callback angegeben werden. + +```json +{ + "organization": { + "organization-name": "Gewerbeamt Musterhausen" + }, + "technical-contact": [ + { + "first-name": "Werner", + "last-name": "Mustermann", + "contact": { + "telephone": [ + { + "number": "+49 89 32168-42", + "mobile": false, + "type": "work" + } + ] + } + } + ], + "callback": { + "callback-url": "https://www.example.com/callback" + } +} +``` + +## Callback ausführen +Trifft nun ein neuer Antrag ein, so sendet der Zustelldienst einen HTTP-POST-Request an die angegebene Adresse. Im Body des Requests werden die `destination-id` und die `application-id`s der wartenden Anträge (i.d.R. genau eine) aufgelistet. + +```json +{ + "destination-id": "821", + "applications": [ + { + "application-id": "98472" + } + ] +} +``` + +## Callback nur bei Inaktivität +Nach einem Callback wartet der Zustelldienst eine gewisse Zeit (z.B. 5 Minuten) bis zum nächsten Callback, auch wenn in dieser Zeit neue Anträge eintreffen. Diese Wartezeit wird bei Aktivität der Destination (z.B. Abfrage der Queue oder Abholen von Anträgen) verlängert. diff --git a/docs/ids.md b/docs/ids.md new file mode 100644 index 00000000..38ade9b8 --- /dev/null +++ b/docs/ids.md @@ -0,0 +1,24 @@ +# IDs + + + +## Extern vergebene IDs +### source-id +Die `source-id` ist die ID des Accounts, der die Übertragung absendet. Sie wird vom genutzten Identitätssystem vergeben und muss global eindeutig sein. + +### subscriber-id +Die `subscriber-id` ist die ID des Accounts, der die Übertragung empfängt. Sie wird vom genutzten Identitätssystem vergeben und muss global eindeutig sein. + +## Vom Sender vergebene IDs +### doc-id +Der Sender vergibt für jedes Antragsformular und jede Anlage in einer Übertragung eine `doc-id`. Diese muss für alle Dokumente (Antragsformulare und Anlagen) in der Übertragung eindeutig sein. Es wird empfohlen, die IDs `1`, `2` etc. zu verwenden. + +## Vom Zustelldienst vergebene IDs +### application-id +Der Zustelldienst weist jeder Übertragung (Application) eine global eindeutige `application-id` zu. + +### destination-id +Für jeden vom Subscriber angelegtes Übertragungsziel vergibt der Zustelldienst eine global eindeutige `destination-id`. + +### schema-id +Für jedes einer Destination zugeordnetes Appication Schema vergibt der Zustelldienst eine global eindeutige `schema-id`. diff --git a/docs/resourcen.md b/docs/resourcen.md new file mode 100644 index 00000000..fb2237a9 --- /dev/null +++ b/docs/resourcen.md @@ -0,0 +1,100 @@ +# Resourcen + + + +## Primärresourcen +### [Application Metadata](../models/application/metadata.json) +Die Metadaten des Antrags (Application Metadata) entsprechen dem früheren XFall-Container und tragen allgemeine Informationen zu der Übertragung, wie +- Nachgefragte behördliche Leistung (Public Service Type) +- Antragsteller +- Hinweis auf Fachdaten und das dazugehörige Schema +- Struktur des Antrags (Liste der enthaltenen Dokumente) + +### [Destination](../models/destination.json) +Die Destination beschreibt einen technischen Übergabepunkt für Anträge. Dies kann ein Fachverfahren sein, aber auch ein zwischengeschaltetes System wie eine virtuelle Poststelle oder ein Kommunal-Gateway. + +Die Destination enthält folgende Informationen: +- Behörde +- technischen Ansprechpartner +- empfangbare Schemata +- technische Benachrichtigungsadresse (siehe [Callback](callback.md)) + +In Zukunft soll die Destination noch um Schlüssel für eine Ende-zu-Ende-Übertragung erweitert werden. + +## Subresourcen +### Application Data +Die Übertragung kann einen Fachdatensatz (Application Data) enthalten. Dieser darf im JSON oder XML Format vorliegen. + +### [Application Document](../models/application/document.json) +Einer Übertragung sind Dokumente zugeordnet. Dies sind z.B. Antragsformulare oder Anlagen. + +### [Application Schema](../models/application/schema.json) +Die Destination kann Schemata benennen, die empfangen werden können. Eine Übertragung referenziert dann eines dieser Schemata um festzulegen, welche Struktur die Fachdaten haben. + +## Datentypen +### [ID-String](../models/common/id-string.json) +Der ID-String ist ein String, der nur die Zeichen A-Z, a-z, 0-9 sowie Bindestrich (-), Unterstrich (_) und Punkt (.) enthält. +- Regex: `^[-_.A-Za-z0-9]+$` + +### [MIME-Type](../models/common/mime-type.json) +Der MIME-Type ist ein String, der dem Format der MIME-Typen entspricht. +- Regex: `^[-\w.]+/[-\w.+]+$` + +### [Phonenr](../models/common/phonenr.json) +Eine Telefonnummer im internationalen Format, z.B. "+49 89 32168-42". Muss mit einem Plus beginnen und darf danach außer Ziffern nur Leerzeichen ( ) und Bindestriche (-) enthalten. +Regex: `^\+[1-9]([ -]?[0-9]){1,14}$` + +### [Status](../models/status.json) +Der Status beschreibt den Fortschritt der Übertragung. Hierzu sind folgende Werte definiert: +- `incomplete`: Die Einlieferung von der Source hat begonnen +- `queued`: Die Übertragung wurde vollständig eingeliefert und akzeptiert +- `sending`: Die Weitergabe wurde begonnen +- `forwarded`: Die Übertragung an die direkt angebundene Destination wurde abgeschlossen +- `delivered`: Die Übertragung hat den vorgesehen Endpunkt erreicht + +<!-- theme: info --> +> **Hinweis:** Bei diesem Status handelt es sich um den Übermittlungsstatus vom Sender an den Subscriber. Die Statusmeldungen der Zuständigen Stelle an den Antragsteller sind davon unabhängig. + +## Modelle + +<!-- theme: warning --> +> ### Hinweis! +> +> Die Modelle werden derzeit überarbeitet. + +### Addresse +#### [AddressNational](../models/xfall/address-national.json) + +#### [AddressInternational](../models/xfall/address-international.json) + +#### [Address](../models/xfall/address.json) +Die Klasse "Address" ist eine Choice (oneOf) zwischen nationaler und internationaler Adresse. + +### [Error](../models/error.json) +Die Klasse "Error" dient der Rückmeldung zu einer nicht erfolgreichen Operation. +Sie enthält drei Propertys: +- code: integer - Fehlercode +- msg: string - Fehlermeldung +- ref: string - Referenz auf fehlerhafte Stelle + +### [FIM-ID](../models/common/fim-id.json) +Die FIM ID besteht aus einer ID und einer Versionsnummmer. + +Beispiel für Stammdatenschema "S99000001V1.0": +```json +{"id":"S99000001","version":"1.0"} +``` +- Regex für "id": `^[DFGS]\d{8}$` +- Regex für "version": `^\d+\.\d+$` + +### [Identifier](../models/common/identifier.json) + +### Person +- [AbstractPerson](../models/xfall/abstract-person.json) +- [Individual](../models/xfall/individual.json) +- [Organization](../models/xfall/organization.json) +- [PublicOrganization](../models/xfall/public-organization.json) + +### Public Service Type +- [PublicServiceType](../models/application/public-service-type.json) + diff --git a/docs/sender.md b/docs/sender.md new file mode 100644 index 00000000..33b19863 --- /dev/null +++ b/docs/sender.md @@ -0,0 +1,95 @@ +# Application Sender API +## Transfer Operationen +Es werden folgende Parameter in der URL verwendet: +- `source-id`: Wird mit dem SourceAccount zugewiesen. +- `destination-id`: Über externes System (Zuständigkeitsfinder) dem Onlineantragsdienst bekannt. +- `application-id`: Vom Zustelldienst vergebene ID für die Übertragung. + + + +### [Create Transfer](../reference/sender.json/paths/~1{source-id}~1{destination-id}/post) +Legt eine neue Übertragung an. + +#### Request +- Body: [Application Metadata ohne ID](../models/application/metadata-no-id.json) + +#### Response +- Body: `application-id` + + + +### [Add Application Data](../reference/sender.json/paths/~1{source-id}~1{destination-id}~1{application-id}~1data/put) +Fügt dem Antrag strukturierte Daten hinzu. + +#### Request application/json +- Body: Strukturierte JSON-Daten, die dem in der Application angegebenen ApplicationSchema entsprechen. + +#### Request application/xml +- Body: Strukturierte XML-Daten, die dem in der Application angegebenen ApplicationSchema entsprechen. + +#### Response +- Body: (leer) + +#### Falls Transfer-ID ungültig/Transfer-Timeout +- HTTP 410 Gone +- Body: [Error](../models/error.json) + +#### Falls Kein Schema zugeordnet +- HTTP 406 Not Acceptable +- Body: [Error](../models/error.json) + +#### Falls Übertragung zu groß +- HTTP 413 Request Entity Too Large +- Body: [Error](../models/error.json) + +#### Falls Schemafehler +- HTTP 406 Not Acceptable +- Body: [Error](../models/error.json) + + + +### [Add Application Document](../reference/sender.json/paths/~1{source-id}~1{destination-id}~1{application-id}~1docs~1{doc-id}/put) +Übermittelt ein Antragsformular oder eine Anlage. + +#### Request +- Body: FIXME + +#### Response +- Body: (leer) + +#### Falls Transfer-ID ungültig/Transfer-Timeout +- HTTP 410 Gone +- Body: [Error](../models/error.json) + +#### Falls der Body bzw. das Dokument kein PDF ist +- HTTP 415 Unsupported Media Type +- Body: [Error](../models/error.json) + +#### Falls Signaturprüfung nicht erfolgreich - Signatur passt nicht zum Dokument +- HTTP 400 Bad Request +- Body: [Error](../models/error.json) + + + +### [Commit Transfer](../reference/sender.json/paths/~1{source-id}~1{destination-id}~1{application-id}/post) +Beendet die Übertragung des Antrags und löst seinen Versand aus. + +#### Request +- Body: + +#### Response +- Body: + +#### Falls +- HTTP +- Body: [Error](../models/error.json) + + + +### [Get Application Metadata](../reference/sender.json/paths/~1{source-id}~1{destination-id}~1{application-id}/get) + +FIXME + +### [Get Application Upload Status](../reference/sender.json/paths/~1{source-id}~1{destination-id}~1{application-id}~1upload-status/get) + +FIXME diff --git a/docs/subscriber.md b/docs/subscriber.md new file mode 100644 index 00000000..b61a1e5f --- /dev/null +++ b/docs/subscriber.md @@ -0,0 +1,100 @@ +# Application Subscriber API +## Subscriber Operationen +Mit diesem Satz von Operationen werden die Abonnements (Subscriptions bzw. Destinations) des Backends/Subscribers verwaltet. + + + +### [Create Destination](../reference/subscriber.json/paths/~1{subscriber-id}~1destinations/post) +Legt ein neues Übertragungsziel (Destination) an. + +#### Request +- Body: [Destination](../models/destination.json) + +#### Response +- Body: destination-id + +Beispiel: +```json +{ "destination-id": "123e4567-e89b-12d3-a456-426655440000" } +``` +**Hinweis:** Die `destination-id` kann, muss aber keine UUID sein. Der Subscriber hat sie als einen beliebigen String zu behandeln. + + + +### [List Destinations](../reference/subscriber.json/paths/~1{subscriber-id}~1destinations/get) +Listet alle Übertragungsziele (Destinations) eines Subscribers auf. + + + +### [Get Destination](../reference/subscriber.json/paths/~1{subscriber-id}~1destinations~1{destination-id}/get) +Ruf die Daten eines Übertragungsziels (Destination) ab. + + + +### [Update Destination](../reference/subscriber.json/paths/~1{subscriber-id}~1destinations~1{destination-id}/put) +Aktualisiert ein Übertragungsziel (Destination). + + + +### [Delete Destination](../reference/subscriber.json/paths/~1{subscriber-id}~1destinations~1{destination-id}/delete) +Löscht ein Übertragungsziel (Destination). + + + +## Application Operationen +Mit diesem Satz von Operationen wird nach wartenden Transfers/Applications gesucht und diese abgeholt. + + + +### [List Applications](../reference/subscriber.json/paths/~1{subscriber-id}~1destinations~1{destination-id}~1applications/get) +Ruft die Liste der wartenden Übertragungen (Applications) ab. + + + +### [Get Application](../reference/subscriber.json/paths/~1{subscriber-id}~1destinations~1{destination-id}~1applications~1{application-id}/get) +Ruft eine wartende Übertragung (Application) ab. + + + +### [Get Application Data](../reference/subscriber.json/paths/~1{subscriber-id}~1destinations~1{destination-id}~1applications~1{application-id}~1application-data/get) +Ruft die Fachdaten einer Übertragung (Application Data) ab. + +Beispiele: +#### JSON +```json +{ + "F99000001": "Eins", + "G99000001": { + "F99000002": "Zwei", + "F99000003": "Drei" + } +} +``` + +#### XML +```xml +<S99000001> + <F99000001>Eins</F99000001> + <G99000001> + <F99000002>Zwei</F99000002> + <F99000003>Drei</F99000003> + </G99000001> +</S99000001> +``` + + + +### [Get Application Form](../reference/subscriber.json/paths/~1{subscriber-id}~1destinations~1{destination-id}~1applications~1{application-id}~1application-forms~1{form-id}/get) +Ruft ein Antragsformular einer Übertragung (Application Form) ab. + + + +### [Get Attachment](../reference/subscriber.json/paths/~1{subscriber-id}~1destinations~1{destination-id}~1applications~1{application-id}~1attachments~1{attachment-id}/get) +Ruft eine Anlage einer Übertragung (Attachment) ab. + + + +### [Commit Application](../reference/subscriber.json/paths/~1{subscriber-id}~1destinations~1{destination-id}~1applications~1{application-id}/post) +Quittiert die Abholung der Übertragung. + + diff --git a/models/application/applicant-contact-info.json b/models/application/applicant-contact-info.json new file mode 100644 index 00000000..017e3211 --- /dev/null +++ b/models/application/applicant-contact-info.json @@ -0,0 +1,49 @@ +{ + "title": "Applicant Contact Info", + "type": "object", + "description": "Kontaktdaten des Antragstellers", + "properties": { + "electronic-adresses": { + "type": "array", + "description": "Elektronische Kontaktmöglkichkeiten, z.B. E-Mail", + "items": { + "type": "object", + "description": "", + "properties": { + "channel-type": { + "type": "string", + "enum": [ + "Service-Account-Mailbox", + "De-Mail", + "E-Mail", + "Fax" + ], + "description": "Art der Kommunikationsmöglichkeit" + }, + "address": { + "type": "string", + "description": "Kommunikationsadresse" + } + } + } + }, + "physical-adress": { + "oneOf": [ + { + "$ref": "../common/address-national.json" + }, + { + "$ref": "../common/address-international.json" + } + ], + "description": "Physikalische (Post-)Adresse" + }, + "telephone": { + "type": "array", + "description": "Liste der Telefonnummern, außer Fax", + "items": { + "$ref": "../common/phone.json" + } + } + } +} \ No newline at end of file diff --git a/models/application/applicant-organization.json b/models/application/applicant-organization.json new file mode 100644 index 00000000..1c3a3636 --- /dev/null +++ b/models/application/applicant-organization.json @@ -0,0 +1,95 @@ +{ + "title": "Applicant Organisation", + "type": "object", + "description": "Antragsteller in Form von einer Organisation, z.B. einem Unternehmen", + "properties": { + "role": { + "type": "string" + }, + "identifier": { + "type": "array", + "description": "IDs für diese Organisation", + "items": { + "$ref": "" + } + }, + "org-validation": { + "type": "object", + "description": "Informationen, ob diese Organisation vom sendenden System identifiziert wurde", + "properties": { + "validated": { + "type": "boolean", + "description": "Wurde die Organisation identifiziert?" + }, + "method": { + "type": "string", + "description": "Identifizierungsmethode" + } + }, + "required": [ + "validated", + "method" + ] + }, + "organization-info": { + "type": "object", + "description": "Informationen über die Organisation", + "properties": { + "legal-name": { + "type": "string", + "description": "Name von rechtswegen, z.B. der Firmenname mit Rechtsform bei Unternehmen" + }, + "organization-type": { + "type": "string", + "description": "Rechtsform der Organisation" + }, + "registry-court": { + "type": "string", + "description": "Registergericht" + }, + "registry-type": { + "type": "string" + }, + "registry-number": { + "type": "string", + "description": "Registernummer, z.B. vom Handelsregister" + }, + "legal-address": { + "oneOf": [ + { + "$ref": "../common/address-national.json" + }, + { + "$ref": "../common/address-international.json" + } + ], + "description": "Offizielle Adresse" + }, + "legal-representatives": { + "type": "array", + "items": { + "type": "object" + } + } + } + }, + "acting-person": { + "type": "array", + "description": "Im Namen der Organisation auftretende natürliche Personen, wie z.B. Geschäftsführer, Vorstände oder Prokuristen", + "items": { + "type": "object", + "properties": { + "identity-info": { + "$ref": "../common/eID-natural-person.json" + }, + "authentification-info": { + "$ref": "../common/authentification-info.json" + } + } + } + }, + "contact-info": { + "$ref": "./applicant-contact-info.json" + } + } +} \ No newline at end of file diff --git a/models/application/applicant-person.json b/models/application/applicant-person.json new file mode 100644 index 00000000..e4fe81e2 --- /dev/null +++ b/models/application/applicant-person.json @@ -0,0 +1,26 @@ +{ + "title": "Applicant Person", + "type": "object", + "description": "Antragstellerdaten für eine natürliche Person", + "properties": { + "role": { + "type": "string" + }, + "identifier": { + "type": "array", + "description": "IDs der natürlichen Person", + "items": { + "$ref": "../common/identifier.json" + } + }, + "authentification-info": { + "$ref": "../common/authentification-info.json" + }, + "identity-info": { + "$ref": "../common/eID-natural-person.json" + }, + "contact-info": { + "$ref": "./applicant-contact-info.json" + } + } +} \ No newline at end of file diff --git a/models/application/applicant.json b/models/application/applicant.json new file mode 100644 index 00000000..5d783295 --- /dev/null +++ b/models/application/applicant.json @@ -0,0 +1,15 @@ +{ + "title": "Applicant", + "type": "array", + "description": "Ein Antragsteller, entweder eine Organisation oder eine natürliche Person", + "items": { + "oneOf": [ + { + "$ref": "./applicant-person.json" + }, + { + "$ref": "./applicant-organization.json" + } + ] + } +} \ No newline at end of file diff --git a/models/application/document.json b/models/application/document.json new file mode 100644 index 00000000..2d26791f --- /dev/null +++ b/models/application/document.json @@ -0,0 +1,107 @@ +{ + "title": "Application Document", + "type": "object", + "description": "Ein im Antrag (Application) enthaltenes Dokument (z.B. Antragsformular oder hochgeladene Anlage)", + "properties": { + "doc-id": { + "type": "string", + "pattern": { + "$ref": "../common/id-string.json#/pattern" + }, + "description": "ID des Dokuments. Diese muss nur innerhalb des Antrags (Application) eindeutig sein. Es wird daher empfohlen, die IDs fortlaufend (1, 2 etc.) zu vergeben." + }, + "purpose": { + "type": "string", + "enum": [ + "form", + "attachment", + "report" + ], + "description": "Zweck/Art des Dokuments\n- form: Antragsformular\n- attachment: Anlage (Upload)\n- report: Vom System erzeugte Unterlage" + }, + "size": { + "type": "integer", + "description": "Größe des Dokuments in Bytes" + }, + "mime": { + "$ref": "../common/mime-type.json" + }, + "filename": { + "type": "string", + "description": "Ursprünglicher Dateiname bei Erzeugung oder Upload" + }, + "description": { + "type": "string", + "description": "Optionale Beschreibung des Dokuments" + }, + "lang": { + "$ref": "../common/language.json" + }, + "hash": { + "type": "object", + "description": "Prüfsumme über den Inhalt des Dokuments zur Absicherung auf dem Transportweg", + "additionalProperties": false, + "properties": { + "algorithm": { + "type": "string", + "description": "Verwendeter Algorithmus", + "enum": [ + "SHA-256", + "SHA-512" + ] + }, + "digest": { + "type": "string", + "description": "Prüfsumme, hexadezimal codiert", + "pattern": "[0-9A-F]{64,128}" + } + }, + "required": [ + "algorithm", + "digest" + ] + }, + "signature": { + "pattern": { + "$ref": "../common/base64url.json#/pattern" + }, + "type": "string", + "description": "Sofern der Antragstellers dieses Dokument signiert hat, wird die Signatur hier base64url-encoded eingebettet" + } + }, + "required": [ + "purpose", + "size", + "mime" + ], + "x-examples": { + "example-1": { + "doc-id": "1", + "purpose": "form", + "size": 39273, + "mime": "application/pdf", + "filename": "antrag.pdf", + "description": "Das Antragsformular", + "lang": { + "lang": "de", + "region": "DE" + }, + "hash": { + "algorithm": "SHA-256", + "digest": "03ba204e50d126e4674c005e04d82e84c21366780af1f43bd54a37816b6ab340" + } + }, + "example-2": { + "doc-id": "2", + "purpose": "attachment", + "size": 894834874, + "mime": "image/jpeg", + "filename": "scan.jpg", + "description": "Scan der Bescheinigung", + "hash": { + "algorithm": "SHA-256", + "digest": "e1762f14d9924e37b32f1c81dfd256410af462f5136415c96877efa8c80345d0" + } + } + } +} \ No newline at end of file diff --git a/models/application/metadata-no-id.json b/models/application/metadata-no-id.json new file mode 100644 index 00000000..83358308 --- /dev/null +++ b/models/application/metadata-no-id.json @@ -0,0 +1,165 @@ +{ + "title": "Application Metadata without ID", + "type": "object", + "description": "Metadaten eines Antrags noch ohne ID, zum Anlegen eines neuen Antrags. Nach dem Zuweisen der `application-id` wird das Modell [Application Metadata](metadata.json) verwendet.", + "properties": { + "additional-reference-info": { + "type": "object", + "properties": { + "subject": { + "type": "string" + }, + "case-id": { + "type": "string" + } + } + }, + "content-structure": { + "type": "object", + "required": [ + "data", + "docs" + ], + "properties": { + "data": { + "type": "object", + "required": [ + "schema-id" + ], + "properties": { + "schema-id": { + "type": "string", + "pattern": { + "$ref": "../common/id-string.json#/pattern" + } + }, + "mime-type": { + "type": "string", + "enum": [ + "json", + "xml" + ] + } + } + }, + "docs": { + "type": "array", + "items": { + "$ref": "./document.json" + } + } + } + }, + "public-service-type": { + "$ref": "./public-service-type.json" + }, + "applicants": { + "type": "array", + "items": { + "$ref": "./applicant.json" + } + }, + "payment-info": { + "$ref": "./payment-info.json" + } + }, + "required": [ + "content-structure" + ], + "x-examples": { + "example-1": { + "additional-reference-info": { + "subject": "Anmeldung eines Gewerbes in Musterstadt", + "case-id": "DF/8923" + }, + "content-structure": { + "data": { + "schema-id": "742", + "mime-type": "json" + }, + "docs": [ + { + "doc-id": "1", + "purpose": "form", + "size": 39273, + "mime": "application/pdf", + "filename": "antrag.pdf", + "description": "Das Antragsformular", + "lang": { + "lang": "de", + "region": "DE" + }, + "hash": { + "algorithm": "SHA-256", + "digest": "03ba204e50d126e4674c005e04d82e84c21366780af1f43bd54a37816b6ab340" + } + }, + { + "doc-id": "2", + "purpose": "attachment", + "size": 894834874, + "mime": "image/jpeg", + "filename": "scan.jpg", + "description": "Scan der Bescheinigung", + "hash": { + "algorithm": "SHA-256", + "digest": "e1762f14d9924e37b32f1c81dfd256410af462f5136415c96877efa8c80345d0" + } + } + ] + }, + "public-service-type": { + "name": "Gewerbeanmeldung", + "description": "Eine Gewerbeanmeldung ist immer dann notwendig, wenn Sie einen stehenden Gewerbebetrieb beginnen.", + "leika-id": "99050012104000", + "other-identifiers": [ + { + "id": "8664844", + "schemeURI": "service.niedersachsen.de", + "schemeName": "Serviceportal Niedersachsen" + }, + { + "id": "354824", + "schemeURI": "buerger.thueringen.de", + "schemeName": "Zuständigkeitsfinder Thüringen" + } + ] + }, + "applicants": [ + { + "person": { + "form-of-address": "Herr", + "academic-title": "Dr.", + "first-name": "Werner", + "last-name": "Mustermann" + }, + "identification": { + "authentication": { + "assurance-level": "high", + "authentification-method": "eID", + "timestamp": "2020-03-03T12:38:23Z" + }, + "authenticated-data": { + "family-name": "MUSTERMANN", + "given-name": "WERNER", + "date-of-birth": "13091970", + "place-of-resicence": { + "street": "KURZER WEG 7", + "postal-code": "12345", + "city": "ANKH-MORPORK" + } + } + } + } + ], + "payment-info": { + "reference": "TP/93/GDP", + "usage": "Gewerbeanmeldung", + "amount": 17.3, + "timestamp": "2020-03-03T12:38:23Z", + "status": "success", + "transaction": "1f77c5f9b759db9cdce59988b24974d465c7be5e462a6185485559ff6e2dea82" + } + } + } +} \ No newline at end of file diff --git a/models/application/metadata.json b/models/application/metadata.json new file mode 100644 index 00000000..7ebc7b6d --- /dev/null +++ b/models/application/metadata.json @@ -0,0 +1,121 @@ +{ + "title": "Application Metadata", + "allOf": [ + { + "type": "object", + "properties": { + "application-id": { + "type": "string", + "pattern": { + "$ref": "../common/id-string.json#/pattern" + }, + "description": "ID des Antrags" + } + }, + "required": [ + "application-id" + ] + }, + { + "$ref": "./metadata-no-id.json" + } + ], + "description": "Metadaten zu einem Antrag.", + "x-examples": { + "example-1": { + "application-id": "7236", + "additional-reference-info": { + "subject": "Anmeldung eines Gewerbes in Musterstadt", + "case-id": "DF/8923" + }, + "content-structure": { + "data": { + "schema-id": "742", + "mime-type": "json" + }, + "docs": [ + { + "doc-id": "1", + "purpose": "form", + "size": 39273, + "mime": "application/pdf", + "filename": "antrag.pdf", + "description": "Das Antragsformular", + "lang": { + "lang": "de", + "region": "DE" + }, + "hash": { + "algorithm": "SHA-256", + "digest": "03ba204e50d126e4674c005e04d82e84c21366780af1f43bd54a37816b6ab340" + } + }, + { + "doc-id": "2", + "purpose": "attachment", + "size": 894834874, + "mime": "image/jpeg", + "filename": "scan.jpg", + "description": "Scan der Bescheinigung", + "hash": { + "algorithm": "SHA-256", + "digest": "e1762f14d9924e37b32f1c81dfd256410af462f5136415c96877efa8c80345d0" + } + } + ] + }, + "public-service-type": { + "name": "Gewerbeanmeldung", + "description": "Eine Gewerbeanmeldung ist immer dann notwendig, wenn Sie einen stehenden Gewerbebetrieb beginnen.", + "leika-id": "99050012104000", + "other-identifiers": [ + { + "id": "8664844", + "schemeURI": "service.niedersachsen.de", + "schemeName": "Serviceportal Niedersachsen" + }, + { + "id": "354824", + "schemeURI": "buerger.thueringen.de", + "schemeName": "Zuständigkeitsfinder Thüringen" + } + ] + }, + "applicants": [ + { + "person": { + "form-of-address": "Herr", + "academic-title": "Dr.", + "first-name": "Werner", + "last-name": "Mustermann" + }, + "identification": { + "authentication": { + "assurance-level": "high", + "authentification-method": "eID", + "timestamp": "2020-03-03T12:38:23Z" + }, + "authenticated-data": { + "family-name": "MUSTERMANN", + "given-name": "WERNER", + "date-of-birth": "13091970", + "place-of-resicence": { + "street": "KURZER WEG 7", + "postal-code": "12345", + "city": "ANKH-MORPORK" + } + } + } + } + ], + "payment-info": { + "reference": "TP/93/GDP", + "usage": "Gewerbeanmeldung", + "amount": 17.3, + "timestamp": "2020-03-03T12:38:23Z", + "status": "success", + "transaction": "1f77c5f9b759db9cdce59988b24974d465c7be5e462a6185485559ff6e2dea82" + } + } + } +} \ No newline at end of file diff --git a/models/application/payment-info.json b/models/application/payment-info.json new file mode 100644 index 00000000..a672941d --- /dev/null +++ b/models/application/payment-info.json @@ -0,0 +1,56 @@ +{ + "type": "object", + "title": "Payment Info", + "description": "Informationen über eine im Antragsprozess erfolgte Bezahlung.", + "additionalProperties": false, + "properties": { + "reference": { + "type": "string", + "description": "Bezahlreferenz, z.B. ein Kassenzeichen" + }, + "usage": { + "type": "string", + "description": "Verwendungszweck", + "maxLength": 27 + }, + "amount": { + "type": "number", + "minimum": 0.01, + "multipleOf": 0.01, + "description": "Geldbetrag" + }, + "timestamp": { + "type": "string", + "description": "Zeitpunkt der Bezahlung", + "format": "date-time" + }, + "status": { + "type": "string", + "description": "Status der Bezahlung", + "enum": [ + "success", + "failed", + "open" + ] + }, + "transaction": { + "type": "string", + "description": "Informationen zur Bezahltransaktion, z.B. eine Transaktions-ID" + } + }, + "required": [ + "usage", + "amount", + "status" + ], + "x-examples": { + "example-1": { + "reference": "TP/93/GDP", + "usage": "Gewerbeanmeldung", + "amount": 17.3, + "timestamp": "2020-03-03T12:38:23Z", + "status": "success", + "transaction": "1f77c5f9b759db9cdce59988b24974d465c7be5e462a6185485559ff6e2dea82" + } + } +} \ No newline at end of file diff --git a/models/application/public-service-type.json b/models/application/public-service-type.json new file mode 100644 index 00000000..b0f254d8 --- /dev/null +++ b/models/application/public-service-type.json @@ -0,0 +1,54 @@ +{ + "type": "object", + "title": "Public Service Type", + "description": "Leistung\n\nThis represents the Type of a Public Service. For the indicating the Type, we are referring to the functions of government to indicate the purpose of a government activity, which the public service is intended for.", + "additionalProperties": false, + "x-examples": { + "example-1": { + "name": "Gewerbeanmeldung", + "leika-id": "99050012104000" + }, + "example-2": { + "name": "Gewerbeanmeldung", + "description": "Eine Gewerbeanmeldung ist immer dann notwendig, wenn Sie einen stehenden Gewerbebetrieb beginnen.", + "leika-id": "99050012104000", + "other-identifiers": [ + { + "id": "8664844", + "schemeURI": "service.niedersachsen.de", + "schemeName": "Serviceportal Niedersachsen" + }, + { + "id": "354824", + "schemeURI": "buerger.thueringen.de", + "schemeName": "Zuständigkeitsfinder Thüringen" + } + ] + } + }, + "properties": { + "name": { + "type": "string", + "description": "Name/Bezeichnung der behördlichen Leistung" + }, + "description": { + "type": "string", + "description": "(Kurz-)Beschreibung der behördlichen Leistung" + }, + "leika-id": { + "type": "string", + "pattern": "^[0-9]{2}([0-9]{3}){1,4}$", + "description": "ID aus dem Leistungskatalog (Leika)" + }, + "other-identifiers": { + "type": "array", + "description": "Weitere Identifikatioren. Die ID wird in `content` abgelegt, zusätzlich sollten die Schema-Attribute zur Spezifikation des Gültigkeitsraumes verwendet werden.", + "items": { + "$ref": "../common/identifier.json" + } + } + }, + "required": [ + "name" + ] +} \ No newline at end of file diff --git a/models/application/schema.json b/models/application/schema.json new file mode 100644 index 00000000..599ed36a --- /dev/null +++ b/models/application/schema.json @@ -0,0 +1,32 @@ +{ + "title": "Application Schema", + "type": "object", + "description": "Strukturinformationen zu übertragbaren oder übertragenen Daten.", + "properties": { + "schema-id": { + "description": "Vom Zustelldienst vergebene ID für dieses Schema. Wird beim Anlegen eines neuen Schemas weggelassen.", + "pattern": { + "$ref": "../common/id-string.json#/pattern" + }, + "type": "string" + }, + "fim-schema": { + "$ref": "../common/fim-id.json" + } + }, + "x-examples": { + "example-1": { + "fim-schema": { + "id": "S00000001", + "version": "1.0" + } + }, + "example-2": { + "schema-id": "8438", + "fim-schema": { + "id": "S00000001", + "version": "1.0" + } + } + } +} \ No newline at end of file diff --git a/models/common/address-international.json b/models/common/address-international.json new file mode 100644 index 00000000..9c0b91b1 --- /dev/null +++ b/models/common/address-international.json @@ -0,0 +1,29 @@ +{ + "title": "International Address", + "type": "object", + "description": "Eine internationale Adresse, bestehend aus ein bis fünf Adresszeilen.", + "x-examples": { + "example-1": { + "lines": [ + "760 United Nations Plaza", + "Manhattan, New York City, New York 10017" + ] + }, + "example-2": { + "lines": [ + "Threadneedle Street", + "London EC2R 8AH" + ] + } + }, + "properties": { + "lines": { + "type": "array", + "maxItems": 5, + "minItems": 1, + "items": { + "type": "string" + } + } + } +} \ No newline at end of file diff --git a/models/common/address-national.json b/models/common/address-national.json new file mode 100644 index 00000000..8f02ea9b --- /dev/null +++ b/models/common/address-national.json @@ -0,0 +1,31 @@ +{ + "title": "National Address", + "type": "object", + "description": "Eine nationale (deutsche) Adresse, bestehend aus Straße, Hausnummer, PLZ und Ort.", + "properties": { + "street": { + "type": "string", + "description": "Straße" + }, + "house-number": { + "type": "string", + "description": "Hausnummer" + }, + "postal-code": { + "type": "string", + "description": "PLZ" + }, + "city": { + "type": "string", + "description": "Ort" + } + }, + "x-examples": { + "example-1": { + "street": "Kurzer Weg", + "house-number": "7", + "postal-code": "12345", + "city": "Ankh-Morpork" + } + } +} \ No newline at end of file diff --git a/models/common/authentification-info.json b/models/common/authentification-info.json new file mode 100644 index 00000000..75d89e3d --- /dev/null +++ b/models/common/authentification-info.json @@ -0,0 +1,28 @@ +{ + "title": "authentification-info", + "type": "object", + "properties": { + "assurance-level": { + "type": "string", + "enum": [ + "low", + "substantial", + "high" + ] + }, + "authentification-method": { + "type": "string" + }, + "authentification-token": { + "type": "object" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "assurance-level", + "authentification-method" + ] +} \ No newline at end of file diff --git a/models/common/base64url.json b/models/common/base64url.json new file mode 100644 index 00000000..56ea2aeb --- /dev/null +++ b/models/common/base64url.json @@ -0,0 +1,8 @@ +{ + "type": "string", + "title": "base64url", + "description": "Base 64 Encoding with URL and Filename Safe Alphabet (RFC 4648 section 5)", + "example": "SGVsbG8gV29ybGQhCg==", + "pattern": "^[a-zA-Z0-9-_=]+$", + "x-examples": {} +} \ No newline at end of file diff --git a/models/common/eID-natural-person.json b/models/common/eID-natural-person.json new file mode 100644 index 00000000..28efe07e --- /dev/null +++ b/models/common/eID-natural-person.json @@ -0,0 +1,17 @@ +{ + "title": "Identity Information for Persons", + "description": "", + "allOf": [ + { + "$ref": "./eID-org-acting-person.json" + }, + { + "type": "object", + "properties": { + "place-of-residence": { + "$ref": "./address-national.json" + } + } + } + ] +} \ No newline at end of file diff --git a/models/common/eID-org-acting-person.json b/models/common/eID-org-acting-person.json new file mode 100644 index 00000000..b30951a7 --- /dev/null +++ b/models/common/eID-org-acting-person.json @@ -0,0 +1,49 @@ +{ + "title": "Identity Information for Organization Acting Person", + "type": "object", + "properties": { + "place-of-birth": { + "type": "string", + "description": "Geburtsort" + }, + "date-of-birth": { + "type": "string", + "format": "date", + "description": "Geburtsdatum" + }, + "gender": { + "type": "string", + "enum": [ + "m", + "w", + "x", + "d" + ], + "description": "Geschlecht (m=männlich, w=weiblich, x=keine Angabe, d=divers)" + }, + "nationality": { + "type": "string", + "description": "Nationalität" + }, + "artictic-name": { + "type": "string", + "description": "Künstler- oder Ordensname" + }, + "academic-title": { + "type": "string", + "description": "Akademischer Titel, z.B. \"Dr.\" oder \"Prof.\"" + }, + "birth-name": { + "type": "string", + "description": "Geburtsname" + }, + "given-name": { + "type": "string", + "description": "Vorname(n)" + }, + "family-name": { + "type": "string", + "description": "Familienname" + } + } +} \ No newline at end of file diff --git a/models/common/fim-id.json b/models/common/fim-id.json new file mode 100644 index 00000000..fabe7f12 --- /dev/null +++ b/models/common/fim-id.json @@ -0,0 +1,32 @@ +{ + "type": "object", + "title": "FIM ID", + "description": "ID eines FIM Elements, zusammengesetzt aus ID und Version.", + "additionalProperties": false, + "properties": { + "id": { + "type": "string", + "description": "ID des FIM Elements, z.B. \"S00000001\"", + "example": "S00000001", + "pattern": "^[DFGS]\\d{8}$" + }, + "version": { + "type": "string", + "description": "Optionale Version des FIM Elements, z.B. \"1.0\"", + "example": "1.0", + "pattern": "^\\d+\\.\\d+$" + } + }, + "required": [ + "id" + ], + "x-examples": { + "example-1": { + "id": "S00000001", + "version": "1.0" + }, + "example-2": { + "id": "F99000042" + } + } +} \ No newline at end of file diff --git a/models/common/id-string.json b/models/common/id-string.json new file mode 100644 index 00000000..3c2a17e8 --- /dev/null +++ b/models/common/id-string.json @@ -0,0 +1,7 @@ +{ + "type": "string", + "title": "ID String", + "description": "Datentyp für IDs. Darf nur die Zeichen A-Z, a-z, 0-9 sowie Bindestrich (-), Unterstrich (_) und Punkt (.) enthalten.\n", + "example": "JB007", + "pattern": "^[-_.A-Za-z0-9]+$" +} \ No newline at end of file diff --git a/models/common/identifier.json b/models/common/identifier.json new file mode 100644 index 00000000..60177411 --- /dev/null +++ b/models/common/identifier.json @@ -0,0 +1,59 @@ +{ + "title": "Identifier", + "type": "object", + "description": "Identifiers are keys that are owned by either the sender, receiver or a third party. If the keys used are owned by either sender or receiver, no meta data has to be specified by means of attributes. The table below specifies the use of attributes for the identifier types when they are owned by a third party.", + "properties": { + "id": { + "type": "string", + "description": "A character string to identify and distinguish uniquely, one instance of an object in an identification scheme from all other objects in the same scheme together with relevant supplementary information." + }, + "schemeURI": { + "type": "string", + "format": "uri", + "description": "Link to the location of the list scheme" + }, + "schemeDataURI": { + "type": "string", + "format": "uri", + "description": "Link to the location of the list" + }, + "schemeVersionID": { + "type": "string", + "description": "Version of the scheme" + }, + "schemeAgencyName": { + "type": "string", + "description": "Specifies the name of the ID issuer" + }, + "schemeAgencyID": { + "type": "string", + "description": "Specifies the ID of the ID issuer" + }, + "schemeName": { + "type": "string", + "description": "Name of the scheme" + }, + "schemeID": { + "type": "string", + "description": "Identifices the ID type" + } + }, + "required": [ + "id" + ], + "x-examples": { + "example-1": { + "id": "978-1-894049-23-8", + "schemeID": "ISBN" + }, + "example-2": { + "id": "99050012104000", + "schemeURI": "https://www.xrepository.de/details/urn:de:gkleika:leika:leistung", + "schemeDataURI": "https://www.xrepository.de/details/urn:de:gkleika:leika:leistung_20180705#version", + "schemeVersionID": "urn:de:gkleika:leika:leistung_20180705", + "schemeAgencyName": "Geschäfts- und Koordinierungsstelle LeiKa beim Ministerium der Finanzen des Landes Sachsen-Anhalt (GK_LEIKA)", + "schemeName": "Leistungen des LeiKa", + "schemeID": "urn:de:gkleika:leika:leistung" + } + } +} \ No newline at end of file diff --git a/models/common/language.json b/models/common/language.json new file mode 100644 index 00000000..8dc6076a --- /dev/null +++ b/models/common/language.json @@ -0,0 +1,46 @@ +{ + "type": "object", + "title": "Language", + "description": "Angaben zur Sprache basierend auf dem IETF language tag. Es wird jedoch nur ein Subset unterstützt:\n- `lang`: Die Primary Language darf nur aus zwei oder drei Kleinbuchstaben bestehen (gemäß ISO 639-1 (2002), ISO 639-2 (1998), ISO 639-3 (2007) oder ISO 639-5 (2008))\n- `region`: Die Region muss aus zwei Großbuchstaben bestehen (gemäß ISO 3166-1 alpha-2)\n- `variant`: Sprachvariante (gemäß IANA Registry), derzeit wird nur `simple` unterstützt.", + "additionalProperties": false, + "properties": { + "lang": { + "type": "string", + "description": "primary language based on a two-letter language code from ISO 639-1 (2002) or a three-letter code from ISO 639-2 (1998), ISO 639-3 (2007) or ISO 639-5 (2008)", + "minLength": 2, + "maxLength": 3, + "pattern": "[a-z]{2,3}" + }, + "region": { + "type": "string", + "description": "region based on a two-letter country code from ISO 3166-1 alpha-2", + "minLength": 2, + "maxLength": 2, + "pattern": "[A-Z]{2}" + }, + "variant": { + "type": "string", + "enum": [ + "simple" + ], + "description": "Subset der IANA language variant subtags\n- `simple`: Simplified form" + } + }, + "required": [ + "lang" + ], + "x-examples": { + "example-1": { + "lang": "de" + }, + "example-2": { + "lang": "en", + "region": "GB" + }, + "example-3": { + "lang": "de", + "region": "DE", + "variant": "simple" + } + } +} \ No newline at end of file diff --git a/models/common/mime-type.json b/models/common/mime-type.json new file mode 100644 index 00000000..ed7f80eb --- /dev/null +++ b/models/common/mime-type.json @@ -0,0 +1,7 @@ +{ + "type": "string", + "title": "MIME Type", + "description": "Internet Media Type gemäß RFC 2045, z.B. application/pdf.", + "example": "application/xml", + "pattern": "^[-\\w.]+/[-\\w.+]+$" +} \ No newline at end of file diff --git a/models/common/phone.json b/models/common/phone.json new file mode 100644 index 00000000..d3969595 --- /dev/null +++ b/models/common/phone.json @@ -0,0 +1,27 @@ +{ + "title": "phone", + "type": "object", + "description": "Telefonnumer mit Zusatzinformationen", + "properties": { + "number": { + "type": "string", + "title": "Phone Number", + "example": "+49 89 32168-42", + "pattern": "^\\+[1-9]([ -]?[0-9]){1,14}$", + "description": "Telefonnummer im internationalen Format, z.B. \"+49 89 32168-42\". Muss mit einem Plus beginnen und darf danach außer Ziffern nur Leerzeichen ( ) und Bindestriche (-) enthalten." + }, + "mobile": { + "type": "boolean", + "description": "Zeigt an, ob es sich um eine Mobilfunknummer handelt." + }, + "type": { + "type": "string", + "enum": [ + "work", + "home", + "other" + ], + "description": "Art der Telefonnummer: work=dienstlich, home=privat oder other=sonstige" + } + } +} \ No newline at end of file diff --git a/models/common/phonenr.json b/models/common/phonenr.json new file mode 100644 index 00000000..a32d8d00 --- /dev/null +++ b/models/common/phonenr.json @@ -0,0 +1,7 @@ +{ + "type": "string", + "title": "Phone Number", + "example": "+49 89 32168-42", + "pattern": "^\\+[1-9]([ -]?[0-9]){1,14}$", + "description": "Telefonnummer im internationalen Format, z.B. \"+49 89 32168-42\". Muss mit einem Plus beginnen und darf danach außer Ziffern nur Leerzeichen ( ) und Bindestriche (-) enthalten." +} \ No newline at end of file diff --git a/models/destination-no-id.json b/models/destination-no-id.json new file mode 100644 index 00000000..8cf61c3b --- /dev/null +++ b/models/destination-no-id.json @@ -0,0 +1,63 @@ +{ + "title": "Destination without ID", + "type": "object", + "description": "Daten eines technischen Übergabepunkts (Ziel der Übertragung - z.B. ein Fachverfahren) noch ohne ID, zum Anlegen eines neuen Übergabepunkts. Nach dem Zuweisen der `destination-id` wird das Modell [Destination](destination.json) verwendet.", + "x-examples": { + "example-1": { + "organization": { + "organization-name": "Gewerbeamt Musterhausen" + }, + "technical-contact": [ + { + "first-name": "Werner", + "last-name": "Mustermann", + "contact": { + "telephone": [ + { + "number": "+49 89 32168-42", + "mobile": false, + "type": "work" + } + ] + } + } + ], + "callback": { + "callback-url": "https://www.example.com/callback" + } + } + }, + "properties": { + "organization": { + "$ref": "./person/public-organization.json" + }, + "technical-contact": { + "type": "array", + "description": "Technischer Ansprechpartner", + "items": { + "$ref": "./person/individual.json" + } + }, + "schemas": { + "type": "array", + "description": "Zulässige Schemas, die zu diesem Ziel übertragen werden können. Sofern leer dürfen Anträge (Application) keinen Datensatz (ApplicationData) enthalten.", + "items": { + "$ref": "./application/schema.json" + } + }, + "callback": { + "type": "object", + "description": "Callback zur Benachrichtigung bei neuen Anträgen", + "properties": { + "callback-url": { + "type": "string", + "description": "URL auf die der Callback als POST durchgeführt wird", + "format": "uri" + } + }, + "required": [ + "callback-url" + ] + } + } +} \ No newline at end of file diff --git a/models/destination.json b/models/destination.json new file mode 100644 index 00000000..96186fd0 --- /dev/null +++ b/models/destination.json @@ -0,0 +1,50 @@ +{ + "title": "Destination", + "allOf": [ + { + "type": "object", + "properties": { + "destination-id": { + "description": "Vom Zustelldienst für dieses Ziel vergebene ID. Wird beim Anlegen eines neuen Ziels leer gelassen.", + "pattern": { + "$ref": "./common/id-string.json#/pattern" + }, + "type": "string" + } + }, + "required": [ + "destination-id" + ] + }, + { + "$ref": "./destination-no-id.json" + } + ], + "description": "Beschreibung eines technischen Übergabepunkts", + "x-examples": { + "example-1": { + "destination-id": "83578", + "organization": { + "organization-name": "Gewerbeamt Musterhausen" + }, + "technical-contact": [ + { + "first-name": "Werner", + "last-name": "Mustermann", + "contact": { + "telephone": [ + { + "number": "+49 89 32168-42", + "mobile": false, + "type": "work" + } + ] + } + } + ], + "callback": { + "callback-url": "https://www.example.com/callback" + } + } + } +} \ No newline at end of file diff --git a/models/error.json b/models/error.json new file mode 100644 index 00000000..e9461d20 --- /dev/null +++ b/models/error.json @@ -0,0 +1,23 @@ +{ + "title": "Error", + "type": "object", + "description": "Rückmeldung zu einer nicht erfolgreichen Operation", + "properties": { + "code": { + "type": "integer", + "description": "Fehlercode" + }, + "msg": { + "type": "string", + "description": "Fehlermeldung" + }, + "ref": { + "type": "string", + "description": "Referenz auf die Stelle, an der der Fehler aufgetreten ist. Dies könnte z.B. eine Zeilennummer oder der Pfad eines JSON oder XML Elements sein." + } + }, + "required": [ + "code", + "msg" + ] +} \ No newline at end of file diff --git a/models/person/abstract-person.json b/models/person/abstract-person.json new file mode 100644 index 00000000..8b631c5d --- /dev/null +++ b/models/person/abstract-person.json @@ -0,0 +1,74 @@ +{ + "title": "Abstract Person", + "type": "object", + "description": "Abstrakte Klasse für natürliche Person (Individual) und Organisation (Organization)", + "properties": { + "address": { + "description": "Adresse als Alternative (Choice) von nationaler und internationaler Adresse.", + "oneOf": [ + { + "$ref": "../common/address-national.json" + }, + { + "$ref": "../common/address-international.json" + } + ] + }, + "identifiers": { + "type": "array", + "description": "Externe Identifikatoren der Person", + "items": { + "$ref": "../common/identifier.json" + } + }, + "contact": { + "description": "Kontaktmöglichkeiten einer Person (natürliche Person oder Organisation)", + "type": "object", + "properties": { + "telephone": { + "type": "array", + "description": "Liste der Telefonnummern, außer Fax", + "items": { + "type": "object", + "description": "Telefonnumer mit Zusatzinformationen", + "properties": { + "number": { + "$ref": "../common/phonenr.json" + }, + "mobile": { + "type": "boolean", + "description": "Zeigt an, ob es sich um eine Mobilfunknummer handelt." + }, + "type": { + "type": "string", + "enum": [ + "work", + "home", + "other" + ], + "description": "Art der Telefonnummer: work=dienstlich, home=privat oder other=sonstige" + } + }, + "required": [ + "number", + "type" + ] + } + }, + "email": { + "type": "string", + "format": "email", + "description": "E-Mail-Adresse" + }, + "www": { + "type": "string", + "format": "uri", + "description": "Webadresse" + }, + "telefax": { + "$ref": "../common/phonenr.json" + } + } + } + } +} \ No newline at end of file diff --git a/models/person/individual.json b/models/person/individual.json new file mode 100644 index 00000000..b00e4996 --- /dev/null +++ b/models/person/individual.json @@ -0,0 +1,47 @@ +{ + "title": "Individual", + "allOf": [ + { + "$ref": "./abstract-person.json" + }, + { + "type": "object", + "properties": { + "form-of-address": { + "type": "string", + "description": "Anrede der Person wie \"Herr\" oder \"Frau\"" + }, + "academic-title": { + "type": "string", + "description": "Titel der Person wie \"Dr.\" oder \"Prof.\"" + }, + "first-name": { + "type": "string", + "description": "Vorname der Person" + }, + "last-name": { + "type": "string", + "description": "Nachname der Person" + } + } + } + ], + "description": "Natürliche Person", + "x-examples": { + "example-1": { + "form-of-address": "Herr", + "academic-title": "Dr.", + "first-name": "Werner", + "last-name": "Mustermann", + "contact": { + "telephone": [ + { + "number": "+49 89 32168-42", + "mobile": false, + "type": "work" + } + ] + } + } + } +} \ No newline at end of file diff --git a/models/person/organization.json b/models/person/organization.json new file mode 100644 index 00000000..fcfed302 --- /dev/null +++ b/models/person/organization.json @@ -0,0 +1,28 @@ +{ + "title": "Organization", + "allOf": [ + { + "type": "object", + "properties": { + "organization-name": { + "type": "string", + "description": "Name der Organisation" + }, + "agents": { + "type": "array", + "description": "Ansprechpartner der Organisation", + "items": { + "$ref": "./individual.json" + } + } + }, + "required": [ + "organization-name" + ] + }, + { + "$ref": "./abstract-person.json" + } + ], + "description": "Eine Organisation, z.B. ein Unternehmen; für Behörden gibt es den Untertyp \"PublicOrganization\"" +} \ No newline at end of file diff --git a/models/person/public-organization.json b/models/person/public-organization.json new file mode 100644 index 00000000..cd29085f --- /dev/null +++ b/models/person/public-organization.json @@ -0,0 +1,12 @@ +{ + "title": "Public Organization", + "description": "Behörde", + "allOf": [ + { + "$ref": "./organization.json" + }, + { + "type": "object" + } + ] +} \ No newline at end of file diff --git a/models/status.json b/models/status.json new file mode 100644 index 00000000..1352b2dc --- /dev/null +++ b/models/status.json @@ -0,0 +1,28 @@ +{ + "type": "object", + "title": "Status", + "description": "Status der Zustellung eines Antrags:\n- `incomplete`: Die Einlieferung von der Source hat begonnen\n- `queued`: Die Übertragung wurde vollständig eingeliefert und akzeptiert\n- `sending`: Die Weitergabe wurde begonnen\n- `forwarded`: Die Übertragung an die direkt angebundene Destination wurde abgeschlossen\n- `delivered`: Die Übertragung hat den vorgesehen Endpunkt erreicht", + "additionalProperties": false, + "properties": { + "code": { + "type": "string", + "enum": [ + "incomplete", + "queued", + "sending", + "forwarded", + "delivered" + ], + "description": "Code für den Status (incomplete, queued, sending, forwarded, delivered)" + }, + "since": { + "type": "string", + "format": "date-time", + "description": "Zeitpunkt, zu dem der Status sich geändert hat" + } + }, + "required": [ + "code", + "since" + ] +} \ No newline at end of file diff --git a/reference/callback.json b/reference/callback.json new file mode 100644 index 00000000..2e00f599 --- /dev/null +++ b/reference/callback.json @@ -0,0 +1,91 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Notification Callback", + "version": "1.0", + "contact": { + "name": "FITKO", + "url": "https://www.fitko.de/" + }, + "license": { + "name": "Creative Commons Attribution Share Alike 4.0 (CC BY-SA 4.0)", + "url": "https://creativecommons.org/licenses/by-sa/4.0/" + }, + "description": "Pseudo API um den Callback zu modellieren." + }, + "servers": [ + { + "url": "http://localhost:3000" + } + ], + "paths": { + "/{path}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "path", + "in": "path", + "required": true + } + ], + "post": { + "summary": "Callback", + "operationId": "callback", + "responses": { + "200": { + "description": "OK" + } + }, + "description": "Beschreibt den Callback, mit dem der Zustelldienst den Subscriber benachrichtigt.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "destination-id": { + "type": "string" + }, + "applications": { + "type": "array", + "items": { + "type": "object", + "properties": { + "application-id": { + "type": "string" + } + } + } + } + } + }, + "examples": { + "example-1": { + "value": { + "destination-id": "821", + "applications": [ + { + "application-id": "98472" + } + ] + } + } + } + } + }, + "description": "Information zu den wartenden Anträgen" + }, + "tags": [ + "callback" + ] + } + } + }, + "tags": [ + { + "name": "callback" + } + ] +} \ No newline at end of file diff --git a/reference/sender.json b/reference/sender.json new file mode 100644 index 00000000..a55ccbcc --- /dev/null +++ b/reference/sender.json @@ -0,0 +1,653 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Application Sender API", + "version": "1.0", + "description": "API vom Onlineantragsdienst zum Zustelldienst", + "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)" + } + }, + "servers": [ + { + "url": "http://localhost:3000" + } + ], + "paths": { + "/{source-id}/{destination-id}/{application-id}/data": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "source-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "destination-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "application-id", + "in": "path", + "required": true + } + ], + "put": { + "summary": "Add Application Data", + "operationId": "add-application-data", + "responses": { + "202": { + "description": "Accepted" + }, + "406": { + "description": "Not Acceptable - Kein Schema zugeordnet oder Schemafehler", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + }, + "410": { + "description": "Gone - Transfer-ID ungültig/Transfer-Timeout", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + }, + "413": { + "description": "Request Entity Too Large - Übertragung zu groß", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + } + }, + "description": "Datensatz übertragen", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + }, + "application/xml": { + "schema": { + "type": "object", + "properties": {} + } + } + }, + "description": "JSON oder XML Daten" + }, + "tags": [ + "transfer" + ] + } + }, + "/{source-id}/{destination-id}/{application-id}/docs/{doc-id}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "source-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "destination-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "application-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "doc-id", + "in": "path", + "required": true + } + ], + "put": { + "summary": "Add Application Document", + "operationId": "add-application-doc", + "responses": { + "202": { + "description": "Accepted" + }, + "400": { + "description": "Bad Request - Signaturprüfung nicht erfolgreich - Signatur passt nicht zum Dokument", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + }, + "404": { + "description": "Not Acceptable - Falsche doc-id", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + }, + "410": { + "description": "Gone - Transfer-ID ungültig/Transfer-Timeout", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + }, + "413": { + "description": "Request Entity Too Large - Attachment zu groß oder Gesamtübertragung zu groß", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + }, + "415": { + "description": "Unsupported Media Type - Nicht unterstützter oder falscher Datentyp", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + } + }, + "description": "Lädt ein Antragsformuar oder einen Anhang hoch, um ihn dem Antrag hinzuzufügen.", + "requestBody": { + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "tags": [ + "transfer" + ] + } + }, + "/{source-id}/{application-id}/status": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "source-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "application-id", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Get Status", + "tags": [ + "status" + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "current": { + "$ref": "../models/status.json" + }, + "history": { + "type": "array", + "items": { + "$ref": "../models/status.json" + } + } + } + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + } + }, + "operationId": "get-application-status", + "description": "Ruft den aktuellen Status der Übermittlung ab." + } + }, + "/{source-id}/{application-id}/status/{status-nr}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "source-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "application-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "status-nr", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Get Status Entry", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "../models/status.json" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + } + }, + "operationId": "get-application-status-entry", + "description": "Ruft einen spezifischen Statuswechsel aus der Historie des Status ab.", + "tags": [ + "status" + ] + } + }, + "/{source-id}/{destination-id}/{application-id}/upload-status": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "source-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "destination-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "application-id", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Get Application Upload Status", + "tags": [ + "transfer" + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "status": { + "type": "string", + "enum": [ + "missing", + "partial", + "complete" + ] + }, + "length": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "status", + "length" + ] + }, + "docs": { + "type": "array", + "items": { + "type": "object", + "properties": { + "status": { + "type": "string", + "enum": [ + "missing", + "partial", + "complete" + ] + }, + "length": { + "type": "integer", + "minimum": 0 + } + }, + "required": [ + "status", + "length" + ] + } + } + } + } + } + } + }, + "410": { + "description": "Gone", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + } + }, + "operationId": "get-application-upload-status", + "description": "Abfrage des Übermittlungsstatus. Listet alle Unterresourcen (data und docs) mit Übermittlungsstatus auf." + } + }, + "/{source-id}/{destination-id}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "source-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "destination-id", + "in": "path", + "required": true + } + ], + "post": { + "summary": "Create Application", + "operationId": "create-transfer", + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "application-id": { + "type": "string" + } + } + } + } + } + }, + "406": { + "description": "Not Acceptable", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + }, + "413": { + "description": "Request Entity Too Large", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + } + }, + "tags": [ + "transfer" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "../models/application/metadata-no-id.json" + } + } + }, + "description": "Transfer" + }, + "description": "Übertragung initiieren" + }, + "get": { + "summary": "Get Destination", + "operationId": "get-destination-info", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "../models/destination.json" + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + } + }, + "description": "Ruft die Information über eine Destination ab", + "tags": [ + "destination" + ] + } + }, + "/{source-id}/{destination-id}/{application-id}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "source-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "destination-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "application-id", + "in": "path", + "required": true + } + ], + "post": { + "summary": "Commit Application", + "operationId": "commit-transfer", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "../models/status.json" + } + } + } + }, + "400": { + "description": "Bad Request - Unvollständig", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + }, + "410": { + "description": "Gone - Transfer-ID ungültig/Transfer-Timeout", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + }, + "413": { + "description": "Request Entity Too Large - Gesamtübertragung zu groß", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + } + }, + "description": "Übertragung abschließen", + "parameters": [], + "tags": [ + "transfer" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + }, + "description": "" + } + } + } + }, + "tags": [ + { + "name": "transfer" + }, + { + "name": "status" + }, + { + "name": "destination" + }, + { + "name": "source" + } + ] +} \ No newline at end of file diff --git a/reference/subscriber.json b/reference/subscriber.json new file mode 100644 index 00000000..de926c08 --- /dev/null +++ b/reference/subscriber.json @@ -0,0 +1,816 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Application Subscriber API", + "version": "1.0", + "description": "API vom Fachverfahren zum Zustelldienst", + "contact": { + "name": "FITKO", + "url": "https://www.fitko.de/" + }, + "license": { + "name": "Creative Commons Attribution Share Alike 4.0 (CC BY-SA 4.0)", + "url": "https://creativecommons.org/licenses/by-sa/4.0/" + } + }, + "servers": [ + { + "url": "http://localhost:3000" + } + ], + "paths": { + "/{subscriber-id}/destinations/{destination-id}/applications/{application-id}/docs/{doc-id}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "subscriber-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "destination-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "application-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "doc-id", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Get Application Document", + "tags": [ + "transfer" + ], + "responses": { + "200": { + "description": "OK", + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "operationId": "get-application-document", + "description": "Ruf ein Dokument (Formular oder Anlage) der Application ab." + } + }, + "/{subscriber-id}/destinations/{destination-id}/applications/{application-id}/data": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "subscriber-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "destination-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "application-id", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Get Application Data", + "tags": [ + "transfer" + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + }, + "application/xml": { + "schema": { + "type": "object", + "properties": {} + } + } + } + }, + "404": { + "description": "Not Found" + } + }, + "operationId": "get-application-data", + "description": "Ruft die Fachdaten der Application ab." + } + }, + "/{subscriber-id}/destinations/{destination-id}/applications/{application-id}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "subscriber-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "destination-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "application-id", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Get Application Metadata", + "tags": [ + "transfer" + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "../models/application/metadata.json" + }, + "examples": { + "example-1": { + "value": { + "application-id": "7236", + "additional-reference-info": { + "subject": "Anmeldung eines Gewerbes in Musterstadt", + "case-id": "DF/8923" + }, + "content-structure": { + "data": { + "schema-id": "742", + "mime-type": "json" + }, + "docs": [ + { + "doc-id": "1", + "purpose": "form", + "size": 39273, + "mime": "application/pdf", + "filename": "antrag.pdf", + "description": "Das Antragsformular", + "lang": { + "lang": "de", + "region": "DE" + }, + "hash": { + "algorithm": "SHA-256", + "digest": "03ba204e50d126e4674c005e04d82e84c21366780af1f43bd54a37816b6ab340" + } + }, + { + "doc-id": "2", + "purpose": "attachment", + "size": 894834874, + "mime": "image/jpeg", + "filename": "scan.jpg", + "description": "Scan der Bescheinigung", + "hash": { + "algorithm": "SHA-256", + "digest": "e1762f14d9924e37b32f1c81dfd256410af462f5136415c96877efa8c80345d0" + } + } + ] + }, + "public-service-type": { + "name": "Gewerbeanmeldung", + "description": "Eine Gewerbeanmeldung ist immer dann notwendig, wenn Sie einen stehenden Gewerbebetrieb beginnen.", + "leika-id": "99050012104000", + "other-identifiers": [ + { + "id": "8664844", + "schemeURI": "service.niedersachsen.de", + "schemeName": "Serviceportal Niedersachsen" + }, + { + "id": "354824", + "schemeURI": "buerger.thueringen.de", + "schemeName": "Zuständigkeitsfinder Thüringen" + } + ] + }, + "applicants": [ + { + "person": { + "form-of-address": "Herr", + "academic-title": "Dr.", + "first-name": "Werner", + "last-name": "Mustermann" + }, + "identification": { + "authentication": { + "assurance-level": "high", + "authentification-method": "eID", + "timestamp": "2020-03-03T12:38:23Z" + }, + "authenticated-data": { + "family-name": "MUSTERMANN", + "given-name": "WERNER", + "date-of-birth": "13091970", + "place-of-resicence": { + "street": "KURZER WEG 7", + "postal-code": "12345", + "city": "ANKH-MORPORK" + } + } + } + } + ], + "payment-info": { + "reference": "TP/93/GDP", + "usage": "Gewerbeanmeldung", + "amount": 17.3, + "timestamp": "2020-03-03T12:38:23Z", + "status": "success", + "transaction": "1f77c5f9b759db9cdce59988b24974d465c7be5e462a6185485559ff6e2dea82" + } + } + } + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + } + }, + "operationId": "get-application", + "description": "Ruft eine wartende Application ab." + }, + "post": { + "summary": "Commit Application", + "operationId": "commit-application", + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + }, + "417": { + "description": "Expectation Failed - Status passt nicht" + } + }, + "tags": [ + "transfer" + ], + "description": "Bestätigt die Abholung der Application. Über den Parameter `final-delivery` im Body wird gesteuert, wie der Folgestatus aussieht:\n\n| final-delivery | status |\n| -------------- | ----------- |\n| `false` | \"forwarded\" |\n| `true` | \"delivered\" |\n\nDer Parameter `final-delivery` zeigt an, ob der Antrag noch weitergesendet wird (`false`) oder das finale Ziel erreicht hat (`true`).\n\nSofern der Wert `false` übergeben wurde, muss zu einem späteren Zeitpunkt, wenn der Antrag final zugestellt wurde, ein weiterer Aufruf mit dem Wert `true` erfolgen.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "final-delivery": { + "type": "boolean", + "description": "Zeigt an, ob die Zustellung zum nächsten Hop (`false`) oder bis zum Endpunkt (`true`) erfolgt ist." + } + } + } + } + }, + "description": "Details der Quittung" + } + } + }, + "/{subscriber-id}/destinations/{destination-id}/applications": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "subscriber-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "destination-id", + "in": "path", + "required": true + } + ], + "get": { + "summary": "List Applications", + "tags": [ + "transfer" + ], + "operationId": "list-applications", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "../models/application/metadata.json" + } + }, + "examples": { + "example-1": { + "value": [] + }, + "example-2": { + "value": [ + { + "application-id": "7236", + "additional-reference-info": { + "subject": "Anmeldung eines Gewerbes in Musterstadt", + "case-id": "DF/8923" + }, + "content-structure": { + "data": { + "schema-id": "742", + "mime-type": "json" + }, + "docs": [ + { + "doc-id": "1", + "purpose": "form", + "size": 39273, + "mime": "application/pdf", + "filename": "antrag.pdf", + "description": "Das Antragsformular", + "lang": { + "lang": "de", + "region": "DE" + }, + "hash": { + "algorithm": "SHA-256", + "digest": "03ba204e50d126e4674c005e04d82e84c21366780af1f43bd54a37816b6ab340" + } + }, + { + "doc-id": "2", + "purpose": "attachment", + "size": 894834874, + "mime": "image/jpeg", + "filename": "scan.jpg", + "description": "Scan der Bescheinigung", + "hash": { + "algorithm": "SHA-256", + "digest": "e1762f14d9924e37b32f1c81dfd256410af462f5136415c96877efa8c80345d0" + } + } + ] + }, + "public-service-type": { + "name": "Gewerbeanmeldung", + "description": "Eine Gewerbeanmeldung ist immer dann notwendig, wenn Sie einen stehenden Gewerbebetrieb beginnen.", + "leika-id": "99050012104000", + "other-identifiers": [ + { + "id": "8664844", + "schemeURI": "service.niedersachsen.de", + "schemeName": "Serviceportal Niedersachsen" + }, + { + "id": "354824", + "schemeURI": "buerger.thueringen.de", + "schemeName": "Zuständigkeitsfinder Thüringen" + } + ] + }, + "applicants": [ + { + "person": { + "form-of-address": "Herr", + "academic-title": "Dr.", + "first-name": "Werner", + "last-name": "Mustermann" + }, + "identification": { + "authentication": { + "assurance-level": "high", + "authentification-method": "eID", + "timestamp": "2020-03-03T12:38:23Z" + }, + "authenticated-data": { + "family-name": "MUSTERMANN", + "given-name": "WERNER", + "date-of-birth": "13091970", + "place-of-resicence": { + "street": "KURZER WEG 7", + "postal-code": "12345", + "city": "ANKH-MORPORK" + } + } + } + } + ], + "payment-info": { + "reference": "TP/93/GDP", + "usage": "Gewerbeanmeldung", + "amount": 17.3, + "timestamp": "2020-03-03T12:38:23Z", + "status": "success", + "transaction": "1f77c5f9b759db9cdce59988b24974d465c7be5e462a6185485559ff6e2dea82" + } + } + ] + } + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + } + }, + "description": "Ruft die Liste der wartenden Applications ab." + } + }, + "/{subscriber-id}/destinations/{destination-id}": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "destination-id", + "in": "path", + "required": true + }, + { + "schema": { + "type": "string" + }, + "name": "subscriber-id", + "in": "path", + "required": true + } + ], + "get": { + "summary": "Get Destination", + "tags": [ + "destination" + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "../models/destination.json" + }, + "examples": { + "example-1": { + "value": { + "destination-id": "52", + "organization": { + "organization-name": "Umweltamt Ankh-Morpork", + "address": { + "street": "Kurzer Weg", + "houseNr": "7", + "postalCode": "12345", + "city": "Ankh-Morpork" + }, + "contact": { + "telephone": { + "number": "+49 89 32168-0", + "type": "work" + }, + "email": "behoerde@example.com" + } + }, + "technical-contact": { + "formOfAddress": "Herr", + "academicTitle": "Dr.", + "firstName": "Kunibert", + "lastName": "Vonundzu", + "contact": { + "telephone": { + "number": "+49 89 32168-42", + "mobile": "+49 123 456789", + "type": "work" + }, + "email": "kunibert.vonundzu@example.com" + } + } + } + } + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + } + }, + "operationId": "get-destination", + "description": "Übertragungsziel abfragen" + }, + "put": { + "summary": "Update Destination", + "operationId": "update-destination", + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + } + }, + "tags": [ + "destination" + ], + "description": "Übertragungsziel aktualisieren", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "../models/destination.json" + }, + "examples": { + "example-1": { + "value": { + "destination-id": "83578", + "organization": { + "organization-name": "Gewerbeamt Musterhausen" + }, + "technical-contact": [ + { + "first-name": "Werner", + "last-name": "Mustermann", + "contact": { + "telephone": [ + { + "number": "+49 89 32168-42", + "mobile": false, + "type": "work" + } + ] + } + } + ], + "callback": { + "callback-url": "https://www.example.com/callback" + } + } + } + } + } + } + } + }, + "delete": { + "summary": "Delete Destination", + "operationId": "delete-destination", + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error.json" + } + } + } + } + }, + "tags": [ + "destination" + ], + "description": "Übertragungsziel löschen" + } + }, + "/{subscriber-id}/destinations": { + "parameters": [ + { + "schema": { + "type": "string" + }, + "name": "subscriber-id", + "in": "path", + "required": true + } + ], + "get": { + "summary": "List Destinations", + "tags": [ + "destination" + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "../models/destination.json" + } + }, + "examples": { + "example-1": { + "value": [ + { + "destination-id": "83578", + "organization": { + "organization-name": "Gewerbeamt Musterhausen" + }, + "technical-contact": [ + { + "first-name": "Werner", + "last-name": "Mustermann", + "contact": { + "telephone": [ + { + "number": "+49 89 32168-42", + "mobile": false, + "type": "work" + } + ] + } + } + ], + "callback": { + "callback-url": "https://www.example.com/callback" + } + } + ] + } + } + } + } + } + }, + "operationId": "list-destinations", + "description": "Ruft die Liste aller Destinations dieses Accounts auf." + }, + "post": { + "summary": "Create Destination", + "operationId": "create-destination", + "responses": { + "201": { + "description": "Created", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "destination-id": { + "type": "string" + } + }, + "required": [ + "destination-id" + ] + } + } + } + } + }, + "description": "Legt eine neue Destination an.", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "../models/destination-no-id.json" + }, + "examples": { + "example-1": { + "value": { + "organization": { + "address": { + "street": "Kurzer Weg", + "houseNr": "7", + "postalCode": "12345", + "city": "Ankh-Morpork" + }, + "contact": { + "telephone": { + "number": "+49 89 32168-0", + "type": "work" + }, + "email": "behoerde@example.com" + } + }, + "technical-contact": { + "formOfAddress": "Herr", + "academicTitle": "Dr.", + "firstName": "Kunibert", + "lastName": "Vonundzu", + "contact": { + "telephone": { + "number": "+49 89 32168-42", + "mobile": "+49 123 456789", + "type": "work" + }, + "email": "kunibert.vonundzu@example.com" + } + } + } + } + } + } + }, + "description": "Anzulegende Destination" + }, + "tags": [ + "destination" + ] + } + } + }, + "tags": [ + { + "name": "destination" + }, + { + "name": "subscription" + }, + { + "name": "transfer" + } + ] +} \ No newline at end of file -- GitLab