mirror of
https://github.com/aaronpo97/the-biergarten-app.git
synced 2026-04-05 10:09:03 +00:00
1 line
70 KiB
XML
1 line
70 KiB
XML
<?plantuml 1.2026.1?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="DESCRIPTION" height="1224px" preserveAspectRatio="none" style="width:4815px;height:1224px;background:#FFFFFF;" version="1.1" viewBox="0 0 4815 1224" width="4815px" zoomAndPan="magnify"><title>Docker Deployment Architecture</title><defs/><g><g class="title" data-source-line="6"><text fill="#000000" font-family="Arial" font-size="22" font-weight="bold" lengthAdjust="spacing" textLength="342.3213" x="2231.8394" y="35.6357">Docker Deployment Architecture</text></g><!--cluster Development Environment\n(docker-compose.dev.yaml)--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml." data-source-line="12" id="ent0004"><path d="M13.5,410.7279 L199.6719,410.7279 A3.75,3.75 0 0 1 202.1719,413.2279 L209.1719,448.9251 L1778.5,448.9251 A2.5,2.5 0 0 1 1781,451.4251 L1781,1215.3579 A2.5,2.5 0 0 1 1778.5,1217.8579 L13.5,1217.8579 A2.5,2.5 0 0 1 11,1215.3579 L11,413.2279 A2.5,2.5 0 0 1 13.5,410.7279" fill="#E3F2FD" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="11" x2="209.1719" y1="448.9251" y2="448.9251"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="177.3652" x="18.9033" y="425.8597">Development Environment</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="185.1719" x="15" y="441.9583">(docker-compose.dev.yaml)</text></g><!--cluster DevDB--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevDB" data-source-line="14" id="ent0005"><polygon fill="#FFFFFF" points="1093,857.3179,1103,847.3179,1471,847.3179,1471,1175.8579,1461,1185.8579,1093,1185.8579,1093,857.3179" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1461" x2="1471" y1="857.3179" y2="847.3179"/><line style="stroke:#000000;stroke-width:1;" x1="1093" x2="1461" y1="857.3179" y2="857.3179"/><line style="stroke:#000000;stroke-width:1;" x1="1461" x2="1461" y1="857.3179" y2="1185.8579"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="76.2617" x="1239.8691" y="873.4497">SQL Server</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="302.6816" x="1126.6592" y="889.5483">(mcr.microsoft.com/mssql/server:2022-latest)</text></g><!--cluster DevDBInner--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevDB.DevDBInner" data-source-line="15" id="ent0006"><path d="M1124,978.6379 C1124,968.6379 1169,968.6379 1169,968.6379 C1169,968.6379 1214,968.6379 1214,978.6379 L1214,1151.8579 C1214,1161.8579 1169,1161.8579 1169,1161.8579 C1169,1161.8579 1124,1161.8579 1124,1151.8579 L1124,978.6379" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1124,978.6379 C1124,988.6379 1169,988.6379 1169,988.6379 C1169,988.6379 1214,988.6379 1214,978.6379" fill="none" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="70.0205" x="1133.9897" y="1003.7697">Biergarten</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="62.2549" x="1137.8726" y="1019.8683">Database</text></g><!--cluster DevAPI--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevAPI" data-source-line="29" id="ent0011"><polygon fill="#FFFFFF" points="157.5,505.7279,167.5,495.7279,781,495.7279,781,805.3179,771,815.3179,157.5,815.3179,157.5,505.7279" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="771" x2="781" y1="505.7279" y2="495.7279"/><line style="stroke:#000000;stroke-width:1;" x1="157.5" x2="771" y1="505.7279" y2="505.7279"/><line style="stroke:#000000;stroke-width:1;" x1="771" x2="771" y1="505.7279" y2="815.3179"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="92.5654" x="418.9673" y="521.8597">API Container</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="68.4482" x="431.0259" y="537.9583">(API.Core)</text></g><!--cluster DevMig--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevMig" data-source-line="48" id="ent0018"><polygon fill="#FFFFFF" points="813,634.5279,823,624.5279,1053,624.5279,1053,1017.5379,1043,1027.5379,813,1027.5379,813,634.5279" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1043" x2="1053" y1="634.5279" y2="624.5279"/><line style="stroke:#000000;stroke-width:1;" x1="813" x2="1043" y1="634.5279" y2="634.5279"/><line style="stroke:#000000;stroke-width:1;" x1="1043" x2="1043" y1="634.5279" y2="1027.5379"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="70.7793" x="893.6104" y="650.6597">Migrations</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="69.2139" x="894.3931" y="666.7583">(run-once)</text></g><!--cluster DevSeed--><g class="cluster" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevSeed" data-source-line="58" id="ent0023"><polygon fill="#FFFFFF" points="1511,634.5279,1521,624.5279,1749,624.5279,1749,1025.0079,1739,1035.0079,1511,1035.0079,1511,634.5279" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1739" x2="1749" y1="634.5279" y2="624.5279"/><line style="stroke:#000000;stroke-width:1;" x1="1511" x2="1739" y1="634.5279" y2="634.5279"/><line style="stroke:#000000;stroke-width:1;" x1="1739" x2="1739" y1="634.5279" y2="1035.0079"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="33.4619" x="1609.269" y="650.6597">Seed</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="69.2139" x="1591.3931" y="666.7583">(run-once)</text></g><!--cluster Test Environment\n(docker-compose.test.yaml)--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml." data-source-line="71" id="ent0028"><path d="M2146.5,57.2979 L2333.4443,57.2979 A3.75,3.75 0 0 1 2335.9443,59.7979 L2342.9443,95.4951 L4025.5,95.4951 A2.5,2.5 0 0 1 4028,97.9951 L4028,806.0779 A2.5,2.5 0 0 1 4025.5,808.5779 L2146.5,808.5779 A2.5,2.5 0 0 1 2144,806.0779 L2144,59.7979 A2.5,2.5 0 0 1 2146.5,57.2979" fill="#FFF3E0" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="2144" x2="2342.9443" y1="95.4951" y2="95.4951"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="118.2412" x="2181.8516" y="72.4297">Test Environment</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="185.9443" x="2148" y="88.5283">(docker-compose.test.yaml)</text></g><!--cluster TestDB--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestDB" data-source-line="73" id="ent0029"><polygon fill="#FFFFFF" points="3070,391.8879,3080,381.8879,3458,381.8879,3458,766.5779,3448,776.5779,3070,776.5779,3070,391.8879" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="3448" x2="3458" y1="391.8879" y2="381.8879"/><line style="stroke:#000000;stroke-width:1;" x1="3070" x2="3448" y1="391.8879" y2="391.8879"/><line style="stroke:#000000;stroke-width:1;" x1="3448" x2="3448" y1="391.8879" y2="776.5779"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="76.2617" x="3221.8691" y="408.0197">SQL Server</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="122.917" x="3198.5415" y="424.1183">(isolated instance)</text></g><!--cluster TestDBInner--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestDB.TestDBInner" data-source-line="74" id="ent0030"><path d="M3094,505.7279 C3094,495.7279 3148,495.7279 3148,495.7279 C3148,495.7279 3202,495.7279 3202,505.7279 L3202,742.5779 C3202,752.5779 3148,752.5779 3148,752.5779 C3148,752.5779 3094,752.5779 3094,742.5779 L3094,505.7279" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M3094,505.7279 C3094,515.7279 3148,515.7279 3148,515.7279 C3148,515.7279 3202,515.7279 3202,505.7279" fill="none" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="70.0205" x="3112.9897" y="530.8597">Biergarten</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="94.9307" x="3100.5347" y="546.9583">Test Database</text></g><!--cluster TestMig--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestMig" data-source-line="87" id="ent0035"><polygon fill="#FFFFFF" points="2852,168.5679,2862,158.5679,3088,158.5679,3088,282.6679,3078,292.6679,2852,292.6679,2852,168.5679" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="3078" x2="3088" y1="168.5679" y2="158.5679"/><line style="stroke:#000000;stroke-width:1;" x1="2852" x2="3078" y1="168.5679" y2="168.5679"/><line style="stroke:#000000;stroke-width:1;" x1="3078" x2="3078" y1="168.5679" y2="292.6679"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="70.7793" x="2930.6104" y="184.6997">Migrations</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="34.2207" x="2948.8896" y="200.7983">(test)</text></g><!--cluster TestSeed--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestSeed" data-source-line="91" id="ent0037"><polygon fill="#FFFFFF" points="2608,168.5679,2618,158.5679,2812,158.5679,2812,537.1579,2802,547.1579,2608,547.1579,2608,168.5679" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="2802" x2="2812" y1="168.5679" y2="158.5679"/><line style="stroke:#000000;stroke-width:1;" x1="2608" x2="2802" y1="168.5679" y2="168.5679"/><line style="stroke:#000000;stroke-width:1;" x1="2802" x2="2802" y1="168.5679" y2="547.1579"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="33.4619" x="2689.269" y="184.6997">Seed</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="34.2207" x="2688.8896" y="200.7983">(test)</text></g><!--cluster Specs--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..Specs" data-source-line="100" id="ent0042"><polygon fill="#FFFFFF" points="2176,376.9379,2186,366.9379,2568,366.9379,2568,574.5279,2558,584.5279,2176,584.5279,2176,376.9379" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="2558" x2="2568" y1="376.9379" y2="366.9379"/><line style="stroke:#000000;stroke-width:1;" x1="2176" x2="2558" y1="376.9379" y2="376.9379"/><line style="stroke:#000000;stroke-width:1;" x1="2558" x2="2558" y1="376.9379" y2="584.5279"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="68.4756" x="2333.7622" y="393.0697">API.Specs</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="122.1172" x="2306.9414" y="409.1683">(Integration Tests)</text></g><!--cluster RepoTests--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..RepoTests" data-source-line="114" id="ent0047"><polygon fill="#FFFFFF" points="3128,134.2979,3138,124.2979,3549,124.2979,3549,316.9379,3539,326.9379,3128,326.9379,3128,134.2979" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="3539" x2="3549" y1="134.2979" y2="124.2979"/><line style="stroke:#000000;stroke-width:1;" x1="3128" x2="3539" y1="134.2979" y2="134.2979"/><line style="stroke:#000000;stroke-width:1;" x1="3539" x2="3539" y1="134.2979" y2="326.9379"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="208.4961" x="3230.252" y="150.4297">Infrastructure.Repository.Tests</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="77" x="3296" y="166.5283">(Unit Tests)</text></g><!--cluster SvcTests--><g class="cluster" data-qualified-name="Test Environment.n.docker-compose.test.yaml..SvcTests" data-source-line="127" id="ent0052"><polygon fill="#FFFFFF" points="3589,134.2979,3599,124.2979,3996,124.2979,3996,316.9379,3986,326.9379,3589,326.9379,3589,134.2979" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="3986" x2="3996" y1="134.2979" y2="124.2979"/><line style="stroke:#000000;stroke-width:1;" x1="3589" x2="3986" y1="134.2979" y2="134.2979"/><line style="stroke:#000000;stroke-width:1;" x1="3986" x2="3986" y1="134.2979" y2="326.9379"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="126.0479" x="3725.4761" y="150.4297">Service.Auth.Tests</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="77" x="3750" y="166.5283">(Unit Tests)</text></g><!--cluster Results--><g class="cluster" data-qualified-name="Results" data-source-line="142" id="ent0057"><path d="M4324.5,626.4779 L4446.8311,626.4779 A3.75,3.75 0 0 1 4449.3311,628.9779 L4456.3311,664.6751 L4799.5,664.6751 A2.5,2.5 0 0 1 4802,667.1751 L4802,1032.5079 A2.5,2.5 0 0 1 4799.5,1035.0079 L4324.5,1035.0079 A2.5,2.5 0 0 1 4322,1032.5079 L4322,628.9779 A2.5,2.5 0 0 1 4324.5,626.4779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="4322" x2="4456.3311" y1="664.6751" y2="664.6751"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="79.3584" x="4346.9863" y="641.6097">test-results/</text><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="121.3311" x="4326" y="657.7083">(mounted volume)</text></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevDB.GMN8" data-source-line="19" id="ent0009"><path d="M1249.9,911.3179 L1249.9,964.8579 L1202.33,968.8579 L1249.9,972.8579 L1249.9,1025.959 A0,0 0 0 0 1249.9,1025.959 L1420.1017,1025.959 A0,0 0 0 0 1420.1017,1025.959 L1420.1017,921.3179 L1410.1017,911.3179 L1249.9,911.3179 A0,0 0 0 0 1249.9,911.3179" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1410.1017,911.3179 L1410.1017,921.3179 L1420.1017,921.3179 L1410.1017,911.3179" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="76.5908" x="1255.9" y="928.5117">Environment:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="118.1235" x="1255.9" y="943.4604">- ACCEPT_EULA=Y</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="131.1235" x="1255.9" y="958.4092">- SA_PASSWORD=***</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="149.2017" x="1255.9" y="973.3579">- MSSQL_PID=Developer</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1255.9" y="988.3066"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="54.1899" x="1255.9" y="1003.2554">Volumes:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="121.3989" x="1255.9" y="1018.2041">- biergarten-dev-data</text></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevDB.DevDBInner.1433" data-source-line="16" id="ent0007"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="31.1445" x="1180.4277" y="947.6711">1433</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="1190" y="962.6379"/></g><!--entity API1--><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevAPI.API1" data-source-line="30" id="ent0012"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="153.5996" x="603.2" y="688.5279"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="736.7996" y="693.5279"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="734.7996" y="695.5279"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="734.7996" y="699.5279"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="113.5996" x="618.2" y="721.6597">ASP.NET Core 10</text></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevAPI.DevPort1" data-source-line="31" id="ent0013"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="115.9443" x="117.5278" y="474.7611">8080:8080 (HTTP)</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="169.5" y="489.7279"/></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevAPI.DevPort2" data-source-line="32" id="ent0014"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="125.2822" x="242.1889" y="474.7611">8081:8081 (HTTPS)</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="298.83" y="489.7279"/></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevAPI.GMN15" data-source-line="35" id="ent0016"><path d="M262,631.8279 L262,791.3152 A0,0 0 0 0 262,791.3152 L567.9907,791.3152 A0,0 0 0 0 567.9907,791.3152 L567.9907,641.8279 L557.9907,631.8279 L321,631.8279 L317,501.5079 L313,631.8279 L262,631.8279 A0,0 0 0 0 262,631.8279" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M557.9907,631.8279 L557.9907,641.8279 L567.9907,641.8279 L557.9907,631.8279" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="76.5908" x="268" y="649.0217">Environment:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="284.9907" x="268" y="663.9704">- ASPNETCORE_ENVIRONMENT=Development</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="151.3472" x="268" y="678.9192">- DB_SERVER=sql-server</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="138.3599" x="268" y="693.8679">- DB_NAME=Biergarten</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="148.8018" x="268" y="708.8166">- DB_USER/PASSWORD</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="94.6118" x="268" y="723.7654">- JWT_SECRET</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="146.3008" x="268" y="738.7141">- SMTP_* (10+ variables)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="268" y="753.6628"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="81.6499" x="268" y="768.6115">Health Check:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="92.5234" x="268" y="783.5603">/health endpoint</text></g><!--entity Mig1--><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevMig.Mig1" data-source-line="49" id="ent0019"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="168.3994" x="840.8" y="688.5279"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="989.1994" y="693.5279"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="987.1994" y="695.5279"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="987.1994" y="699.5279"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="128.3994" x="855.8" y="721.6597">Database.Migrations</text></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevMig.GMN20" data-source-line="51" id="ent0021"><path d="M837.04,933.7379 L837.04,1003.5328 A0,0 0 0 0 837.04,1003.5328 L1020.9653,1003.5328 A0,0 0 0 0 1020.9653,1003.5328 L1020.9653,943.7379 L1010.9653,933.7379 L929,933.7379 L925,734.8379 L921,933.7379 L837.04,933.7379 A0,0 0 0 0 837.04,933.7379" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1010.9653,933.7379 L1010.9653,943.7379 L1020.9653,943.7379 L1010.9653,933.7379" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="134.3862" x="843.04" y="950.9317">Runs: DbUp migrations</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="76.5908" x="843.04" y="965.8804">Environment:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="162.9253" x="843.04" y="980.8292">- CLEAR_DATABASE=false</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="134.3989" x="843.04" y="995.7779">Depends on: sql-server</text></g><!--entity Seed1--><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevSeed.Seed1" data-source-line="59" id="ent0024"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="136.5166" x="1565.74" y="688.5279"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1682.2566" y="693.5279"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1680.2566" y="695.5279"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1680.2566" y="699.5279"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="96.5166" x="1580.74" y="721.6597">Database.Seed</text></g><g class="entity" data-qualified-name="Development Environment.n.docker-compose.dev.yaml..DevSeed.GMN25" data-source-line="61" id="ent0026"><path d="M1542.94,926.2679 L1542.94,1011.0115 A0,0 0 0 0 1542.94,1011.0115 L1725.0562,1011.0115 A0,0 0 0 0 1725.0562,1011.0115 L1725.0562,936.2679 L1715.0562,926.2679 L1638,926.2679 L1634,734.8379 L1630,926.2679 L1542.94,926.2679 A0,0 0 0 0 1542.94,926.2679" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1715.0562,926.2679 L1715.0562,936.2679 L1725.0562,936.2679 L1715.0562,926.2679" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="49.1309" x="1548.94" y="943.4617">Creates:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="89.5972" x="1548.94" y="958.4104">- 100 test users</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="161.1162" x="1548.94" y="973.3592">- Location data (US/CA/MX)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="106.939" x="1548.94" y="988.3079">- test.user account</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="137.2998" x="1548.94" y="1003.2566">Depends on: migrations</text></g><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestDB.GMN32" data-source-line="78" id="ent0033"><path d="M3243.54,445.8879 L3243.54,491.8579 L3190.23,495.8579 L3243.54,499.8579 L3243.54,545.5802 A0,0 0 0 0 3243.54,545.5802 L3414.4653,545.5802 A0,0 0 0 0 3414.4653,545.5802 L3414.4653,455.8879 L3404.4653,445.8879 L3243.54,445.8879 A0,0 0 0 0 3243.54,445.8879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M3404.4653,445.8879 L3404.4653,455.8879 L3414.4653,455.8879 L3404.4653,445.8879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="139.4644" x="3249.54" y="463.0817">Fresh instance each run</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="149.9253" x="3249.54" y="478.0304">CLEAR_DATABASE=true</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="3249.54" y="492.9792"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="54.1899" x="3249.54" y="507.9279">Volumes:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="121.3926" x="3249.54" y="522.8766">- biergarten-test-data</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="70.0845" x="3249.54" y="537.8254">(ephemeral)</text></g><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestDB.TestDBInner.1434" data-source-line="75" id="ent0031"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="31.1445" x="3168.4277" y="474.7611">1434</text><rect fill="#FFFFFF" height="12" style="stroke:#000000;stroke-width:1.5;" width="12" x="3178" y="489.7279"/></g><!--entity Database.Migrations--><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestMig.Database.Migrations" data-source-line="88" id="ent0036"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="168.3994" x="2875.8" y="222.5679"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="3024.1994" y="227.5679"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="3022.1994" y="229.5679"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="3022.1994" y="233.5679"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="128.3994" x="2890.8" y="255.6997">Database.Migrations</text></g><!--entity Database.Seed--><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestSeed.Database.Seed" data-source-line="92" id="ent0038"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="136.5166" x="2651.74" y="222.5679"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="2768.2566" y="227.5679"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2766.2566" y="229.5679"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2766.2566" y="233.5679"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="96.5166" x="2666.74" y="255.6997">Database.Seed</text></g><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..TestSeed.GMN39" data-source-line="94" id="ent0040"><path d="M2664.7,468.3079 L2664.7,523.154 A0,0 0 0 0 2664.7,523.154 L2775.3035,523.154 A0,0 0 0 0 2775.3035,523.154 L2775.3035,478.3079 L2765.3035,468.3079 L2724,468.3079 L2720,269.1479 L2716,468.3079 L2664.7,468.3079 A0,0 0 0 0 2664.7,468.3079" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2765.3035,468.3079 L2765.3035,478.3079 L2775.3035,478.3079 L2765.3035,468.3079" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="80.1963" x="2670.7" y="485.5017">Minimal seed:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="85.2554" x="2670.7" y="500.4504">- test.user only</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="89.6035" x="2670.7" y="515.3992">- Essential data</text></g><!--entity SpecsComp--><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..Specs.SpecsComp" data-source-line="101" id="ent0043"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="139.9893" x="2200.01" y="472.6779"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="2319.9993" y="477.6779"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2317.9993" y="479.6779"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="2317.9993" y="483.6779"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="99.9893" x="2215.01" y="505.8097">Reqnroll + xUnit</text></g><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..Specs.GMN44" data-source-line="103" id="ent0045"><path d="M2375.21,430.9379 L2375.21,491.8579 L2340.37,495.8579 L2375.21,499.8579 L2375.21,560.5277 A0,0 0 0 0 2375.21,560.5277 L2524.7881,560.5277 A0,0 0 0 0 2524.7881,560.5277 L2524.7881,440.9379 L2514.7881,430.9379 L2375.21,430.9379 A0,0 0 0 0 2375.21,430.9379" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2514.7881,430.9379 L2514.7881,440.9379 L2524.7881,440.9379 L2514.7881,430.9379" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="35.3945" x="2381.21" y="448.1317">Tests:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="104.0381" x="2381.21" y="463.0804">- Registration flow</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="66.479" x="2381.21" y="478.0292">- Login flow</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="96.8271" x="2381.21" y="492.9779">- Validation rules</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="82.3989" x="2381.21" y="507.9266">- 404 handling</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2381.21" y="522.8754"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="124.2554" x="2381.21" y="537.8241">Uses: TestApiFactory</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="128.5781" x="2381.21" y="552.7728">Mocks: Email services</text></g><!--entity RepoComp--><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..RepoTests.RepoComp" data-source-line="115" id="ent0048"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="151.6445" x="3152.18" y="222.5679"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="3283.8245" y="227.5679"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="3281.8245" y="229.5679"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="3281.8245" y="233.5679"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="111.6445" x="3167.18" y="255.6997">xUnit + DbMocker</text></g><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..RepoTests.GMN49" data-source-line="117" id="ent0050"><path d="M3338.5,188.2979 L3338.5,241.8579 L3304.12,245.8579 L3338.5,249.8579 L3338.5,302.939 A0,0 0 0 0 3338.5,302.939 L3505.5024,302.939 A0,0 0 0 0 3505.5024,302.939 L3505.5024,198.2979 L3495.5024,188.2979 L3338.5,188.2979 A0,0 0 0 0 3338.5,188.2979" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M3495.5024,188.2979 L3495.5024,198.2979 L3505.5024,198.2979 L3495.5024,188.2979" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="35.3945" x="3344.5" y="205.4917">Tests:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="96.8208" x="3344.5" y="220.4404">- AuthRepository</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="144.498" x="3344.5" y="235.3892">- UserAccountRepository</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="143.0698" x="3344.5" y="250.3379">- SQL command building</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="3344.5" y="265.2866"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="140.8926" x="3344.5" y="280.2354">Uses: Mock connections</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="146.0024" x="3344.5" y="295.1841">No real database needed</text></g><!--entity SvcComp--><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..SvcTests.SvcComp" data-source-line="128" id="ent0053"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="115.0859" x="3613.46" y="222.5679"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="3708.5459" y="227.5679"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="3706.5459" y="229.5679"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="3706.5459" y="233.5679"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="75.0859" x="3628.46" y="255.6997">xUnit + Moq</text></g><g class="entity" data-qualified-name="Test Environment.n.docker-compose.test.yaml..SvcTests.GMN54" data-source-line="130" id="ent0055"><path d="M3763.32,188.2979 L3763.32,241.8579 L3728.89,245.8579 L3763.32,249.8579 L3763.32,302.939 A0,0 0 0 0 3763.32,302.939 L3952.6852,302.939 A0,0 0 0 0 3952.6852,302.939 L3952.6852,198.2979 L3942.6852,188.2979 L3763.32,188.2979 A0,0 0 0 0 3763.32,188.2979" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M3942.6852,188.2979 L3942.6852,198.2979 L3952.6852,198.2979 L3942.6852,188.2979" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="35.3945" x="3769.32" y="205.4917">Tests:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="99.6963" x="3769.32" y="220.4404">- RegisterService</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="83.0972" x="3769.32" y="235.3892">- LoginService</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="109.1226" x="3769.32" y="250.3379">- Token generation</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="3769.32" y="265.2866"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="166.9307" x="3769.32" y="280.2354">Uses: Mocked dependencies</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="168.3652" x="3769.32" y="295.1841">No database or infrastructure</text></g><!--entity Result1--><g class="entity" data-qualified-name="Results.Result1" data-source-line="143" id="ent0058"><path d="M4345.77,687.9779 L4345.77,735.1751 A2.5,2.5 0 0 0 4348.27,737.6751 L4431.7251,737.6751 A2.5,2.5 0 0 0 4434.2251,735.1751 L4434.2251,695.4779 L4424.2251,685.4779 L4348.27,685.4779 A2.5,2.5 0 0 0 4345.77,687.9779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4424.2251,685.4779 L4424.2251,692.9779 A2.5,2.5 0 0 0 4426.7251,695.4779 L4434.2251,695.4779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="63.8066" x="4355.77" y="708.6097">api-specs/</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="60.6758" x="4363.5493" y="724.7083">results.trx</text></g><!--entity Result2--><g class="entity" data-qualified-name="Results.Result2" data-source-line="144" id="ent0059"><path d="M4469.21,687.9779 L4469.21,735.1751 A2.5,2.5 0 0 0 4471.71,737.6751 L4586.2959,737.6751 A2.5,2.5 0 0 0 4588.7959,735.1751 L4588.7959,695.4779 L4578.7959,685.4779 L4471.71,685.4779 A2.5,2.5 0 0 0 4469.21,687.9779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4578.7959,685.4779 L4578.7959,692.9779 A2.5,2.5 0 0 0 4581.2959,695.4779 L4588.7959,695.4779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="99.5859" x="4479.21" y="708.6097">repository-tests/</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="60.6758" x="4486.9893" y="724.7083">results.trx</text></g><!--entity Result3--><g class="entity" data-qualified-name="Results.Result3" data-source-line="145" id="ent0060"><path d="M4623.81,687.9779 L4623.81,735.1751 A2.5,2.5 0 0 0 4626.31,737.6751 L4755.6821,737.6751 A2.5,2.5 0 0 0 4758.1821,735.1751 L4758.1821,695.4779 L4748.1821,685.4779 L4626.31,685.4779 A2.5,2.5 0 0 0 4623.81,687.9779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4748.1821,685.4779 L4748.1821,692.9779 A2.5,2.5 0 0 0 4750.6821,695.4779 L4758.1821,695.4779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="114.3721" x="4633.81" y="708.6097">service-auth-tests/</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="60.6758" x="4641.5893" y="724.7083">results.trx</text></g><g class="entity" data-qualified-name="Results.GMN61" data-source-line="148" id="ent0062"><path d="M4633.18,926.2679 L4633.18,1011.0115 A0,0 0 0 0 4633.18,1011.0115 L4748.8236,1011.0115 A0,0 0 0 0 4748.8236,1011.0115 L4748.8236,936.2679 L4738.8236,926.2679 L4695,926.2679 L4691,738.1179 L4687,926.2679 L4633.18,926.2679 A0,0 0 0 0 4633.18,926.2679" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4738.8236,926.2679 L4738.8236,936.2679 L4748.8236,936.2679 L4738.8236,926.2679" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="66.4536" x="4639.18" y="943.4617">TRX format</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="76.6099" x="4639.18" y="958.4104">Readable by:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="83.8208" x="4639.18" y="973.3592">- Visual Studio</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="92.4727" x="4639.18" y="988.3079">- Azure DevOps</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="94.6436" x="4639.18" y="1003.2566">- GitHub Actions</text></g><!--entity Developer--><g class="entity" data-qualified-name="Developer" data-source-line="9" id="ent0002"><ellipse cx="1850.9967" cy="216.0679" fill="#FFFFFF" rx="8" ry="8" style="stroke:#000000;stroke-width:1;"/><path d="M1850.9967,224.0679 L1850.9967,251.0679 M1837.9967,232.0679 L1863.9967,232.0679 M1850.9967,251.0679 L1837.9967,266.0679 M1850.9967,251.0679 L1863.9967,266.0679" fill="none" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="63.8135" x="1819.09" y="281.1997">Developer</text></g><!--entity Host--><g class="entity" data-qualified-name="Host" data-source-line="10" id="ent0003"><path d="M1807.2238,482.8305 C1809.5433,477.6154 1814.1764,475.9068 1818.5056,480.5248 C1822.5161,475.6699 1825.8662,475.6785 1829.1817,481.2372 C1831.8475,475.0046 1835.1877,473.7064 1840.3597,478.7537 C1843.3638,473.5359 1847.5803,473.4948 1851.152,478.1321 C1855.5891,472.3846 1861.4403,473.1811 1864.4661,479.668 C1867.3088,475.2483 1871.4114,475.2912 1874.3866,479.516 C1878.0741,473.6083 1883.3778,475.1259 1885.9902,480.611 C1890.0299,476.6227 1894.0976,475.9029 1896.8091,482.0314 C1904.2757,484.8359 1904.8124,490.1602 1900.1394,495.8832 C1907.7148,502.3441 1905.5716,508.1737 1897.3446,511.8724 C1894.1717,516.7129 1890.5099,516.7102 1886.9191,512.3457 C1883.79,517.9824 1880.0121,519.0253 1875.2219,514.2036 C1872.6485,520.9724 1868.1843,520.1093 1863.8399,516.0683 C1861.1975,521.4447 1857.1262,522.5507 1852.8279,517.8839 C1849.4522,523.9683 1844.1266,522.8643 1841.1526,517.4752 C1835.9937,522.2617 1831.1549,521.5037 1829.0035,514.4018 C1825.5359,519.3522 1822.2163,518.5442 1818.8274,514.3145 C1813.94,518.2184 1809.2593,517.7513 1807.4093,511.0456 C1798.6961,509.6403 1797.2013,503.0202 1801.8067,496.4888 C1797.9166,490.3461 1798.4491,483.9501 1807.2238,482.8305" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="77.0205" x="1812.49" y="500.8097">Docker Host</text></g><g class="entity" data-qualified-name="GMN89" data-source-line="186" id="ent0090"><path d="M1797.01,1085.9579 L1797.01,1155.7528 L2046.9954,1155.7528 L2046.9954,1095.9579 L2036.9954,1085.9579 L1797.01,1085.9579" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2036.9954,1085.9579 L2036.9954,1095.9579 L2046.9954,1095.9579 L2036.9954,1085.9579" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="228.9854" x="1803.01" y="1103.1517">Dev Network (bridge: biergarten-dev)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="78.0317" x="1803.01" y="1118.1004">Internal DNS:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="226.8525" x="1803.01" y="1133.0492">- sql-server (resolves to SQL container)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="182.0762" x="1803.01" y="1147.9979">- api (resolves to API container)</text></g><g class="entity" data-qualified-name="GMN92" data-source-line="193" id="ent0093"><path d="M4044.21,691.6279 L4044.21,731.5253 L4297.7945,731.5253 L4297.7945,701.6279 L4287.7945,691.6279 L4044.21,691.6279" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4287.7945,691.6279 L4287.7945,701.6279 L4297.7945,701.6279 L4287.7945,691.6279" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="232.5845" x="4050.21" y="708.8217">Test Network (bridge: biergarten-test)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="161.8652" x="4050.21" y="723.7704">All test components isolated</text></g><g class="entity" data-qualified-name="GMN95" data-source-line="199" id="ent0096"><path d="M1939.69,453.3579 L1939.69,538.1015 L2128.3189,538.1015 L2128.3189,463.3579 L2118.3189,453.3579 L1939.69,453.3579" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2118.3189,453.3579 L2118.3189,463.3579 L2128.3189,463.3579 L2118.3189,453.3579" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="82.3672" x="1945.69" y="470.5517">Startup Order:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="167.6289" x="1945.69" y="485.5004">1. SQL Server (health check)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="137.998" x="1945.69" y="500.4492">2. Migrations (run-once)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="108.3926" x="1945.69" y="515.3979">3. Seed (run-once)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="119.9517" x="1945.69" y="530.3466">4. API (long-running)</text></g><g class="entity" data-qualified-name="GMN98" data-source-line="207" id="ent0099"><path d="M1979.92,218.1879 L1979.92,273.034 L2128.0889,273.034 L2128.0889,228.1879 L2118.0889,218.1879 L1979.92,218.1879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2118.0889,218.1879 L2118.0889,228.1879 L2128.0889,228.1879 L2118.0889,218.1879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="89.5972" x="1985.92" y="235.3817">Test Execution:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="127.1689" x="1985.92" y="250.3304">All tests run in parallel</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="112.7407" x="1985.92" y="265.2792">Results aggregated</text></g><g class="entity" data-qualified-name="ProductionNote" data-source-line="214" id="ent0101"><path d="M4044.4,165.8679 L4044.4,325.3552 L4293.6046,325.3552 L4293.6046,175.8679 L4283.6046,165.8679 L4044.4,165.8679" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M4283.6046,165.8679 L4283.6046,175.8679 L4293.6046,175.8679 L4283.6046,165.8679" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="228.2046" x="4050.4" y="183.0617">Production Deployment (not shown):</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="4050.4" y="198.0104"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="85.2681" x="4050.4" y="212.9592">Would include:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="202.5156" x="4050.4" y="227.9079">• Azure SQL Database / AWS RDS</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="172.9102" x="4050.4" y="242.8566">• Azure Container Apps / ECS</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="165.6738" x="4050.4" y="257.8054">• Azure Key Vault for secrets</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="201.8174" x="4050.4" y="272.7541">• Application Insights / CloudWatch</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="90.562" x="4050.4" y="287.7028">• Load balancer</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="118.6948" x="4050.4" y="302.6515">• HTTPS termination</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="130.2476" x="4050.4" y="317.6003">• CDN for static assets</text></g><!--link Developer to Host--><g class="link" data-entity-1="ent0002" data-entity-2="ent0003" data-link-type="dependency" data-source-line="157" id="lnk64"><path d="M1851,284.4179 C1851,336.9779 1851,423.1479 1851,466.2579" fill="none" id="Developer-to-Host" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1851,472.2579,1855,463.2579,1851,467.2579,1847,463.2579,1851,472.2579" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="113.4517" x="1737" y="375.5317">docker compose up</text></g><!--link Host to DevAPI--><g class="link" data-entity-1="ent0003" data-entity-2="ent0011" data-link-type="dependency" data-source-line="158" id="lnk65"><path d="M1851,519.2379 C1851,522.5579 1851,524.8579 1851,524.8579 C1851,524.8579 1430.5825,524.8579 1010.165,524.8579 C957.6128,524.8579 905.0606,524.8579 853.3296,524.8579 C840.3968,524.8579 827.5154,524.8579 814.6981,524.8579 C808.2894,524.8579 801.8968,524.8579 795.5218,524.8579 C792.3344,524.8579 795.1513,524.8579 791.9728,524.8579" fill="none" id="Host-to-DevAPI" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="785.9728,524.8579,794.9728,528.8579,790.9728,524.8579,794.9728,520.8579,785.9728,524.8579" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="116.3589" x="812.78" y="522.0517">http://localhost:8080</text></g><!--link DevMig to DevDB--><g class="link" data-entity-1="ent0018" data-entity-2="ent0005" data-link-type="dependency" data-source-line="161" id="lnk66"><path d="M1045,1027.7753 C1045,1028.5354 1045,1029.2825 1045,1030.0162 C1045,1031.4837 1045,1032.8979 1045,1034.2565 C1045,1036.9736 1045,1039.4679 1045,1041.7199 C1045,1050.7277 1045,1055.8579 1045,1055.8579 C1045,1055.8579 1051.4688,1055.8579 1062.7891,1055.8579 C1068.4492,1055.8579 1075.3223,1055.8579 1083.2061,1055.8579 C1085.177,1055.8579 1087.2111,1055.8579 1089.3053,1055.8579 C1090.3523,1055.8579 1085.4144,1055.8579 1086.4911,1055.8579" fill="none" id="DevMig-to-DevDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1092.4911,1055.8579,1083.4911,1051.8579,1087.4911,1055.8579,1083.4911,1059.8579,1092.4911,1055.8579" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="101.8799" x="1021.47" y="1053.0517">1. Run migrations</text></g><!--reverse link DevDB to DevMig--><g class="link" data-entity-1="ent0005" data-entity-2="ent0018" data-link-type="dependency" data-source-line="164" id="lnk70"><path d="M1439.05,839.9028 C1439.05,837.8891 1439.05,841.8735 1439.05,839.8579 C1439.05,775.3579 1439.05,710.8579 1439.05,710.8579 C1439.05,710.8579 1343.5925,710.8579 1246.6438,710.8579 C1198.1694,710.8579 1149.3222,710.8579 1111.848,710.8579 C1093.1109,710.8579 1077.217,710.8579 1065.6346,710.8579 C1062.739,710.8579 1060.1129,710.8579 1057.7791,710.8579 C1056.6123,710.8579 1055.5185,710.8579 1054.5007,710.8579 C1053.9918,710.8579 1053.5019,710.8579 1053.0314,710.8579" fill="none" id="DevDB-backto-DevMig" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="1439.05,845.9028,1443.05,836.9028,1439.05,840.9028,1435.05,836.9028,1439.05,845.9028" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="1308.9" y="708.0517">depends_on</text></g><!--link DevSeed to DevDB--><g class="link" data-entity-1="ent0023" data-entity-2="ent0005" data-link-type="dependency" data-source-line="162" id="lnk67"><path d="M1510.9201,711.8579 C1510.7648,711.8579 1510.6079,711.8579 1510.4492,711.8579 C1509.1799,711.8579 1507.8034,711.8579 1506.3438,711.8579 C1500.505,711.8579 1493.335,711.8579 1486.37,711.8579 C1472.44,711.8579 1459.33,711.8579 1459.33,711.8579 C1459.33,711.8579 1459.33,772.1029 1459.33,834.2316 C1459.33,838.1146 1459.33,836.0051 1459.33,839.8886" fill="none" id="DevSeed-to-DevDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1459.33,845.8886,1463.33,836.8886,1459.33,840.8886,1455.33,836.8886,1459.33,845.8886" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="73.728" x="1385.33" y="807.5717">2. Seed data</text></g><!--link DevAPI to DevDB--><g class="link" data-entity-1="ent0011" data-entity-2="ent0005" data-link-type="dependency" data-source-line="163" id="lnk68"><path d="M143,731.8279 C143,770.4579 143,850.8579 143,850.8579 C143,850.8579 471.9175,850.8579 800.835,850.8579 C883.0644,850.8579 965.2938,850.8579 1042.3838,850.8579 C1052.02,850.8579 1061.576,850.8579 1071.0416,850.8579 C1075.7744,850.8579 1080.4846,850.8579 1085.171,850.8579 C1087.5142,850.8579 1083.8514,850.8579 1086.1826,850.8579" fill="none" id="DevAPI-to-DevDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1092.1826,850.8579,1083.1826,846.8579,1087.1826,850.8579,1083.1826,854.8579,1092.1826,850.8579" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="110.5571" x="688.83" y="848.0517">3. Connect & serve</text></g><!--reverse link DevMig to DevSeed--><g class="link" data-entity-1="ent0018" data-entity-2="ent0023" data-link-type="dependency" data-source-line="165" id="lnk72"><path d="M1059.2214,699.8579 C1061.7366,699.8579 1062.115,699.8579 1065.353,699.8579 C1078.3049,699.8579 1096.8077,699.8579 1119.0109,699.8579 C1163.4175,699.8579 1222.6263,699.8579 1281.835,699.8579 C1341.0438,699.8579 1400.2525,699.8579 1444.6591,699.8579 C1466.8623,699.8579 1485.3651,699.8579 1498.317,699.8579 C1501.555,699.8579 1504.446,699.8579 1506.9612,699.8579 C1508.2188,699.8579 1509.3825,699.8579 1510.4486,699.8579 C1510.5818,699.8579 1510.7136,699.8579 1510.8438,699.8579" fill="none" id="DevMig-backto-DevSeed" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="1053.2214,699.8579,1062.2214,703.8579,1058.2214,699.8579,1062.2214,695.8579,1053.2214,699.8579" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="1209.83" y="697.0517">depends_on</text></g><!--reverse link DevSeed to DevAPI--><g class="link" data-entity-1="ent0023" data-entity-2="ent0011" data-link-type="dependency" data-source-line="166" id="lnk74"><path d="M1519.33,618.4151 C1519.33,618.04 1519.33,623.1028 1519.33,622.7324 C1519.33,621.9916 1519.33,621.2604 1519.33,620.5396 C1519.33,617.6564 1519.33,614.9392 1519.33,612.4369 C1519.33,602.4279 1519.33,595.8579 1519.33,595.8579 C1519.33,595.8579 1189.04,595.8579 858.75,595.8579 C838.1069,595.8579 817.4638,595.8579 796.9013,595.8579 C791.7606,595.8579 786.6251,595.8579 781.4958,595.8579" fill="none" id="DevSeed-backto-DevAPI" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="1519.33,624.4151,1523.33,615.4151,1519.33,619.4151,1515.33,615.4151,1519.33,624.4151" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="796.59" y="593.0517">depends_on</text></g><!--link TestMig to TestDB--><g class="link" data-entity-1="ent0035" data-entity-2="ent0029" data-link-type="dependency" data-source-line="169" id="lnk75"><path d="M3088.0106,245.8579 C3088.0371,245.8579 3088.0635,245.8579 3088.09,245.8579 C3088.1429,245.8579 3088.1958,245.8579 3088.2487,245.8579 C3088.3545,245.8579 3088.4601,245.8579 3088.5655,245.8579 C3088.7764,245.8579 3088.9864,245.8579 3089.195,245.8579 C3092.5325,245.8579 3095.5,245.8579 3095.5,245.8579 C3095.5,245.8579 3095.5,264.7954 3095.5,293.2016 C3095.5,307.4047 3095.5,323.975 3095.5,341.7289 C3095.5,350.6059 3095.5,359.7787 3095.5,369.0996 C3095.5,371.4298 3095.5,373.7692 3095.5,376.1156 C3095.5,377.2888 3095.5,378.4637 3095.5,379.6401 C3095.5,380.2283 3095.5,374.8168 3095.5,375.4057" fill="none" id="TestMig-to-TestDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="3095.5,381.4057,3099.5,372.4057,3095.5,376.4057,3091.5,372.4057,3095.5,381.4057" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="57.8018" x="3081.93" y="546.0517">1. Migrate</text></g><!--reverse link TestDB to TestMig--><g class="link" data-entity-1="ent0029" data-entity-2="ent0035" data-link-type="dependency" data-source-line="175" id="lnk81"><path d="M3450,375.6835 C3450,375.3556 3450,380.7987 3450,380.5131 C3450,379.9417 3450,379.4562 3450,379.0629 C3450,378.2761 3450,377.8579 3450,377.8579 C3450,377.8579 3080,377.8579 3080,377.8579 C3080,377.8579 3080,347.8254 3080,316.3841 C3080,308.5238 3080,300.5754 3080,292.9863" fill="none" id="TestDB-backto-TestMig" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="3450,381.6835,3454,372.6835,3450,376.6835,3446,372.6835,3450,381.6835" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="3185.86" y="375.0517">depends_on</text></g><!--link TestSeed to TestDB--><g class="link" data-entity-1="ent0037" data-entity-2="ent0029" data-link-type="dependency" data-source-line="170" id="lnk76"><path d="M2812.0736,310.8579 C2814.8289,310.8579 2817.602,310.8579 2820.3922,310.8579 C2825.9724,310.8579 2831.6206,310.8579 2837.3306,310.8579 C2848.7506,310.8579 2860.4178,310.8579 2872.2827,310.8579 C2919.7425,310.8579 2970.3663,310.8579 3020.99,310.8579 C3223.485,310.8579 3425.98,310.8579 3425.98,310.8579 C3425.98,310.8579 3425.98,322.4204 3425.98,339.7641 C3425.98,348.436 3425.98,358.5532 3425.98,369.393 C3425.98,372.103 3425.98,374.8581 3425.98,377.6471 C3425.98,379.0416 3425.98,374.4446 3425.98,375.8546" fill="none" id="TestSeed-to-TestDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="3425.98,381.8546,3429.98,372.8546,3425.98,376.8546,3421.98,372.8546,3425.98,381.8546" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="44.8145" x="3047.95" y="308.0517">2. Seed</text></g><!--link Specs to TestDB--><g class="link" data-entity-1="ent0042" data-entity-2="ent0029" data-link-type="dependency" data-source-line="171" id="lnk77"><path d="M2569.0882,556.8579 C2569.484,556.8579 2569.892,556.8579 2570.3124,556.8579 C2577.0378,556.8579 2586.9019,556.8579 2599.4561,556.8579 C2624.5645,556.8579 2660.4336,556.8579 2703.4766,556.8579 C2789.5625,556.8579 2904.3438,556.8579 3019.125,556.8579 C3248.6875,556.8579 3478.25,556.8579 3478.25,556.8579 C3478.25,556.8579 3478.25,495.8579 3478.25,495.8579 C3478.25,495.8579 3472.45,495.8579 3466.1063,495.8579 C3464.5203,495.8579 3462.9004,495.8579 3461.3286,495.8579 C3460.5427,495.8579 3459.7689,495.8579 3459.0173,495.8579 C3458.8294,495.8579 3458.6429,495.8579 3458.458,495.8579 C3458.3655,495.8579 3458.2735,495.8579 3458.1818,495.8579 C3458.1359,495.8579 3464.0902,495.8579 3464.0446,495.8579" fill="none" id="Specs-to-TestDB" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="3458.0446,495.8579,3467.0446,499.8579,3463.0446,495.8579,3467.0446,491.8579,3458.0446,495.8579" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="100.4517" x="2932.18" y="554.0517">3. Integration test</text></g><!--link RepoTests to TestDB--><g class="link" data-entity-1="ent0047" data-entity-2="ent0029" data-link-type="dependency" data-source-line="172" id="lnk78"><path d="M3541,327.6838 C3541,328.1314 3541,328.5799 3541,329.0292 C3541,329.9277 3541,330.8295 3541,331.7343 C3541,346.2114 3541,361.4625 3541,376.5991 C3541,437.1454 3541,495.8579 3541,495.8579 C3541,495.8579 3520.3325,495.8579 3498.6963,495.8579 C3487.8781,495.8579 3476.8178,495.8579 3467.9777,495.8579 C3465.7676,495.8579 3463.6963,495.8579 3461.8023,495.8579 C3460.8553,495.8579 3459.9526,495.8579 3459.099,495.8579 C3458.8856,495.8579 3458.6752,495.8579 3458.468,495.8579 C3458.3645,495.8579 3464.2616,495.8579 3464.1596,495.8579" fill="none" id="RepoTests-to-TestDB" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="3458.1596,495.8579,3467.1596,499.8579,3463.1596,495.8579,3467.1596,491.8579,3458.1596,495.8579" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="124.2808" x="3416" y="413.5017">Mock (no connection)</text></g><!--link SvcTests to TestDB--><g class="link" data-entity-1="ent0052" data-entity-2="ent0029" data-link-type="dependency" data-source-line="173" id="lnk79"><path d="M3587.9193,317.8579 C3580.1576,317.8579 3572.5639,317.8579 3565.1718,317.8579 C3550.3876,317.8579 3536.4098,317.8579 3523.5072,317.8579 C3471.8969,317.8579 3437.49,317.8579 3437.49,317.8579 C3437.49,317.8579 3437.49,328.9829 3437.49,345.6704 C3437.49,354.0141 3437.49,363.7485 3437.49,374.1782 C3437.49,375.4819 3437.49,376.7965 3437.49,378.1205 C3437.49,378.7826 3437.49,379.447 3437.49,380.1136 C3437.49,380.4469 3437.49,374.7808 3437.49,375.1152" fill="none" id="SvcTests-to-TestDB" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="3437.49,381.1152,3441.49,372.1152,3437.49,376.1152,3433.49,372.1152,3437.49,381.1152" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="124.2808" x="3528.61" y="315.0517">Mock (no connection)</text></g><!--reverse link TestMig to TestSeed--><g class="link" data-entity-1="ent0035" data-entity-2="ent0037" data-link-type="dependency" data-source-line="176" id="lnk83"><path d="M2844.7187,212.8579 C2837.4687,212.8579 2833.5,212.8579 2826.2783,212.8579 C2822.6675,212.8579 2819.0637,212.8579 2815.4706,212.8579 C2814.5723,212.8579 2813.6747,212.8579 2812.7778,212.8579" fill="none" id="TestMig-backto-TestSeed" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="2850.7187,212.8579,2841.7187,208.8579,2845.7187,212.8579,2841.7187,216.8579,2850.7187,212.8579" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="2776" y="210.0517">depends_on</text></g><!--reverse link TestSeed to Specs--><g class="link" data-entity-1="ent0037" data-entity-2="ent0042" data-link-type="dependency" data-source-line="177" id="lnk85"><path d="M2601.9764,245.8579 C2596.4972,245.8579 2591.9156,245.8579 2585.3788,245.8579 C2572.305,245.8579 2560,245.8579 2560,245.8579 C2560,245.8579 2560,304.4829 2560,364.9404 C2560,365.4127 2560,365.8851 2560,366.3576" fill="none" id="TestSeed-backto-Specs" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="2607.9764,245.8579,2598.9764,241.8579,2602.9764,245.8579,2598.9764,249.8579,2607.9764,245.8579" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5698" x="2488" y="339.9417">depends_on</text></g><!--link Specs to Results--><g class="link" data-entity-1="ent0042" data-entity-2="ent0057" data-link-type="dependency" data-source-line="180" id="lnk86"><path d="M2568.1057,495.8579 C2568.1966,495.8579 2568.2878,495.8579 2568.3795,495.8579 C2568.5628,495.8579 2568.7477,495.8579 2568.9339,495.8579 C2569.6789,495.8579 2570.446,495.8579 2571.2251,495.8579 C2572.7832,495.8579 2574.3891,495.8579 2575.9613,495.8579 C2582.25,495.8579 2588,495.8579 2588,495.8579 C2588,495.8579 2588,552.8579 2588,552.8579 C2588,552.8579 4775.59,552.8579 4775.59,552.8579 C4775.59,552.8579 4775.59,562.7954 4775.59,577.7016 C4775.59,585.1547 4775.59,593.85 4775.59,603.1664 C4775.59,607.8246 4775.59,612.6381 4775.59,617.5292 C4775.59,619.9748 4775.59,622.4398 4775.59,624.9144 C4775.59,625.2238 4775.59,657.7305 4775.59,658.0401" fill="none" id="Specs-to-Results" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="4775.59,664.0401,4779.59,655.0401,4775.59,659.0401,4771.59,655.0401,4775.59,664.0401" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="67.1836" x="3659.95" y="550.0517">Export TRX</text></g><!--link RepoTests to Results--><g class="link" data-entity-1="ent0047" data-entity-2="ent0057" data-link-type="dependency" data-source-line="181" id="lnk87"><path d="M3549.1287,245.8579 C3549.2426,245.8579 3549.3573,245.8579 3549.4727,245.8579 C3549.7035,245.8579 3549.9373,245.8579 3550.1738,245.8579 C3550.6469,245.8579 3551.1309,245.8579 3551.624,245.8579 C3552.6103,245.8579 3553.6329,245.8579 3554.6773,245.8579 C3556.7659,245.8579 3558.9413,245.8579 3561.085,245.8579 C3569.66,245.8579 3577.73,245.8579 3577.73,245.8579 C3577.73,245.8579 3577.73,764.8579 3577.73,764.8579 C3577.73,764.8579 3881.7975,764.8579 4185.865,764.8579 C4223.8734,764.8579 4261.8819,764.8579 4299.2964,764.8579 C4303.9733,764.8579 4308.6408,764.8579 4313.2979,764.8579 C4315.6264,764.8579 4311.9524,764.8579 4314.2756,764.8579" fill="none" id="RepoTests-to-Results" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="4320.2756,764.8579,4311.2756,760.8579,4315.2756,764.8579,4311.2756,768.8579,4320.2756,764.8579" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="67.1836" x="3866.55" y="762.0517">Export TRX</text></g><!--link SvcTests to Results--><g class="link" data-entity-1="ent0052" data-entity-2="ent0057" data-link-type="dependency" data-source-line="182" id="lnk88"><path d="M3997.0518,147.8579 C4002.9551,147.8579 4011.6133,147.8579 4022.6328,147.8579 C4044.6719,147.8579 4076.1563,147.8579 4113.9375,147.8579 C4189.5,147.8579 4290.25,147.8579 4391,147.8579 C4592.5,147.8579 4794,147.8579 4794,147.8579 C4794,147.8579 4794,283.3354 4794,421.4591 C4794,490.521 4794,560.2444 4794,614.0255 C4794,617.3868 4794,620.6859 4794,623.9186 C4794,624.7268 4794,657.7281 4794,658.5279" fill="none" id="SvcTests-to-Results" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="4794,664.5279,4798,655.5279,4794,659.5279,4790,655.5279,4794,664.5279" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="67.1836" x="4555.97" y="145.0517">Export TRX</text></g><!--link DevDB to GMN89--><g class="link" data-entity-1="ent0005" data-entity-2="ent0090" data-link-type="association" data-source-line="186" id="lnk91"><path d="M1471.0283,968.8579 C1472.6977,968.8579 1474.4181,968.8579 1476.1025,968.8579 C1482.84,968.8579 1489,968.8579 1489,968.8579 C1489,968.8579 1489,1090.8579 1489,1090.8579 C1489,1090.8579 1668.88,1090.8579 1796.76,1090.8579" fill="none" id="DevDB-GMN89" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link TestDB to GMN92--><g class="link" data-entity-1="ent0029" data-entity-2="ent0093" data-link-type="association" data-source-line="193" id="lnk94"><path d="M3458.536,711.8579 C3459.0224,711.8579 3459.5295,711.8579 3460.0569,711.8579 C3462.1666,711.8579 3464.602,711.8579 3467.3458,711.8579 C3478.321,711.8579 3494.2307,711.8579 3513.9689,711.8579 C3553.4453,711.8579 3608.2356,711.8579 3669.4913,711.8579 C3792.0025,711.8579 3940.375,711.8579 4043.82,711.8579" fill="none" id="TestDB-GMN92" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link GMN95 to DevMig--><g class="link" data-entity-1="ent0096" data-entity-2="ent0018" data-link-type="association" data-source-line="199" id="lnk97"><path d="M1939.33,531.8579 C1689.67,531.8579 1032.48,531.8579 1032.48,531.8579 C1032.48,531.8579 1032.48,576.8579 1032.48,621.8579 C1032.48,622.561 1032.48,623.2641 1032.48,623.9671" fill="none" id="GMN95-DevMig" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link GMN98 to Specs--><g class="link" data-entity-1="ent0099" data-entity-2="ent0042" data-link-type="association" data-source-line="207" id="lnk100"><path d="M2128.37,257.8579 C2264.95,257.8579 2541.89,257.8579 2541.89,257.8579 C2541.89,257.8579 2541.89,272.7329 2541.89,295.0454 C2541.89,306.2016 2541.89,319.2172 2541.89,333.1625 C2541.89,340.1352 2541.89,347.3403 2541.89,354.6616 C2541.89,358.3222 2541.89,362.0119 2541.89,365.7161" fill="none" id="GMN98-Specs" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><?plantuml-src bLZTRkCs5hxNKvnDWQqpXMKxoKLXD0DeR6KdRUoubZFf0WK2Mg9j8ZIf8QdCfCK0VPPzj7sI7b8I9UM_kGXide_aET_vfVzbTdHF8UU4YK3VCf4JHVQm9kdjLib2P1F9fOBlpjnV2v7H3IcuEPF2p0cU42b6U4lEcQ3cFgSWbTd9833CS0fJcTvI1LEQStc_fyBWldJ734rDeMWGV0_nLqEL81pqlJPqhmEI6cbtt54kSwg2bCiYWuFgf8zIcmCWsdq8WXpr9bkAuXBlheZ57LDIsC-_YrxcDlPJkS-bfc56xy9xikU71_1TV7nsT3Q5FuC0GCWCZqb-lO24gZkgSES-LU6UfKfgkJ4X7Z3OQ_sP3xG3Z8-6HqTzJWpLvj2fX3fCF-1fW7yPCMHDD1xvWL6r9SfGyRkOLgiD_5m8jAhS0v0ZUKp0mUZa-FZ0hNrp_uKq51JRxam5R9auhfRw44qcyM9r4rzTHAV_zQj9TBE8akJwSZazVVVkdL-V9MZipU9yUjfmNGa_ILxigMvENdiR-iXVtnhdP5HaJhV0Akf9Z1RdCC4umH1pFEBtS28LzInPG6coyugmJZk8aaKuZrTWaJ0QEYm2Hq6Rc1-7Fmx7zX_qFgvM2t_Y0kMFa2EB79N8f0Cz2lu9hSa2zPfSBkERUFxfV7avdyNprMahuZnq-k4cYPUVukKfnac_Z9EsS1xDujCc8DgYAzmug1tb1JzVh_34oJ9UDVwShHOtxw0t6lu0TmIpSCsfFgnTzv4IRdOmsT7qjZPXi2iNqLkvP9MwJxjknhQA62Q5Hh-fGlIbI1k_eVInt-gO3fkz3ezVHmtBQscCt5SABGkXnp1TN-MmzvjUSi7a8ewMDzDe5Ns8alXqGxYcbH1B2vgYGOenF23zQHCJIhEdZBFhBrXdnGvgFpnds4HHMmyQnKV38TW20GNgfVtoXKoTqQvCGEyg6KoYmUotGm-mUqAx1qYQObasJrZxWBgkjTzQjN5b5NYnABhhwgg8TVyu7ZvR5PcMjkXbm8Gsn3DeBtcb-ZazEYMmtFHi3JnviGQUAQftNWkW9Dq1UhLsHJTaZ2heMygRPQAfRm0zcjk6gGW_V6lQD0t1clVcd7aoIhjdlIL4dudC6HDiRxiiOiPFX9aK_DulnrhZoTZVuVLA7oOvJQtPvyBGoXYdh2xrTkB7IY_fPw4av_03VBqIp3JO2OAUThWxjL5-IRTCc-h63PTVMkcrPG-MFX7EiXAg2YoONd0oF84T4HdEBziwGAuqHeUxBihPcHj8Qd9cc3WeY_U4MJBL7KkfVe6XSx5H1BKitC0JBYdc6xFdXSuQvCrQtoRCGjpNnwGvff2nwNhcyjVZtynPL9XTeuDVHeDLL1QQ9wGs_L6BFR84wuBnx15LLXs4O1wdxLe-bu05aJVbG63qqUp5ukmO3QsUppAKtAMl43IJdslaFmmdgYeLki7qS74bRwc0BSN2vOBgCHsOgPahrbIaZBOOyMJWbCiwqV5q6Tz8dc627hZAX2KFXt0ziDEfzHRUSkUgMHqxJko8sJ2Slmz8plhQfXLk0QYsXqPzRU577gsyyrqXV6dJaTzKPK6VeCzUtNPS-hfRdbRBts0ZrPwKhbbIajcf1jRtfNimVPakC90IKsHCLclH7yYPxToNkQwM_iFCns8DaOz2p-Qtpbi3cohLEl23B_JxxzsB0iPGjaQeMYCKUU045b6DhcFO6PEF1mEERPplKEf6Kdj3-ndISNyrFLMdOACSmoYqWr2xZTTJI1jr5Bg9ewp4bG9j-N5ePssRUF1lLv1eVLTOv663AxNHDnYhzJKUOD4F4VOU3t3m3W9jTUsyOsJTxwn-rJpWp2ox70ry3-i0AWk3ibDqH6XSkwtOu0gQ-XY6BQWhGJqXMsNeCF2LudMeLxuqseDRDdlr6yWZvaeZ6i3pp5Nv0VIhdNXQrjT9Z5t6YMnwjAn-5kADVHQ1Ly-f-IBLhKiA7RGI4UIcZ1NCcf_Mx_6Zn_RMYcLREdxm33pyQR1-ZsZh8PTLqtbYyxNVciEXXsPAVaSr65arakfXUEYWM9-w61jtBOnFu8UwbWugbNLylgIj6wCgTICSEjn8xlk6XdgcRLttFHORt5pac5IV2sedp1PdHkOLOHW1U6YDlLHOgoq96FNDr0ozwWMMscUPDVoeJWgRzz0yHb1qN2LyP_4aTCJqk1JRFWe4jk17v5HAkKWAolw6tgTfOMyPjqpNTax6vWFsfnlEAG_01mpPRXNTFY9ZeMHMk5Gfbzo5MDMRzNdPjD0TBMphXnzCE0Dw9x-8mx5p1OAlPS7jGoBbHKQjXl__wtzLNRVirPCj322wJc0vJJeG_ni3H7ck4HHFke1Vw3qEVcYMxIxenrHHesj4ddDMlSBEXRPpWJrYOdzjkYOctLMu2qbmwY7SlZ5KjUP-K40crPw9ilsNwvFflBp9u6gAz6XxdwVnRm00?></g></svg> |