mirror of
https://github.com/aaronpo97/the-biergarten-app.git
synced 2026-10-14 17:54:42 +00:00
* Integrate Spectre.Console into seed application, use async data loading * Replace stored-procedure repositories with Dapper-based repositories Removes the USP_* stored procedures for Auth, Location, and Brewery data access in favour of services built with Dapper. Adds a new Features.Locations slice and optimistic concurrency support for the Brewery slice. * Add new documentation for Dapper migration/database schema * Update FluentAssertions to most recent open source ver * Update XML doc comment in backend projects * Modify brewery location dto to include denormalized data * - Updated column names from 'Timer' to 'RowVersion' in schema.sql for - Introduced new BeerPost entity and updated BreweryPost and BreweryPostLocation entities to use 'RowVersion' for concurrency. - Modified UserAccount, UserCredential, UserVerification, City, StateProvince, and Country entities to use 'RowVersion' instead of 'Timer'. - Updated tests and command handlers to reflect changes in concurrency token from 'Timer' to 'RowVersion'. - Adjusted BreweryDto and BreweryDtoMapper to include 'RowVersion' and updated mapping logic accordingly. - Ensured all repository methods and interfaces are aligned with the new concurrency handling approach. * updates * Add BeerStyle entity and related properties; refactor BreweryDto to remove BeerPosts * Fix Api.Specs test failures: stale Timer column refs and missing test.user fixture * Remove repository tests, usages of registration dto used in repo * archive old stored procs/functions * update stale docs * Add instructions for generating cryptographically secure base64 secrets on macOS/Linux and Windows
1 line
159 KiB
XML
1 line
159 KiB
XML
<?plantuml 1.2026.2?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="SEQUENCE" height="5735px" preserveAspectRatio="none" style="width:2537px;height:5735px;background:#FFFFFF;" version="1.1" viewBox="0 0 2537 5735" width="2537px" zoomAndPan="magnify"><title>User Authentication Flow - Expanded</title><defs/><g><text fill="#000000" font-family="Arial" font-size="22" font-weight="bold" lengthAdjust="spacing" textLength="389.9199" x="1072.3145" y="35.6357">User Authentication Flow - Expanded</text><rect fill="#ADD8E6" height="5677.6914" style="stroke:#000000;stroke-width:1;" width="499.9541" x="741.4028" y="52.2979"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="86.7026" x="948.0286" y="64.4917">Handler Layer</text><rect fill="#90EE90" height="5677.6914" style="stroke:#000000;stroke-width:1;" width="639.9829" x="1253.3569" y="52.2979"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="122.8208" x="1511.938" y="64.4917">Infrastructure Layer</text><rect fill="#FFFFE0" height="5677.6914" style="stroke:#000000;stroke-width:1;" width="292.1855" x="1957.1611" y="52.2979"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="148.8271" x="2028.8403" y="64.4917">Repository / Cross-slice</text><g><title>API</title><rect fill="#FFFFFF" height="3385.3589" style="stroke:#000000;stroke-width:1;" width="10" x="312.5137" y="232.1914"/></g><g><title>API</title><rect fill="#FFFFFF" height="1746.0068" style="stroke:#000000;stroke-width:1;" width="10" x="312.5137" y="3696.3965"/></g><g><title>MediatR pipeline</title><rect fill="#FFFFFF" height="3170.9229" style="stroke:#000000;stroke-width:1;" width="10" x="557.5415" y="261.1401"/></g><g><title>MediatR pipeline</title><rect fill="#FFFFFF" height="599.667" style="stroke:#000000;stroke-width:1;" width="10" x="562.5415" y="2570.2598"/></g><g><title>MediatR pipeline</title><rect fill="#FFFFFF" height="1532.5195" style="stroke:#000000;stroke-width:1;" width="10" x="557.5415" y="3725.3452"/></g><g><title>RegisterUserHandler</title><rect fill="#FFFFFF" height="2861.9917" style="stroke:#000000;stroke-width:1;" width="10" x="822.7612" y="541.1226"/></g><g><title>LoginHandler</title><rect fill="#FFFFFF" height="1283.3833" style="stroke:#000000;stroke-width:1;" width="10" x="973.7607" y="3945.5327"/></g><g><title>TokenService</title><rect fill="#FFFFFF" height="310.3335" style="stroke:#000000;stroke-width:1;" width="10" x="1172.5605" y="1809.9004"/></g><g><title>TokenService</title><rect fill="#FFFFFF" height="166.6411" style="stroke:#000000;stroke-width:1;" width="10" x="1172.5605" y="2149.1826"/></g><g><title>TokenService</title><rect fill="#FFFFFF" height="166.6411" style="stroke:#000000;stroke-width:1;" width="10" x="1172.5605" y="2344.7725"/></g><g><title>TokenService</title><rect fill="#FFFFFF" height="86.8462" style="stroke:#000000;stroke-width:1;" width="10" x="1172.5605" y="4967.4287"/></g><g><title>TokenService</title><rect fill="#FFFFFF" height="86.8462" style="stroke:#000000;stroke-width:1;" width="10" x="1172.5605" y="5083.2236"/></g><g><title>Argon2</title><rect fill="#FFFFFF" height="252.436" style="stroke:#000000;stroke-width:1;" width="10" x="1310.5947" y="988.7974"/></g><g><title>Argon2</title><rect fill="#FFFFFF" height="264.4873" style="stroke:#000000;stroke-width:1;" width="10" x="1310.5947" y="4548.5488"/></g><g><title>JWT</title><rect fill="#FFFFFF" height="237.4873" style="stroke:#000000;stroke-width:1;" width="10" x="1503.5527" y="1853.7979"/></g><g><title>JWT</title><rect fill="#FFFFFF" height="93.7949" style="stroke:#000000;stroke-width:1;" width="10" x="1503.5527" y="2193.0801"/></g><g><title>JWT</title><rect fill="#FFFFFF" height="93.7949" style="stroke:#000000;stroke-width:1;" width="10" x="1503.5527" y="2388.6699"/></g><g><title>JWT</title><rect fill="#FFFFFF" height="28.9487" style="stroke:#000000;stroke-width:1;" width="10" x="1503.5527" y="4996.3774"/></g><g><title>JWT</title><rect fill="#FFFFFF" height="28.9487" style="stroke:#000000;stroke-width:1;" width="10" x="1503.5527" y="5112.1724"/></g><g><title>Email</title><rect fill="#FFFFFF" height="207.5898" style="stroke:#000000;stroke-width:1;" width="10" x="1674.0718" y="2962.3369"/></g><g><title>Template</title><rect fill="#FFFFFF" height="180.5898" style="stroke:#000000;stroke-width:1;" width="10" x="1838.1606" y="2752.7983"/></g><g><title>AuthRepository</title><rect fill="#FFFFFF" height="102.7437" style="stroke:#000000;stroke-width:1;" width="10" x="2021.0195" y="570.0713"/></g><g><title>AuthRepository</title><rect fill="#FFFFFF" height="102.7437" style="stroke:#000000;stroke-width:1;" width="10" x="2021.0195" y="701.7637"/></g><g><title>AuthRepository</title><rect fill="#FFFFFF" height="510.7695" style="stroke:#000000;stroke-width:1;" width="10" x="2021.0195" y="1270.1821"/></g><g><title>AuthRepository</title><rect fill="#FFFFFF" height="102.7437" style="stroke:#000000;stroke-width:1;" width="10" x="2021.0195" y="3974.4814"/></g><g><title>AuthRepository</title><rect fill="#FFFFFF" height="147.5898" style="stroke:#000000;stroke-width:1;" width="10" x="2021.0195" y="4246.5664"/></g><g><title>EmailDispatcher</title><rect fill="#FFFFFF" height="540.8208" style="stroke:#000000;stroke-width:1;" width="10" x="2168.1123" y="2629.106"/></g><g><title>SQL Server</title><rect fill="#FFFFFF" height="28.9487" style="stroke:#000000;stroke-width:1;" width="10" x="2294.9155" y="643.8662"/></g><g><title>SQL Server</title><rect fill="#FFFFFF" height="28.9487" style="stroke:#000000;stroke-width:1;" width="10" x="2294.9155" y="775.5586"/></g><g><title>SQL Server</title><rect fill="#FFFFFF" height="205.4873" style="stroke:#000000;stroke-width:1;" width="10" x="2294.9155" y="1299.1309"/></g><g><title>SQL Server</title><rect fill="#FFFFFF" height="78.8462" style="stroke:#000000;stroke-width:1;" width="10" x="2294.9155" y="1673.1567"/></g><g><title>SQL Server</title><rect fill="#FFFFFF" height="28.9487" style="stroke:#000000;stroke-width:1;" width="10" x="2294.9155" y="4048.2764"/></g><g><title>SQL Server</title><rect fill="#FFFFFF" height="28.9487" style="stroke:#000000;stroke-width:1;" width="10" x="2294.9155" y="4365.2075"/></g><rect fill="#FFFFFF" height="3224.7178" style="stroke:#000000;stroke-width:1;" width="2455.5488" x="65" y="385.8325"/><rect fill="#FFFFFF" height="3105.0254" style="stroke:none;stroke-width:1;" width="2455.5488" x="65" y="505.5249"/><rect fill="#FFFFFF" height="2784.043" style="stroke:#000000;stroke-width:1;" width="2435.5488" x="75" y="819.5073"/><rect fill="#FFFFFF" height="2650.3506" style="stroke:none;stroke-width:1;" width="2435.5488" x="75" y="953.1997"/><rect fill="#FFFFFF" height="145.3926" style="stroke:#000000;stroke-width:1;" width="226.791" x="735.4028" y="3184.9268"/><rect fill="#FFFFFF" height="86.4951" style="stroke:none;stroke-width:1;" width="226.791" x="735.4028" y="3243.8242"/><rect fill="#FFFFFF" height="1645.1606" style="stroke:#000000;stroke-width:1;" width="2314.4844" x="45" y="3790.2427"/><rect fill="#FFFFFF" height="1525.4683" style="stroke:none;stroke-width:1;" width="2314.4844" x="45" y="3909.9351"/><rect fill="#FFFFFF" height="1336.1782" style="stroke:#000000;stroke-width:1;" width="2294.4844" x="55" y="4092.2251"/><rect fill="#FFFFFF" height="1217.4346" style="stroke:none;stroke-width:1;" width="2294.4844" x="55" y="4210.9688"/><rect fill="#FFFFFF" height="1012.2471" style="stroke:#000000;stroke-width:1;" width="1736.0723" x="65" y="4409.1563"/><rect fill="#FFFFFF" height="908.4521" style="stroke:none;stroke-width:1;" width="1736.0723" x="65" y="4512.9512"/><rect fill="#FFFFFF" height="586.3672" style="stroke:#000000;stroke-width:1;" width="1501.7905" x="75" y="4828.0361"/><rect fill="#FFFFFF" height="482.5723" style="stroke:none;stroke-width:1;" width="1501.7905" x="75" y="4931.8311"/><g class="participant-lifeline" data-entity-uid="part1" data-qualified-name="User" id="part1-lifeline"><g><title>User</title><rect fill="#000000" fill-opacity="0.00000" height="5521.4941" width="8" x="98.7793" y="128.3965"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:5,5;" x1="102" x2="102" y1="128.3965" y2="5649.8906"/></g></g><g class="participant-lifeline" data-entity-uid="part2" data-qualified-name="API" id="part2-lifeline"><g><title>API</title><rect fill="#000000" fill-opacity="0.00000" height="5521.4941" width="8" x="313.5137" y="128.3965"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:5,5;" x1="317.1689" x2="317.1689" y1="128.3965" y2="5649.8906"/></g></g><g class="participant-lifeline" data-entity-uid="part3" data-qualified-name="Mediator" id="part3-lifeline"><g><title>MediatR pipeline</title><rect fill="#000000" fill-opacity="0.00000" height="5521.4941" width="8" x="558.5415" y="128.3965"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:5,5;" x1="562.5073" x2="562.5073" y1="128.3965" y2="5649.8906"/></g></g><g class="participant-lifeline" data-entity-uid="part4" data-qualified-name="RegHandler" id="part4-lifeline"><g><title>RegisterUserHandler</title><rect fill="#000000" fill-opacity="0.00000" height="5521.4941" width="8" x="823.7612" y="128.3965"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:5,5;" x1="827.4028" x2="827.4028" y1="128.3965" y2="5649.8906"/></g></g><g class="participant-lifeline" data-entity-uid="part5" data-qualified-name="LoginHandler" id="part5-lifeline"><g><title>LoginHandler</title><rect fill="#000000" fill-opacity="0.00000" height="5521.4941" width="8" x="974.7607" y="128.3965"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:5,5;" x1="978.1196" x2="978.1196" y1="128.3965" y2="5649.8906"/></g></g><g class="participant-lifeline" data-entity-uid="part6" data-qualified-name="TokenSvc" id="part6-lifeline"><g><title>TokenService</title><rect fill="#000000" fill-opacity="0.00000" height="5521.4941" width="8" x="1173.5605" y="128.3965"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:5,5;" x1="1176.7642" x2="1176.7642" y1="128.3965" y2="5649.8906"/></g></g><g class="participant-lifeline" data-entity-uid="part7" data-qualified-name="Argon2" id="part7-lifeline"><g><title>Argon2</title><rect fill="#000000" fill-opacity="0.00000" height="5521.4941" width="8" x="1311.5947" y="128.3965"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:5,5;" x1="1315.3569" x2="1315.3569" y1="128.3965" y2="5649.8906"/></g></g><g class="participant-lifeline" data-entity-uid="part8" data-qualified-name="JWT" id="part8-lifeline"><g><title>JWT</title><rect fill="#000000" fill-opacity="0.00000" height="5521.4941" width="8" x="1504.5527" y="128.3965"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:5,5;" x1="1508.3149" x2="1508.3149" y1="128.3965" y2="5649.8906"/></g></g><g class="participant-lifeline" data-entity-uid="part9" data-qualified-name="SMTP" id="part9-lifeline"><g><title>Email</title><rect fill="#000000" fill-opacity="0.00000" height="5521.4941" width="8" x="1675.0718" y="128.3965"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:5,5;" x1="1679.0063" x2="1679.0063" y1="128.3965" y2="5649.8906"/></g></g><g class="participant-lifeline" data-entity-uid="part10" data-qualified-name="Template" id="part10-lifeline"><g><title>Template</title><rect fill="#000000" fill-opacity="0.00000" height="5521.4941" width="8" x="1839.1606" y="128.3965"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:5,5;" x1="1842.9814" x2="1842.9814" y1="128.3965" y2="5649.8906"/></g></g><g class="participant-lifeline" data-entity-uid="part11" data-qualified-name="AuthRepo" id="part11-lifeline"><g><title>AuthRepository</title><rect fill="#000000" fill-opacity="0.00000" height="5521.4941" width="8" x="2022.0195" y="128.3965"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:5,5;" x1="2025.1611" x2="2025.1611" y1="128.3965" y2="5649.8906"/></g></g><g class="participant-lifeline" data-entity-uid="part12" data-qualified-name="EmailDispatcher" id="part12-lifeline"><g><title>EmailDispatcher</title><rect fill="#000000" fill-opacity="0.00000" height="5521.4941" width="8" x="2169.1123" y="128.3965"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:5,5;" x1="2172.8779" x2="2172.8779" y1="128.3965" y2="5649.8906"/></g></g><g class="participant-lifeline" data-entity-uid="part13" data-qualified-name="DB" id="part13-lifeline"><g><title>SQL Server</title><rect fill="#000000" fill-opacity="0.00000" height="5521.4941" width="8" x="2295.9155" y="128.3965"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:5,5;" x1="2299.3467" x2="2299.3467" y1="128.3965" y2="5649.8906"/></g></g><g class="participant participant-head" data-entity-uid="part1" data-qualified-name="User" id="part1-head"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="29.5586" x="85" y="125.4297">User</text><ellipse cx="102.7793" cy="60.2979" fill="#FFFFFF" rx="8" ry="8" style="stroke:#000000;stroke-width:1;"/><path d="M102.7793,68.2979 L102.7793,95.2979 M89.7793,76.2979 L115.7793,76.2979 M102.7793,95.2979 L89.7793,110.2979 M102.7793,95.2979 L115.7793,110.2979" fill="none" style="stroke:#000000;stroke-width:1;"/></g><g class="participant participant-tail" data-entity-uid="part1" data-qualified-name="User" id="part1-tail"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="29.5586" x="85" y="5662.0225">User</text><ellipse cx="102.7793" cy="5673.9893" fill="#FFFFFF" rx="8" ry="8" style="stroke:#000000;stroke-width:1;"/><path d="M102.7793,5681.9893 L102.7793,5708.9893 M89.7793,5689.9893 L115.7793,5689.9893 M102.7793,5708.9893 L89.7793,5723.9893 M102.7793,5708.9893 L115.7793,5723.9893" fill="none" style="stroke:#000000;stroke-width:1;"/></g><g class="participant participant-head" data-entity-uid="part2" data-qualified-name="API" id="part2-head"><rect fill="#FFFFFF" height="46.1973" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="74.6895" x="280.1689" y="81.1992"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="22.5654" x="306.231" y="101.3311">API</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="60.6895" x="287.1689" y="117.4297">Controller</text></g><g class="participant participant-tail" data-entity-uid="part2" data-qualified-name="API" id="part2-tail"><rect fill="#FFFFFF" height="46.1973" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="74.6895" x="280.1689" y="5648.8906"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="22.5654" x="306.231" y="5669.0225">API</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="60.6895" x="287.1689" y="5685.1211">Controller</text></g><g class="participant participant-head" data-entity-uid="part3" data-qualified-name="Mediator" id="part3-head"><rect fill="#FFFFFF" height="46.1973" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="140.0684" x="492.5073" y="81.1992"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="104.2822" x="510.4004" y="101.3311">MediatR pipeline</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="126.0684" x="499.5073" y="117.4297">(ValidationBehavior)</text></g><g class="participant participant-tail" data-entity-uid="part3" data-qualified-name="Mediator" id="part3-tail"><rect fill="#FFFFFF" height="46.1973" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="140.0684" x="492.5073" y="5648.8906"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="104.2822" x="510.4004" y="5669.0225">MediatR pipeline</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="126.0684" x="499.5073" y="5685.1211">(ValidationBehavior)</text></g><g class="participant participant-head" data-entity-uid="part4" data-qualified-name="RegHandler" id="part4-head"><rect fill="#FFFFFF" height="30.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="144.7168" x="755.4028" y="97.2979"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="130.7168" x="762.4028" y="117.4297">RegisterUserHandler</text></g><g class="participant participant-tail" data-entity-uid="part4" data-qualified-name="RegHandler" id="part4-tail"><rect fill="#FFFFFF" height="30.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="144.7168" x="755.4028" y="5648.8906"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="130.7168" x="762.4028" y="5669.0225">RegisterUserHandler</text></g><g class="participant participant-head" data-entity-uid="part5" data-qualified-name="LoginHandler" id="part5-head"><rect fill="#FFFFFF" height="30.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="97.2822" x="930.1196" y="97.2979"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="83.2822" x="937.1196" y="117.4297">LoginHandler</text></g><g class="participant participant-tail" data-entity-uid="part5" data-qualified-name="LoginHandler" id="part5-tail"><rect fill="#FFFFFF" height="30.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="97.2822" x="930.1196" y="5648.8906"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="83.2822" x="937.1196" y="5669.0225">LoginHandler</text></g><g class="participant participant-head" data-entity-uid="part6" data-qualified-name="TokenSvc" id="part6-head"><rect fill="#FFFFFF" height="30.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="99.5928" x="1127.7642" y="97.2979"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="85.5928" x="1134.7642" y="117.4297">TokenService</text></g><g class="participant participant-tail" data-entity-uid="part6" data-qualified-name="TokenSvc" id="part6-tail"><rect fill="#FFFFFF" height="30.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="99.5928" x="1127.7642" y="5648.8906"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="85.5928" x="1134.7642" y="5669.0225">TokenService</text></g><g class="participant participant-head" data-entity-uid="part7" data-qualified-name="Argon2" id="part7-head"><rect fill="#FFFFFF" height="46.1973" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="96.4756" x="1267.3569" y="81.1992"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="45.1445" x="1293.0225" y="101.3311">Argon2</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="82.4756" x="1274.3569" y="117.4297">Infrastructure</text></g><g class="participant participant-tail" data-entity-uid="part7" data-qualified-name="Argon2" id="part7-tail"><rect fill="#FFFFFF" height="46.1973" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="96.4756" x="1267.3569" y="5648.8906"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="45.1445" x="1293.0225" y="5669.0225">Argon2</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="82.4756" x="1274.3569" y="5685.1211">Infrastructure</text></g><g class="participant participant-head" data-entity-uid="part8" data-qualified-name="JWT" id="part8-head"><rect fill="#FFFFFF" height="46.1973" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="96.4756" x="1460.3149" y="81.1992"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="28.7656" x="1494.1699" y="101.3311">JWT</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="82.4756" x="1467.3149" y="117.4297">Infrastructure</text></g><g class="participant participant-tail" data-entity-uid="part8" data-qualified-name="JWT" id="part8-tail"><rect fill="#FFFFFF" height="46.1973" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="96.4756" x="1460.3149" y="5648.8906"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="28.7656" x="1494.1699" y="5669.0225">JWT</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="82.4756" x="1467.3149" y="5685.1211">Infrastructure</text></g><g class="participant participant-head" data-entity-uid="part9" data-qualified-name="SMTP" id="part9-head"><rect fill="#FFFFFF" height="46.1973" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="66.1309" x="1646.0063" y="81.1992"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="35.0068" x="1661.5684" y="101.3311">Email</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="52.1309" x="1653.0063" y="117.4297">Provider</text></g><g class="participant participant-tail" data-entity-uid="part9" data-qualified-name="SMTP" id="part9-tail"><rect fill="#FFFFFF" height="46.1973" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="66.1309" x="1646.0063" y="5648.8906"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="35.0068" x="1661.5684" y="5669.0225">Email</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="52.1309" x="1653.0063" y="5685.1211">Provider</text></g><g class="participant participant-head" data-entity-uid="part10" data-qualified-name="Template" id="part10-head"><rect fill="#FFFFFF" height="46.1973" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="72.3584" x="1806.9814" y="81.1992"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="58.3584" x="1813.9814" y="101.3311">Template</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="52.1309" x="1817.0952" y="117.4297">Provider</text></g><g class="participant participant-tail" data-entity-uid="part10" data-qualified-name="Template" id="part10-tail"><rect fill="#FFFFFF" height="46.1973" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="72.3584" x="1806.9814" y="5648.8906"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="58.3584" x="1813.9814" y="5669.0225">Template</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="52.1309" x="1817.0952" y="5685.1211">Provider</text></g><g class="participant participant-head" data-entity-uid="part11" data-qualified-name="AuthRepo" id="part11-head"><rect fill="#FFFFFF" height="30.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="109.7168" x="1971.1611" y="97.2979"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="95.7168" x="1978.1611" y="117.4297">AuthRepository</text></g><g class="participant participant-tail" data-entity-uid="part11" data-qualified-name="AuthRepo" id="part11-tail"><rect fill="#FFFFFF" height="30.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="109.7168" x="1971.1611" y="5648.8906"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="95.7168" x="1978.1611" y="5669.0225">AuthRepository</text></g><g class="participant participant-head" data-entity-uid="part12" data-qualified-name="EmailDispatcher" id="part12-head"><rect fill="#FFFFFF" height="46.1973" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="124.4688" x="2110.8779" y="81.1992"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="101.9238" x="2122.1504" y="101.3311">EmailDispatcher</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="110.4688" x="2117.8779" y="117.4297">(Features.Emails)</text></g><g class="participant participant-tail" data-entity-uid="part12" data-qualified-name="EmailDispatcher" id="part12-tail"><rect fill="#FFFFFF" height="46.1973" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="124.4688" x="2110.8779" y="5648.8906"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="101.9238" x="2122.1504" y="5669.0225">EmailDispatcher</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="110.4688" x="2117.8779" y="5685.1211">(Features.Emails)</text></g><g class="participant participant-head" data-entity-uid="part13" data-qualified-name="DB" id="part13-head"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="73.1377" x="2260.3467" y="125.4297">SQL Server</text><path d="M2281.9155,76.2979 C2281.9155,66.2979 2299.9155,66.2979 2299.9155,66.2979 C2299.9155,66.2979 2317.9155,66.2979 2317.9155,76.2979 L2317.9155,102.2979 C2317.9155,112.2979 2299.9155,112.2979 2299.9155,112.2979 C2299.9155,112.2979 2281.9155,112.2979 2281.9155,102.2979 L2281.9155,76.2979" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2281.9155,76.2979 C2281.9155,86.2979 2299.9155,86.2979 2299.9155,86.2979 C2299.9155,86.2979 2317.9155,86.2979 2317.9155,76.2979" fill="none" style="stroke:#000000;stroke-width:1;"/></g><g class="participant participant-tail" data-entity-uid="part13" data-qualified-name="DB" id="part13-tail"><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="73.1377" x="2260.3467" y="5662.0225">SQL Server</text><path d="M2281.9155,5674.9893 C2281.9155,5664.9893 2299.9155,5664.9893 2299.9155,5664.9893 C2299.9155,5664.9893 2317.9155,5664.9893 2317.9155,5674.9893 L2317.9155,5700.9893 C2317.9155,5710.9893 2299.9155,5710.9893 2299.9155,5710.9893 C2299.9155,5710.9893 2281.9155,5710.9893 2281.9155,5700.9893 L2281.9155,5674.9893" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2281.9155,5674.9893 C2281.9155,5684.9893 2299.9155,5684.9893 2299.9155,5684.9893 C2299.9155,5684.9893 2317.9155,5684.9893 2317.9155,5674.9893" fill="none" style="stroke:#000000;stroke-width:1;"/></g><g><title>API</title><rect fill="#FFFFFF" height="3385.3589" style="stroke:#000000;stroke-width:1;" width="10" x="312.5137" y="232.1914"/></g><g><title>API</title><rect fill="#FFFFFF" height="1746.0068" style="stroke:#000000;stroke-width:1;" width="10" x="312.5137" y="3696.3965"/></g><g><title>MediatR pipeline</title><rect fill="#FFFFFF" height="3170.9229" style="stroke:#000000;stroke-width:1;" width="10" x="557.5415" y="261.1401"/></g><g><title>MediatR pipeline</title><rect fill="#FFFFFF" height="599.667" style="stroke:#000000;stroke-width:1;" width="10" x="562.5415" y="2570.2598"/></g><g><title>MediatR pipeline</title><rect fill="#FFFFFF" height="1532.5195" style="stroke:#000000;stroke-width:1;" width="10" x="557.5415" y="3725.3452"/></g><g><title>RegisterUserHandler</title><rect fill="#FFFFFF" height="2861.9917" style="stroke:#000000;stroke-width:1;" width="10" x="822.7612" y="541.1226"/></g><g><title>LoginHandler</title><rect fill="#FFFFFF" height="1283.3833" style="stroke:#000000;stroke-width:1;" width="10" x="973.7607" y="3945.5327"/></g><g><title>TokenService</title><rect fill="#FFFFFF" height="310.3335" style="stroke:#000000;stroke-width:1;" width="10" x="1172.5605" y="1809.9004"/></g><g><title>TokenService</title><rect fill="#FFFFFF" height="166.6411" style="stroke:#000000;stroke-width:1;" width="10" x="1172.5605" y="2149.1826"/></g><g><title>TokenService</title><rect fill="#FFFFFF" height="166.6411" style="stroke:#000000;stroke-width:1;" width="10" x="1172.5605" y="2344.7725"/></g><g><title>TokenService</title><rect fill="#FFFFFF" height="86.8462" style="stroke:#000000;stroke-width:1;" width="10" x="1172.5605" y="4967.4287"/></g><g><title>TokenService</title><rect fill="#FFFFFF" height="86.8462" style="stroke:#000000;stroke-width:1;" width="10" x="1172.5605" y="5083.2236"/></g><g><title>Argon2</title><rect fill="#FFFFFF" height="252.436" style="stroke:#000000;stroke-width:1;" width="10" x="1310.5947" y="988.7974"/></g><g><title>Argon2</title><rect fill="#FFFFFF" height="264.4873" style="stroke:#000000;stroke-width:1;" width="10" x="1310.5947" y="4548.5488"/></g><g><title>JWT</title><rect fill="#FFFFFF" height="237.4873" style="stroke:#000000;stroke-width:1;" width="10" x="1503.5527" y="1853.7979"/></g><g><title>JWT</title><rect fill="#FFFFFF" height="93.7949" style="stroke:#000000;stroke-width:1;" width="10" x="1503.5527" y="2193.0801"/></g><g><title>JWT</title><rect fill="#FFFFFF" height="93.7949" style="stroke:#000000;stroke-width:1;" width="10" x="1503.5527" y="2388.6699"/></g><g><title>JWT</title><rect fill="#FFFFFF" height="28.9487" style="stroke:#000000;stroke-width:1;" width="10" x="1503.5527" y="4996.3774"/></g><g><title>JWT</title><rect fill="#FFFFFF" height="28.9487" style="stroke:#000000;stroke-width:1;" width="10" x="1503.5527" y="5112.1724"/></g><g><title>Email</title><rect fill="#FFFFFF" height="207.5898" style="stroke:#000000;stroke-width:1;" width="10" x="1674.0718" y="2962.3369"/></g><g><title>Template</title><rect fill="#FFFFFF" height="180.5898" style="stroke:#000000;stroke-width:1;" width="10" x="1838.1606" y="2752.7983"/></g><g><title>AuthRepository</title><rect fill="#FFFFFF" height="102.7437" style="stroke:#000000;stroke-width:1;" width="10" x="2021.0195" y="570.0713"/></g><g><title>AuthRepository</title><rect fill="#FFFFFF" height="102.7437" style="stroke:#000000;stroke-width:1;" width="10" x="2021.0195" y="701.7637"/></g><g><title>AuthRepository</title><rect fill="#FFFFFF" height="510.7695" style="stroke:#000000;stroke-width:1;" width="10" x="2021.0195" y="1270.1821"/></g><g><title>AuthRepository</title><rect fill="#FFFFFF" height="102.7437" style="stroke:#000000;stroke-width:1;" width="10" x="2021.0195" y="3974.4814"/></g><g><title>AuthRepository</title><rect fill="#FFFFFF" height="147.5898" style="stroke:#000000;stroke-width:1;" width="10" x="2021.0195" y="4246.5664"/></g><g><title>EmailDispatcher</title><rect fill="#FFFFFF" height="540.8208" style="stroke:#000000;stroke-width:1;" width="10" x="2168.1123" y="2629.106"/></g><g><title>SQL Server</title><rect fill="#FFFFFF" height="28.9487" style="stroke:#000000;stroke-width:1;" width="10" x="2294.9155" y="643.8662"/></g><g><title>SQL Server</title><rect fill="#FFFFFF" height="28.9487" style="stroke:#000000;stroke-width:1;" width="10" x="2294.9155" y="775.5586"/></g><g><title>SQL Server</title><rect fill="#FFFFFF" height="205.4873" style="stroke:#000000;stroke-width:1;" width="10" x="2294.9155" y="1299.1309"/></g><g><title>SQL Server</title><rect fill="#FFFFFF" height="78.8462" style="stroke:#000000;stroke-width:1;" width="10" x="2294.9155" y="1673.1567"/></g><g><title>SQL Server</title><rect fill="#FFFFFF" height="28.9487" style="stroke:#000000;stroke-width:1;" width="10" x="2294.9155" y="4048.2764"/></g><g><title>SQL Server</title><rect fill="#FFFFFF" height="28.9487" style="stroke:#000000;stroke-width:1;" width="10" x="2294.9155" y="4365.2075"/></g><rect fill="#FFFFFF" height="3" style="stroke:#FFFFFF;stroke-width:1;" width="2525.5488" x="5" y="158.8708"/><line style="stroke:#000000;stroke-width:0.5;" x1="5" x2="2530.5488" y1="158.8708" y2="158.8708"/><line style="stroke:#000000;stroke-width:0.5;" x1="5" x2="2530.5488" y1="161.8708" y2="161.8708"/><rect fill="#FFFFFF" height="22.9487" style="stroke:#000000;stroke-width:1;" width="126.6709" x="1204.439" y="148.3965"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="109.0591" x="1210.439" y="164.5903">Registration Flow</text><g class="message" data-entity-1="part1" data-entity-2="part2" id="msg1"><polygon fill="#000000" points="300.5137,228.1914,310.5137,232.1914,300.5137,236.1914,304.5137,232.1914" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="102.7793" x2="306.5137" y1="232.1914" y2="232.1914"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="35.3945" x="139.7266" y="197.5391">POST</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="175.1211" y="197.5391"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="96.8335" x="178.7329" y="197.5391">/api/auth/register</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="65.7617" x="112.2793" y="212.4878">{username,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="178.041" y="212.4878"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="59.23" x="181.6528" y="212.4878">firstName,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="240.8828" y="212.4878"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="58.519" x="244.4946" y="212.4878">lastName,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="34.6772" x="122.0229" y="227.4365">email,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="156.7002" y="227.4365"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="69.3672" x="160.312" y="227.4365">dateOfBirth,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="229.6792" y="227.4365"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="59.979" x="233.291" y="227.4365">password}</text></g><g class="message" data-entity-1="part2" data-entity-2="part3" id="msg2"><polygon fill="#000000" points="545.5415,257.1401,555.5415,261.1401,545.5415,265.1401,549.5415,261.1401" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="322.5137" x2="551.5415" y1="261.1401" y2="261.1401"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="174.8398" x="352.6077" y="256.3853">Send(RegisterUserCommand)</text></g><path d="M572,274.1401 L572,373.1401 L1015,373.1401 L1015,284.1401 L1005,274.1401 L572,274.1401" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1005,274.1401 L1005,284.1401 L1015,284.1401 L1005,274.1401" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="268.0806" x="578" y="291.334">ValidationBehavior runs RegisterUserValidator</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="214.6333" x="578" y="306.2827">(FluentValidation) before the handler:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="259.0288" x="578" y="321.2314">- Username: 3-64 chars, alphanumeric + [._-]</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="207.3462" x="578" y="336.1802">- Email: valid format, max 128 chars</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="422.6841" x="578" y="351.1289">- Password: min 8 chars, uppercase,\n lowercase, number, special char</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="211.3452" x="578" y="366.0776">- DateOfBirth: must be 19+ years old</text><path d="M65,385.8325 L125.1709,385.8325 L125.1709,392.7813 L115.1709,402.7813 L65,402.7813 L65,385.8325" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><rect fill="none" height="3224.7178" style="stroke:#000000;stroke-width:1;" width="2455.5488" x="65" y="385.8325"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="15.1709" x="80" y="399.0264">alt</text><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="84.9546" x="140.1709" y="398.1504">[Validation fails]</text><g class="message" data-entity-1="part3" data-entity-2="part2" id="msg3"><polygon fill="#000000" points="333.5137,434.6787,323.5137,438.6787,333.5137,442.6787,329.5137,438.6787" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="327.5137" x2="556.5415" y1="438.6787" y2="438.6787"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="38.2891" x="420.8831" y="418.9751">throws</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="211.0278" x="334.5137" y="433.9238">FluentValidation.ValidationException</text></g><g class="message" data-entity-1="part2" data-entity-2="part1" id="msg4"><polygon fill="#000000" points="113.7793,493.5249,103.7793,497.5249,113.7793,501.5249,109.7793,497.5249" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="107.7793" x2="311.5137" y1="497.5249" y2="497.5249"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="21.6899" x="157.4143" y="462.8726">400</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="179.1042" y="462.8726"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="23.1309" x="182.7161" y="462.8726">Bad</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="205.8469" y="462.8726"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="48.4199" x="209.4587" y="462.8726">Request</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="60.7026" x="123.175" y="477.8213">{message:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="183.8777" y="477.8213"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="61.7119" x="187.4895" y="477.8213">"Validation</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="249.2014" y="477.8213"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="39.3047" x="252.8132" y="477.8213">failed",</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="37.5591" x="175.1306" y="492.77">errors:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="212.6897" y="492.77"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="23.8608" x="216.3015" y="492.77">{...}}</text></g><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="65" x2="2520.5488" y1="506.5249" y2="506.5249"/><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="113.0884" x="70" y="516.8428">[Validation succeeds]</text><g class="message" data-entity-1="part3" data-entity-2="part4" id="msg5"><polygon fill="#000000" points="810.7612,537.1226,820.7612,541.1226,810.7612,545.1226,814.7612,541.1226" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="567.5415" x2="816.7612" y1="541.1226" y2="541.1226"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="106.9326" x="641.6851" y="536.3677">Handle(command)</text></g><g class="message" data-entity-1="part4" data-entity-2="part11" id="msg6"><polygon fill="#000000" points="2009.0195,566.0713,2019.0195,570.0713,2009.0195,574.0713,2013.0195,570.0713" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="832.7612" x2="2015.0195" y1="570.0713" y2="570.0713"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="225.4053" x="1314.1877" y="565.3164">GetUserByUsernameAsync(username)</text></g><g class="message" data-entity-1="part11" data-entity-2="part13" id="msg7"><polygon fill="#000000" points="2282.9155,639.8662,2292.9155,643.8662,2282.9155,647.8662,2286.9155,643.8662" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="2031.0195" x2="2288.9155" y1="643.8662" y2="643.8662"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="50.5718" x="2090.3599" y="594.2651">SELECT</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2140.9316" y="594.2651"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="91.0317" x="2144.5435" y="594.2651">UserAccountID,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="63.5781" x="2123.9548" y="609.2139">Username,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2187.533" y="609.2139"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="10.8354" x="2191.1448" y="609.2139">...</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="38.27" x="2092.1658" y="624.1626">FROM</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2130.4358" y="624.1626"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="99.7217" x="2134.0476" y="624.1626">dbo.UserAccount</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="48.3882" x="2062.9951" y="639.1113">WHERE</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2111.3833" y="639.1113"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="59.9663" x="2114.9951" y="639.1113">Username</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2174.9614" y="639.1113"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.5918" x="2178.5732" y="639.1113">=</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2186.165" y="639.1113"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="73.1631" x="2189.7769" y="639.1113">@Username</text></g><g class="message" data-entity-1="part13" data-entity-2="part11" id="msg8"><polygon fill="#000000" points="2037.0195,668.8149,2027.0195,672.8149,2037.0195,676.8149,2033.0195,672.8149" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="2031.0195" x2="2298.9155" y1="672.8149" y2="672.8149"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="20.2363" x="2096.3362" y="668.0601">null</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2116.5725" y="668.0601"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="29.6182" x="2120.1843" y="668.0601">(user</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2149.8025" y="668.0601"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="41.5137" x="2153.4143" y="668.0601">doesn't</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2194.928" y="668.0601"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="31.0591" x="2198.5398" y="668.0601">exist)</text></g><g class="message" data-entity-1="part4" data-entity-2="part11" id="msg9"><polygon fill="#000000" points="2009.0195,697.7637,2019.0195,701.7637,2009.0195,705.7637,2013.0195,701.7637" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="832.7612" x2="2015.0195" y1="701.7637" y2="701.7637"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="171.2026" x="1341.2891" y="697.0088">GetUserByEmailAsync(email)</text></g><g class="message" data-entity-1="part11" data-entity-2="part13" id="msg10"><polygon fill="#000000" points="2282.9155,771.5586,2292.9155,775.5586,2282.9155,779.5586,2286.9155,775.5586" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="2031.0195" x2="2288.9155" y1="775.5586" y2="775.5586"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="50.5718" x="2090.3599" y="725.9575">SELECT</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2140.9316" y="725.9575"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="91.0317" x="2144.5435" y="725.9575">UserAccountID,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="63.5781" x="2123.9548" y="740.9063">Username,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2187.533" y="740.9063"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="10.8354" x="2191.1448" y="740.9063">...</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="38.27" x="2092.1658" y="755.855">FROM</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2130.4358" y="755.855"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="99.7217" x="2134.0476" y="755.855">dbo.UserAccount</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="48.3882" x="2090.4551" y="770.8037">WHERE</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2138.8433" y="770.8037"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="32.5063" x="2142.4551" y="770.8037">Email</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2174.9614" y="770.8037"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.5918" x="2178.5732" y="770.8037">=</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2186.165" y="770.8037"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="45.7031" x="2189.7769" y="770.8037">@Email</text></g><g class="message" data-entity-1="part13" data-entity-2="part11" id="msg11"><polygon fill="#000000" points="2037.0195,800.5073,2027.0195,804.5073,2037.0195,808.5073,2033.0195,804.5073" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="2031.0195" x2="2298.9155" y1="804.5073" y2="804.5073"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="20.2363" x="2093.448" y="799.7524">null</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2113.6843" y="799.7524"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="35.3945" x="2117.2961" y="799.7524">(email</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2152.6907" y="799.7524"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="41.5137" x="2156.3025" y="799.7524">doesn't</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2197.8162" y="799.7524"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="31.0591" x="2201.428" y="799.7524">exist)</text></g><path d="M75,819.5073 L135.1709,819.5073 L135.1709,826.4561 L125.1709,836.4561 L75,836.4561 L75,819.5073" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><rect fill="none" height="2784.043" style="stroke:#000000;stroke-width:1;" width="2435.5488" x="75" y="819.5073"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="15.1709" x="90" y="832.7012">alt</text><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="181.5913" x="150.1709" y="831.8252">[Username or email already exists]</text><g class="message" data-entity-1="part4" data-entity-2="part3" id="msg12"><polygon fill="#000000" points="578.5415,853.4048,568.5415,857.4048,578.5415,861.4048,574.5415,857.4048" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="572.5415" x2="821.7612" y1="857.4048" y2="857.4048"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="31.7891" x="627.2314" y="852.6499">throw</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="659.0205" y="852.6499"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="100.439" x="662.6323" y="852.6499">ConflictException</text></g><g class="message" data-entity-1="part3" data-entity-2="part2" id="msg13"><polygon fill="#000000" points="333.5137,882.3535,323.5137,886.3535,333.5137,890.3535,329.5137,886.3535" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="327.5137" x2="556.5415" y1="886.3535" y2="886.3535"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="58.5508" x="410.7522" y="881.5986">propagate</text></g><g class="message" data-entity-1="part2" data-entity-2="part1" id="msg14"><polygon fill="#000000" points="113.7793,941.1997,103.7793,945.1997,113.7793,949.1997,109.7793,945.1997" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="107.7793" x2="311.5137" y1="945.1997" y2="945.1997"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="21.6899" x="173.3215" y="910.5474">409</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="195.0115" y="910.5474"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="43.3481" x="198.6233" y="910.5474">Conflict</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="64.5811" x="127.3074" y="925.4961">"Username</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="191.8884" y="925.4961"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="11.5591" x="195.5002" y="925.4961">or</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="207.0593" y="925.4961"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="31.0654" x="210.6711" y="925.4961">email</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="241.7366" y="925.4961"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="42.6372" x="245.3484" y="925.4961">already</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="37.8447" x="188.7241" y="940.4448">exists"</text></g><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="75" x2="2510.5488" y1="954.1997" y2="954.1997"/><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="157.126" x="80" y="964.5176">[Username and email are free]</text><g class="message" data-entity-1="part4" data-entity-2="part7" id="msg15"><polygon fill="#000000" points="1298.5947,984.7974,1308.5947,988.7974,1298.5947,992.7974,1302.5947,988.7974" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="832.7612" x2="1304.5947" y1="988.7974" y2="988.7974"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="94.6436" x="1024.3562" y="984.0425">Hash(password)</text></g><path d="M1325,1001.7974 L1325,1100.7974 L1487,1100.7974 L1487,1011.7974 L1477,1001.7974 L1325,1001.7974" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1477,1001.7974 L1477,1011.7974 L1487,1011.7974 L1477,1001.7974" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="125.0107" x="1331" y="1018.9912">Argon2id parameters:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="138.728" x="1331" y="1033.9399">- Salt: 16 bytes (128-bit)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="96.0718" x="1331" y="1048.8887">- Memory: 64MB</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="75.8672" x="1331" y="1063.8374">- Iterations: 4</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="141.5972" x="1331" y="1078.7861">- Parallelism: CPU count</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="134.4116" x="1331" y="1093.7349">- Hash output: 32 bytes</text><g class="message" data-entity-1="part7" data-entity-2="part7" id="msg16"><line style="stroke:#000000;stroke-width:1;" x1="1320.5947" x2="1362.5947" y1="1142.3872" y2="1142.3872"/><line style="stroke:#000000;stroke-width:1;" x1="1362.5947" x2="1362.5947" y1="1142.3872" y2="1155.3872"/><line style="stroke:#000000;stroke-width:1;" x1="1321.5947" x2="1362.5947" y1="1155.3872" y2="1155.3872"/><polygon fill="#000000" points="1331.5947,1151.3872,1321.5947,1155.3872,1331.5947,1159.3872,1327.5947,1155.3872" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="54.2026" x="1327.5947" y="1122.6836">Generate</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1381.7974" y="1122.6836"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="44.0781" x="1385.4092" y="1122.6836">random</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1429.4873" y="1122.6836"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="20.23" x="1433.0991" y="1122.6836">salt</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="18.7891" x="1361.561" y="1137.6323">(16</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1380.3501" y="1137.6323"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="35.4009" x="1383.9619" y="1137.6323">bytes)</text></g><g class="message" data-entity-1="part7" data-entity-2="part7" id="msg17"><line style="stroke:#000000;stroke-width:1;" x1="1320.5947" x2="1362.5947" y1="1199.2847" y2="1199.2847"/><line style="stroke:#000000;stroke-width:1;" x1="1362.5947" x2="1362.5947" y1="1199.2847" y2="1212.2847"/><line style="stroke:#000000;stroke-width:1;" x1="1321.5947" x2="1362.5947" y1="1212.2847" y2="1212.2847"/><polygon fill="#000000" points="1331.5947,1208.2847,1321.5947,1212.2847,1331.5947,1216.2847,1327.5947,1212.2847" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="30.3481" x="1327.5947" y="1179.5811">Hash</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1357.9429" y="1179.5811"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="55.6372" x="1361.5547" y="1179.5811">password</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1417.1919" y="1179.5811"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="23.1182" x="1420.8037" y="1179.5811">with</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="52.0381" x="1331.2002" y="1194.5298">Argon2id</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1383.2383" y="1194.5298"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="53.4663" x="1386.8501" y="1194.5298">algorithm</text></g><g class="message" data-entity-1="part7" data-entity-2="part4" id="msg18"><polygon fill="#000000" points="843.7612,1237.2334,833.7612,1241.2334,843.7612,1245.2334,839.7612,1241.2334" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="837.7612" x2="1314.5947" y1="1241.2334" y2="1241.2334"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="163.8774" x="992.2393" y="1236.4785">"base64(salt):base64(hash)"</text></g><g class="message" data-entity-1="part4" data-entity-2="part11" id="msg19"><polygon fill="#000000" points="2009.0195,1266.1821,2019.0195,1270.1821,2009.0195,1274.1821,2013.0195,1270.1821" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="832.7612" x2="2015.0195" y1="1270.1821" y2="1270.1821"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="192.1753" x="1330.8027" y="1265.4272">RegisterUserAsync(userAccount)</text></g><g class="message" data-entity-1="part11" data-entity-2="part13" id="msg20"><polygon fill="#000000" points="2282.9155,1295.1309,2292.9155,1299.1309,2282.9155,1303.1309,2286.9155,1299.1309" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="2031.0195" x2="2288.9155" y1="1299.1309" y2="1299.1309"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="40.4536" x="2094.3494" y="1294.376">BEGIN</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2134.803" y="1294.376"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="93.1709" x="2138.4148" y="1294.376">TRANSACTION</text></g><g class="message" data-entity-1="part11" data-entity-2="part13" id="msg21"><polygon fill="#000000" points="2282.9155,1398.8232,2292.9155,1402.8232,2282.9155,1406.8232,2286.9155,1402.8232" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="2031.0195" x2="2288.9155" y1="1402.8232" y2="1402.8232"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="47.6709" x="2070.1331" y="1323.3247">INSERT</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2117.804" y="1323.3247"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="31.0527" x="2121.4158" y="1323.3247">INTO</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2152.4685" y="1323.3247"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="99.7217" x="2156.0803" y="1323.3247">dbo.UserAccount</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="67.9072" x="2095.4285" y="1338.2734">(Username,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2163.3357" y="1338.2734"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="63.5591" x="2166.9475" y="1338.2734">FirstName,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="62.8608" x="2131.5371" y="1353.2222">LastName,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="71.5254" x="2106.9812" y="1368.1709">DateOfBirth,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2178.5066" y="1368.1709"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="36.8354" x="2182.1184" y="1368.1709">Email)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="53.4409" x="2136.2471" y="1383.1196">OUTPUT</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="156.7617" x="2084.5867" y="1398.0684">INSERTED.UserAccountID</text></g><g class="message" data-entity-1="part13" data-entity-2="part11" id="msg22"><polygon fill="#000000" points="2042.0195,1427.772,2032.0195,1431.772,2042.0195,1435.772,2038.0195,1431.772" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="2036.0195" x2="2293.9155" y1="1431.772" y2="1431.772"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="85.2617" x="2097.9517" y="1427.0171">UserAccountId</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2183.2134" y="1427.0171"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="41.1582" x="2186.8252" y="1427.0171">(GUID)</text></g><g class="message" data-entity-1="part11" data-entity-2="part13" id="msg23"><polygon fill="#000000" points="2282.9155,1471.6694,2292.9155,1475.6694,2282.9155,1479.6694,2286.9155,1475.6694" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="2031.0195" x2="2288.9155" y1="1475.6694" y2="1475.6694"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="47.6709" x="2063.9917" y="1455.9658">INSERT</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2111.6626" y="1455.9658"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="31.0527" x="2115.2744" y="1455.9658">INTO</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2146.3271" y="1455.9658"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="112.0044" x="2149.939" y="1455.9658">dbo.UserCredential</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="93.2026" x="2097.2217" y="1470.9146">(UserAccountId,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2190.4243" y="1470.9146"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="34.6772" x="2194.0361" y="1470.9146">Hash)</text></g><g class="message" data-entity-1="part11" data-entity-2="part13" id="msg24"><polygon fill="#000000" points="2287.9155,1500.6182,2297.9155,1504.6182,2287.9155,1508.6182,2291.9155,1504.6182" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="2031.0195" x2="2293.9155" y1="1504.6182" y2="1504.6182"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="52.7109" x="2090.7207" y="1499.8633">COMMIT</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2143.4316" y="1499.8633"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="93.1709" x="2147.0435" y="1499.8633">TRANSACTION</text></g><path d="M2036,1517.6182 L2036,1586.6182 L2307,1586.6182 L2307,1527.6182 L2297,1517.6182 L2036,1517.6182" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2297,1517.6182 L2297,1527.6182 L2307,1527.6182 L2297,1517.6182" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="212.748" x="2042" y="1534.812">All three statements run via Dapper's</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="250.7388" x="2042" y="1549.7607">ExecuteScalarAsync/ExecuteAsync against</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="208.8379" x="2042" y="1564.7095">a single DbTransaction, not a stored</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="239.1987" x="2042" y="1579.6582">procedure - no manual parameter binding</text><g class="message" data-entity-1="part11" data-entity-2="part13" id="msg25"><polygon fill="#000000" points="2282.9155,1669.1567,2292.9155,1673.1567,2282.9155,1677.1567,2286.9155,1673.1567" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="2031.0195" x2="2288.9155" y1="1673.1567" y2="1673.1567"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="50.5718" x="2090.3599" y="1608.6069">SELECT</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2140.9316" y="1608.6069"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="91.0317" x="2144.5435" y="1608.6069">UserAccountID,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="63.5781" x="2123.9548" y="1623.5557">Username,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2187.533" y="1623.5557"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="10.8354" x="2191.1448" y="1623.5557">...</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="38.27" x="2092.1658" y="1638.5044">FROM</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2130.4358" y="1638.5044"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="99.7217" x="2134.0476" y="1638.5044">dbo.UserAccount</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="48.3882" x="2087.6558" y="1653.4531">WHERE</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2136.0439" y="1653.4531"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="87.4199" x="2139.6558" y="1653.4531">UserAccountID</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2227.0757" y="1653.4531"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.5918" x="2230.6875" y="1653.4531">=</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="98.4585" x="2113.7383" y="1668.4019">@UserAccountId</text></g><path d="M2309,1686.1567 L2309,1725.1567 L2500,1725.1567 L2500,1696.1567 L2490,1686.1567 L2309,1686.1567" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2490,1686.1567 L2490,1696.1567 L2500,1696.1567 L2490,1686.1567" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="170.5488" x="2315" y="1703.3506">Round trip to load the row the</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="118.4854" x="2315" y="1718.2993">INSERT just created</text><g class="message" data-entity-1="part13" data-entity-2="part11" id="msg26"><polygon fill="#000000" points="2042.0195,1748.0029,2032.0195,1752.0029,2042.0195,1756.0029,2038.0195,1752.0029" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="2036.0195" x2="2298.9155" y1="1752.0029" y2="1752.0029"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.4199" x="2115.978" y="1747.248">UserAccount</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2190.3979" y="1747.248"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="20.9473" x="2194.0098" y="1747.248">row</text></g><g class="message" data-entity-1="part11" data-entity-2="part4" id="msg27"><polygon fill="#000000" points="843.7612,1776.9517,833.7612,1780.9517,843.7612,1784.9517,839.7612,1780.9517" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="837.7612" x2="2025.0195" y1="1780.9517" y2="1780.9517"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.4199" x="1374.8386" y="1776.1968">UserAccount</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1449.2585" y="1776.1968"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="31.0718" x="1452.8704" y="1776.1968">entity</text></g><g class="message" data-entity-1="part4" data-entity-2="part6" id="msg28"><polygon fill="#000000" points="1160.5605,1805.9004,1170.5605,1809.9004,1160.5605,1813.9004,1164.5605,1809.9004" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="832.7612" x2="1166.5605" y1="1809.9004" y2="1809.9004"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="166.1816" x="919.5701" y="1805.1455">GenerateAccessToken(user)</text></g><g class="message" data-entity-1="part6" data-entity-2="part8" id="msg29"><polygon fill="#000000" points="1491.5527,1849.7979,1501.5527,1853.7979,1491.5527,1857.7979,1495.5527,1853.7979" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1182.5605" x2="1497.5527" y1="1853.7979" y2="1853.7979"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="117.7744" x="1251.6536" y="1834.0942">GenerateJwt(userId,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1369.428" y="1834.0942"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="61.4199" x="1373.0398" y="1834.0942">username,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="39.0063" x="1323.5535" y="1849.043">expiry)</text></g><path d="M1518,1866.7979 L1518,1980.7979 L1698,1980.7979 L1698,1876.7979 L1688,1866.7979 L1518,1866.7979" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1688,1866.7979 L1688,1876.7979 L1698,1876.7979 L1688,1866.7979" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="111.2617" x="1524" y="1883.9917">JWT Configuration:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="109.8208" x="1524" y="1898.9404">- Algorithm: HS256</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="95.3735" x="1524" y="1913.8892">- Expires: 1 hour</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="51.2764" x="1524" y="1928.8379">- Claims:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="72.9854" x="1531.2236" y="1943.7866">* sub: userId</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="152.4897" x="1531.2236" y="1958.7354">* unique_name: username</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="42.6245" x="1531.2236" y="1973.6841">* iat / jti</text><g class="message" data-entity-1="part8" data-entity-2="part8" id="msg30"><line style="stroke:#000000;stroke-width:1;" x1="1513.5527" x2="1555.5527" y1="2007.3877" y2="2007.3877"/><line style="stroke:#000000;stroke-width:1;" x1="1555.5527" x2="1555.5527" y1="2007.3877" y2="2020.3877"/><line style="stroke:#000000;stroke-width:1;" x1="1514.5527" x2="1555.5527" y1="2020.3877" y2="2020.3877"/><polygon fill="#000000" points="1524.5527,2016.3877,1514.5527,2020.3877,1524.5527,2024.3877,1520.5527,2020.3877" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="39.019" x="1520.5527" y="2002.6328">Create</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1559.5718" y="2002.6328"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="26.7109" x="1563.1836" y="2002.6328">JWT</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1589.8945" y="2002.6328"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="23.1182" x="1593.5063" y="2002.6328">with</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1616.6245" y="2002.6328"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="36.8354" x="1620.2363" y="2002.6328">claims</text></g><g class="message" data-entity-1="part8" data-entity-2="part8" id="msg31"><line style="stroke:#000000;stroke-width:1;" x1="1513.5527" x2="1555.5527" y1="2049.3364" y2="2049.3364"/><line style="stroke:#000000;stroke-width:1;" x1="1555.5527" x2="1555.5527" y1="2049.3364" y2="2062.3364"/><line style="stroke:#000000;stroke-width:1;" x1="1514.5527" x2="1555.5527" y1="2062.3364" y2="2062.3364"/><polygon fill="#000000" points="1524.5527,2058.3364,1514.5527,2062.3364,1524.5527,2066.3364,1520.5527,2062.3364" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="26.019" x="1520.5527" y="2044.5815">Sign</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1546.5718" y="2044.5815"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="23.1182" x="1550.1836" y="2044.5815">with</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1573.3018" y="2044.5815"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="35.4009" x="1576.9136" y="2044.5815">secret</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1612.3145" y="2044.5815"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="20.23" x="1615.9263" y="2044.5815">key</text></g><g class="message" data-entity-1="part8" data-entity-2="part6" id="msg32"><polygon fill="#000000" points="1193.5605,2087.2852,1183.5605,2091.2852,1193.5605,2095.2852,1189.5605,2091.2852" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="1187.5605" x2="1507.5527" y1="2091.2852" y2="2091.2852"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="41.9009" x="1304.7349" y="2086.5303">Access</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1346.6357" y="2086.5303"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="36.1309" x="1350.2476" y="2086.5303">Token</text></g><g class="message" data-entity-1="part6" data-entity-2="part4" id="msg33"><polygon fill="#000000" points="843.7612,2116.2339,833.7612,2120.2339,843.7612,2124.2339,839.7612,2120.2339" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="837.7612" x2="1176.5605" y1="2120.2339" y2="2120.2339"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="41.9009" x="964.3391" y="2115.479">Access</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1006.24" y="2115.479"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="36.1309" x="1009.8518" y="2115.479">Token</text></g><g class="message" data-entity-1="part4" data-entity-2="part6" id="msg34"><polygon fill="#000000" points="1160.5605,2145.1826,1170.5605,2149.1826,1160.5605,2153.1826,1164.5605,2149.1826" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="832.7612" x2="1166.5605" y1="2149.1826" y2="2149.1826"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="169.7998" x="917.761" y="2144.4277">GenerateRefreshToken(user)</text></g><g class="message" data-entity-1="part6" data-entity-2="part8" id="msg35"><polygon fill="#000000" points="1491.5527,2189.0801,1501.5527,2193.0801,1491.5527,2197.0801,1495.5527,2193.0801" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1182.5605" x2="1497.5527" y1="2193.0801" y2="2193.0801"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="117.7744" x="1251.6536" y="2173.3765">GenerateJwt(userId,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1369.428" y="2173.3765"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="61.4199" x="1373.0398" y="2173.3765">username,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="39.0063" x="1323.5535" y="2188.3252">expiry)</text></g><path d="M1518,2206.0801 L1518,2260.0801 L1929,2260.0801 L1929,2216.0801 L1919,2206.0801 L1518,2206.0801" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1919,2206.0801 L1919,2216.0801 L1929,2216.0801 L1919,2206.0801" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="88.8735" x="1524" y="2223.2739">Refresh Token:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="174.1353" x="1524" y="2238.2227">- Expires: 21 days (504 hours)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="390.9077" x="1524" y="2253.1714">- Same structure as access token,\n signed with a separate secret</text><g class="message" data-entity-1="part8" data-entity-2="part6" id="msg36"><polygon fill="#000000" points="1193.5605,2282.875,1183.5605,2286.875,1193.5605,2290.875,1189.5605,2286.875" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="1187.5605" x2="1507.5527" y1="2286.875" y2="2286.875"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="45.519" x="1302.9258" y="2282.1201">Refresh</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1348.4448" y="2282.1201"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="36.1309" x="1352.0566" y="2282.1201">Token</text></g><g class="message" data-entity-1="part6" data-entity-2="part4" id="msg37"><polygon fill="#000000" points="843.7612,2311.8237,833.7612,2315.8237,843.7612,2319.8237,839.7612,2315.8237" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="837.7612" x2="1176.5605" y1="2315.8237" y2="2315.8237"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="45.519" x="962.53" y="2311.0688">Refresh</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1008.0491" y="2311.0688"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="36.1309" x="1011.6609" y="2311.0688">Token</text></g><g class="message" data-entity-1="part4" data-entity-2="part6" id="msg38"><polygon fill="#000000" points="1160.5605,2340.7725,1170.5605,2344.7725,1160.5605,2348.7725,1164.5605,2344.7725" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="832.7612" x2="1166.5605" y1="2344.7725" y2="2344.7725"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="197.9771" x="903.6724" y="2340.0176">GenerateConfirmationToken(user)</text></g><g class="message" data-entity-1="part6" data-entity-2="part8" id="msg39"><polygon fill="#000000" points="1491.5527,2384.6699,1501.5527,2388.6699,1491.5527,2392.6699,1495.5527,2388.6699" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1182.5605" x2="1497.5527" y1="2388.6699" y2="2388.6699"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="117.7744" x="1251.6536" y="2368.9663">GenerateJwt(userId,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1369.428" y="2368.9663"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="61.4199" x="1373.0398" y="2368.9663">username,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="39.0063" x="1323.5535" y="2383.915">expiry)</text></g><path d="M1518,2401.6699 L1518,2455.6699 L1750,2455.6699 L1750,2411.6699 L1740,2401.6699 L1518,2401.6699" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1740,2401.6699 L1740,2411.6699 L1750,2411.6699 L1740,2401.6699" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="117.0508" x="1524" y="2418.8638">Confirmation Token:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="188.5762" x="1524" y="2433.8125">- Expires: 30 minutes (0.5 hours)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="211.7197" x="1524" y="2448.7612">- Signed with a third, separate secret</text><g class="message" data-entity-1="part8" data-entity-2="part6" id="msg40"><polygon fill="#000000" points="1193.5605,2478.4648,1183.5605,2482.4648,1193.5605,2486.4648,1189.5605,2482.4648" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="1187.5605" x2="1507.5527" y1="2482.4648" y2="2482.4648"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="73.6963" x="1288.8372" y="2477.71">Confirmation</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1362.5334" y="2477.71"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="36.1309" x="1366.1453" y="2477.71">Token</text></g><g class="message" data-entity-1="part6" data-entity-2="part4" id="msg41"><polygon fill="#000000" points="843.7612,2507.4136,833.7612,2511.4136,843.7612,2515.4136,839.7612,2511.4136" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="837.7612" x2="1176.5605" y1="2511.4136" y2="2511.4136"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="73.6963" x="948.4414" y="2506.6587">Confirmation</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1022.1377" y="2506.6587"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="36.1309" x="1025.7495" y="2506.6587">Token</text></g><g class="message" data-entity-1="part4" data-entity-2="part3" id="msg42"><polygon fill="#000000" points="583.5415,2566.2598,573.5415,2570.2598,583.5415,2574.2598,579.5415,2570.2598" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="577.5415" x2="821.7612" y1="2570.2598" y2="2570.2598"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="231.2197" x="582.0415" y="2535.6074">Send(SendRegistrationEmailCommand)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="113.458" x="608.4192" y="2550.5562">(Shared.Application</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="721.8772" y="2550.5562"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="61.3945" x="725.489" y="2550.5562">cross-slice</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="50.5718" x="672.3655" y="2565.5049">contract)</text></g><g class="message" data-entity-1="part3" data-entity-2="part12" id="msg43"><polygon fill="#000000" points="2156.1123,2625.106,2166.1123,2629.106,2156.1123,2633.106,2160.1123,2629.106" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="572.5415" x2="2162.1123" y1="2629.106" y2="2629.106"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="171.9644" x="1284.3447" y="2594.4536">SendRegistrationEmailAsync(</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.2236" x="1317.9556" y="2609.4023">  </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="59.23" x="1325.1792" y="2609.4023">firstName,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1384.4092" y="2609.4023"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="34.6772" x="1388.021" y="2609.4023">email,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="111.2681" x="1314.6929" y="2624.3511">confirmationToken)</text></g><path d="M577,2642.106 L577,2711.106 L779,2711.106 L779,2652.106 L769,2642.106 L577,2642.106" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M769,2642.106 L769,2652.106 L779,2652.106 L769,2642.106" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="156.3872" x="583" y="2659.2998">Routed to Features.Emails'</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="181.3716" x="583" y="2674.2485">SendRegistrationEmailHandler,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="147.3862" x="583" y="2689.1973">the only cross-slice call in</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="70.8335" x="583" y="2704.146">the backend</text><g class="message" data-entity-1="part12" data-entity-2="part10" id="msg44"><polygon fill="#000000" points="1859.1606,2748.7983,1849.1606,2752.7983,1859.1606,2756.7983,1855.1606,2752.7983" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1853.1606" x2="2167.1123" y1="2752.7983" y2="2752.7983"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="205.188" x="1905.5425" y="2733.0947">RenderUserRegisteredEmailAsync(</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.2236" x="1923.6111" y="2748.0435">  </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="59.23" x="1930.8347" y="2748.0435">firstName,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1990.0647" y="2748.0435"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="98.9854" x="1993.6765" y="2748.0435">confirmationLink)</text></g><path d="M1853,2765.7983 L1853,2849.7983 L2005,2849.7983 L2005,2775.7983 L1995,2765.7983 L1853,2765.7983" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1995,2765.7983 L1995,2775.7983 L2005,2775.7983 L1995,2765.7983" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="109.1099" x="1859" y="2782.9922">Razor Component:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="131.5171" x="1859" y="2797.9409">- Header with branding</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="118.479" x="1859" y="2812.8896">- Welcome message</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="121.3926" x="1859" y="2827.8384">- Confirmation button</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="45.5127" x="1859" y="2842.7871">- Footer</text><g class="message" data-entity-1="part10" data-entity-2="part10" id="msg45"><line style="stroke:#000000;stroke-width:1;" x1="1848.1606" x2="1890.1606" y1="2891.4395" y2="2891.4395"/><line style="stroke:#000000;stroke-width:1;" x1="1890.1606" x2="1890.1606" y1="2891.4395" y2="2904.4395"/><line style="stroke:#000000;stroke-width:1;" x1="1849.1606" x2="1890.1606" y1="2904.4395" y2="2904.4395"/><polygon fill="#000000" points="1859.1606,2900.4395,1849.1606,2904.4395,1859.1606,2908.4395,1855.1606,2904.4395" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="42.6372" x="1855.1606" y="2871.7358">Render</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1897.7979" y="2871.7358"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="34.6772" x="1901.4097" y="2871.7358">Razor</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1936.0869" y="2871.7358"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="64.3208" x="1939.6987" y="2871.7358">component</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="10.8418" x="1904.6692" y="2886.6846">to</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1915.511" y="2886.6846"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="35.3882" x="1919.1228" y="2886.6846">HTML</text></g><g class="message" data-entity-1="part10" data-entity-2="part12" id="msg46"><polygon fill="#000000" points="2156.1123,2929.3882,2166.1123,2933.3882,2156.1123,2937.3882,2160.1123,2933.3882" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="1843.1606" x2="2162.1123" y1="2933.3882" y2="2933.3882"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="35.3882" x="1947.4761" y="2928.6333">HTML</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1982.8643" y="2928.6333"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="31.0654" x="1986.4761" y="2928.6333">email</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2017.5415" y="2928.6333"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="42.6436" x="2021.1533" y="2928.6333">content</text></g><g class="message" data-entity-1="part12" data-entity-2="part9" id="msg47"><polygon fill="#000000" points="1695.0718,2958.3369,1685.0718,2962.3369,1695.0718,2966.3369,1691.0718,2962.3369" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1689.0718" x2="2167.1123" y1="2962.3369" y2="2962.3369"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="104.7681" x="1831.4358" y="2957.582">SendAsync(email,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1936.2039" y="2957.582"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="44.8018" x="1939.8157" y="2957.582">subject,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1984.6174" y="2957.582"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="32.519" x="1988.2292" y="2957.582">body)</text></g><path d="M1689,2975.3369 L1689,3044.3369 L2003,3044.3369 L2003,2985.3369 L1993,2975.3369 L1689,2975.3369" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1993,2975.3369 L1993,2985.3369 L2003,2985.3369 L1993,2975.3369" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="171.939" x="1695" y="2992.5308">SMTP Configuration (MailKit):</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="293.2681" x="1695" y="3007.4795">- Host/port: from env (SMTP_HOST/SMTP_PORT)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="260.4697" x="1695" y="3022.4282">- TLS: StartTLS when SMTP_USE_SSL=true</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="237.0088" x="1695" y="3037.377">- Auth: username/password, if configured</text><g class="message" data-entity-1="part9" data-entity-2="part9" id="msg48"><line style="stroke:#000000;stroke-width:1;" x1="1684.0718" x2="1726.0718" y1="3071.0806" y2="3071.0806"/><line style="stroke:#000000;stroke-width:1;" x1="1726.0718" x2="1726.0718" y1="3071.0806" y2="3084.0806"/><line style="stroke:#000000;stroke-width:1;" x1="1685.0718" x2="1726.0718" y1="3084.0806" y2="3084.0806"/><polygon fill="#000000" points="1695.0718,3080.0806,1685.0718,3084.0806,1695.0718,3088.0806,1691.0718,3084.0806" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="28.9072" x="1691.0718" y="3066.3257">Build</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1719.979" y="3066.3257"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="33.9409" x="1723.5908" y="3066.3257">MIME</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1757.5317" y="3066.3257"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="52.749" x="1761.1436" y="3066.3257">message</text></g><g class="message" data-entity-1="part9" data-entity-2="part9" id="msg49"><line style="stroke:#000000;stroke-width:1;" x1="1684.0718" x2="1726.0718" y1="3127.978" y2="3127.978"/><line style="stroke:#000000;stroke-width:1;" x1="1726.0718" x2="1726.0718" y1="3127.978" y2="3140.978"/><line style="stroke:#000000;stroke-width:1;" x1="1685.0718" x2="1726.0718" y1="3140.978" y2="3140.978"/><polygon fill="#000000" points="1695.0718,3136.978,1685.0718,3140.978,1695.0718,3144.978,1691.0718,3140.978" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="52.0317" x="1691.0718" y="3108.2744">Connect,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1743.1035" y="3108.2744"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.4453" x="1746.7153" y="3108.2744">authenticate,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="31.8018" x="1707.3345" y="3123.2231">send,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1739.1362" y="3123.2231"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="62.1499" x="1742.748" y="3123.2231">disconnect</text></g><g class="message" data-entity-1="part9" data-entity-2="part12" id="msg50"><polygon fill="#000000" points="2161.1123,3165.9268,2171.1123,3169.9268,2161.1123,3173.9268,2165.1123,3169.9268" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="1679.0718" x2="2167.1123" y1="3169.9268" y2="3169.9268"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="49.1309" x="1876.9644" y="3165.1719">Success</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1926.0952" y="3165.1719"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1929.707" y="3165.1719">/</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1933.3188" y="3165.1719"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="38.2891" x="1936.9307" y="3165.1719">throws</text></g><path d="M735.4028,3184.9268 L795.5737,3184.9268 L795.5737,3191.8755 L785.5737,3201.8755 L735.4028,3201.8755 L735.4028,3184.9268" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><rect fill="none" height="145.3926" style="stroke:#000000;stroke-width:1;" width="226.791" x="735.4028" y="3184.9268"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="15.1709" x="750.4028" y="3198.1206">alt</text><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="131.4414" x="810.5737" y="3197.2446">[Email sent successfully]</text><g class="message" data-entity-1="part4" data-entity-2="part4" id="msg51"><line style="stroke:#000000;stroke-width:1;" x1="832.7612" x2="874.7612" y1="3222.8242" y2="3222.8242"/><line style="stroke:#000000;stroke-width:1;" x1="874.7612" x2="874.7612" y1="3222.8242" y2="3235.8242"/><line style="stroke:#000000;stroke-width:1;" x1="833.7612" x2="874.7612" y1="3235.8242" y2="3235.8242"/><polygon fill="#000000" points="843.7612,3231.8242,833.7612,3235.8242,843.7612,3239.8242,839.7612,3235.8242" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="57.8081" x="839.7612" y="3218.0693">emailSent</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="897.5693" y="3218.0693"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.5918" x="901.1812" y="3218.0693">=</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="908.7729" y="3218.0693"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="22.4009" x="912.3848" y="3218.0693">true</text></g><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="735.4028" x2="962.1938" y1="3244.8242" y2="3244.8242"/><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="122.8423" x="740.4028" y="3255.1421">[mediator.Send throws]</text><g class="message" data-entity-1="part4" data-entity-2="part4" id="msg52"><line style="stroke:#000000;stroke-width:1;" x1="832.7612" x2="874.7612" y1="3309.3193" y2="3309.3193"/><line style="stroke:#000000;stroke-width:1;" x1="874.7612" x2="874.7612" y1="3309.3193" y2="3322.3193"/><line style="stroke:#000000;stroke-width:1;" x1="833.7612" x2="874.7612" y1="3322.3193" y2="3322.3193"/><polygon fill="#000000" points="843.7612,3318.3193,833.7612,3322.3193,843.7612,3326.3193,839.7612,3322.3193" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="100.4326" x="839.7612" y="3274.667">catch(Exception),</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="17.3481" x="853.8499" y="3289.6157">log</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="871.198" y="3289.6157"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="10.8418" x="874.8098" y="3289.6157">to</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="885.6516" y="3289.6157"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="36.8418" x="889.2634" y="3289.6157">stderr,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="57.8081" x="839.9358" y="3304.5645">emailSent</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="897.7439" y="3304.5645"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.5918" x="901.3557" y="3304.5645">=</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="908.9475" y="3304.5645"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="27.46" x="912.5593" y="3304.5645">false</text></g><g class="message" data-entity-1="part4" data-entity-2="part3" id="msg53"><polygon fill="#000000" points="578.5415,3399.1143,568.5415,3403.1143,578.5415,3407.1143,574.5415,3403.1143" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="572.5415" x2="826.7612" y1="3403.1143" y2="3403.1143"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="120.6753" x="637.3137" y="3353.5132">RegistrationPayload(</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.2236" x="618.166" y="3368.4619">  </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="86.7153" x="625.3896" y="3368.4619">userAccountId,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="712.105" y="3368.4619"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="61.4199" x="715.7168" y="3368.4619">username,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.2236" x="612.031" y="3383.4106">  </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="80.2026" x="619.2546" y="3383.4106">refreshToken,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="699.4573" y="3383.4106"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="80.2026" x="703.0691" y="3383.4106">accessToken,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.2236" x="626.8464" y="3398.3594">  </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="134.3862" x="634.0701" y="3398.3594">confirmationEmailSent)</text></g><g class="message" data-entity-1="part3" data-entity-2="part2" id="msg54"><polygon fill="#000000" points="333.5137,3428.063,323.5137,3432.063,333.5137,3436.063,329.5137,3432.063" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="327.5137" x2="561.5415" y1="3432.063" y2="3432.063"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="116.3462" x="384.3545" y="3427.3081">RegistrationPayload</text></g><g class="message" data-entity-1="part2" data-entity-2="part1" id="msg55"><polygon fill="#000000" points="113.7793,3591.5503,103.7793,3595.5503,113.7793,3599.5503,109.7793,3595.5503" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="107.7793" x2="311.5137" y1="3595.5503" y2="3595.5503"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="21.6899" x="171.8711" y="3456.2568">201</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="193.561" y="3456.2568"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="46.249" x="197.1729" y="3456.2568">Created</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="4.3418" x="205.4756" y="3471.2056">{</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.2236" x="127.3074" y="3486.1543">  </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="56.3608" x="134.531" y="3486.1543">message:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="190.8918" y="3486.1543"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="32.062" x="194.5037" y="3486.1543">"User</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="226.5657" y="3486.1543"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="57.8081" x="230.1775" y="3486.1543">registered</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="81.9165" x="166.6882" y="3501.103">successfully.",</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.2236" x="175.4829" y="3516.0518">  </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="49.1499" x="182.7065" y="3516.0518">payload:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="231.8564" y="3516.0518"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="4.3418" x="235.4683" y="3516.0518">{</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="14.4473" x="124.5493" y="3531.0005">    </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="86.7153" x="138.9966" y="3531.0005">userAccountId,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="225.7119" y="3531.0005"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="61.4199" x="229.3237" y="3531.0005">username,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="14.4473" x="118.4143" y="3545.9492">    </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="80.2026" x="132.8616" y="3545.9492">refreshToken,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="213.0642" y="3545.9492"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="80.2026" x="216.676" y="3545.9492">accessToken,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="14.4473" x="135.3943" y="3560.8979">    </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="130.0571" x="149.8416" y="3560.8979">confirmationEmailSent</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.2236" x="201.8638" y="3575.8467">  </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="4.3418" x="209.0874" y="3575.8467">}</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="4.3418" x="205.4756" y="3590.7954">}</text></g><rect fill="#FFFFFF" height="3" style="stroke:#FFFFFF;stroke-width:1;" width="2525.5488" x="5" y="3638.0247"/><line style="stroke:#000000;stroke-width:0.5;" x1="5" x2="2530.5488" y1="3638.0247" y2="3638.0247"/><line style="stroke:#000000;stroke-width:0.5;" x1="5" x2="2530.5488" y1="3641.0247" y2="3641.0247"/><rect fill="#FFFFFF" height="22.9487" style="stroke:#000000;stroke-width:1;" width="86.2046" x="1224.6721" y="3627.5503"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="68.5928" x="1230.6721" y="3643.7441">Login Flow</text><g class="message" data-entity-1="part1" data-entity-2="part2" id="msg56"><polygon fill="#000000" points="300.5137,3692.3965,310.5137,3696.3965,300.5137,3700.3965,304.5137,3696.3965" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="102.7793" x2="306.5137" y1="3696.3965" y2="3696.3965"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="35.3945" x="147.6675" y="3676.6929">POST</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="183.062" y="3676.6929"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="80.9517" x="186.6738" y="3676.6929">/api/auth/login</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="65.7617" x="142.9702" y="3691.6416">{username,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="208.7319" y="3691.6416"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="59.979" x="212.3438" y="3691.6416">password}</text></g><g class="message" data-entity-1="part2" data-entity-2="part3" id="msg57"><polygon fill="#000000" points="545.5415,3721.3452,555.5415,3725.3452,545.5415,3729.3452,549.5415,3725.3452" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="322.5137" x2="551.5415" y1="3725.3452" y2="3725.3452"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="130.7935" x="374.6309" y="3720.5903">Send(LoginCommand)</text></g><path d="M572,3738.3452 L572,3777.3452 L879,3777.3452 L879,3748.3452 L869,3738.3452 L572,3738.3452" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M869,3738.3452 L869,3748.3452 L879,3748.3452 L869,3738.3452" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="227.646" x="578" y="3755.5391">ValidationBehavior runs LoginValidator:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="286.1587" x="578" y="3770.4878">username and password must both be non-empty</text><path d="M45,3790.2427 L105.1709,3790.2427 L105.1709,3797.1914 L95.1709,3807.1914 L45,3807.1914 L45,3790.2427" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><rect fill="none" height="1645.1606" style="stroke:#000000;stroke-width:1;" width="2314.4844" x="45" y="3790.2427"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="15.1709" x="60" y="3803.4365">alt</text><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="84.9546" x="120.1709" y="3802.5605">[Validation fails]</text><g class="message" data-entity-1="part3" data-entity-2="part2" id="msg58"><polygon fill="#000000" points="333.5137,3839.0889,323.5137,3843.0889,333.5137,3847.0889,329.5137,3843.0889" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="327.5137" x2="556.5415" y1="3843.0889" y2="3843.0889"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="38.2891" x="420.8831" y="3823.3853">throws</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="211.0278" x="334.5137" y="3838.334">FluentValidation.ValidationException</text></g><g class="message" data-entity-1="part2" data-entity-2="part1" id="msg59"><polygon fill="#000000" points="113.7793,3897.9351,103.7793,3901.9351,113.7793,3905.9351,109.7793,3901.9351" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="107.7793" x2="311.5137" y1="3901.9351" y2="3901.9351"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="21.6899" x="157.4143" y="3867.2827">400</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="179.1042" y="3867.2827"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="23.1309" x="182.7161" y="3867.2827">Bad</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="205.8469" y="3867.2827"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="48.4199" x="209.4587" y="3867.2827">Request</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="60.7026" x="123.175" y="3882.2314">{message:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="183.8777" y="3882.2314"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="61.7119" x="187.4895" y="3882.2314">"Validation</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="249.2014" y="3882.2314"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="39.3047" x="252.8132" y="3882.2314">failed",</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="37.5591" x="175.1306" y="3897.1802">errors:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="212.6897" y="3897.1802"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="23.8608" x="216.3015" y="3897.1802">{...}}</text></g><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="45" x2="2359.4844" y1="3910.9351" y2="3910.9351"/><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="113.0884" x="50" y="3921.2529">[Validation succeeds]</text><g class="message" data-entity-1="part3" data-entity-2="part5" id="msg60"><polygon fill="#000000" points="961.7607,3941.5327,971.7607,3945.5327,961.7607,3949.5327,965.7607,3945.5327" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="567.5415" x2="967.7607" y1="3945.5327" y2="3945.5327"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="106.9326" x="717.1848" y="3940.7778">Handle(command)</text></g><g class="message" data-entity-1="part5" data-entity-2="part11" id="msg61"><polygon fill="#000000" points="2009.0195,3970.4814,2019.0195,3974.4814,2009.0195,3978.4814,2013.0195,3974.4814" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="983.7607" x2="2015.0195" y1="3974.4814" y2="3974.4814"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="225.4053" x="1389.6875" y="3969.7266">GetUserByUsernameAsync(username)</text></g><g class="message" data-entity-1="part11" data-entity-2="part13" id="msg62"><polygon fill="#000000" points="2282.9155,4044.2764,2292.9155,4048.2764,2282.9155,4052.2764,2286.9155,4048.2764" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="2031.0195" x2="2288.9155" y1="4048.2764" y2="4048.2764"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="50.5718" x="2090.3599" y="3998.6753">SELECT</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2140.9316" y="3998.6753"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="91.0317" x="2144.5435" y="3998.6753">UserAccountID,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="63.5781" x="2123.9548" y="4013.624">Username,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2187.533" y="4013.624"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="10.8354" x="2191.1448" y="4013.624">...</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="38.27" x="2092.1658" y="4028.5728">FROM</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2130.4358" y="4028.5728"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="99.7217" x="2134.0476" y="4028.5728">dbo.UserAccount</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="48.3882" x="2062.9951" y="4043.5215">WHERE</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2111.3833" y="4043.5215"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="59.9663" x="2114.9951" y="4043.5215">Username</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2174.9614" y="4043.5215"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.5918" x="2178.5732" y="4043.5215">=</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2186.165" y="4043.5215"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="73.1631" x="2189.7769" y="4043.5215">@Username</text></g><g class="message" data-entity-1="part13" data-entity-2="part11" id="msg63"><polygon fill="#000000" points="2037.0195,4073.2251,2027.0195,4077.2251,2037.0195,4081.2251,2033.0195,4077.2251" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="2031.0195" x2="2298.9155" y1="4077.2251" y2="4077.2251"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="74.4199" x="2093.9685" y="4072.4702">UserAccount</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2168.3884" y="4072.4702"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="20.9473" x="2172.0002" y="4072.4702">row</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2192.9475" y="4072.4702"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="11.5591" x="2196.5593" y="4072.4702">or</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2208.1184" y="4072.4702"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="20.2363" x="2211.7302" y="4072.4702">null</text></g><path d="M55,4092.2251 L115.1709,4092.2251 L115.1709,4099.1738 L105.1709,4109.1738 L55,4109.1738 L55,4092.2251" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><rect fill="none" height="1336.1782" style="stroke:#000000;stroke-width:1;" width="2294.4844" x="55" y="4092.2251"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="15.1709" x="70" y="4105.4189">alt</text><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="85.54" x="130.1709" y="4104.543">[User not found]</text><g class="message" data-entity-1="part5" data-entity-2="part3" id="msg64"><polygon fill="#000000" points="578.5415,4141.0713,568.5415,4145.0713,578.5415,4149.0713,574.5415,4145.0713" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="572.5415" x2="972.7607" y1="4145.0713" y2="4145.0713"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="31.7891" x="685.7417" y="4125.3677">throw</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="717.5308" y="4125.3677"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="134.418" x="721.1426" y="4125.3677">UnauthorizedException</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="42.1929" x="677.5215" y="4140.3164">"Invalid</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="719.7144" y="4140.3164"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="57.8081" x="723.3262" y="4140.3164">username</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="781.1343" y="4140.3164"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="11.5591" x="784.7461" y="4140.3164">or</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="796.3052" y="4140.3164"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="63.8638" x="799.917" y="4140.3164">password."</text></g><g class="message" data-entity-1="part3" data-entity-2="part2" id="msg65"><polygon fill="#000000" points="333.5137,4170.02,323.5137,4174.02,333.5137,4178.02,329.5137,4174.02" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="327.5137" x2="556.5415" y1="4174.02" y2="4174.02"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="58.5508" x="410.7522" y="4169.2651">propagate</text></g><g class="message" data-entity-1="part2" data-entity-2="part1" id="msg66"><polygon fill="#000000" points="113.7793,4198.9688,103.7793,4202.9688,113.7793,4206.9688,109.7793,4202.9688" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="107.7793" x2="311.5137" y1="4202.9688" y2="4202.9688"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="21.6899" x="156.332" y="4198.2139">401</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="178.022" y="4198.2139"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="77.3271" x="181.6338" y="4198.2139">Unauthorized</text></g><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="55" x2="2349.4844" y1="4211.9688" y2="4211.9688"/><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="65.3823" x="60" y="4222.2866">[User found]</text><g class="message" data-entity-1="part5" data-entity-2="part11" id="msg67"><polygon fill="#000000" points="2009.0195,4242.5664,2019.0195,4246.5664,2009.0195,4250.5664,2013.0195,4246.5664" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="983.7607" x2="2015.0195" y1="4246.5664" y2="4246.5664"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="296.2324" x="1354.2739" y="4241.8115">GetActiveCredentialByUserAccountIdAsync(userId)</text></g><g class="message" data-entity-1="part11" data-entity-2="part13" id="msg68"><polygon fill="#000000" points="2282.9155,4361.2075,2292.9155,4365.2075,2282.9155,4369.2075,2286.9155,4365.2075" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="2031.0195" x2="2288.9155" y1="4365.2075" y2="4365.2075"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="50.5718" x="2085.2976" y="4270.7603">SELECT</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2135.8694" y="4270.7603"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="101.1563" x="2139.4812" y="4270.7603">UserCredentialId,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="88.8735" x="2118.5308" y="4285.709">UserAccountId,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="33.96" x="2076.2617" y="4300.6577">Hash,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2110.2217" y="4300.6577"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="62.1436" x="2113.8335" y="4300.6577">CreatedAt,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2175.9771" y="4300.6577"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="70.0845" x="2179.5889" y="4300.6577">RowVersion</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="38.27" x="2086.0244" y="4315.6064">FROM</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2124.2944" y="4315.6064"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="112.0044" x="2127.9063" y="4315.6064">dbo.UserCredential</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="48.3882" x="2088.7349" y="4330.5552">WHERE</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2137.123" y="4330.5552"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="85.2617" x="2140.7349" y="4330.5552">UserAccountId</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2225.9966" y="4330.5552"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.5918" x="2229.6084" y="4330.5552">=</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="98.4585" x="2113.7383" y="4345.5039">@UserAccountId</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.2236" x="2102.0935" y="4360.4526">  </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="27.4473" x="2109.3171" y="4360.4526">AND</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2136.7644" y="4360.4526"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="61.4199" x="2140.3762" y="4360.4526">IsRevoked</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2201.7961" y="4360.4526"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.5918" x="2205.408" y="4360.4526">=</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2212.9998" y="4360.4526"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.23" x="2216.6116" y="4360.4526">0</text></g><g class="message" data-entity-1="part13" data-entity-2="part11" id="msg69"><polygon fill="#000000" points="2037.0195,4390.1563,2027.0195,4394.1563,2037.0195,4398.1563,2033.0195,4394.1563" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="2031.0195" x2="2298.9155" y1="4394.1563" y2="4394.1563"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="86.7026" x="2087.8271" y="4389.4014">UserCredential</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2174.5298" y="4389.4014"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="20.9473" x="2178.1416" y="4389.4014">row</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2199.0889" y="4389.4014"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="11.5591" x="2202.7007" y="4389.4014">or</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="2214.2598" y="4389.4014"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="20.2363" x="2217.8716" y="4389.4014">null</text></g><path d="M65,4409.1563 L125.1709,4409.1563 L125.1709,4416.105 L115.1709,4426.105 L65,4426.105 L65,4409.1563" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><rect fill="none" height="1012.2471" style="stroke:#000000;stroke-width:1;" width="1736.0723" x="65" y="4409.1563"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="15.1709" x="80" y="4422.3501">alt</text><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="111.2568" x="140.1709" y="4421.4741">[No active credential]</text><g class="message" data-entity-1="part5" data-entity-2="part3" id="msg70"><polygon fill="#000000" points="578.5415,4443.0537,568.5415,4447.0537,578.5415,4451.0537,574.5415,4447.0537" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="572.5415" x2="972.7607" y1="4447.0537" y2="4447.0537"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="31.7891" x="685.7417" y="4442.2988">throw</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="717.5308" y="4442.2988"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="134.418" x="721.1426" y="4442.2988">UnauthorizedException</text></g><g class="message" data-entity-1="part3" data-entity-2="part2" id="msg71"><polygon fill="#000000" points="333.5137,4472.0024,323.5137,4476.0024,333.5137,4480.0024,329.5137,4476.0024" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="327.5137" x2="556.5415" y1="4476.0024" y2="4476.0024"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="58.5508" x="410.7522" y="4471.2476">propagate</text></g><g class="message" data-entity-1="part2" data-entity-2="part1" id="msg72"><polygon fill="#000000" points="113.7793,4500.9512,103.7793,4504.9512,113.7793,4508.9512,109.7793,4504.9512" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="107.7793" x2="311.5137" y1="4504.9512" y2="4504.9512"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="21.6899" x="156.332" y="4500.1963">401</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="178.022" y="4500.1963"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="77.3271" x="181.6338" y="4500.1963">Unauthorized</text></g><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="65" x2="1801.0723" y1="4513.9512" y2="4513.9512"/><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="128.96" x="70" y="4524.269">[Active credential found]</text><g class="message" data-entity-1="part5" data-entity-2="part7" id="msg73"><polygon fill="#000000" points="1298.5947,4544.5488,1308.5947,4548.5488,1298.5947,4552.5488,1302.5947,4548.5488" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="983.7607" x2="1304.5947" y1="4548.5488" y2="4548.5488"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="96.8081" x="1061.5637" y="4543.7939">Verify(password,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1158.3718" y="4543.7939"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="70.8081" x="1161.9836" y="4543.7939">storedHash)</text></g><path d="M1325,4561.5488 L1325,4630.5488 L1791,4630.5488 L1791,4571.5488 L1781,4561.5488 L1325,4561.5488" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1781,4561.5488 L1781,4571.5488 L1791,4571.5488 L1781,4561.5488" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="179.772" x="1331" y="4578.7427">1. Split stored hash: "salt:hash"</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="78.749" x="1331" y="4593.6914">2. Extract salt</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="261.5679" x="1331" y="4608.6401">3. Hash provided password\n with same salt</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="445.0723" x="1331" y="4623.5889">4. Constant-time comparison\n (CryptographicOperations.FixedTimeEquals)</text><g class="message" data-entity-1="part7" data-entity-2="part7" id="msg74"><line style="stroke:#000000;stroke-width:1;" x1="1320.5947" x2="1362.5947" y1="4657.2925" y2="4657.2925"/><line style="stroke:#000000;stroke-width:1;" x1="1362.5947" x2="1362.5947" y1="4657.2925" y2="4670.2925"/><line style="stroke:#000000;stroke-width:1;" x1="1321.5947" x2="1362.5947" y1="4670.2925" y2="4670.2925"/><polygon fill="#000000" points="1331.5947,4666.2925,1321.5947,4670.2925,1331.5947,4674.2925,1327.5947,4670.2925" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="33.96" x="1327.5947" y="4652.5376">Parse</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1361.5547" y="4652.5376"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="20.23" x="1365.1665" y="4652.5376">salt</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1385.3965" y="4652.5376"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="26" x="1389.0083" y="4652.5376">from</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1415.0083" y="4652.5376"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="36.1309" x="1418.6201" y="4652.5376">stored</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1454.751" y="4652.5376"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="28.1899" x="1458.3628" y="4652.5376">hash</text></g><g class="message" data-entity-1="part7" data-entity-2="part7" id="msg75"><line style="stroke:#000000;stroke-width:1;" x1="1320.5947" x2="1362.5947" y1="4714.1899" y2="4714.1899"/><line style="stroke:#000000;stroke-width:1;" x1="1362.5947" x2="1362.5947" y1="4714.1899" y2="4727.1899"/><line style="stroke:#000000;stroke-width:1;" x1="1321.5947" x2="1362.5947" y1="4727.1899" y2="4727.1899"/><polygon fill="#000000" points="1331.5947,4723.1899,1321.5947,4727.1899,1331.5947,4731.1899,1327.5947,4727.1899" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="30.3481" x="1327.5947" y="4694.4863">Hash</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1357.9429" y="4694.4863"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="49.8672" x="1361.5547" y="4694.4863">provided</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1411.4219" y="4694.4863"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="55.6372" x="1415.0337" y="4694.4863">password</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="23.1182" x="1347.1106" y="4709.4351">with</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1370.2288" y="4709.4351"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="53.4727" x="1373.8406" y="4709.4351">extracted</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1427.3132" y="4709.4351"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="20.23" x="1430.925" y="4709.4351">salt</text></g><g class="message" data-entity-1="part7" data-entity-2="part7" id="msg76"><line style="stroke:#000000;stroke-width:1;" x1="1320.5947" x2="1362.5947" y1="4771.0874" y2="4771.0874"/><line style="stroke:#000000;stroke-width:1;" x1="1362.5947" x2="1362.5947" y1="4771.0874" y2="4784.0874"/><line style="stroke:#000000;stroke-width:1;" x1="1321.5947" x2="1362.5947" y1="4784.0874" y2="4784.0874"/><polygon fill="#000000" points="1331.5947,4780.0874,1321.5947,4784.0874,1331.5947,4788.0874,1327.5947,4784.0874" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="104.7554" x="1331.2161" y="4751.3838">FixedTimeEquals(</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.2236" x="1327.5947" y="4766.3325">  </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="60.7026" x="1334.8184" y="4766.3325">computed,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1395.521" y="4766.3325"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="40.46" x="1399.1328" y="4766.3325">stored)</text></g><g class="message" data-entity-1="part7" data-entity-2="part5" id="msg77"><polygon fill="#000000" points="994.7607,4809.0361,984.7607,4813.0361,994.7607,4817.0361,990.7607,4813.0361" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="988.7607" x2="1314.5947" y1="4813.0361" y2="4813.0361"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="53.4727" x="1122.9414" y="4808.2813">true/false</text></g><path d="M75,4828.0361 L135.1709,4828.0361 L135.1709,4834.9849 L125.1709,4844.9849 L75,4844.9849 L75,4828.0361" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><rect fill="none" height="586.3672" style="stroke:#000000;stroke-width:1;" width="1501.7905" x="75" y="4828.0361"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="15.1709" x="90" y="4841.23">alt</text><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="97.1899" x="150.1709" y="4840.354">[Password invalid]</text><g class="message" data-entity-1="part5" data-entity-2="part3" id="msg78"><polygon fill="#000000" points="578.5415,4861.9336,568.5415,4865.9336,578.5415,4869.9336,574.5415,4865.9336" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="572.5415" x2="972.7607" y1="4865.9336" y2="4865.9336"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="31.7891" x="685.7417" y="4861.1787">throw</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="717.5308" y="4861.1787"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="134.418" x="721.1426" y="4861.1787">UnauthorizedException</text></g><g class="message" data-entity-1="part3" data-entity-2="part2" id="msg79"><polygon fill="#000000" points="333.5137,4890.8823,323.5137,4894.8823,333.5137,4898.8823,329.5137,4894.8823" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="327.5137" x2="556.5415" y1="4894.8823" y2="4894.8823"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="58.5508" x="410.7522" y="4890.1274">propagate</text></g><g class="message" data-entity-1="part2" data-entity-2="part1" id="msg80"><polygon fill="#000000" points="113.7793,4919.8311,103.7793,4923.8311,113.7793,4927.8311,109.7793,4923.8311" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="107.7793" x2="311.5137" y1="4923.8311" y2="4923.8311"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="21.6899" x="156.332" y="4919.0762">401</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="178.022" y="4919.0762"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="77.3271" x="181.6338" y="4919.0762">Unauthorized</text></g><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="75" x2="1576.7905" y1="4932.8311" y2="4932.8311"/><text fill="#000000" font-family="Arial" font-size="11" font-weight="bold" lengthAdjust="spacing" textLength="87.4146" x="80" y="4943.1489">[Password valid]</text><g class="message" data-entity-1="part5" data-entity-2="part6" id="msg81"><polygon fill="#000000" points="1160.5605,4963.4287,1170.5605,4967.4287,1160.5605,4971.4287,1164.5605,4967.4287" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="983.7607" x2="1166.5605" y1="4967.4287" y2="4967.4287"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="166.1816" x="995.0698" y="4962.6738">GenerateAccessToken(user)</text></g><g class="message" data-entity-1="part6" data-entity-2="part8" id="msg82"><polygon fill="#000000" points="1491.5527,4992.3774,1501.5527,4996.3774,1491.5527,5000.3774,1495.5527,4996.3774" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1182.5605" x2="1497.5527" y1="4996.3774" y2="4996.3774"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="93.1963" x="1296.4585" y="4991.6226">GenerateJwt(...)</text></g><g class="message" data-entity-1="part8" data-entity-2="part6" id="msg83"><polygon fill="#000000" points="1193.5605,5021.3262,1183.5605,5025.3262,1193.5605,5029.3262,1189.5605,5025.3262" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="1187.5605" x2="1507.5527" y1="5025.3262" y2="5025.3262"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="41.9009" x="1304.7349" y="5020.5713">Access</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1346.6357" y="5020.5713"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="36.1309" x="1350.2476" y="5020.5713">Token</text></g><g class="message" data-entity-1="part6" data-entity-2="part5" id="msg84"><polygon fill="#000000" points="994.7607,5050.2749,984.7607,5054.2749,994.7607,5058.2749,990.7607,5054.2749" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="988.7607" x2="1176.5605" y1="5054.2749" y2="5054.2749"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="41.9009" x="1039.8389" y="5049.52">Access</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1081.7397" y="5049.52"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="36.1309" x="1085.3516" y="5049.52">Token</text></g><g class="message" data-entity-1="part5" data-entity-2="part6" id="msg85"><polygon fill="#000000" points="1160.5605,5079.2236,1170.5605,5083.2236,1160.5605,5087.2236,1164.5605,5083.2236" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="983.7607" x2="1166.5605" y1="5083.2236" y2="5083.2236"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="169.7998" x="993.2607" y="5078.4688">GenerateRefreshToken(user)</text></g><g class="message" data-entity-1="part6" data-entity-2="part8" id="msg86"><polygon fill="#000000" points="1491.5527,5108.1724,1501.5527,5112.1724,1491.5527,5116.1724,1495.5527,5112.1724" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1182.5605" x2="1497.5527" y1="5112.1724" y2="5112.1724"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="93.1963" x="1296.4585" y="5107.4175">GenerateJwt(...)</text></g><g class="message" data-entity-1="part8" data-entity-2="part6" id="msg87"><polygon fill="#000000" points="1193.5605,5137.1211,1183.5605,5141.1211,1193.5605,5145.1211,1189.5605,5141.1211" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="1187.5605" x2="1507.5527" y1="5141.1211" y2="5141.1211"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="45.519" x="1302.9258" y="5136.3662">Refresh</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1348.4448" y="5136.3662"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="36.1309" x="1352.0566" y="5136.3662">Token</text></g><g class="message" data-entity-1="part6" data-entity-2="part5" id="msg88"><polygon fill="#000000" points="994.7607,5166.0698,984.7607,5170.0698,994.7607,5174.0698,990.7607,5170.0698" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="988.7607" x2="1176.5605" y1="5170.0698" y2="5170.0698"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="45.519" x="1038.0298" y="5165.3149">Refresh</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="1083.5488" y="5165.3149"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="36.1309" x="1087.1606" y="5165.3149">Token</text></g><g class="message" data-entity-1="part5" data-entity-2="part3" id="msg89"><polygon fill="#000000" points="578.5415,5224.916,568.5415,5228.916,578.5415,5232.916,574.5415,5228.916" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="572.5415" x2="977.7607" y1="5228.916" y2="5228.916"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="83.1162" x="731.593" y="5194.2637">LoginPayload(</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.2236" x="693.6658" y="5209.2124">  </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="86.7153" x="700.8894" y="5209.2124">userAccountId,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="787.6047" y="5209.2124"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="61.4199" x="791.2166" y="5209.2124">username,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.2236" x="687.1721" y="5224.1611">  </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="80.2026" x="694.3958" y="5224.1611">refreshToken,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="774.5984" y="5224.1611"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="80.9199" x="778.2102" y="5224.1611">accessToken)</text></g><g class="message" data-entity-1="part3" data-entity-2="part2" id="msg90"><polygon fill="#000000" points="333.5137,5253.8647,323.5137,5257.8647,333.5137,5261.8647,329.5137,5257.8647" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;stroke-dasharray:2,2;" x1="327.5137" x2="561.5415" y1="5257.8647" y2="5257.8647"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="78.7871" x="403.134" y="5253.1099">LoginPayload</text></g><g class="message" data-entity-1="part2" data-entity-2="part1" id="msg91"><polygon fill="#000000" points="113.7793,5402.4033,103.7793,5406.4033,113.7793,5410.4033,109.7793,5406.4033" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="107.7793" x2="311.5137" y1="5406.4033" y2="5406.4033"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="21.6899" x="185.6042" y="5282.0586">200</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="207.2942" y="5282.0586"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="18.7827" x="210.906" y="5282.0586">OK</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="4.3418" x="205.4756" y="5297.0073">{</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.2236" x="143.186" y="5311.9561">  </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="56.3608" x="150.4097" y="5311.9561">message:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="206.7705" y="5311.9561"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="47.9946" x="210.3823" y="5311.9561">"Logged</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="258.377" y="5311.9561"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="10.1182" x="261.9888" y="5311.9561">in</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="81.9165" x="166.6882" y="5326.9048">successfully.",</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.2236" x="175.4829" y="5341.8535">  </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="49.1499" x="182.7065" y="5341.8535">payload:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="231.8564" y="5341.8535"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="4.3418" x="235.4683" y="5341.8535">{</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="14.4473" x="124.5493" y="5356.8022">    </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="86.7153" x="138.9966" y="5356.8022">userAccountId,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="225.7119" y="5356.8022"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="61.4199" x="229.3237" y="5356.8022">username,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="14.4473" x="120.2202" y="5371.751">    </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="80.2026" x="134.6675" y="5371.751">refreshToken,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="3.6118" x="214.8701" y="5371.751"> </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="76.5908" x="218.4819" y="5371.751">accessToken</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="7.2236" x="201.8638" y="5386.6997">  </text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="4.3418" x="209.0874" y="5386.6997">}</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="4.3418" x="205.4756" y="5401.6484">}</text></g><rect fill="#FFFFFF" height="3" style="stroke:#FFFFFF;stroke-width:1;" width="2525.5488" x="5" y="5462.8777"/><line style="stroke:#000000;stroke-width:0.5;" x1="5" x2="2530.5488" y1="5462.8777" y2="5462.8777"/><line style="stroke:#000000;stroke-width:0.5;" x1="5" x2="2530.5488" y1="5465.8777" y2="5465.8777"/><rect fill="#FFFFFF" height="22.9487" style="stroke:#000000;stroke-width:1;" width="262.4663" x="1136.5413" y="5452.4033"/><text fill="#000000" font-family="Arial" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="244.8545" x="1142.5413" y="5468.5972">Error Handling (Global Exception Filter)</text><path d="M10,5490.3521 L10,5634.3521 L626,5634.3521 L626,5500.3521 L616,5490.3521 L10,5490.3521" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M616,5490.3521 L616,5500.3521 L626,5500.3521 L616,5490.3521" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="240.9189" x="16" y="5507.5459">API.Core's GlobalExceptionFilter catches:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="595.0928" x="16" y="5522.4946">- FluentValidation.ValidationException -> 400 Bad Request\n {message, errors} (grouped by property)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="196.1743" x="16" y="5537.4434">- ConflictException -> 409 Conflict</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="227.2715" x="16" y="5552.3921">- NotFoundException -> 404 Not Found</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="264.1323" x="16" y="5567.3408">- UnauthorizedException -> 401 Unauthorized</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="226.5542" x="16" y="5582.2896">- ForbiddenException -> 403 Forbidden</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="357.3477" x="16" y="5597.2383">- Domain.Exceptions.ValidationException -> 400 Bad Request</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="386.2104" x="16" y="5612.187">- Microsoft.Data.SqlClient.SqlException -> 503 Service Unavailable</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="224.3389" x="16" y="5627.1357">- All others -> 500 Internal Server Error</text><?plantuml-src tHfhRnityhj-nPpw8T9LaXznWbQ03oVRSgBMhxEK5eVJ8LZjKXAJ5NTBScshGVxxpP3xu3vaEsclA6h0zYuv70xdFSFzcrwp3OCuzBXegOzSn9xqDh3m_8yh6IKYE8t2IC8tv-R7WGZOqaj2VHu9VUKXXf7aNkZCA_PBmeJFBfbItegDGhuIu3EXcNIWDjv32Z3blp8utDzljJJN8ODtYaaO9KYUqDptD8y4d8VHFVHX_11x8c11g-Nv6eaZq1RYGpYECnhQevl9N9mYQJ8AGoRRu2d0iJBG9GkufsyXvZ4BkM1pqVd92tbWzZfXQ--EHx9hrbhGIBOMqGEqt-BkY1Kkl2tX_kQ2hzRw94nO6VyjMt65noNoqYK66OwdhsNuYsZ5XGle3fH1Pz579gPCtd6V6L0xSEUtc0W0YRI4JiHIUahBnDU9P6LwtqZ6H8LhSXM9mxaeBxFCCrDby1z-dZN2udWPSBpnU3WNDpAwuq5wjkdbxAPo9hP1BTIi0fWDbqzso-98SPJ85lRWL4PAzLLec65FzsyMegvKZeVALAopnqg76kWzuohsjBzc4lNYd7bqF3KmKyegHGKi9n0Lo5juYa5x-gyB82cbHpaxQRMEZy7gXNHK-lYurJBwtly7gUaGRgwdCzZpOhxd8OLxCjMakVYK89X0U-l1aajbJAy7ePS-pGKZedg0DB3hvGcNUjs3s5FgFfB1Px8NVeTJnXXQ-8Tsp9HxYBIAeEEgxMcqsQ3-TOk5kIMqH8IlafWDqR8O1wWR4SX4A70Hfp06ldEEfYDqiQmB2xQCK67H-65jzN-8W7rZwNJw8Rpilpu2V-r9rGClZ14gsJ39VVWM_ZDut_-l0JSI6i8TOGR4kF5qZrmE71n-PnSRi9kKFqFOS07VPMYJE6RIHq4YMm5_K5BfE-1c2oPxe6BcezipAmogiuBlY2rH6ey21zz_2rk6E24A0wCcn3lqNg5sc0LBKYt4ah4ormQzbj6zWYgR1iNZ-C5dCJtWybIgnAeX7EtlmuaN8E_H6okD2hInxdO8xShMB6ZtW4aPIJM4JuF1uFFd5WjHZHqubVW-Oq6LoiAZ3S4-TFnCSm1otN4S7muNR-QWgIKEuGtJHFl9DXFsI6s5tyaKluGnjr_87mdPsGdgylXYV3epR1ZvFaOoFJdhvGhK0ppWN9pVNbz2i8W63jXS_FnsV3lEGU4O_fazktkZDGF-WNw9Uf648HXY8OYO4Yyqi0TKUo8xOEN5pdj-aESmngYrvOenzp-C9MPZueTvU2up38rVpGqoabmKg6uMcnTAvWLRYutKiSgsmgaPwm5C1fOO8BHhAGsc5iiezbOKRcYwOahVvrZcelqKJMt4OCmd1qJYCaZqRKkClwq6mcsa9JjIwqxckRi6iE2FZSOqLlR2pWIaB-ZvJAh5qFEgOJhLXodoTGW7hs6nrKn11prYVy5rDmUuP1kCaaDuVNHvaWzE48dn1EWYZlBH6yIFQLR8rMO8fpVlm2XDFaqdWIZHSO8xlZoqEvhPt1KMvBeiUCC4ROVdG_P4c58YpHYCCwAxEvQP_JBEmJtNwxd8UU65gqZYqAQqkEB3sXI-NnzrQCFkC7rP8zfksonpLTLol4cGkHcuWQzmPgbjLKNhg7xTWa_6RoPNCBiTNKr7fxF9zLLvyTb9uwh9rNHyEyD_i-kwPNSA-pylCegB8gCuSrC9O_ZTkRX-DxjvDqinZyy69PzYYAWv0nSaWCwRTvEpxhF9FPKie4B02rEASqmz8-zcJAVNbvUJMOrVLSzJiwB2XHgiwCJGYJ06IkEQ3TAXAAE1E-vXmASiuOLAOSSFp4yqc_fUw5bPxwL3vWNGjt2XCjlmG76nmcBdR3537LT4LYHwH0xDeMF28iU2ecFoMK1PV1-dCOaH2UOTkMN3Wei0SPNDgf4flqjWp5TcqJ6NHwD6blbxbZcKMoemGKiUWuumly94XL8-yjVuFmLArU439LC-UbYTygJaF1xJDiBN8FSASoekm5rFYgUtDSilMMhPzhDohF1XY0iJBpDkhBzYzddzHgFP2s72Ogf0yiEzDej9wuj2W3t4N6uh2Aa8gtC-6mLwCj6ChnBhqOlGCCfS9BhIwU6hr_d4c3PYwFeFO1qbCXy_3Js-oMCBmDynJrmCmLBgZ2Q2OnRwtYRmIP5IPVCOYh6Q-w1vNRv4RiQDKwC4PeYSE_Xc-nhOb1eE1a0nr1iD7zcs02e9oGh73bJ5dB6i44f5KnvRd8lrMJfoop0fKEi_ZvAa1DczXdKzE3p0GdEBsSEh_IEZ4ghh91WRSfXPxm7BNyyoIXEojAHIA2DcOpGvF4R-34cn0jkX1INMbIZyOj4zklhBP6TiYGfCDAK_Zm1TgdPAyUK-rRs9IGFt1wzgWYp9IA-vHBg-GbHrMhvONa-ZU4nebJu7_N5RCIQroHeUc6LCiQPdmM0Kns7MV_IBHXFck08N-jNypUc3bCkBIhV84b7RtwQ7P1nEUoVjwVXL5UisoBwqlucm62yfkbPQM2zIW4OgKgRrKXYAoP48j-NpOyeFN3WWr3D6R7LTo9bJxPYPsSgWCQ-qvqSMAWARE6T9D0jsCyhbq0KN7wlcbxKIwsmhJI7Rl5zHQgWCSIGm-XT6ynOhFAJH6CE2of8ivwB9drdeH-ZrqXPB4HzTjLqaMaSYdpkF8kg8rtYM4TJ4ZfGyFoDlBb2-RsUN5vMLJLf7O6aLIXhCqZhDDQ6C5RkaGwrRgxvE3w97CVy3ytKF5b5GzLEcsrldUZuCvh6Sa43d4l7-Y3Mfm_v8wRquabX8BYLMX4pSGOUMldzxFPtjcQURwzjPuRrc5rEaLNjIunFShvamMxr_Dns_dqulZZ505OAYbAx8JFQo6h87V6br2sbhoZuDyJbdJX8U1d0vkHoNDA4CX4SLXbjUSSL1rPP2n3q8kF8jWBEqqOaaDgZkfKt2gZ0DXwk3LJEiJ1SjNYF3KATz7oHDsmwWKiia3BTvbk1wMTTV6ysOqh9Zo1bjcYART8y1gP5B-sFeVAAtatTmkiYkC5gHSrCQpK9cxUzqnwM7EsN2gWU4KaHmNU2DjwLIn3YNf5ngvk6OvgIJhlNIx6QM9pUkBnfdL7Mhl7PQekM0aJMa6WXxN5wbdjNX_a6QBWTpyOd8Ajg_vi91vbwr9Db1svmXjXiEuPDDrnxZnbFysC4Hcley5vzRLahqwzPOT4rnV6nlmfvtLn8IQEcYvCkkFynMl-kzXy6ONtYGCqlSbc3UgRBN1H555eQ-HVJH4MFP-PUuBwYGwTviFdfbKBe2nGdt_QzqRL1fLr1JcPhdNzucDxsZ9VLLZ3UeyglQ5dydo6YmtFyLywfCAUQYFH7sqYnnkjoPeWxQNz4xFoXjvVR6KseRoIs9TqJdPaKdq8ewzqU5l2V1hgRg4_sm0ZUvjtARSIwepzZBtEa8G_TjTFyJayfmhAGIRhUotZCBQZqpSeAZgpEOg5jsXnwJ8FOR6scDYbDiLz6TfbRdpWuMQT1LP7Tar6bBSQPX-QiqALtxXAeyhIofkeogjBcwqw0zwOK02ealjvqYdRETrQ9lt7orykZb2i310APO6keK6z3z07f9kZCOqdCxXpmSOB5jYaLpXP6FlnoaTnNsUuSY59XuQLjNfelYBZeQKEwej2TqN_CDCsM09xaYBSJvpgdSnZfQIIzUS_ywpYvi1kVyWGKpN37-9S7CA3jvAP5jkawvyQIoDDYSspdkpZMxZcNEn2mlAEKe3bR7KQ6tOvEgJKm5RIR2RcLrBRHGrhbN988xhswi-cSV0c1TQznVplJVelpFKF_d641g0Zc9bi2T53wt0xsxF_LaZmf3OGEEeldqh4xhZXPGhGrK5kjJQCfjeEVnPqVtzGzcKBqb-NKSUXBFKomgQRcP-irrKRU9ZbA6LxUOp6HS2fhGb8kWXa9e7wv_hDL0Y7N5oDp_ZzMFK-5ajMZn_v6QPqofjSsDkLX1vqqOBJ3YvUu57MI8bLlNL4GcKaLtzCaaBZU77voYXtoXmAxBbzbLjfPcodvMzPnAWNXPgmxe85c5a1K3dw53Nux6oDV5rhWw9hLf2FNhNs5OhCM75GRgAjBd5DShK4Sq0UTfRjjlTheMjEO_gT4c5pp0lA42-hAOiLzmHLYQYa4EfPx93BFuabEBD5hgmPcdlS7qb_0qvCXQUYejVeNxfjzl4gbtM4zvYv2rxFrR25W5OcPf8VTXGb_D2XI-_PZGgaPH6FuF?></g></svg> |