diff --git a/assets/images/REST_Resourcen.svg b/assets/images/REST_Resourcen.svg deleted file mode 100644 index 3c346916df86a155be7240090cc4d280bc6902dd..0000000000000000000000000000000000000000 --- a/assets/images/REST_Resourcen.svg +++ /dev/null @@ -1,369 +0,0 @@ -<?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/assets/images/api_overview/FIEP_strategic_vision.png b/assets/images/api_overview/FIEP_strategic_vision.png new file mode 100644 index 0000000000000000000000000000000000000000..41e22cbbde7f119aa257e03d7c8e0ffb6b05b533 Binary files /dev/null and b/assets/images/api_overview/FIEP_strategic_vision.png differ diff --git a/assets/images/api_overview/PoC_integrationarchitecture.jpg b/assets/images/api_overview/PoC_integrationarchitecture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..507ff1af949892abd9164f6599359f9251a30852 Binary files /dev/null and b/assets/images/api_overview/PoC_integrationarchitecture.jpg differ diff --git a/assets/images/api_overview/destination-id_publishing_jurisdiction-finder.png b/assets/images/api_overview/destination-id_publishing_jurisdiction-finder.png new file mode 100644 index 0000000000000000000000000000000000000000..78575e5c84ef95f0ff15cf97407c022d8cb8e707 Binary files /dev/null and b/assets/images/api_overview/destination-id_publishing_jurisdiction-finder.png differ diff --git a/assets/images/api_overview/future_integrationarchitecture.jpg b/assets/images/api_overview/future_integrationarchitecture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..23612975e67ca300473365b1b6d3e834e5f2d265 Binary files /dev/null and b/assets/images/api_overview/future_integrationarchitecture.jpg differ diff --git a/assets/images/quick_reference/application_structure.png b/assets/images/quick_reference/application_structure.png new file mode 100644 index 0000000000000000000000000000000000000000..c710d371f1642d88e675ccca4a67cd4d6929a167 Binary files /dev/null and b/assets/images/quick_reference/application_structure.png differ diff --git a/assets/images/use_case_documentation/BPMN Legend/Activity.png b/assets/images/use_case_documentation/BPMN Legend/Activity.png new file mode 100644 index 0000000000000000000000000000000000000000..aaf458f30b55474f54a0244864ccb6e5b329ba2c Binary files /dev/null and b/assets/images/use_case_documentation/BPMN Legend/Activity.png differ diff --git a/assets/images/use_case_documentation/BPMN Legend/Activity_Multi_Instance.png b/assets/images/use_case_documentation/BPMN Legend/Activity_Multi_Instance.png new file mode 100644 index 0000000000000000000000000000000000000000..9774845f9022ca3cb24ce699c2c3c0dff8569cc0 Binary files /dev/null and b/assets/images/use_case_documentation/BPMN Legend/Activity_Multi_Instance.png differ diff --git a/assets/images/use_case_documentation/BPMN Legend/End_Event.png b/assets/images/use_case_documentation/BPMN Legend/End_Event.png new file mode 100644 index 0000000000000000000000000000000000000000..49ee283f35aa9516ef5d7930ee6344e4d31acd7c Binary files /dev/null and b/assets/images/use_case_documentation/BPMN Legend/End_Event.png differ diff --git a/assets/images/use_case_documentation/BPMN Legend/Exclusive Gateway.png b/assets/images/use_case_documentation/BPMN Legend/Exclusive Gateway.png new file mode 100644 index 0000000000000000000000000000000000000000..ec053efa7ae4b37bb2656e23bf3eda03d16962e0 Binary files /dev/null and b/assets/images/use_case_documentation/BPMN Legend/Exclusive Gateway.png differ diff --git a/assets/images/use_case_documentation/BPMN Legend/Parallel_Gateway.png b/assets/images/use_case_documentation/BPMN Legend/Parallel_Gateway.png new file mode 100644 index 0000000000000000000000000000000000000000..1b339095837ed90dd2d49eeee97119359ea7341a Binary files /dev/null and b/assets/images/use_case_documentation/BPMN Legend/Parallel_Gateway.png differ diff --git a/assets/images/use_case_documentation/BPMN Legend/Start_Event.png b/assets/images/use_case_documentation/BPMN Legend/Start_Event.png new file mode 100644 index 0000000000000000000000000000000000000000..8e316c333628217c8a3dbd40b7113a515966890a Binary files /dev/null and b/assets/images/use_case_documentation/BPMN Legend/Start_Event.png differ diff --git a/assets/images/use_case_documentation/application_retrieval.png b/assets/images/use_case_documentation/application_retrieval.png new file mode 100644 index 0000000000000000000000000000000000000000..bd7415d9a6de3a74d6dd7fa3c060ecd7a98ac3a0 Binary files /dev/null and b/assets/images/use_case_documentation/application_retrieval.png differ diff --git a/assets/images/use_case_documentation/application_transfer.png b/assets/images/use_case_documentation/application_transfer.png new file mode 100644 index 0000000000000000000000000000000000000000..e4fc7e76c60169c6cd4ff15b81e13c68017a5f1b Binary files /dev/null and b/assets/images/use_case_documentation/application_transfer.png differ diff --git a/assets/images/use_case_documentation/use_case_diagramm.png b/assets/images/use_case_documentation/use_case_diagramm.png new file mode 100644 index 0000000000000000000000000000000000000000..36643c9ff2f7d3d19113827535a29e577e5d82d6 Binary files /dev/null and b/assets/images/use_case_documentation/use_case_diagramm.png differ diff --git a/docs/1_Getting_Started.md b/docs/1_Getting_Started.md new file mode 100644 index 0000000000000000000000000000000000000000..c7f59aef60fa7e0841c56b0375e8b78e356cfafe --- /dev/null +++ b/docs/1_Getting_Started.md @@ -0,0 +1,7 @@ +# Erste Schritte zur API Nutzung + +... + +**Noch in Arbeit** + +... \ No newline at end of file diff --git a/docs/2_Quick_Reference.md b/docs/2_Quick_Reference.md new file mode 100644 index 0000000000000000000000000000000000000000..0f1ec25886a2842ee1bf1a5bdf1e67996cbab2bc --- /dev/null +++ b/docs/2_Quick_Reference.md @@ -0,0 +1,66 @@ +# API-Kurzreferenz + +## Der XFall Antrag + + + +Der XFall Antrag (`application`) ist das zentrale Geschäftsobjekt in der XFall API. Der XFall Antrag besteht aus den Fachdaten (`data`) sowie den beigefügten Anhängen (`document`) und wird über die Metadaten ([application metadata](../models/application/metadata.json)) beschrieben. + +Die Metadaten des Antrags entsprechen dem früheren XFall-Container und enthalten übergreifenden Informationen über den Antrag sowie Strukturinformationen zu den enthaltenen Fachdaten und Anhängen. + +Fachdaten bezeichnen in XFall Antrag im einen strukturieren Datensatz in XML oder JSON und können über ein externes Schema (bspw. aus FIM) beschrieben werden. + +Anhänge können entweder klassische Anhänge (bspw. Nachweise) oder oder eine PDF-Repräsentation der Fachdaten des Antrags, falls eine solche alternative Repräsentation aus rechtlichen, technischen oder organisatorischen Gründen notwendig ist. + +## Identifikatoren der XFall Ressourcen + +Um Ressourcen eindeutig zu identifizieren, werden in den URLs der REST Endpunkte eine oder mehrere Identifikatoren (IDs) benutzt. + +### Von der API bereitgestellte IDs +#### application-id +Der Zustelldienst weist jedem übertragenen Antrag (`application`) eine global eindeutige `application-id` zu, die diesen Antrag dauerhaft über den gesamten Bearbeitungsverlauf eindeutig identifiziert. + +#### destination-id +Die `destination-id` ist eine vom Zustelldienst vergebene ID für einen durch den Subscriber angelegten Zustellpunkt (`destination`). Diese ID wird dem Sender über externe Systeme (bspw. Zuständigkeitsfinder) oder bilaterale Absprachen zwischen beiden Seiten mitgeteilt. + +### Vom API-Portal bereitgestellte 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 Identifikatoren +#### doc-id +Der Sender vergibt für jedes Antragsformular und jede Anlage in einer Übertragung eine `doc-id`. Diese muss für alle Dokumente (PDF-Antragsformulare und beliebige Anlagen) in der Übertragung eindeutig sein. Es wird empfohlen, die IDs `1`, `2` etc. zu verwenden. + +## Operation der Application Sender API + +Mit folgenden Operationen kann der Sender eine Application übertragen und die Übertragung verwalten: + +- [Create Application](../reference/sender.json/paths/~1{source-id}~1{destination-id}/post) - Legt eine neue Übertragung durch Übermittlung der Metadaten an. +- [Add Application Data](../reference/sender.json/paths/~1{source-id}~1{destination-id}~1{application-id}~1data/put) - Fügt dem Antrag strukturierte Daten (Fachdaten) hinzu. +- [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. +- [Send Application](../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. +- [Get Application Upload Status](../reference/sender.json/paths/~1{source-id}~1{destination-id}~1{application-id}~1upload-status/get) - Ruft den Status der Uploads der Teile der Übertragung ab. Für die Fachdaten und Dokumente wird jeweils der Status und die auf dem Server vorliegende Länge in Bytes zurückgegegben. + +Darüber hinaus stehen dem Sender folgende weitere Operationen zur Verfügung: + +- [Get Destination](../reference/sender.json/paths/~1{source-id}~1{destination-id}/get) - Ruft übertragungsrelevante Informationen über den Zustellpunkt (bspw. zulässige Schemata oder Datentypen) ab. +- [Get Status](../reference/sender.json/paths/~1{source-id}~1{application-id}~1status/get) - Ruft den Status sowie die Statushistorie der Zustellung des Antrags ab. + +## Operation der Application Subscriber API + +Mit diesen Operationen kann der Subscriber eine oder mehrere Zustellpunkte (`Destinations`) verwalten: +- [Create Destination](../reference/subscriber.json/paths/~1{subscriber-id}~1destinations/post) - Legt ein neues Übertragungsziel (Destination) an. +- [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). + +Mit diesen Operationen wird nach wartenden 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. +- [Get Application Document](../reference/subscriber.json/paths/~1{subscriber-id}~1destinations~1{destination-id}~1applications~1{application-id}~1docs~1{doc-id}/get) - Ruf ein Dokument (Formular oder Anlage) der Application ab. +- [Acknowledge 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/docs/3_Use_Cases_der_API.md b/docs/3_Use_Cases_der_API.md new file mode 100644 index 0000000000000000000000000000000000000000..ca4e1aba9ebb958df919616bdacc47b9b1f0273e --- /dev/null +++ b/docs/3_Use_Cases_der_API.md @@ -0,0 +1,86 @@ +# Anwendungsfälle + +## Überblick über die Anwendungsfälle + + + +## Anwendungsfälle für den Sender + +### Antrag bei einem Zustellpunkt abgeben + +**Vorbedingung:** Es muss zuvor die `destination-id` eines gültigen Zustellpunkts ermittelt worden sein. Im Rahmen des PoC erfolgt die Übermittlung mittels bilateraler Absprachen und Kanäle zwischen dem Subscriber und Sender. + +**Ziel:** Alle Bestandteile des Antrags werden in den Abholbereich des addressierten Zustellpunkts übergeben und liegen dort zur Abholung durch den Subscriber bereit. + +**Beschreibung:** Der Sender überträgt mittels eines POST die Metadaten des Antrags an die Sender API und legt damit den Antrag (`application`) als Ressource sowie die Fachdaten und die in den Metadaten angegebenen Anlagen als Subressourcen an. Für den Antrag bekommt der Sender eine eindeutige `application-id`in der Response mitgeteilt. Der Sender kann anschließend alle Bestandteile des Antrags an die jeweiligen Endpunkte per PUT übermitteln und die Übergabe an in den Abholbereich des Subscribers über einen abschließenden Commit initialisieren. + + + +### Zustellstatus des abgegebenen Antrags abrufen + +**Vorbedingung:** Der Antrag wurde als Ressource angelegt und dem Sender liegt eine `application-id` vor. + +**Ziel:** Den Zustellungsstatus des Antrags abschließend überwachen. + +**Beschreibung:** Der Sender fragt per GET über die `application-id` den `status` der Antrags ab. Als Antwort bekommt dieser den aktuellen Status sowie die Statushistorie übersendet. Diese Statusübergänge sind über standardisierte Codes (`incomplete`, `queued`, `forwarded`, `delivered`) definiert. + +## Anwendungsfälle für den Subscriber + +### Zustellpunkt einrichten + +**Vorbedingung:** Keine + +**Ziel:** Es wird ein Zustellpunkt (`destination`) eingerichtet und verwaltet, über den der Subscriber Anträge empfangen kann. Hierdurch wird grundsätzlich ein Zugang für alle Sender eröffnet, die die `destination-id` kennen. + +**Beschreibung:** Der Subscriber erstellt einen Zustellpunkt per POST und bekommt von der API eine eindeutige `destination-id`. Für diesen Zustellpunkt sind fachliche und technische Ansprechpartner sowie das Schema der Fachdaten zu definieren. Zusätzlich besteht die Möglichkeit, eine Callback URL zu hinterlegen, über die der Zustelldienst den Subscriber über neue Anträge informieren kann. + +### Benachrichtigungen über Anträge erhalten + +**Vorbedingung:** Es wurden in den Zustellpunkten Callback URLs hinterlegt, die durch den XFall Zustelldienst erreichbar sind. + +**Ziel:** Ziel ist, Benachrichtigungen über abholbereite Anträge zu empfangen. Diese Benachrichtigungen ersetzen ein konstantes Polling durch den Subscriber und entlasten damit die verfügbaren Hardware und Netzwerkressourcen. + +**Beschreibung:** Für die Benachrichtung übernimmt der Subscriber die Rolle eines API Providers, indem dieser Requests vom Zustelldienst empfängt. Der Zustelldienst sendet beim Vorliegen einer oder mehrerer Anträge einen POST Request mit allen `application-id's` der abholbereiten Anträge an die hinterlegte Callback URL. + +### Anträge abrufen + +**Vorbedingung:** Der Subscriber hat einen Zustellpunkt erstellt und die dazugehörige `destination-id` einem oder mehreren Sendern mitgeteilt und es liegt einer oder mehrere Anträge zum abholen bereit. + +**Ziel:** Ziel ist es, abholbereite Anträge abzurufen. + +**Beschreibung:** Der Subscriber kann die Metadaten aller vorliegenden Anträge mit einem Request abrufen oder die Metadaten eines spezifischen Antrags abrufen, falls die `application-id` durch eine Callback Benachtigung bereits mitgeteilt wurde. Nach dem Abruf der Metadaten besteht die Möglichkeit, die Fachdaten (`data`) sowie die Anlagen (`document`) abzurufen. Nach dem Abruf aller gewünschten Bestandteile des Antrags, muss der vollständige Abruf durch den Subscriber bestätigt werden. Diese Bestätigung hat zur Folge, dass innerhalb einer definierten Frist der Antrag unwiederruflich gelöscht wird. + + + +### Legende der verwendeten BPMN Symbole + +#### Start- und Endereignisse + + + + + +Startet oder beendet einen Prozessablauf. + +#### Aktivität + + + +Eine Tätigkeit innerhalb einer Prozessablaufs. + +#### Aktivität mit mehrfachen parallelen Instanzen + + + +Eine Tätigkeit innerhalb einer Prozessablaufs, die ab dem aktivierungszeitpunkt mehrfach parallel durchgeführt werden kann. + +#### Exclusive Gateway + + + +Ein Entscheidungspunkt innerhalb des Prozessablaufs im Sinne einer ODER Entscheidung. Es wird nur der weitere Prozessablauf weiterverfolgt, der dem Entscheidungsergebnis entspricht. +#### Parallel Gateway + + + +Parallelisierungspunkt innerhalb des Prozessablauf. Prozessflüsse nach dem parallelen Gateway parallel durchgeführt. diff --git a/docs/4_Authentifizierung_und_Autorisierung.md b/docs/4_Authentifizierung_und_Autorisierung.md new file mode 100644 index 0000000000000000000000000000000000000000..2aa66cb98f7d9a1a1e9961462a23f59193ea46e7 --- /dev/null +++ b/docs/4_Authentifizierung_und_Autorisierung.md @@ -0,0 +1,7 @@ +# Authentifizierung und Autorisierung + +... + +**Noch in Arbeit** + +... \ No newline at end of file diff --git a/docs/5_Status-_und_Fehlercodes.md b/docs/5_Status-_und_Fehlercodes.md new file mode 100644 index 0000000000000000000000000000000000000000..e79a83003af756b8c279ceeda8d5fc5c36c02975 --- /dev/null +++ b/docs/5_Status-_und_Fehlercodes.md @@ -0,0 +1,45 @@ +# Status- und Fehlercodes + +Die XFall RESTful API liefert in allen Responses HTTP Response Codes. In der aktuell vorliegenden API Version werden nur HTTP Response Codes verwendet, die im [RFC 7231](https://tools.ietf.org/html/rfc7231) beschrieben sind. + +API Clients sollten aber gemäß RFC 7231 so implementiert, dass auch unbekannte Response Status Codes (Neue Standardcodes oder proprietäre Erweiterungen) gemäß ihrer Statusklasse interpretiert werden können: +> "HTTP status codes are extensible. HTTP clients are not required to + understand the meaning of all registered status codes, though such + understanding is obviously desirable. However, a client MUST + understand the class of any status code, as indicated by the first + digit, and treat an unrecognized status code as being equivalent to + the x00 status code of that class, with the exception that a + recipient MUST NOT cache a response with an unrecognized status code." + + +### Übersicht der verwendeten Response Codes und ihre Bedeutung + +Code | Text | Bedeutung +---------|----------|--------- + 200 | OK | Der Request war erfolgreich. + 201 | Created | Eine Ressource wurde erfolgreich angelegt. + 202 | Accepted | Daten wurden wurden erfolgreich übertragen und angenommen. + 400 | Bad Request | Der Request war nicht korrekt aufgebaut oder es liegen mehrere Fehler vor, die unterschiedliche Statuscodes der 4xx-Klasse betreffen. + 401 | Unauthorized | Der Request lieferte keine oder eine ungültige Authentifikation. + 403 | Forbidden | Die mit dem Request gelieferte Authentifikation ist für diese Resource nicht zugriffsberechtigt. + 404 | Not Found | Die Ressource kann nicht unter dem angegeben Pfad gefunden werden oder temporär nicht verfügbar. + 410 | Gone | Die Ressource ist unter dem Pfad permanent nicht mehr verfügbar. (bspw. weil die Ressource gelöscht wurde in dieser Repräsentation nicht mehr verfügbar ist) + 413 | Request Entity Too Large | Der übertragene Datensatz ist zu groß. + 415 | Unsupported Media Type | Der Datentyp wird nicht unterstützt. + 500 | Internal Server Error | Es besteht ein Fehler auf Seite des API Providers. + +### Detailangaben zu clientseitig verursachten Fehlern + +Bei durch den API-Client verursachte Fehler (HTTP Statusklasse 4XX), liefert die API im Response Body eine [Error Body](../models/error-body.json) Mitteilung mit detaillierten Angaben, wodurch der Fehler versacht wurde. + +Eine Error Mitteilung enthält folgende Angaben: + + code: Standardisierter Fehlercode + + msg: Textuelle Fehlermeldung + + ref: Referenz auf fehlerhafte Stelle + +### Liste der Fehlercodes + +**... Noch in der Erstellung ...** \ No newline at end of file diff --git a/docs/callback.md b/docs/6_Callback.md similarity index 78% rename from docs/callback.md rename to docs/6_Callback.md index f241a3a49dbfd782f1edff96b5d104870ee1a4eb..ea035e5aaff78eea0bf2a57edc796c611dd6a32b 100644 --- a/docs/callback.md +++ b/docs/6_Callback.md @@ -1,4 +1,9 @@ -# Callback +# Callback Benachrichtigungen + +Callbacks sind einfache Webhooks und dienen dazu, API Nutzer über relevante Ereignisse aktiv zu informieren, anstatt das der Client über konstante Abfragen an der API potentielle Änderungen oder Eigenisse abzufragen muss. + +Aktuell wird den Subscribern eine Callback Funktion angeboten, um diese über abrufbereite Anträge in ihren Destinations zu informieren. + ## 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. diff --git a/docs/7_Begrenzung_von_Abrufen.md b/docs/7_Begrenzung_von_Abrufen.md new file mode 100644 index 0000000000000000000000000000000000000000..f6a21d5a82183f86284ba0620190ae862fac2ede --- /dev/null +++ b/docs/7_Begrenzung_von_Abrufen.md @@ -0,0 +1,7 @@ +# Begrenzung von Abrufen + +... + +**Noch in Arbeit** + +... \ No newline at end of file diff --git a/docs/99_Glossar.md b/docs/99_Glossar.md new file mode 100644 index 0000000000000000000000000000000000000000..3de05ad0d4a6357b2514378f1701c13569c366c6 --- /dev/null +++ b/docs/99_Glossar.md @@ -0,0 +1,7 @@ +# Glossar + +... + +**Noch in Arbeit** + +... \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index 6dc3a4a69ddd0757abfc1c281b27514c852b9e1a..77f44c5663fc91b4dfc269112e7f16a670a3dad4 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,8 +1,76 @@ -# FIEP PoC -## Resourcen -- [Resourcen](./resourcen.md) -- [IDs](./ids.md) - -## APIs -- [Application Sender API](./sender.md) -- [Application Subscriber API](./subscriber.md) +# Überblick über die XFall API + +Willkomen auf der API Dokumentation für die XFall RESTful API. Zusammen mit der föderalen Integrations- und Entwicklungsplattform ermöglicht die XFall RESTful API Lösungsverantwortlichen und Entwicklern von OZG-Verfahren, ihre Anwendungen schnell und wirtschaftlich in medienbruchfreie Antragsprozesse zu integrieren. + +Das zentrale Ziel der XFall RESTful API: +> Lösungsverantwortliche und Entwickler werden von wiederkehrenden Integrationsherausforderungen im Antragsprozess entlastet und können wertvolle Kapazitäten darauf fokussieren, Innovationen in der Verwaltung voranzutreiben und nutzerzentrierte Lösungen für Antragssteller und Sachbearbeitern schnell und kostengünstig in die Breite zu bringen! + +## Was ist die XFall RESTful API und was unterscheidet diese vom bisherigen XFall Standard? + +Die XFall RESTful API baut auf den bisherigen Konzepten und Erfahrungen des bestehenden IT-Planungsrats Standards XFall auf. Die übergreifende Zielstellung von XFall besteht darin, Anträge und Berichte, die aus vorgelagerten Systemen (bspw. Onlineantragsdienste, Fachportale oder Berichtssysteme) erstellt werden, in die unterschiedlichen Systeme der elektronische Verfahrensbearbeitung zu übergeben. + +Ausgehend von dieser Aufgabestellung, ist die XFall RESTful API auch keine einheitliche API, sondern besteht aus zwei dedizierten APIs für Sender (`Application Sender API`) und Empfänger von Anträgen (`Application Subscriber API`). + +Bei der Entwicklung der XFall RESTful API wurden viele Konzepte mit Hinblick auf die neuen Erfordernisse des Onlinezugangsgesetzes, dem EU-Single Digital Gateway sowie den Anforderungen moderner digitaler Geschäftsmodelle grundlegend weiterentwickelt. Im Vergleich zum bisherigen XFall-Standard, setzt die XFall RESTful API auf einen leichgewichtigen REST-Architekturstil und ergänzt die API um eine einheitliche föderale Integrations- und Entwicklungsinfrastruktur: +- Eine Integrationsplattform, welche die APIs für die Beteiligten bereitstellt und viele Integrationsherausforderungen zentral löst. Die Integrationsplattform folgt dem "Lightweight Messaging Principle", sodass keine Fachlogik im Übermittelungsprozess durch die Integrationsplattform übernommen wird, sondern die Hohheit beim Empfänger liegt und für den Sender die Zustellunglogik transparent. +- Ein Entwicklerportal, da alle Informationen und Ressourcen für Anbindung an die XFall RESTful API bereitstellt. Neben zentral erstellten Informationen und Werkzeugen ,sollen auch bisher dezentral vorliegende Informationen bedarfsgerecht gebündelt und vernetzt werden, sodass für Entwickler eine mühsame Suche kritischer Informationen entfällt. + +## In welchem Stand befindet sich XFall RESTful API und wann kann man die API nutzen? + +Die Entwicklung und Bereitstellung der XFall RESTful API erfolgt im Rahmen eines Proof of Concepts für die geplante föderale Integrations- und Entwicklungsplattform. Der Proof of Concept und das Gesamtvorhaben wird durch die FITKO (https://www.fitko.de) verantwortet. + +Im Rahmen des Proof of Concepts wird es ab dem zweiten Quartal 2020 möglich sein, dass interessierte Organisationen und Projekte einen Zugang zum API-Portal bekommen und eine prototypische Anbindung von Verfahren umsetzen können. + +Die langfristige produktive Nutzung der XFall RESTful API hängt jedoch vom Ausgang des Proof of Concepts und der weiteren Planung der föderalen Integrations- und Entwicklungsplattform ab. + +### Was ist die föderale Integrations- und Entwicklungsplattform? + +Die föderale Integrations- und Entwicklungsplattform ist ein strategischer Ansatz, um die aktuellen Herausforderungen in der verteilten OZG Umsetzung zu adressieren. + +Durch die föderale Integrations- und Entwicklungsplattform soll den OZG-Umsetzungsverantwortlichen und Lösungsentwicklern eine stabile und leistungsfähige Basis bereitgestellt werden, um schnell und wirtschaftlich bundesweit nutzbare und interopable Lösungen für Verwaltungsleistungen zu entwickeln. + +Die föderale Integrations- und Entwicklungsplattform baut hierbei auf zwei zentralen Säulen auf: +- Leichtgewichtige Schnittstellen auf Basis etablierter Industriestandards sowie zentral bereitgestellte Integrationskomponenten, um wiederkehrende Integrationsherausforderungen im verteilten föderalen Vorgehen zu lösen oder zu minimieren. +- Eine gemeinsame Entwicklerplattform mit zentral bereitgestellten Entwicklungs- und Testwerkwerkzeugen, um die Entwicklung interoperabler Verfahren für die Antragsstellung und Antragsbearbeitung zu vereinfachen und zu beschleunigen. + +Die föderale Integrations- und Entwicklungsplattform folgt einem offenen Plattformgedanken und soll einen Kulturwandel in der Entwicklung digitaler Verwaltungslösungen einleuten. +- Der Staat stellt eine digitale Basis an Funktionen und Daten auf Basis offener Standards und Komponenten jedem frei zur Verfügung. +- Dies ermöglicht es allen gesellschaftlichen Akteuren (Behörden, Unternehmen, Non-Profit Organisationen, Bürger) neue digitale Lösungen und Innovationen frei zu erstellen. +- Entwickelte Lösungen können durch den Staat eingebunden, beauftragt oder eingekauft werden oder abseits des Staates im Rahmen neuer kommerzieller oder gesellschaftlicher Geschäftsmodelle eingebunden werden. + +Die föderale Integrations- und Entwicklungsplattform ist dabei ganz bewusst nicht als zentralischer Ansatz zu sehen, sondern als ein föderaler Ansatz, da sowohl bei der Entwicklung von Antragsdiensten als Antragsbearbeitungssystem eine hohe Autonomie in der Umsetzung belassen wird. + + + +### Wozu dient der Proof of Concept? + +Der Proof of Concept (PoC) soll wesentliche Grundprinzipien und Lösungsansätze der föderalen Integrations- und Entwicklungsplattform am Beispiel der Antragsübermittlung praktisch erproben. Für diesen Zweck wird der bestehende XFall Standard für den PoC als offene RESTful API weiterentwickelt und die dazugehörigen Integrationskomponenten und Entwicklerressourcen prototypisch bereitgestellt. + +Mit dem PoC soll aufgezeigt werden, dass mit den zwei Säulen der föderalen Integrations- und Entwicklungsplattform und dem offenen Plattformansatz ein echter Mehrwert für die Entwicklung interoperabler und skalierbarer Lösungen geschaffen werden kann, um die föderale Verwaltungsdigitalisierung in Deutschland grundlegend voranzutreiben. + +Bei einem positiven Ergebnis des PoC wird angestrebt, die föderale Integrations- und Entwicklungsplattform als Gesamtansatz umzusetzen und die XFall RESTful API produktiv anzubieten sowie weitere APIs für das Antragsmanagement zu entwickeln. + +### Überblick PoC-Integrationsarchitektur + + + +#### Komponenten +Für den PoC werden zwei zentrale Komponenten bereitgestellt: +- **XFall-Zustelldienst:** Dieser Dienst stellt die `Application Sender API` und `Application Subscriber API` bereit. +- **API-Gateway:** Das API-Gatway regelt den Zugriff auf die API (Authorisierung, Rate-Limiting, Sicherheitsüberprüfungen, etc.) des XFall-Zustelldienstes und stellt zusammen mit der angebundenen IdM-Komponente die Authentifizierung für den API-Zugriff bereit. Für einen API-Client ist das API-Gatway in der API-Nutzung nicht direkt sichtbar. + +#### Ablauf +Die Integrationsarchitektur sieht vor, dass eine empfangende Behörde oder ein Dienstleister (bspw. eine kommunales Rechenzentrum) über die `Application Subscriber API` initial einen Zustellpunkt mit einer eindeutigen `destination-id` anlegt. + +Diese `destination-id` wird im Rahmen des PoC mit der Antragssenderseite bilateral ausgetauscht bzw. über einen vereinbaren Kanal veröffentlicht. Diese ID wird dann durch den Sender in der `Application Sender API` genutzt, um die korrekte Stelle zu adressieren und den Antrag beim entsprechenden Zustellpunkt abzugeben. Die empfangende Behörde oder der Dienstleister können dann mit ihren Systemen diesen Antrag abholen. + +#### Langfristige Vision +Die Integrationsarchitektur wird im Rahmen des PoC um einige zentrale Aspekte vereinfacht, welche für die zukünftige Integrationsarchitektur fest eingeplant sind: +- **Nutzung von Zuständigkeitsfindern:** Langfristig ist angedacht, die `destination-id` über die bestehenden etablierten Zuständigkeitsfindern von Bund und Ländern zu veröffentlichen. Damit stünde ein skalierbarer Ansatz bereit, bei dem Antragsdienste während der Antragsstellung die `destination-id` der fachlich und örtlich zuständigen Stelle beim Zuständigkeitsfinder ermitteln können. Durch diesen Ansatz sind keine aufwendigen bilateralen Absprachen während der Entwicklung mehr notwendig, sondern die Antragsdienste können einen universellen zuständigkeitsbasierten Ansatz auf Basis bestehender föderaler Basisinfrastukturen nutzen! + + + +- **Standardisierte XTA-Einbindung:** Mit XTA steht ein in vielen Teilen der Verwaltung etablierter Standard bereit, um standardisiert Transportverfahren anzubinden, welche die eigentliche Übertragung von Fachdaten über diverse Protokolle und Kommunikationsinfrastrukturen für das Fachverfahren übernehmen. Während es schon im PoC prinzipiell möglich sein sollte, technische Intermedäre für die XFall RESTful API Anbindung per XTA-SOAP Webservice anzusprechen, wird zukünftig eine vollumfängliche Unterstützung alle XTA Bestandteile (wie bspw. Reports) angestrebt. +- **Anbindung von Servicekonten und Antragsmanagementkomponenten:** Zukünftig soll der XFall-Zustelldienst alle antragsrelevenaten Daten (Kopien der Antragsdaten und Statusinformationen) bei definierten Ereignissen (Abgabe beim Zustelldienst und Abholung am Zustellpunkt) in den Hohheitsbereich des Antragsstellers übermitteln und damit die Antragsdienste und Fachverfahren von dieser Querschnittsaufgabe entlasten. Hierfür ist angedacht, die zukünftig verfügbaren interoperablen Postfächer als einen standardisierten Übertragsweg in den Hohheitsbereich des Antragsstellers zu nutzen. + + diff --git a/docs/ids.md b/docs/ids.md deleted file mode 100644 index 38ade9b8c84556fc4f78ce3bf16fd81847bda8f8..0000000000000000000000000000000000000000 --- a/docs/ids.md +++ /dev/null @@ -1,24 +0,0 @@ -# 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 deleted file mode 100644 index fb2237a9a1f79ad08bdd4bf34b36b239261f29bf..0000000000000000000000000000000000000000 --- a/docs/resourcen.md +++ /dev/null @@ -1,100 +0,0 @@ -# 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 deleted file mode 100644 index 33b198630931734f76614a88fbb6fdc5c84705de..0000000000000000000000000000000000000000 --- a/docs/sender.md +++ /dev/null @@ -1,95 +0,0 @@ -# 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 deleted file mode 100644 index b61a1e5f60572bb308735b0e88c311c487eba270..0000000000000000000000000000000000000000 --- a/docs/subscriber.md +++ /dev/null @@ -1,100 +0,0 @@ -# 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-organization.json b/models/application/applicant-organization.json index 1c3a3636735aab350c28b1320bf15c63af8e0fcd..c3d76bb66b3a752d877f6c64b281fa268050c2f8 100644 --- a/models/application/applicant-organization.json +++ b/models/application/applicant-organization.json @@ -3,31 +3,23 @@ "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": "" + "$ref": "../common/identifier.json" } }, "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" ] }, @@ -37,7 +29,7 @@ "properties": { "legal-name": { "type": "string", - "description": "Name von rechtswegen, z.B. der Firmenname mit Rechtsform bei Unternehmen" + "description": "Name oder Bezeichnung - Der rechtliche Name einer Organisation. Der Name ist nicht zwingend eindeutig, um die Organisation zu identifizieren." }, "organization-type": { "type": "string", @@ -48,7 +40,8 @@ "description": "Registergericht" }, "registry-type": { - "type": "string" + "type": "string", + "description": "Registerart - Die Registerart macht die Registernummer zur Identifizierung der Organisation innerhalb des Registergerichts eindeutig (z. B. HRA und HRB als Registerarten für das Handelsregister)." }, "registry-number": { "type": "string", @@ -67,8 +60,9 @@ }, "legal-representatives": { "type": "array", + "description": "Namen der Mitglieder des Vertretungsorgans oder der gesetzlichen Vertreter", "items": { - "type": "object" + "$ref": "../common/individual.json" } } } diff --git a/models/application/applicant-person.json b/models/application/applicant-person.json index e4fe81e2a7f4877e23921d46730dc84577ff36b9..5c196924fb954d54f350e7973447592d3a08c741 100644 --- a/models/application/applicant-person.json +++ b/models/application/applicant-person.json @@ -3,9 +3,6 @@ "type": "object", "description": "Antragstellerdaten für eine natürliche Person", "properties": { - "role": { - "type": "string" - }, "identifier": { "type": "array", "description": "IDs der natürlichen Person", diff --git a/models/application/applicant.json b/models/application/applicant.json index 5d78329573a1fc29184414381988d81124045fd9..a07958d62ee87719a84fdc328f2b1e2ad324d475 100644 --- a/models/application/applicant.json +++ b/models/application/applicant.json @@ -1,15 +1,12 @@ { + "oneOf": [ + { + "$ref": "./applicant-person.json" + }, + { + "$ref": "./applicant-organization.json" + } + ], "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" - } - ] - } + "description": "Ein Antragsteller, entweder eine Organisation oder eine natürliche Person" } \ No newline at end of file diff --git a/models/application/document.json b/models/application/document.json index 2d26791f2ed0824ef35b3d1a30f2d27a91f65310..ba845ce19838c1900ffcc085902598b6ec9357d2 100644 --- a/models/application/document.json +++ b/models/application/document.json @@ -2,12 +2,40 @@ "title": "Application Document", "type": "object", "description": "Ein im Antrag (Application) enthaltenes Dokument (z.B. Antragsformular oder hochgeladene Anlage)", + "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" + } + } + }, "properties": { "doc-id": { "type": "string", - "pattern": { - "$ref": "../common/id-string.json#/pattern" - }, + "pattern": "^[-_.A-Za-z0-9]+$", "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": { @@ -23,7 +51,7 @@ "type": "integer", "description": "Größe des Dokuments in Bytes" }, - "mime": { + "mime-type": { "$ref": "../common/mime-type.json" }, "filename": { @@ -72,36 +100,6 @@ "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" - } - } - } + "mime-type" + ] } \ No newline at end of file diff --git a/models/application/metadata-no-id.json b/models/application/metadata-no-id.json index 83358308bef5afcd0dea828612878613c96d3d11..350ddbdb404ffcdbccce1fb5417accbf45bd794f 100644 --- a/models/application/metadata-no-id.json +++ b/models/application/metadata-no-id.json @@ -2,70 +2,6 @@ "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": { @@ -161,5 +97,67 @@ "transaction": "1f77c5f9b759db9cdce59988b24974d465c7be5e462a6185485559ff6e2dea82" } } - } + }, + "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", + "mime-type" + ], + "properties": { + "schema": { + "$ref": "./schema.json" + }, + "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" + ] } \ No newline at end of file diff --git a/models/application/metadata.json b/models/application/metadata.json index 7ebc7b6d78c5379151ea703d069898cb5b5eff93..be404f05b0f64ba8b73b349951d434bbf77df774 100644 --- a/models/application/metadata.json +++ b/models/application/metadata.json @@ -6,9 +6,7 @@ "properties": { "application-id": { "type": "string", - "pattern": { - "$ref": "../common/id-string.json#/pattern" - }, + "pattern": "^[-_.A-Za-z0-9]+$", "description": "ID des Antrags" } }, diff --git a/models/application/schema.json b/models/application/schema.json index 599ed36ae3a26a611761a9dbd36ad55b647569d6..c0be2f2a37b2a5d32cf5849ecf6b4e74968ee9a4 100644 --- a/models/application/schema.json +++ b/models/application/schema.json @@ -1,32 +1,38 @@ { "title": "Application Schema", - "type": "object", + "x-examples": { + "example-1": { + "mime-type": "xml", + "schema-source": "fim", + "schema-id": "S00000001V1.0" + } + }, "description": "Strukturinformationen zu übertragbaren oder übertragenen Daten.", + "type": "object", "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" + "mime-type": { + "type": "string", + "enum": [ + "json", + "xml" + ], + "description": "Gibt das zulässige Format (JSON oder XML) der Fachdaten an." }, - "fim-schema": { - "$ref": "../common/fim-id.json" - } - }, - "x-examples": { - "example-1": { - "fim-schema": { - "id": "S00000001", - "version": "1.0" - } + "schema-source": { + "type": "string", + "enum": [ + "fim", + "none" + ], + "description": "Quelle, von der das Schema bezogen werden kann." }, - "example-2": { - "schema-id": "8438", - "fim-schema": { - "id": "S00000001", - "version": "1.0" - } + "schema-id": { + "type": "string", + "description": "ID des Schemas, abhängig von der ausgewählten Quelle." } - } + }, + "required": [ + "mime-type", + "schema-source" + ] } \ No newline at end of file diff --git a/models/common/base64.json b/models/common/base64.json new file mode 100644 index 0000000000000000000000000000000000000000..4492b15f3542eb957a3d786447bd1224ac38ba2f --- /dev/null +++ b/models/common/base64.json @@ -0,0 +1,6 @@ +{ + "type": "string", + "title": "base64", + "pattern": "^[a-zA-Z0-9+/=]+$", + "description": "Base 64 Encoding (RFC 4648 section 4)" +} \ No newline at end of file diff --git a/models/common/id-string.json b/models/common/id-string.json deleted file mode 100644 index 3c2a17e890936d0e35bcb9883470c5f091df188e..0000000000000000000000000000000000000000 --- a/models/common/id-string.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "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 index 60177411dd679615236373bf357c0f4e0547405d..2f3e7a2a2c2179e9887a40781a0491331deef375 100644 --- a/models/common/identifier.json +++ b/models/common/identifier.json @@ -2,6 +2,21 @@ "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.", + "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" + } + }, "properties": { "id": { "type": "string", @@ -40,20 +55,5 @@ }, "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/person/abstract-person.json b/models/common/individual.json similarity index 54% rename from models/person/abstract-person.json rename to models/common/individual.json index 8b631c5d0ce41eb4fd52b4cc14cef2687c19172c..8bff8f18eda7863f7e06b5951f7183eb4b3f6b95 100644 --- a/models/person/abstract-person.json +++ b/models/common/individual.json @@ -1,8 +1,23 @@ { - "title": "Abstract Person", + "title": "Individual", "type": "object", - "description": "Abstrakte Klasse für natürliche Person (Individual) und Organisation (Organization)", "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" + }, "address": { "description": "Adresse als Alternative (Choice) von nationaler und internationaler Adresse.", "oneOf": [ @@ -29,30 +44,7 @@ "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" - ] + "$ref": "../common/phone.json" } }, "email": { @@ -66,9 +58,27 @@ "description": "Webadresse" }, "telefax": { - "$ref": "../common/phonenr.json" + "$ref": "../common/phone.json#/properties/number" } } } + }, + "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/common/jwe.json b/models/common/jwe.json new file mode 100644 index 0000000000000000000000000000000000000000..5b1b02ab6efea5b59ecd0d1a1d90aa84a0234e86 --- /dev/null +++ b/models/common/jwe.json @@ -0,0 +1,116 @@ +{ + "title": "JSON Web Encryption (JWE)", + "type": "object", + "description": "JSON Web Encryption - JSON Serialization - RFC 7516", + "properties": { + "protected": { + "$ref": "./base64url.json" + }, + "unprotected": { + "type": "object", + "properties": { + "alg": { + "type": "string", + "description": "Algorithm", + "enum": [ + "A256GCMKW", + "RS256", + "PS256", + "RSA-OAEP-256" + ] + }, + "enc": { + "type": "string", + "description": "Encryption Algorithm", + "enum": [ + "A256GCM" + ] + }, + "zip": { + "type": "string", + "description": "Compression Algorithm", + "enum": [ + "DEF" + ] + }, + "jku": { + "type": "string", + "description": "JWK Set URL" + }, + "jwk": { + "$ref": "./jwk.json" + }, + "kid": { + "description": "Key ID" + }, + "x5u": { + "type": "string", + "description": "X.509 URL", + "format": "uri" + }, + "x5c": { + "type": "array", + "description": "X.509 Certificate Chain", + "items": { + "$ref": "./base64.json" + } + }, + "x5t": { + "$ref": "./base64url.json" + }, + "x5t#S256": { + "$ref": "./base64url.json" + }, + "typ": { + "type": "string", + "description": "Type" + }, + "cty": { + "type": "string", + "description": "Content Type" + }, + "crit": { + "description": "Critical", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "recipients": { + "type": "array", + "items": { + "type": "object", + "properties": { + "header": { + "$ref": "#/properties/unprotected" + }, + "encrypted_key": { + "$ref": "./base64url.json" + } + } + } + }, + "encrypted_key": { + "type": "object" + }, + "iv": { + "$ref": "./base64url.json" + }, + "aad": { + "$ref": "./base64url.json" + }, + "ciphertext": { + "$ref": "./base64url.json" + }, + "tag": { + "$ref": "./base64url.json" + } + }, + "required": [ + "protected", + "recipients", + "ciphertext" + ] +} \ No newline at end of file diff --git a/models/common/jwk.json b/models/common/jwk.json new file mode 100644 index 0000000000000000000000000000000000000000..18427f3aa4e4778e4dcdee331677a062541af8ae --- /dev/null +++ b/models/common/jwk.json @@ -0,0 +1,70 @@ +{ + "title": "JSON Web Key (JWK)", + "type": "object", + "properties": { + "kty": { + "type": "string", + "description": "Key Type", + "enum": [ + "EC", + "RSA", + "oct", + "OKP" + ] + }, + "use": { + "type": "string", + "description": "Public Key Use", + "enum": [ + "sig", + "enc" + ] + }, + "key_ops": { + "type": "array", + "enum": [ + "sign", + "verify", + "encrypt", + "decrypt", + "wrapKey", + "unwrapKey", + "deriveKey", + "deriveBits" + ], + "description": "Key Operations", + "items": { + "type": "string" + } + }, + "alg": { + "type": "string", + "description": "Algorithm" + }, + "kid": { + "description": "Key ID" + }, + "x5u": { + "type": "string", + "description": "X.509 URL", + "format": "uri" + }, + "x5c": { + "description": "X.509 Certificate Chain", + "type": "array", + "items": { + "$ref": "./base64.json" + } + }, + "x5t": { + "$ref": "./base64url.json" + }, + "x5t#S256": { + "$ref": "./base64url.json" + } + }, + "required": [ + "kty" + ], + "description": "JSON Web Key - RFC 7517" +} \ No newline at end of file diff --git a/models/common/phone.json b/models/common/phone.json index d3969595d6e66c2010c64b09c229f4039784a95a..d5e3e68a5c692a221f39abe481ed6cb5a716435a 100644 --- a/models/common/phone.json +++ b/models/common/phone.json @@ -1,5 +1,5 @@ { - "title": "phone", + "title": "Phone", "type": "object", "description": "Telefonnumer mit Zusatzinformationen", "properties": { @@ -23,5 +23,9 @@ ], "description": "Art der Telefonnummer: work=dienstlich, home=privat oder other=sonstige" } - } + }, + "required": [ + "number", + "type" + ] } \ No newline at end of file diff --git a/models/destination-no-id.json b/models/destination-no-id.json index 8cf61c3b5065c7ae2e55c38eadb7ffb74b28e9a5..6c08ac36ccb1c805cd556c50eb6d9a08b310ea38 100644 --- a/models/destination-no-id.json +++ b/models/destination-no-id.json @@ -4,7 +4,7 @@ "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": { + "public-organization": { "organization-name": "Gewerbeamt Musterhausen" }, "technical-contact": [ @@ -28,14 +28,63 @@ } }, "properties": { - "organization": { - "$ref": "./person/public-organization.json" + "public-organization": { + "type": "object", + "properties": { + "organization-name": { + "type": "string" + }, + "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 der Behörde", + "type": "object", + "properties": { + "telephone": { + "type": "array", + "description": "Liste der Telefonnummern, außer Fax", + "items": { + "$ref": "./common/phone.json" + } + }, + "email": { + "type": "string", + "format": "email", + "description": "E-Mail-Adresse" + }, + "www": { + "type": "string", + "format": "uri", + "description": "Webadresse" + }, + "telefax": { + "$ref": "./common/phone.json#/properties/number" + } + } + } + } }, "technical-contact": { "type": "array", "description": "Technischer Ansprechpartner", "items": { - "$ref": "./person/individual.json" + "$ref": "./common/individual.json" } }, "schemas": { diff --git a/models/destination.json b/models/destination.json index 96186fd090e88d9a39275e0628aa6c94ea8a8b7a..2c9bf0536dc33158c110020bc59a9a625033a9d7 100644 --- a/models/destination.json +++ b/models/destination.json @@ -6,9 +6,7 @@ "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" - }, + "pattern": "^[-_.A-Za-z0-9]+$", "type": "string" } }, diff --git a/models/error-body.json b/models/error-body.json new file mode 100644 index 0000000000000000000000000000000000000000..fef50dd99ab4569433ff10cce5984d1fe76ea2c0 --- /dev/null +++ b/models/error-body.json @@ -0,0 +1,28 @@ +{ + "title": "Error Body", + "type": "array", + "description": "Der Inhalt (Body) von HTTP Responses bei Fehlern.", + "items": { + "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/error.json b/models/error.json deleted file mode 100644 index e9461d2042aa255f9a77ca2ad1bcb064eda05625..0000000000000000000000000000000000000000 --- a/models/error.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "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/individual.json b/models/person/individual.json deleted file mode 100644 index b00e49969d6ba49689b086def0b38c5b021e700b..0000000000000000000000000000000000000000 --- a/models/person/individual.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "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 deleted file mode 100644 index fcfed3028283a78ff0025f122edb382527771742..0000000000000000000000000000000000000000 --- a/models/person/organization.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "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 deleted file mode 100644 index cd29085f1af2f7070ea23c947f142bfebc1b31e5..0000000000000000000000000000000000000000 --- a/models/person/public-organization.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "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-overview.json similarity index 59% rename from models/status.json rename to models/status-overview.json index 1352b2dc4761fcf9290f8670b42e733f6ec85b49..a2767e0f7f7206f8993419e396b0fa5cc505413a 100644 --- a/models/status.json +++ b/models/status-overview.json @@ -1,28 +1,33 @@ { "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", + "title": "Statusübersicht", + "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- `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", + "description": "Code für den Status (incomplete, queued, forwarded, delivered)", "enum": [ "incomplete", "queued", - "sending", "forwarded", "delivered" - ], - "description": "Code für den Status (incomplete, queued, sending, forwarded, delivered)" + ] }, - "since": { + "timestamp": { "type": "string", "format": "date-time", "description": "Zeitpunkt, zu dem der Status sich geändert hat" + }, + "number": { + "type": "integer", + "description": "Chonologische Nummierung der Statusmeldungen für einen Antrag.", + "minimum": 1 } }, "required": [ "code", - "since" + "timestamp", + "number" ] } \ No newline at end of file diff --git a/reference/callback.json b/reference/callback.json index 2e00f599b87267afe9220f00d54e5a7ea06493f0..10ea60648f109cbd3fca3cbb8fdab8660597c95c 100644 --- a/reference/callback.json +++ b/reference/callback.json @@ -2,7 +2,7 @@ "openapi": "3.0.0", "info": { "title": "Notification Callback", - "version": "1.0", + "version": "0.2", "contact": { "name": "FITKO", "url": "https://www.fitko.de/" @@ -15,19 +15,20 @@ }, "servers": [ { - "url": "http://localhost:3000" + "url": "{callback-host}" } ], "paths": { - "/{path}": { + "/{callback-path}": { "parameters": [ { "schema": { "type": "string" }, - "name": "path", + "name": "callback-path", "in": "path", - "required": true + "required": true, + "description": "Dies ist nur ein Platzhalter. Die ganze Callback-URL ergibt sich aus der Angabe in der Destiantion." } ], "post": { diff --git a/reference/sender.json b/reference/sender.json index a55ccbcc5675692833326d6c2c349b3b9a259053..423014a78afbe895710f5e43090770a4cb015286 100644 --- a/reference/sender.json +++ b/reference/sender.json @@ -2,7 +2,7 @@ "openapi": "3.0.0", "info": { "title": "Application Sender API", - "version": "1.0", + "version": "0.2", "description": "API vom Onlineantragsdienst zum Zustelldienst", "contact": { "name": "FITKO", @@ -15,7 +15,8 @@ }, "servers": [ { - "url": "http://localhost:3000" + "url": "https://sender.fiep-poc.de", + "description": "Produktionsumgebung der API." } ], "paths": { @@ -53,22 +54,42 @@ "202": { "description": "Accepted" }, - "406": { - "description": "Not Acceptable - Kein Schema zugeordnet oder Schemafehler", + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "403": { + "description": "Forbidden", "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } }, "410": { - "description": "Gone - Transfer-ID ungültig/Transfer-Timeout", + "description": "Gone", "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } @@ -78,7 +99,7 @@ "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } @@ -91,6 +112,33 @@ "schema": { "type": "object", "properties": {} + }, + "examples": { + "example-1": { + "value": { + "F99000001": "string", + "G99000001": { + "F99000002": "string", + "F99000003": 42 + }, + "G99000002": [ + { + "F99000004": true, + "G99000001": { + "F99000002": "string", + "F99000003": 17 + } + }, + { + "F99000004": true, + "G99000001": { + "F99000002": "string", + "F99000003": 24 + } + } + ] + } + } } }, "application/xml": { @@ -103,7 +151,15 @@ "description": "JSON oder XML Daten" }, "tags": [ - "transfer" + "Application Transfer" + ], + "security": [ + { + "API Key": [ + "{source-id}:application:apply", + "{source-id}:source:manage" + ] + } ] } }, @@ -150,11 +206,31 @@ "description": "Accepted" }, "400": { - "description": "Bad Request - Signaturprüfung nicht erfolgreich - Signatur passt nicht zum Dokument", + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "403": { + "description": "Forbidden", "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } @@ -164,17 +240,17 @@ "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } }, "410": { - "description": "Gone - Transfer-ID ungültig/Transfer-Timeout", + "description": "Gone - Application-ID ungültig/Transfer-Timeout", "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } @@ -184,7 +260,7 @@ "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } @@ -194,7 +270,7 @@ "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } @@ -212,7 +288,15 @@ } }, "tags": [ - "transfer" + "Application Transfer" + ], + "security": [ + { + "API Key": [ + "{source-id}:application:apply", + "{source-id}:source:manage" + ] + } ] } }, @@ -249,12 +333,12 @@ "type": "object", "properties": { "current": { - "$ref": "../models/status.json" + "$ref": "../models/status-overview.json" }, "history": { "type": "array", "items": { - "$ref": "../models/status.json" + "$ref": "../models/status-overview.json" } } } @@ -262,57 +346,32 @@ } } }, - "404": { - "description": "Not Found", + "400": { + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.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" + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } }, - "name": "status-nr", - "in": "path", - "required": true - } - ], - "get": { - "summary": "Get Status Entry", - "responses": { - "200": { - "description": "OK", + "403": { + "description": "Forbidden", "content": { "application/json": { "schema": { - "$ref": "../models/status.json" + "$ref": "../models/error-body.json" } } } @@ -322,16 +381,21 @@ "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } } }, - "operationId": "get-application-status-entry", - "description": "Ruft einen spezifischen Statuswechsel aus der Historie des Status ab.", - "tags": [ - "status" + "operationId": "get-application-status", + "description": "Ruft den aktuellen Status der Übermittlung sowie einer Übersicht der bisherigen Übertragungshistorie ab.", + "security": [ + { + "API Key": [ + "{source-id}:status:read", + "{source-id}:source:manage" + ] + } ] } }, @@ -364,9 +428,6 @@ ], "get": { "summary": "Get Application Upload Status", - "tags": [ - "transfer" - ], "responses": { "200": { "description": "OK", @@ -401,6 +462,11 @@ "items": { "type": "object", "properties": { + "doc-id": { + "type": "string", + "pattern": "^[-_.A-Za-z0-9]+$", + "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." + }, "status": { "type": "string", "enum": [ @@ -415,6 +481,7 @@ } }, "required": [ + "doc-id", "status", "length" ] @@ -425,19 +492,60 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, "410": { "description": "Gone", "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } } }, "operationId": "get-application-upload-status", - "description": "Abfrage des Übermittlungsstatus. Listet alle Unterresourcen (data und docs) mit Übermittlungsstatus auf." + "description": "Abfrage des Übermittlungsstatus. Listet alle Unterresourcen (data und docs) mit Übermittlungsstatus auf.", + "tags": [ + "Transfer related Information" + ], + "security": [ + { + "API Key": [ + "{source-id}:application:apply", + "{source-id}:source:manage" + ] + } + ] } }, "/{source-id}/{destination-id}": { @@ -461,7 +569,7 @@ ], "post": { "summary": "Create Application", - "operationId": "create-transfer", + "operationId": "create-application", "responses": { "201": { "description": "Created", @@ -474,6 +582,43 @@ "type": "string" } } + }, + "examples": { + "example-1": { + "value": { + "application-id": "45bb5b95-d853-4fc5-b45d-10aa9e15287a" + } + } + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" } } } @@ -483,7 +628,7 @@ "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } @@ -493,26 +638,137 @@ "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } } }, - "tags": [ - "transfer" - ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "../models/application/metadata-no-id.json" + }, + "examples": { + "example-1": { + "value": { + "additional-reference-info": { + "subject": "Anmeldung eines Gewerbes in Musterstadt", + "case-id": "DF/8923" + }, + "content-structure": { + "data": { + "schema": { + "mime-type": "json", + "schema-source": "none" + }, + "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" + } + } + ] + }, + "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": [ + { + "authentification-info": { + "assurance-level": "high", + "authentification-method": "eID", + "timestamp": "2020-03-03T12:38:23Z" + }, + "identity-info": { + "date-of-birth": "1970-09-13", + "gender": "m", + "given-name": "WERNER", + "family-name": "MUSTERMANN", + "place-of-residence": { + "street": "KURZER WEG 7", + "postal-code": "12345", + "city": "ANKH-MORPORK" + } + }, + "contact-info": { + "electronic-adresses": [ + { + "channel-type": "Service-Account-Mailbox", + "address": "3b0c9c8c-0801-45f0-a331-2abfc9db78d0" + } + ], + "physical-adress": { + "street": "Kurzer Weg", + "house-number": "7", + "postal-code": "12345", + "city": "Ankh-Morpork" + }, + "telephone": [ + { + "number": "+49 89 32168-42", + "mobile": true, + "type": "work" + } + ] + } + } + ], + "payment-info": { + "reference": "TP/93/GDP", + "usage": "Gewerbeanmeldung", + "amount": 17.3, + "timestamp": "2020-03-03T12:38:23Z", + "status": "success", + "transaction": "1f77c5f9b759db9cdce59988b24974d465c7be5e462a6185485559ff6e2dea82" + } + } + } } } }, - "description": "Transfer" + "description": "Metadaten des Antrags" }, - "description": "Übertragung initiieren" + "description": "Übertragung initiieren", + "tags": [ + "Application Transfer" + ], + "security": [ + { + "API Key": [ + "{source-id}:application:apply", + "{source-id}:source:manage" + ] + } + ] }, "get": { "summary": "Get Destination", @@ -528,12 +784,42 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } @@ -541,7 +827,15 @@ }, "description": "Ruft die Information über eine Destination ab", "tags": [ - "destination" + "Transfer related Information" + ], + "security": [ + { + "API Key": [ + "{source-id}:destination-info:read", + "{source-id}:source:manage" + ] + } ] } }, @@ -573,35 +867,55 @@ } ], "post": { - "summary": "Commit Application", - "operationId": "commit-transfer", + "summary": "Send Application", + "operationId": "commit-application", "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { - "$ref": "../models/status.json" + "$ref": "../models/status-overview.json" } } } }, "400": { - "description": "Bad Request - Unvollständig", + "description": "Bad Request", "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" } } } }, "410": { - "description": "Gone - Transfer-ID ungültig/Transfer-Timeout", + "description": "Gone - Application-ID ungültig/Transfer-Timeout", "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } @@ -611,17 +925,14 @@ "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } } }, - "description": "Übertragung abschließen", + "description": "Übertragung abschließen, Antrag absenden", "parameters": [], - "tags": [ - "transfer" - ], "requestBody": { "content": { "application/json": { @@ -632,22 +943,50 @@ } }, "description": "" - } + }, + "tags": [ + "Application Transfer" + ], + "security": [ + { + "API Key": [ + "{source-id}:application:apply", + "{source-id}:source:manage" + ] + } + ] } } }, "tags": [ { - "name": "transfer" + "name": "Application Transfer" }, { "name": "status" }, { - "name": "destination" - }, - { - "name": "source" + "name": "Transfer related Information" + } + ], + "components": { + "securitySchemes": { + "API Key": { + "type": "oauth2", + "flows": { + "clientCredentials": { + "tokenUrl": "beispieltokenURL.de", + "scopes": { + "{source-id}:application:apply": "Dieser Zugriffsbereich erlaubt es Anträge anzulegen, diesen zu aktualisieren und abzusenden.", + "{source-id}:status:read": "Dieser Zufriffsbereich erlaubt es auf Statusmitteilungen zu einem übersendeten Antrag abzurufen.", + "{source-id}:destination-info:read": "Dieser Zufriffsbereich erlaubt es Informationen von existierenden Destinationsabzurufen", + "{source-id}:source:manage": "Dieser Zufriffsbereich erlaubt es alle Endpunkte einer " + }, + "refreshUrl": "beispielrefreshURL.de" + } + }, + "description": "Dieses Authentifizierungsmethode wird genutzt, um den Zugriff auf die Produktiv API zu autorisieren. " + } } - ] + } } \ No newline at end of file diff --git a/reference/subscriber.json b/reference/subscriber.json index de926c089fa46d11f105dd1f4a86194fc8dfd43f..7422e011fe5a853ca3a2796fb339115ebe9c9ff4 100644 --- a/reference/subscriber.json +++ b/reference/subscriber.json @@ -2,7 +2,7 @@ "openapi": "3.0.0", "info": { "title": "Application Subscriber API", - "version": "1.0", + "version": "0.2", "description": "API vom Fachverfahren zum Zustelldienst", "contact": { "name": "FITKO", @@ -15,7 +15,8 @@ }, "servers": [ { - "url": "http://localhost:3000" + "url": "https://subscriber.fiep-poc.de", + "description": "Produktionsumgebung der API." } ], "paths": { @@ -56,9 +57,6 @@ ], "get": { "summary": "Get Application Document", - "tags": [ - "transfer" - ], "responses": { "200": { "description": "OK", @@ -71,12 +69,61 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, "404": { - "description": "Not Found" + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } } }, "operationId": "get-application-document", - "description": "Ruf ein Dokument (Formular oder Anlage) der Application ab." + "description": "Ruf ein Dokument (Formular oder Anlage) der Application ab.", + "tags": [ + "Application Retrieval" + ], + "security": [ + { + "API Key": [ + "{subscriber-id}:manage", + "{subscriber-id}:application:receive", + "{subscriber-id}:destination:{destination-id}:application:receive" + ] + } + ] } }, "/{subscriber-id}/destinations/{destination-id}/applications/{application-id}/data": { @@ -108,9 +155,6 @@ ], "get": { "summary": "Get Application Data", - "tags": [ - "transfer" - ], "responses": { "200": { "description": "OK", @@ -119,22 +163,83 @@ "schema": { "type": "object", "properties": {} + }, + "examples": { + "example-1": { + "value": { + "F99000001": "Eins", + "G99000001": { + "F99000002": "Zwei", + "F99000003": "Drei" + } + } + } } }, "application/xml": { "schema": { "type": "object", "properties": {} + }, + "examples": {} + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" } } } }, "404": { - "description": "Not Found" + "description": "Not Found", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } } }, "operationId": "get-application-data", - "description": "Ruft die Fachdaten der Application ab." + "description": "Ruft die Fachdaten der Application ab.\n\nBeispiele:\n#### JSON\n```json\n{\n \"F99000001\": \"Eins\",\n \"G99000001\": {\n \"F99000002\": \"Zwei\",\n \"F99000003\": \"Drei\"\n }\n}\n```\n\n#### XML\n```xml\n<S99000001>\n <F99000001>Eins</F99000001>\n <G99000001>\n <F99000002>Zwei</F99000002>\n <F99000003>Drei</F99000003>\n </G99000001>\n</S99000001>\n```", + "tags": [ + "Application Retrieval" + ], + "security": [ + { + "API Key": [ + "{subscriber-id}:manage", + "{subscriber-id}:application:receive", + "{subscriber-id}:destination:{destination-id}:application:receive" + ] + } + ] } }, "/{subscriber-id}/destinations/{destination-id}/applications/{application-id}": { @@ -166,9 +271,6 @@ ], "get": { "summary": "Get Application Metadata", - "tags": [ - "transfer" - ], "responses": { "200": { "description": "OK", @@ -279,44 +381,120 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } } }, "operationId": "get-application", - "description": "Ruft eine wartende Application ab." + "description": "Ruft eine wartende Application ab.", + "tags": [ + "Application Retrieval" + ], + "security": [ + { + "API Key": [ + "{subscriber-id}:manage", + "{subscriber-id}:application:receive", + "{subscriber-id}:destination:{destination-id}:application:receive" + ] + } + ] }, "post": { - "summary": "Commit Application", - "operationId": "commit-application", + "summary": "Acknowledge Application", + "operationId": "ack-application", "responses": { "200": { "description": "OK" }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } }, "417": { - "description": "Expectation Failed - Status passt nicht" + "description": "Expectation Failed - Status passt nicht", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } } }, - "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": { @@ -333,7 +511,19 @@ } }, "description": "Details der Quittung" - } + }, + "tags": [ + "Application Retrieval" + ], + "security": [ + { + "API Key": [ + "{subscriber-id}:manage", + "{subscriber-id}:application:receive", + "{subscriber-id}:destination:{destination-id}:application:receive" + ] + } + ] } }, "/{subscriber-id}/destinations/{destination-id}/applications": { @@ -357,9 +547,6 @@ ], "get": { "summary": "List Applications", - "tags": [ - "transfer" - ], "operationId": "list-applications", "responses": { "200": { @@ -479,18 +666,60 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } } }, - "description": "Ruft die Liste der wartenden Applications ab." + "description": "Ruft die Liste der wartenden Applications ab.", + "tags": [ + "Application Retrieval" + ], + "security": [ + { + "API Key": [ + "{subscriber-id}:manage", + "{subscriber-id}:application:receive", + "{subscriber-id}:destination:{destination-id}:application:receive" + ] + } + ] } }, "/{subscriber-id}/destinations/{destination-id}": { @@ -514,9 +743,6 @@ ], "get": { "summary": "Get Destination", - "tags": [ - "destination" - ], "responses": { "200": { "description": "OK", @@ -565,19 +791,62 @@ } } }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } } }, "operationId": "get-destination", - "description": "Übertragungsziel abfragen" + "description": "Übertragungsziel abfragen", + "tags": [ + "Destination Management" + ], + "security": [ + { + "API Key": [ + "{subscriber-id}:destination:read", + "{subscriber-id}:destination:manage", + "{subscriber-id}:manage", + "{subscriber-id}:destination:{destination-id}:read" + ] + } + ] }, "put": { "summary": "Update Destination", @@ -586,20 +855,47 @@ "200": { "description": "OK" }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } } }, - "tags": [ - "destination" - ], "description": "Übertragungsziel aktualisieren", "requestBody": { "content": { @@ -637,7 +933,20 @@ } } } - } + }, + "tags": [ + "Destination Management" + ], + "security": [ + { + "API Key": [ + "{subscriber-id}:manage", + "{subscriber-id}:destination:update", + "{subscriber-id}:destination:manage", + "{subscriber-id}:destination:{destination-id}:update" + ] + } + ] }, "delete": { "summary": "Delete Destination", @@ -646,21 +955,61 @@ "200": { "description": "OK" }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { - "$ref": "../models/error.json" + "$ref": "../models/error-body.json" } } } } }, + "description": "Übertragungsziel löschen", "tags": [ - "destination" + "Destination Management" ], - "description": "Übertragungsziel löschen" + "security": [ + { + "API Key": [ + "{subscriber-id}:manage", + "{subscriber-id}:destination:manage", + "{subscriber-id}:destination:delete", + "{subscriber-id}:destination:{destination-id}:delete" + ] + } + ] } }, "/{subscriber-id}/destinations": { @@ -676,9 +1025,6 @@ ], "get": { "summary": "List Destinations", - "tags": [ - "destination" - ], "responses": { "200": { "description": "OK", @@ -722,10 +1068,52 @@ } } } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } } }, "operationId": "list-destinations", - "description": "Ruft die Liste aller Destinations dieses Accounts auf." + "description": "Ruft die Liste aller Destinations dieses Accounts auf.", + "tags": [ + "Destination Management" + ], + "security": [ + { + "API Key": [ + "{subscriber-id}:destination:read", + "{subscriber-id}:manage", + "{subscriber-id}:destination:manage" + ] + } + ] }, "post": { "summary": "Create Destination", @@ -745,6 +1133,43 @@ "required": [ "destination-id" ] + }, + "examples": { + "example-1": { + "value": { + "destination-id": "e15fc92e-c286-424b-9802-39c6b6bc441d" + } + } + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "../models/error-body.json" } } } @@ -760,7 +1185,8 @@ "examples": { "example-1": { "value": { - "organization": { + "public-organization": { + "organization-name": "Gewerbeamt Musterstadt", "address": { "street": "Kurzer Weg", "houseNr": "7", @@ -770,6 +1196,7 @@ "contact": { "telephone": { "number": "+49 89 32168-0", + "mobile": false, "type": "work" }, "email": "behoerde@example.com" @@ -781,13 +1208,29 @@ "firstName": "Kunibert", "lastName": "Vonundzu", "contact": { - "telephone": { - "number": "+49 89 32168-42", - "mobile": "+49 123 456789", - "type": "work" - }, + "telephone": [ + { + "number": "+49 89 32168-42", + "mobile": false, + "type": "work" + }, + { + "number": "+49 123 456789", + "mobile": true, + "type": "work" + } + ], "email": "kunibert.vonundzu@example.com" } + }, + "schemas": [ + { + "mime-type": "json", + "schema-source": "none" + } + ], + "callback": { + "callback-url": "https://www.example.com/callback" } } } @@ -797,20 +1240,53 @@ "description": "Anzulegende Destination" }, "tags": [ - "destination" + "Destination Management" + ], + "security": [ + { + "API Key": [ + "{subscriber-id}:manage", + "{subscriber-id}:destination:manage", + "{subscriber-id}:destination:create" + ] + } ] } } }, "tags": [ { - "name": "destination" + "name": "Destination Management" }, { - "name": "subscription" - }, - { - "name": "transfer" + "name": "Application Retrieval" + } + ], + "components": { + "securitySchemes": { + "API Key": { + "type": "oauth2", + "flows": { + "clientCredentials": { + "tokenUrl": "", + "refreshUrl": "", + "scopes": { + "{subscriber-id}:destination:read": "Dieser Zugriffsbereich erlaubt bei allen Destination-Informationen ein lesender Zugriff.", + "{subscriber-id}:destination:create": "Der Zugriffsbereich erlaubt Destinations neu anzulegen und zu verändern.", + "{subscriber-id}:destination:update": "Dieser Zugriffsbereich erlaubt es, bestehende Destinations zu verändern.", + "{subscriber-id}:destination:manage": "Dieser Zugriffsbereich alle Destination Endpunkte eines Subscriber genutzt werden.", + "{subscriber-id}:destination:{destination-id}:read": "Mit diesem Zugriffsbereich wird ein lesender Zugriff auf eine spezifische Destination ermöglicht.", + "{subscriber-id}:destination:{destination-id}:update": "Mit diesem Zugriffsbereich wird ein schreibende Zugriff auf eine spezifische Destination ermöglicht.", + "{subscriber-id}:application:receive": "Dieser Zugriffsbereich erlaubt es, Anträge für allen Destinations abzuholen.", + "{subscriber-id}:destination:{destination-id}:application:receive": "Dieser Zugriffsbereich erlaubt es, Anträge einer spezifischen Destination abzuholen.", + "{subscriber-id}:manage": "Dieser Zugriffsbereich die vollständige Nutzung aller Endpunkte eines Subscribers.", + "{subscriber-id}:destination:delete": "Dieser Zugriffsbereich erlaubt die Löschung von Destinations eines Accounts.", + "{subscriber-id}:destination:{destination-id}:delete": "Dieser Zugriffsbereich erlaubt es, eine spezifische Destination zu löschen." + } + } + }, + "description": "Dieses Authentifizierungsmethode wird genutzt, um den Zugriff auf die Produktiv API zu autorisieren. " + } } - ] + } } \ No newline at end of file