Added documentation, restructured solution
@@ -0,0 +1,163 @@
|
|||||||
|
<mxfile host="Electron">
|
||||||
|
<diagram name="Page-1" id="lj056Mnt25KX5hBf4p9v">
|
||||||
|
<mxGraphModel dx="1063" dy="686" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1600" pageHeight="900" math="0" shadow="0">
|
||||||
|
<root>
|
||||||
|
<mxCell id="0" />
|
||||||
|
<mxCell id="1" parent="0" />
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-42" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" value="" vertex="1">
|
||||||
|
<mxGeometry height="700" width="952" x="340" y="130" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-1" parent="1" style="rounded=0;whiteSpace=wrap;html=1;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;fillColor=#008a00;fontColor=#ffffff;strokeColor=#005700;" value="<b style="color: rgb(255, 255, 255);">Persistance</b>" vertex="1">
|
||||||
|
<mxGeometry height="70" width="650" x="475" y="730" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-2" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="PostgresSQL" vertex="1">
|
||||||
|
<mxGeometry height="45" width="120" x="500" y="742.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-3" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Redis" vertex="1">
|
||||||
|
<mxGeometry height="45" width="120" x="740" y="742.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-4" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Garage S3" vertex="1">
|
||||||
|
<mxGeometry height="45" width="120" x="980" y="742.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-5" parent="1" style="rounded=0;whiteSpace=wrap;html=1;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;fillColor=#e51400;fontColor=#ffffff;strokeColor=#B20000;" value="<span style="color: rgb(255, 255, 255);"><b>Enterprise Integration Elements</b></span>" vertex="1">
|
||||||
|
<mxGeometry height="70" width="650" x="475" y="580" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-7" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Skoruba Identity API" vertex="1">
|
||||||
|
<mxGeometry height="45" width="120" x="500" y="592.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-8" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Skoruba STS" vertex="1">
|
||||||
|
<mxGeometry height="45" width="120" x="658" y="592.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-10" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Email" vertex="1">
|
||||||
|
<mxGeometry height="45" width="120" x="815" y="592.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-55" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-11" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" target="G6m14uD4gVQkRd8Mz5xj-10">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-56" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-11" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-3">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-57" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-11" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-2">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-58" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-11" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-4">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-11" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Quartz Scheduler" vertex="1">
|
||||||
|
<mxGeometry height="45" width="120" x="980" y="592.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-12" parent="1" style="rounded=0;whiteSpace=wrap;html=1;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;fillColor=#fa6800;fontColor=#000000;strokeColor=#C73500;" value="<b style="color: rgb(255, 255, 255);">Integration &amp; Services</b>" vertex="1">
|
||||||
|
<mxGeometry height="70" width="650" x="475" y="440" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-51" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-13" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-7">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-52" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-13" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-11">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-53" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-13" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.538;entryY=0.073;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-8">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-61" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-13" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=0.333;entryY=0.167;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-2">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-62" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-13" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.25;entryY=0;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-3">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-13" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="PFM API" vertex="1">
|
||||||
|
<mxGeometry height="45" width="62" x="500" y="452.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-14" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;dashed=1;fillColor=none;fontColor=#000000;strokeColor=#000000;strokeWidth=2;" value="PFM MCP" vertex="1">
|
||||||
|
<mxGeometry height="45" width="72" x="580" y="452.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-15" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="" vertex="1">
|
||||||
|
<mxGeometry height="45" width="284" x="816" y="452.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-16" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Governance" vertex="1">
|
||||||
|
<mxGeometry height="20" width="80" x="830" y="465" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-17" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Evidence" vertex="1">
|
||||||
|
<mxGeometry height="20" width="62" x="918" y="465" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-18" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Grants" vertex="1">
|
||||||
|
<mxGeometry height="20" width="42" x="988" y="465" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-19" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Projects" vertex="1">
|
||||||
|
<mxGeometry height="20" width="52" x="1038" y="465" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-20" parent="1" style="rounded=0;whiteSpace=wrap;html=1;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;fillColor=#0050ef;fontColor=#ffffff;strokeColor=#001DBC;" value="<b>Presentation</b>" vertex="1">
|
||||||
|
<mxGeometry height="70" width="650" x="475" y="300" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-49" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-21" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-13">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-21" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="PFM Console (Web)" vertex="1">
|
||||||
|
<mxGeometry height="45" width="120" x="500" y="312.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-48" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-22" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;startArrow=classic;startFill=1;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-26">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-50" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-22" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-13">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-22" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="PFM Partner (Web)" vertex="1">
|
||||||
|
<mxGeometry height="45" width="120" x="640" y="312.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-23" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;dashed=1;fillColor=none;fontColor=#000000;strokeColor=#000000;strokeWidth=2;" value="PFM Console Mobile" vertex="1">
|
||||||
|
<mxGeometry height="45" width="130" x="830" y="312.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-24" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;dashed=1;fillColor=none;fontColor=#000000;strokeColor=#000000;strokeWidth=2;" value="PFM Partner Mobile" vertex="1">
|
||||||
|
<mxGeometry height="45" width="120" x="980" y="312.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-26" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Khongisa CDN" vertex="1">
|
||||||
|
<mxGeometry height="45" width="102" x="668" y="452.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-34" parent="1" style="rounded=0;whiteSpace=wrap;html=1;labelPosition=center;verticalLabelPosition=bottom;align=center;verticalAlign=top;fillColor=#e3c800;fontColor=#000000;strokeColor=#B09500;" value="<span style="color: rgb(255, 255, 255);"><b>Consumers / Users</b></span>" vertex="1">
|
||||||
|
<mxGeometry height="70" width="650" x="475" y="160" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-25" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="3rd Party AI" vertex="1">
|
||||||
|
<mxGeometry height="45" width="80" x="1020" y="172.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-37" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;dashed=1;fillColor=none;fontColor=#000000;strokeColor=#000000;strokeWidth=2;" value="PFM AI" vertex="1">
|
||||||
|
<mxGeometry height="45" width="62" x="950" y="172.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-46" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-38" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.33;exitY=0.996;exitDx=0;exitDy=0;entryX=0.333;entryY=0.167;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-21">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-38" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Private Funding Organisations" vertex="1">
|
||||||
|
<mxGeometry height="45" width="180" x="500" y="172.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-47" edge="1" parent="1" source="G6m14uD4gVQkRd8Mz5xj-39" style="edgeStyle=none;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;dashed=1;dashPattern=1 4;" target="G6m14uD4gVQkRd8Mz5xj-22">
|
||||||
|
<mxGeometry relative="1" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-39" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;" value="Funding Applicants" vertex="1">
|
||||||
|
<mxGeometry height="45" width="120" x="690" y="172.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-40" parent="1" style="rounded=1;whiteSpace=wrap;html=1;roundedPerimeter=1;dashed=1;fillColor=none;fontColor=#000000;strokeColor=#000000;strokeWidth=2;" value="Data Aggregators" vertex="1">
|
||||||
|
<mxGeometry height="45" width="110" x="820" y="172.5" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-41" edge="1" parent="1" style="shape=flexArrow;endArrow=classic;startArrow=classic;html=1;rounded=0;fillColor=#1ba1e2;strokeColor=#006EAF;movable=0;resizable=0;rotatable=0;deletable=0;editable=0;locked=1;connectable=0;" value="">
|
||||||
|
<mxGeometry height="100" relative="1" width="100" as="geometry">
|
||||||
|
<mxPoint x="430" y="800" as="sourcePoint" />
|
||||||
|
<mxPoint x="430" y="160" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-44" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;rotation=-90;fontSize=15;movable=0;resizable=0;rotatable=0;deletable=0;editable=0;locked=1;connectable=0;" value="Interaction / Integration / Data Flow" vertex="1">
|
||||||
|
<mxGeometry height="30" width="450" x="170" y="465" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-63" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;strokeWidth=2;rounded=0;" value="">
|
||||||
|
<mxGeometry height="50" relative="1" width="50" as="geometry">
|
||||||
|
<mxPoint x="340" y="550" as="sourcePoint" />
|
||||||
|
<mxPoint x="1290" y="550" as="targetPoint" />
|
||||||
|
</mxGeometry>
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-64" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Public" vertex="1">
|
||||||
|
<mxGeometry height="30" width="102" x="1190" y="510" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
<mxCell id="G6m14uD4gVQkRd8Mz5xj-65" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;" value="Private" vertex="1">
|
||||||
|
<mxGeometry height="30" width="102" x="1190" y="570" as="geometry" />
|
||||||
|
</mxCell>
|
||||||
|
</root>
|
||||||
|
</mxGraphModel>
|
||||||
|
</diagram>
|
||||||
|
</mxfile>
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
> **Document Version**: 2.0
|
> **Document Version**: 2.0
|
||||||
> **Target Runtimes**: .NET 10.0 (C# 13) | React 19 / TypeScript 5.8 / Vite
|
> **Target Runtimes**: .NET 10.0 (C# 13) | React 19 / TypeScript 5.8 / Vite
|
||||||
> **Scope**: System Architecture, Security Topology, RBAC Enforcement, and Maker-Checker Pattern
|
> **Scope**: System Architecture, Security Topology, RBAC Enforcement, and Maker-Checker Pattern
|
||||||
|
> **Technology Partner & Technical Authorship**: **Lite Charms (PTY) Ltd** is the official technology partner and author of every technical implementation, architecture, and maintenance of the Post-Fund Management (PFM) Platform. **Ifri Technologies** is an initiative and entity within **Lite Charms (PTY) Ltd**.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -328,7 +329,7 @@ The background job runner powers four essential operational workloads:
|
|||||||
The PFM platform integrates the **Model Context Protocol (MCP)** standard (v2.3.0) to expose domain capabilities both internally and externally while preventing token exhaustion and eliminating network call overhead:
|
The PFM platform integrates the **Model Context Protocol (MCP)** standard (v2.3.0) to expose domain capabilities both internally and externally while preventing token exhaustion and eliminating network call overhead:
|
||||||
|
|
||||||
1. **Dual Realisation Pattern**:
|
1. **Dual Realisation Pattern**:
|
||||||
* **In-App MCP (`PostFundManagement.Api`)**: Internal features, handlers, and workflows obtain in-process access to MCP tooling via `IInAppMcpClient`. Calls are executed directly against scoped services with zero network latency, zero serialization overhead, and no external web requests.
|
* **In-App MCP (`PostFundManagement.Api` & `PostFundManagement.Jobs`)**: Internal features, background jobs, and workflows obtain in-process access to MCP tooling via `IInAppMcpClient`. Calls are executed directly against scoped services with zero network latency, zero serialization overhead, and no external web requests.
|
||||||
* **External MCP Server (`PostFundManagement.Mcp`)**: A dedicated standalone presentation host exposes the exact same tools over standard external transports (HTTP/SSE at `/mcp` and command-line Stdio via `--stdio`) for external LLMs, agentic workbenches, and client IDEs.
|
* **External MCP Server (`PostFundManagement.Mcp`)**: A dedicated standalone presentation host exposes the exact same tools over standard external transports (HTTP/SSE at `/mcp` and command-line Stdio via `--stdio`) for external LLMs, agentic workbenches, and client IDEs.
|
||||||
|
|
||||||
2. **Application.Services Proxying Pattern**:
|
2. **Application.Services Proxying Pattern**:
|
||||||
|
Before Width: | Height: | Size: 2.3 MiB After Width: | Height: | Size: 2.3 MiB |
|
Before Width: | Height: | Size: 2.8 MiB After Width: | Height: | Size: 2.8 MiB |
|
Before Width: | Height: | Size: 2.7 MiB After Width: | Height: | Size: 2.7 MiB |
|
Before Width: | Height: | Size: 2.3 MiB After Width: | Height: | Size: 2.3 MiB |
|
Before Width: | Height: | Size: 2.3 MiB After Width: | Height: | Size: 2.3 MiB |
|
Before Width: | Height: | Size: 2.7 MiB After Width: | Height: | Size: 2.7 MiB |
@@ -1,6 +1,6 @@
|
|||||||
# PostFundManagement (PFM) Platform — Operational Processes & Governance (Processes.md)
|
# PostFundManagement (PFM) Platform — Operational Processes & Governance (Processes.md)
|
||||||
|
|
||||||
> **Document Context**: Authoritative operational manual and process specification for the PFM Platform. Derived from the PFM SRS v2.0 and governing all lifecycle transitions, workflow gates, RBAC controls, and Maker-Checker segregation of duties.
|
> **Document Context**: Authoritative operational manual and process specification for the PFM Platform. Derived from the PFM SRS v2.0 and governed by **Lite Charms (PTY) Ltd** (official technology partner and author of every technical implementation, architecture, and maintenance of the system, with **Ifri Technologies** operating within Lite Charms (PTY) Ltd).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 281 KiB After Width: | Height: | Size: 281 KiB |
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 302 KiB After Width: | Height: | Size: 302 KiB |
|
Before Width: | Height: | Size: 260 KiB After Width: | Height: | Size: 260 KiB |
|
Before Width: | Height: | Size: 269 KiB After Width: | Height: | Size: 269 KiB |
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 156 KiB After Width: | Height: | Size: 156 KiB |
|
Before Width: | Height: | Size: 140 KiB After Width: | Height: | Size: 140 KiB |
|
Before Width: | Height: | Size: 150 KiB After Width: | Height: | Size: 150 KiB |
|
Before Width: | Height: | Size: 218 KiB After Width: | Height: | Size: 218 KiB |
|
Before Width: | Height: | Size: 637 KiB After Width: | Height: | Size: 637 KiB |
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
> **Document Context**: This document serves as the primary system specification, technical architectural guide, and development roadmap for the **Post-Fund Management, Performance & Impact Management Platform (PFM)**. It is directly derived from the **PFM System Requirements Specification (SRS) v2.0** (authored by S. Phiri, 13 August 2026) and reflects the actual technical implementation and project layout in this repository.
|
> **Document Context**: This document serves as the primary system specification, technical architectural guide, and development roadmap for the **Post-Fund Management, Performance & Impact Management Platform (PFM)**. It is directly derived from the **PFM System Requirements Specification (SRS) v2.0** (authored by S. Phiri, 13 August 2026) and reflects the actual technical implementation and project layout in this repository.
|
||||||
>
|
>
|
||||||
|
> **Technology Partner & Technical Authorship**: **Lite Charms (PTY) Ltd** is the official technology partner and author of every technical implementation, system architecture, and maintenance of the Post-Fund Management (PFM) Platform. **Ifri Technologies** is an initiative and entity within **Lite Charms (PTY) Ltd**.
|
||||||
|
>
|
||||||
> **Role for Gemini / Antigravity**: Use this file as your authoritative blueprint when extending, debugging, testing, or implementing any features, endpoints, domain models, or UI components across the PFM solution.
|
> **Role for Gemini / Antigravity**: Use this file as your authoritative blueprint when extending, debugging, testing, or implementing any features, endpoints, domain models, or UI components across the PFM solution.
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -194,8 +196,8 @@ The platform establishes a dual-channel Model Context Protocol (MCP) architectur
|
|||||||
* `CommunicationsMcpTools`: Proxies `ICommunicationsService` (Notifications M25, Onboarding Invites M03).
|
* `CommunicationsMcpTools`: Proxies `ICommunicationsService` (Notifications M25, Onboarding Invites M03).
|
||||||
* `UsersMcpTools`: Proxies `IUserService` (Identity accounts, RBAC roles, security claims).
|
* `UsersMcpTools`: Proxies `IUserService` (Identity accounts, RBAC roles, security claims).
|
||||||
|
|
||||||
2. **In-App MCP Consumer in `PostFundManagement.Api` (Zero Web Hops)**:
|
2. **In-App MCP Consumer in `PostFundManagement.Api` & `PostFundManagement.Jobs` (Zero Web Hops)**:
|
||||||
- `PostFundManagement.Api` accesses tools in-process via `IInAppMcpClient` registered by `AddApplicationMcpTools()`.
|
- Both `PostFundManagement.Api` and `PostFundManagement.Jobs` access tools in-process via `IInAppMcpClient` registered by `AddApplicationMcpTools()`.
|
||||||
- Resolves and executes tool methods directly against scoped domain services without issuing HTTP network calls to an external MCP server.
|
- Resolves and executes tool methods directly against scoped domain services without issuing HTTP network calls to an external MCP server.
|
||||||
- Provides optional in-process protocol compatibility via `CreateProtocolClientAsync()` using duplex in-memory streams.
|
- Provides optional in-process protocol compatibility via `CreateProtocolClientAsync()` using duplex in-memory streams.
|
||||||
- *Design Boundary*: No autonomous AI agents are defined in the solution at this time; the tooling layer and in-app consumer interfaces provide the underlying foundation for future agentic orchestration.
|
- *Design Boundary*: No autonomous AI agents are defined in the solution at this time; the tooling layer and in-app consumer interfaces provide the underlying foundation for future agentic orchestration.
|
||||||
|
|||||||
@@ -1,13 +1,17 @@
|
|||||||
PROPRIETARY LICENSE
|
PROPRIETARY LICENSE
|
||||||
|
|
||||||
Copyright (c) 2026 IFRI TECHNOLOGIES (PTY) Ltd. All rights reserved.
|
Copyright (c) 2026 Lite Charms (PTY) Ltd / Ifri Technologies. All rights reserved.
|
||||||
|
|
||||||
This software and its associated documentation (the "Software") are the
|
This software and its associated documentation (the "Software") are the proprietary
|
||||||
proprietary property of IFRI TECHNOLOGIES (PTY) Ltd.
|
property of Lite Charms (PTY) Ltd.
|
||||||
|
|
||||||
The Software is provided for internal use only. Unauthorized copying,
|
Ifri Technologies is an entity within Lite Charms (PTY) Ltd.
|
||||||
distribution, modification, or use of this file via any medium is
|
Lite Charms (PTY) Ltd is the technology partner and author of every technical
|
||||||
strictly prohibited.
|
implementation and maintenance of the system.
|
||||||
|
|
||||||
|
The Software is provided for internal and authorized partner use only.
|
||||||
|
Unauthorized copying, distribution, modification, reverse engineering,
|
||||||
|
or use of this file via any medium is strictly prohibited.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ builder.Services.AddFeatureManagement();
|
|||||||
builder.Services.AddSharedServices();
|
builder.Services.AddSharedServices();
|
||||||
builder.Services.AddHostedService<JobsWorker>();
|
builder.Services.AddHostedService<JobsWorker>();
|
||||||
builder.Services.AddRegisterServicesWithCaching(builder.Configuration);
|
builder.Services.AddRegisterServicesWithCaching(builder.Configuration);
|
||||||
|
builder.Services.AddApplicationMcpTools();
|
||||||
builder.Services.AddEndpointAndServiceCaching(builder.Configuration);
|
builder.Services.AddEndpointAndServiceCaching(builder.Configuration);
|
||||||
builder.Services.AddTransient<ITenantContextService, HeadlessTenantContextService>();
|
builder.Services.AddTransient<ITenantContextService, HeadlessTenantContextService>();
|
||||||
builder.Services.AddSkorubaApiService(builder.Configuration);
|
builder.Services.AddSkorubaApiService(builder.Configuration);
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
An enterprise system designed to manage the entire post-funding grant and project lifecycle. PFM provides end-to-end oversight across strategic portfolios, programme allocation, project execution tracking, financial disbursements, monitoring & evaluation (M&E), and candidate notifications.
|
An enterprise system designed to manage the entire post-funding grant and project lifecycle. PFM provides end-to-end oversight across strategic portfolios, programme allocation, project execution tracking, financial disbursements, monitoring & evaluation (M&E), and candidate notifications.
|
||||||
|
|
||||||
|
> **Technology Partner & Technical Authorship**: **Lite Charms (PTY) Ltd** is the official technology partner and author of every technical implementation, system architecture, and maintenance of the Post-Fund Management (PFM) Platform. **Ifri Technologies** is an initiative and entity within **Lite Charms (PTY) Ltd**.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🏛️ System Architecture & Domain Model
|
## 🏛️ System Architecture & Domain Model
|
||||||
@@ -43,7 +45,7 @@ The application follows a modular, hierarchical architecture where high-level fu
|
|||||||
|
|
||||||
### **6. Model Context Protocol (MCP) — In-App & External Tooling**
|
### **6. Model Context Protocol (MCP) — In-App & External Tooling**
|
||||||
* **Central Tool Definitions (`PostFundManagement.Application/Mcp`)**: Tools proxy core domain services organized by business domain (`Grants`, `Projects`, `Execution`, `Governance`, `Evidence`, `Communications`, `Users`).
|
* **Central Tool Definitions (`PostFundManagement.Application/Mcp`)**: Tools proxy core domain services organized by business domain (`Grants`, `Projects`, `Execution`, `Governance`, `Evidence`, `Communications`, `Users`).
|
||||||
* **In-App MCP (`PostFundManagement.Api`)**: The API has direct in-process access to tooling via `IInAppMcpClient` without making external web or HTTP calls.
|
* **In-App MCP (`PostFundManagement.Api` & `PostFundManagement.Jobs`)**: Both the API and Jobs background worker hosts have direct in-process access to tooling via `IInAppMcpClient` without making external web or HTTP calls.
|
||||||
* **External MCP Server (`PostFundManagement.Mcp`)**: Dedicated .NET 10 host serving MCP tools over HTTP/SSE (`/mcp`) and Stdio (`--stdio`) for external agents, Claude Desktop, and IDEs.
|
* **External MCP Server (`PostFundManagement.Mcp`)**: Dedicated .NET 10 host serving MCP tools over HTTP/SSE (`/mcp`) and Stdio (`--stdio`) for external agents, Claude Desktop, and IDEs.
|
||||||
* **Token Optimization**: Standardized `McpToolResult` models minimize prompt token overhead.
|
* **Token Optimization**: Standardized `McpToolResult` models minimize prompt token overhead.
|
||||||
* **Agent Status**: Tooling infrastructure is established; agent definitions are deferred to future milestones.
|
* **Agent Status**: Tooling infrastructure is established; agent definitions are deferred to future milestones.
|
||||||
@@ -78,6 +80,7 @@ The application follows a modular, hierarchical architecture where high-level fu
|
|||||||
* **Frontend Portals**:
|
* **Frontend Portals**:
|
||||||
* `PostFundManagement.ConsoleUI`: Internal Staff & Portfolio Administration Portal (React 19 + TypeScript + Vite + Tailwind CSS)
|
* `PostFundManagement.ConsoleUI`: Internal Staff & Portfolio Administration Portal (React 19 + TypeScript + Vite + Tailwind CSS)
|
||||||
* `PostFundManagement.PartnerUI`: External Recipient & Grantee Portal (React 19 + TypeScript + Vite + WebGL OGL)
|
* `PostFundManagement.PartnerUI`: External Recipient & Grantee Portal (React 19 + TypeScript + Vite + WebGL OGL)
|
||||||
|
* `PostFundManagement.ShowcaseUI`: Public-Facing Product & Experience Showcase Portal (React 19 + TypeScript + Vite + Tailwind CSS)
|
||||||
* **Database**: PostgreSQL 14+ with Npgsql & EF Core 10
|
* **Database**: PostgreSQL 14+ with Npgsql & EF Core 10
|
||||||
* **Security & Authentication**: Duende IdentityServer / OIDC PKCE + Claim-Based RBAC
|
* **Security & Authentication**: Duende IdentityServer / OIDC PKCE + Claim-Based RBAC
|
||||||
* **Governance Patterns**: Maker-Checker Pattern (Dual Authorization & Segregation of Duties)
|
* **Governance Patterns**: Maker-Checker Pattern (Dual Authorization & Segregation of Duties)
|
||||||
@@ -113,8 +116,8 @@ To eliminate conflicts of interest, record creators ("Makers") cannot approve ("
|
|||||||
$$\text{Can Approve} = \text{Has 'update' permission} \land (\text{Current User ID} \neq \text{Record Creator ID})$$
|
$$\text{Can Approve} = \text{Has 'update' permission} \land (\text{Current User ID} \neq \text{Record Creator ID})$$
|
||||||
|
|
||||||
For in-depth architectural and operational specifications, see:
|
For in-depth architectural and operational specifications, see:
|
||||||
* [Architecture.md](file:///c:/Users/Admin/source/repos/PostFundManagement/Architecture.md)
|
* [Architecture.md](file:///c:/Users/Admin/source/repos/PostFundManagement/Documentation/Architecture.md)
|
||||||
* [Processes.md](file:///c:/Users/Admin/source/repos/PostFundManagement/Processes.md)
|
* [Processes.md](file:///c:/Users/Admin/source/repos/PostFundManagement/Documentation/Processes.md)
|
||||||
* [GEMINI.md](file:///c:/Users/Admin/source/repos/PostFundManagement/GEMINI.md)
|
* [GEMINI.md](file:///c:/Users/Admin/source/repos/PostFundManagement/GEMINI.md)
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -125,14 +128,19 @@ For in-depth architectural and operational specifications, see:
|
|||||||
PostFundManagement/
|
PostFundManagement/
|
||||||
├── PostFundManagement.Domain/ # Core Domain Entities, Enums, Value Objects & Abstractions (IEvent)
|
├── PostFundManagement.Domain/ # Core Domain Entities, Enums, Value Objects & Abstractions (IEvent)
|
||||||
├── PostFundManagement.Infrastructure/ # EF Core 10, PostgreSQL (Npgsql), Migrations, Data Protection
|
├── PostFundManagement.Infrastructure/ # EF Core 10, PostgreSQL (Npgsql), Migrations, Data Protection
|
||||||
├── PostFundManagement.Application/ # CQRS Handlers, Mediator, DTOs, Validations, S3, Email, Job Orchestrator
|
├── PostFundManagement.Application/ # CQRS Handlers, Mediator, DTOs, Validations, S3, Email, Quartz, Mcp Tools
|
||||||
├── PostFundManagement.Api/ # ASP.NET Core Minimal APIs / Carter, Auth (OIDC), Swagger/Scalar, Versioning
|
├── PostFundManagement.Api/ # ASP.NET Core Minimal APIs / Carter, Auth (OIDC), Swagger/Scalar, In-App MCP Consumer
|
||||||
|
├── PostFundManagement.Mcp/ # Dedicated Model Context Protocol (MCP) Server Host (HTTP/SSE & Stdio Transports)
|
||||||
├── PostFundManagement.Jobs/ # Dedicated Quartz.NET Background Worker Host (Recurring & Event-Driven Jobs)
|
├── PostFundManagement.Jobs/ # Dedicated Quartz.NET Background Worker Host (Recurring & Event-Driven Jobs)
|
||||||
├── PostFundManagement.Tests/ # Unit & Integration Test Suite (xUnit, Coverlet)
|
├── PostFundManagement.Tests/ # Unit & Integration Test Suite (xUnit, Coverlet)
|
||||||
├── PostFundManagement.ConsoleUI/ # Internal Staff & Admin Web Portal (React 19 + Vite + Tailwind 4)
|
├── PostFundManagement.ConsoleUI/ # Internal Staff & Admin Web Portal (React 19 + Vite + Tailwind 4)
|
||||||
├── PostFundManagement.PartnerUI/ # External Grantee / Recipient Portal (React 19 + Vite + WebGL OGL)
|
├── PostFundManagement.PartnerUI/ # External Grantee / Recipient Portal (React 19 + Vite + WebGL OGL)
|
||||||
├── Architecture.md # System Architecture, Security, RBAC, Caching & Quartz Spec
|
├── PostFundManagement.ShowcaseUI/ # Public-Facing Product Experience Showcase Portal (React 19 + Vite + Tailwind 4)
|
||||||
├── Processes.md # Operational Grant Lifecycle, Maker-Checker & Background Workflows
|
├── Documentation/ # System Architecture, Operational Manuals, Marketing & Screenshots
|
||||||
|
│ ├── Architecture.md # System Architecture, Security, RBAC, Caching, MCP & Quartz Spec
|
||||||
|
│ ├── Processes.md # Operational Grant Lifecycle, Maker-Checker & Background Workflows
|
||||||
|
│ ├── Marketing/ # Campaign Decks & Marketing Posters
|
||||||
|
│ └── Screenshots/ # Backoffice (ConsoleUI) & Partner Portal Screenshots
|
||||||
├── GEMINI.md # Master Technical & Architecture Roadmap (SRS v2.0 Alignment)
|
├── GEMINI.md # Master Technical & Architecture Roadmap (SRS v2.0 Alignment)
|
||||||
└── docker-compose.yml # Container orchestration for API and Frontends
|
└── docker-compose.yml # Container orchestration for API and Frontends
|
||||||
```
|
```
|
||||||
@@ -179,6 +187,9 @@ yarn install
|
|||||||
yarn dev
|
yarn dev
|
||||||
```
|
```
|
||||||
|
|
||||||
## 📄 License
|
## 📄 License & Legal Notice
|
||||||
|
|
||||||
Internal Proprietary Software — All rights reserved.
|
Internal Proprietary Software — All rights reserved.
|
||||||
|
Copyright (c) 2026 **Lite Charms (PTY) Ltd** / **Ifri Technologies**.
|
||||||
|
|
||||||
|
This software and its associated documentation are the proprietary property of **Lite Charms (PTY) Ltd**. **Ifri Technologies** is an initiative and entity within **Lite Charms (PTY) Ltd**. **Lite Charms (PTY) Ltd** is the official technology partner and author of every technical implementation, system architecture, and maintenance of the Post-Fund Management (PFM) Platform. Unauthorized copying, distribution, or modification via any medium is strictly prohibited.
|
||||||
|
|||||||