aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGunther6070 <haydenhartman10@yahoo.com>2025-04-16 20:48:45 -0400
committerGunther6070 <haydenhartman10@yahoo.com>2025-04-16 20:48:45 -0400
commitb4e9341dcd26f983cb7ec55330deed84bbc2f553 (patch)
tree707443b706181d2f7c7a1c9901e1e05d9c264cae
parentca614fa34bf228c418ade8f7c47e3e7428f942b6 (diff)
downloadJellySolutions-b4e9341dcd26f983cb7ec55330deed84bbc2f553.tar.gz
JellySolutions-b4e9341dcd26f983cb7ec55330deed84bbc2f553.tar.bz2
JellySolutions-b4e9341dcd26f983cb7ec55330deed84bbc2f553.zip
Added new uml to viewmodel and model sections
-rw-r--r--docs/DesignDoc.md4
-rw-r--r--docs/u-fund-model.drawio.pngbin0 -> 173754 bytes
-rw-r--r--docs/u-fund-model.drawio.xml103
-rw-r--r--docs/u-fund-viewmodel.drawio.pngbin0 -> 149547 bytes
-rw-r--r--docs/u-fund-viewmodel.drawio.xml134
5 files changed, 239 insertions, 2 deletions
diff --git a/docs/DesignDoc.md b/docs/DesignDoc.md
index c1b76fe..0d288fe 100644
--- a/docs/DesignDoc.md
+++ b/docs/DesignDoc.md
@@ -248,7 +248,7 @@ Requests are sent from the view tier and handled by controllers. For example, wh
> _At appropriate places as part of this narrative provide **one** or more updated and **properly labeled**
> static models (UML class diagrams) with some details such as associations (connections) between classes, and critical attributes and methods. (**Be sure** to revisit the Static **UML Review Sheet** to ensure your class diagrams are using correct format and syntax.)_
>
-![UML](u-fund.drawio.png)
+![UML](u-fund-viewmodel.drawio.png)
### Model Tier
@@ -273,7 +273,7 @@ In our model tier we have a Need class, a User class, and a UserAuth class. The
> _At appropriate places as part of this narrative provide **one** or more updated and **properly labeled**
> static models (UML class diagrams) with some details such as associations (connections) between classes, and critical attributes and methods. (**Be sure** to revisit the Static **UML Review Sheet** to ensure your class diagrams are using correct format and syntax.)_
-![UML](u-fund.drawio.png)
+![UML](u-fund-model.drawio.png)
## OO Design Principles
diff --git a/docs/u-fund-model.drawio.png b/docs/u-fund-model.drawio.png
new file mode 100644
index 0000000..3d6d6b9
--- /dev/null
+++ b/docs/u-fund-model.drawio.png
Binary files differ
diff --git a/docs/u-fund-model.drawio.xml b/docs/u-fund-model.drawio.xml
new file mode 100644
index 0000000..69138d4
--- /dev/null
+++ b/docs/u-fund-model.drawio.xml
@@ -0,0 +1,103 @@
+<mxfile host="Electron" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/26.2.2 Chrome/134.0.6998.178 Electron/35.1.2 Safari/537.36" version="26.2.2">
+ <diagram id="WOSjVCChJG0uuKkKcy1j" name="Page-1">
+ <mxGraphModel dx="3484" dy="1652" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="0" pageScale="1" pageWidth="850" pageHeight="1100" background="none" math="0" shadow="0">
+ <root>
+ <mxCell id="0" />
+ <mxCell id="1" parent="0" />
+ <mxCell id="node17" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;interface&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;CupboardDAO&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ deleteNeed(int): boolean&lt;br/&gt;+ getNeed(int): Need&lt;br/&gt;+ addNeed(Need): Need&lt;br/&gt;+ updateNeed(Need): Need&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; needs: Need[]&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
+ <mxGeometry x="-750" y="750" width="192" height="142" as="geometry" />
+ </mxCell>
+ <mxCell id="node2" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;CupboardFileDAO&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ CupboardFileDAO(String, ObjectMapper): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- needs: Map&amp;lt;Integer, Need&amp;gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ getNeed(int): Need&lt;br/&gt;+ addNeed(Need): Need&lt;br/&gt;- save(): void&lt;br/&gt;+ deleteNeed(int): boolean&lt;br/&gt;- load(): void&lt;br/&gt;- nextId(): int&lt;br/&gt;+ updateNeed(Need): Need&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; needs: Need[]&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
+ <mxGeometry x="-472" y="687.5" width="286" height="267" as="geometry" />
+ </mxCell>
+ <mxCell id="node19" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;GoalType&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ GoalType(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ valueOf(String): GoalType&lt;br/&gt;+ values(): GoalType[]&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
+ <mxGeometry x="-401.5" y="190" width="193" height="136" as="geometry" />
+ </mxCell>
+ <mxCell id="node9" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;Need&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ Need(String, String, String, double, GoalType, boolean, String): &lt;br/&gt;+ Need(Need): &lt;br/&gt;+ Need(String, String, String, int, double, GoalType, boolean, String): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- name: String&lt;br/&gt;- type: GoalType&lt;br/&gt;- current: double&lt;br/&gt;- id: int&lt;br/&gt;- maxGoal: double&lt;br/&gt;- filterAttributes: String[]&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ toString(): String&lt;br/&gt;+ incrementCurrent(double): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; name: String&lt;br/&gt; id: int&lt;br/&gt; ID: int&lt;br/&gt; type: GoalType&lt;br/&gt; current: double&lt;br/&gt; maxGoal: double&lt;br/&gt; filterAttributes: String[]&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
+ <mxGeometry x="-880" y="180" width="392" height="309" as="geometry" />
+ </mxCell>
+ <mxCell id="node10" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;User&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ User(String, int, List&amp;lt;Integer&amp;gt;, UserType): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- type: UserType&lt;br/&gt;- username: String&lt;br/&gt;- basket: List&amp;lt;Integer&amp;gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ addToBasket(Need): void&lt;br/&gt;+ withoutPasswordHash(): User&lt;br/&gt;+ verifyPassword(String): boolean&lt;br/&gt;+ create(String, String): User&lt;br/&gt;+ removeBasketNeed(Integer): void&lt;br/&gt;+ toString(): String&lt;br/&gt;+ copyPassword(User): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; type: UserType&lt;br/&gt; basket: Integer[]&lt;br/&gt; username: String&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
+ <mxGeometry x="-410.5" y="1310" width="293" height="320" as="geometry" />
+ </mxCell>
+ <mxCell id="node14" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;UserAuth&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ UserAuth(String, String, LocalDateTime): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;~ key: String&lt;br/&gt;~ username: String&lt;br/&gt;~ expiration: LocalDateTime&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ generate(String): UserAuth&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; expiration: LocalDateTime&lt;br/&gt; key: String&lt;br/&gt; username: String&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
+ <mxGeometry x="-237" y="1011" width="282" height="179" as="geometry" />
+ </mxCell>
+ <mxCell id="node1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;interface&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;UserAuthDAO&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ addUserAuth(UserAuth): void&lt;br/&gt;+ removeUserAuth(String): void&lt;br/&gt;+ getUserAuth(String): UserAuth&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
+ <mxGeometry x="-930" y="1040.5" width="218" height="120" as="geometry" />
+ </mxCell>
+ <mxCell id="node3" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;UserAuthFIleDAO&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ UserAuthFIleDAO(ObjectMapper, String): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- save(): void&lt;br/&gt;- load(): void&lt;br/&gt;+ addUserAuth(UserAuth): void&lt;br/&gt;+ getUserAuth(String): UserAuth&lt;br/&gt;+ removeUserAuth(String): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
+ <mxGeometry x="-650" y="1018.5" width="283" height="164" as="geometry" />
+ </mxCell>
+ <mxCell id="node4" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;interface&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;UserDAO&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ updateUser(User): User&lt;br/&gt;+ deleteUser(String): boolean&lt;br/&gt;+ getUser(String): User&lt;br/&gt;+ addUser(User): User&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; users: User[]&lt;br/&gt; userCount: int&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
+ <mxGeometry x="-1070" y="1387" width="203" height="150" as="geometry" />
+ </mxCell>
+ <mxCell id="node0" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;UserFileDAO&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ UserFileDAO(String, ObjectMapper): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- users: Map&amp;lt;String, User&amp;gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ addUser(User): User&lt;br/&gt;+ deleteUser(String): boolean&lt;br/&gt;+ updateUser(User): User&lt;br/&gt;- save(): void&lt;br/&gt;+ getUser(String): User&lt;br/&gt;- load(): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; users: User[]&lt;br/&gt; userCount: int&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
+ <mxGeometry x="-770" y="1339" width="257" height="246" as="geometry" />
+ </mxCell>
+ <mxCell id="node18" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;UserType&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ UserType(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ valueOf(String): UserType&lt;br/&gt;+ values(): UserType[]&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
+ <mxGeometry x="1.5" y="1400.25" width="194" height="139.5" as="geometry" />
+ </mxCell>
+ <mxCell id="edge0" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;exitX=0.000;exitY=0.500;exitDx=0;exitDy=0;" parent="1" source="node2" target="node17" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <Array as="points" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="edge5" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;" parent="1" source="node2" target="node9" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="-329" y="603" />
+ <mxPoint x="-586" y="603" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="edge19" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThin;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.552;exitY=0.000;exitDx=0;exitDy=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;jumpStyle=none;startFill=1;" parent="1" source="node2" target="node9" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="-314" y="412" />
+ <mxPoint x="-350" y="412" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="edge16" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=1.000;exitY=0.319;exitDx=0;exitDy=0;entryX=0.000;entryY=0.653;entryDx=0;entryDy=0;" parent="1" source="node9" target="node19" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <Array as="points" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="edge24" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;" parent="1" source="node10" target="node18" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <Array as="points" />
+ <mxPoint x="-78.5" y="1380" as="sourcePoint" />
+ <mxPoint x="-28.5" y="1440" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="edge21" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThin;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=1;exitY=0.5;exitDx=0;exitDy=0;startFill=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="node3" target="node14" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="-350" y="1100" />
+ </Array>
+ <mxPoint x="-290" y="1080" as="targetPoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="label126" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge21" vertex="1" connectable="0">
+ <mxGeometry x="-456" y="1091" as="geometry" />
+ </mxCell>
+ <mxCell id="edge2" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;exitX=0.000;exitY=0.500;exitDx=0;exitDy=0;entryX=1.000;entryY=0.500;entryDx=0;entryDy=0;jumpStyle=none;" parent="1" source="node3" target="node1" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <Array as="points" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="edge6" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThin;endArrow=openThin;endSize=12;strokeColor=#595959;entryX=0.005;entryY=0.466;entryDx=0;entryDy=0;entryPerimeter=0;startFill=1;exitX=1;exitY=0.488;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="node0" target="node10" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <Array as="points" />
+ <mxPoint x="-490" y="1459" as="sourcePoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="edge1" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;exitX=0.000;exitY=0.500;exitDx=0;exitDy=0;entryX=1.000;entryY=0.500;entryDx=0;entryDy=0;" parent="1" source="node0" target="node4" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <Array as="points" />
+ </mxGeometry>
+ </mxCell>
+ </root>
+ </mxGraphModel>
+ </diagram>
+</mxfile>
diff --git a/docs/u-fund-viewmodel.drawio.png b/docs/u-fund-viewmodel.drawio.png
new file mode 100644
index 0000000..d92098b
--- /dev/null
+++ b/docs/u-fund-viewmodel.drawio.png
Binary files differ
diff --git a/docs/u-fund-viewmodel.drawio.xml b/docs/u-fund-viewmodel.drawio.xml
new file mode 100644
index 0000000..afd1d33
--- /dev/null
+++ b/docs/u-fund-viewmodel.drawio.xml
@@ -0,0 +1,134 @@
+<mxfile host="Electron" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/26.2.2 Chrome/134.0.6998.178 Electron/35.1.2 Safari/537.36" version="26.2.2">
+ <diagram id="WOSjVCChJG0uuKkKcy1j" name="Page-1">
+ <mxGraphModel dx="3757" dy="1271" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="0" pageScale="1" pageWidth="850" pageHeight="1100" background="none" math="0" shadow="0">
+ <root>
+ <mxCell id="0" />
+ <mxCell id="1" parent="0" />
+ <mxCell id="node5" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;AuthController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ AuthController(AuthService): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ login(Map&amp;lt;String, String&amp;gt;): ResponseEntity&amp;lt;String&amp;gt;&lt;br/&gt;+ logout(String): ResponseEntity&amp;lt;Object&amp;gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
+ <mxGeometry x="-1910" y="940" width="340" height="129" as="geometry" />
+ </mxCell>
+ <mxCell id="node13" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;AuthService&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ AuthService(UserAuthDAO, UserService): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ login(String, String): String&lt;br/&gt;+ keyIsValid(String): void&lt;br/&gt;+ keyHasAccessToCupboard(String): void&lt;br/&gt;+ keyHasAccessToUser(String, String): void&lt;br/&gt;+ logout(String): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
+ <mxGeometry x="-1337" y="930" width="285" height="190" as="geometry" />
+ </mxCell>
+ <mxCell id="node12" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;CupboardController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ CupboardController(CupboardService, AuthService): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ createNeed(Map&amp;lt;String, Object&amp;gt;, String): ResponseEntity&amp;lt;Object&amp;gt;&lt;br/&gt;+ deleteNeed(int, String): ResponseEntity&amp;lt;Object&amp;gt;&lt;br/&gt;- of(Object[]): Object[]&lt;br/&gt;+ getNeed(int): ResponseEntity&amp;lt;Object&amp;gt;&lt;br/&gt;+ checkoutNeeds(List&amp;lt;Map&amp;lt;String, Integer&amp;gt;&amp;gt;, String): ResponseEntity&amp;lt;Object&amp;gt;&lt;br/&gt;+ searchNeeds(String): ResponseEntity&amp;lt;Object&amp;gt;&lt;br/&gt;+ updateNeed(Need, int, String): ResponseEntity&amp;lt;Object&amp;gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; needs: ResponseEntity&amp;lt;Object&amp;gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
+ <mxGeometry x="-1771" y="395" width="501" height="235" as="geometry" />
+ </mxCell>
+ <mxCell id="node16" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;CupboardService&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ CupboardService(AuthService, CupboardDAO): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ checkoutNeed(int, double, String): void&lt;br/&gt;+ createNeed(String, String, String, double, GoalType, boolean, String): Need&lt;br/&gt;+ getNeed(int): Need&lt;br/&gt;+ deleteNeed(int): boolean&lt;br/&gt;+ searchNeeds(String): Need[]&lt;br/&gt;+ updateNeed(Need, int): Need&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; needs: Need[]&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
+ <mxGeometry x="-1185" y="406" width="485" height="210" as="geometry" />
+ </mxCell>
+ <mxCell id="node11" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;UserController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ UserController(UserService, AuthService): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ deleteUser(String, String): ResponseEntity&amp;lt;Object&amp;gt;&lt;br/&gt;+ getUserCount(String): ResponseEntity&amp;lt;Object&amp;gt;&lt;br/&gt;+ createUser(Map&amp;lt;String, String&amp;gt;): ResponseEntity&amp;lt;Object&amp;gt;&lt;br/&gt;- of(Object[]): Object[]&lt;br/&gt;+ getUser(String, String): ResponseEntity&amp;lt;Object&amp;gt;&lt;br/&gt;+ updateUser(User, String, String): ResponseEntity&amp;lt;Object&amp;gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
+ <mxGeometry x="-1898" y="1539" width="382" height="186" as="geometry" />
+ </mxCell>
+ <mxCell id="node8" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;UserService&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ UserService(UserDAO, CupboardService): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ updateUser(User, String): User&lt;br/&gt;+ deleteUser(String): boolean&lt;br/&gt;+ createUser(String, String): User&lt;br/&gt;+ getUser(String): User&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; userCount: int&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" parent="1" vertex="1">
+ <mxGeometry x="-1326" y="1549" width="289" height="166" as="geometry" />
+ </mxCell>
+ <mxCell id="edge8" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;entryX=0.000;entryY=0.399;entryDx=0;entryDy=0;" parent="1" target="node13" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="-1570" y="1006" />
+ <mxPoint x="-1510" y="1006" />
+ </Array>
+ <mxPoint x="-1570" y="1006" as="sourcePoint" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="label48" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge8" vertex="1" connectable="0">
+ <mxGeometry x="-1560" y="980" as="geometry" />
+ </mxCell>
+ <mxCell id="label52" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge8" vertex="1" connectable="0">
+ <mxGeometry x="-1360" y="990" as="geometry" />
+ </mxCell>
+ <mxCell id="edge14" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.425;exitY=1.000;exitDx=0;exitDy=0;entryX=0.382;entryY=0.000;entryDx=0;entryDy=0;" parent="1" source="node13" target="node8" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <Array as="points" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="label84" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge14" vertex="1" connectable="0">
+ <mxGeometry x="-1211" y="1090" as="geometry" />
+ </mxCell>
+ <mxCell id="label88" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge14" vertex="1" connectable="0">
+ <mxGeometry x="-1230" y="1520" as="geometry" />
+ </mxCell>
+ <mxCell id="edge18" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;entryX=0.342;entryY=0.000;entryDx=0;entryDy=0;" parent="1" source="node12" target="node13" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="-1525" y="885" />
+ <mxPoint x="-1239" y="885" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="label108" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge18" vertex="1" connectable="0">
+ <mxGeometry x="-1525" y="632" as="geometry" />
+ </mxCell>
+ <mxCell id="label112" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge18" vertex="1" connectable="0">
+ <mxGeometry x="-1260" y="900" as="geometry" />
+ </mxCell>
+ <mxCell id="edge17" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=1.000;exitY=0.528;exitDx=0;exitDy=0;entryX=0.000;entryY=0.531;entryDx=0;entryDy=0;" parent="1" source="node12" target="node16" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <Array as="points" />
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="label102" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge17" vertex="1" connectable="0">
+ <mxGeometry x="-1270" y="502" as="geometry" />
+ </mxCell>
+ <mxCell id="label106" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge17" vertex="1" connectable="0">
+ <mxGeometry x="-1210" y="520" as="geometry" />
+ </mxCell>
+ <mxCell id="edge22" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;entryX=0.500;entryY=0.000;entryDx=0;entryDy=0;" parent="1" source="node16" target="node13" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="-978" y="773" />
+ <mxPoint x="-1194" y="773" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="label132" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge22" vertex="1" connectable="0">
+ <mxGeometry x="-989" y="630" as="geometry" />
+ </mxCell>
+ <mxCell id="label136" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge22" vertex="1" connectable="0">
+ <mxGeometry x="-1205" y="870" as="geometry" />
+ </mxCell>
+ <mxCell id="edge7" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.987;exitY=0.000;exitDx=0;exitDy=0;" parent="1" source="node11" target="node13" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="-1521" y="1052" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="label42" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge7" vertex="1" connectable="0">
+ <mxGeometry x="-1532" y="1510" as="geometry" />
+ </mxCell>
+ <mxCell id="label46" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge7" vertex="1" connectable="0">
+ <mxGeometry x="-1360" y="1060" as="geometry" />
+ </mxCell>
+ <mxCell id="edge13" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=1.000;exitY=0.515;exitDx=0;exitDy=0;" parent="1" source="node11" target="node8" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="-1370" y="1635" />
+ <mxPoint x="-1370" y="1635" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="label78" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge13" vertex="1" connectable="0">
+ <mxGeometry x="-1495" y="1614" as="geometry" />
+ </mxCell>
+ <mxCell id="label82" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge13" vertex="1" connectable="0">
+ <mxGeometry x="-1363" y="1636" as="geometry" />
+ </mxCell>
+ <mxCell id="edge12" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;" parent="1" source="node8" target="node16" edge="1">
+ <mxGeometry width="50" height="50" relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="-1181" y="1286" />
+ <mxPoint x="-963" y="1286" />
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="label72" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge12" vertex="1" connectable="0">
+ <mxGeometry x="-1192" y="1524" as="geometry" />
+ </mxCell>
+ <mxCell id="label76" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" parent="edge12" vertex="1" connectable="0">
+ <mxGeometry x="-950" y="621" as="geometry" />
+ </mxCell>
+ </root>
+ </mxGraphModel>
+ </diagram>
+</mxfile>