mirror of
https://github.com/aaronpo97/the-biergarten-app.git
synced 2026-04-05 10:09:03 +00:00
1 line
27 KiB
XML
1 line
27 KiB
XML
<?plantuml 1.2026.1?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="CLASS" height="719px" preserveAspectRatio="none" style="width:1605px;height:719px;background:#FFFFFF;" version="1.1" viewBox="0 0 1605 719" width="1605px" zoomAndPan="magnify"><title>Key Database Schema - User & Authentication</title><defs/><g><g class="title" data-source-line="6"><text fill="#000000" font-family="Arial" font-size="22" font-weight="bold" lengthAdjust="spacing" textLength="485.3643" x="555.3287" y="35.6357">Key Database Schema - User & Authentication</text></g><!--class User--><g class="entity" data-qualified-name="User" data-source-line="8" id="ent0002"><rect fill="#FFFFFF" height="188.8877" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="273.7305" x="987.46" y="58.2979"/><ellipse cx="1080.503" cy="72.2979" fill="#FFFFFF" rx="9" ry="9" style="stroke:#000000;stroke-width:1;"/><path d="M1076.8623,78.7979 L1076.8623,66.6572 L1084.5186,66.6572 L1084.5186,68.7822 L1079.2373,68.7822 L1079.2373,71.4385 L1084.253,71.4385 L1084.253,73.5635 L1079.2373,73.5635 L1079.2373,76.6729 L1084.5186,76.6729 L1084.5186,78.7979 L1076.8623,78.7979 Z " fill="#000000"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="80.1445" x="1098.003" y="77.3804">UserAccount</text><line style="stroke:#000000;stroke-width:1;" x1="988.46" x2="1260.1905" y1="86.2979" y2="86.2979"/><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="998.46" cy="99.8472" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="160.2891" x="1005.46" y="103.4297">UserAccountId: INT «PK»</text><line style="stroke:#000000;stroke-width:1;" x1="988.46" x2="1260.1905" y1="110.3965" y2="110.3965"/><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="998.46" cy="123.9458" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="249.7305" x="1005.46" y="127.5283">Username: NVARCHAR(30) «UNIQUE»</text><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="998.46" cy="140.0444" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="227.9443" x="1005.46" y="143.627">Email: NVARCHAR(255) «UNIQUE»</text><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="998.46" cy="156.1431" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="175.7998" x="1005.46" y="159.7256">FirstName: NVARCHAR(50)</text><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="998.46" cy="172.2417" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="175.0479" x="1005.46" y="175.8242">LastName: NVARCHAR(50)</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="139.2617" x="1005.46" y="191.9229">Bio: NVARCHAR(500)</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="149.3789" x="1005.46" y="208.0215">CreatedAt: DATETIME2</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="152.5029" x="1005.46" y="224.1201">UpdatedAt: DATETIME2</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="160.2891" x="1005.46" y="240.2188">LastLoginAt: DATETIME2</text></g><!--class Cred--><g class="entity" data-qualified-name="Cred" data-source-line="21" id="ent0003"><rect fill="#FFFFFF" height="188.8877" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="242.6406" x="12" y="307.1879"/><ellipse cx="82.8843" cy="321.1879" fill="#FFFFFF" rx="9" ry="9" style="stroke:#000000;stroke-width:1;"/><path d="M79.2437,327.6879 L79.2437,315.5472 L86.8999,315.5472 L86.8999,317.6722 L81.6187,317.6722 L81.6187,320.3285 L86.6343,320.3285 L86.6343,322.4535 L81.6187,322.4535 L81.6187,325.5629 L86.8999,325.5629 L86.8999,327.6879 L79.2437,327.6879 Z " fill="#000000"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="93.3721" x="100.3843" y="326.2704">UserCredential</text><line style="stroke:#000000;stroke-width:1;" x1="13" x2="253.6406" y1="335.1879" y2="335.1879"/><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="23" cy="348.7372" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="173.5166" x="30" y="352.3197">UserCredentialId: INT «PK»</text><line style="stroke:#000000;stroke-width:1;" x1="13" x2="253.6406" y1="359.2865" y2="359.2865"/><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="23" cy="372.8358" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="159.5029" x="30" y="376.4183">UserAccountId: INT «FK»</text><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="23" cy="388.9344" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="207.7373" x="30" y="392.517">PasswordHash: VARBINARY(32)</text><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="23" cy="405.0331" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="199.1787" x="30" y="408.6156">PasswordSalt: VARBINARY(16)</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="212.4199" x="30" y="424.7142">CredentialRotatedAt: DATETIME2</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="210.0684" x="30" y="440.8129">CredentialExpiresAt: DATETIME2</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="218.6406" x="30" y="456.9115">CredentialRevokedAt: DATETIME2</text><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="23" cy="469.4276" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="78.5723" x="30" y="473.0101">IsActive: BIT</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="149.3789" x="30" y="489.1088">CreatedAt: DATETIME2</text></g><!--class Verify--><g class="entity" data-qualified-name="Verify" data-source-line="34" id="ent0004"><rect fill="#FFFFFF" height="140.5918" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="251.1924" x="467.72" y="331.3379"/><ellipse cx="540.1595" cy="345.3379" fill="#FFFFFF" rx="9" ry="9" style="stroke:#000000;stroke-width:1;"/><path d="M536.5188,351.8379 L536.5188,339.6972 L544.1751,339.6972 L544.1751,341.8222 L538.8938,341.8222 L538.8938,344.4785 L543.9095,344.4785 L543.9095,346.6035 L538.8938,346.6035 L538.8938,349.7129 L544.1751,349.7129 L544.1751,351.8379 L536.5188,351.8379 Z " fill="#000000"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="98.8135" x="557.6595" y="350.4204">UserVerification</text><line style="stroke:#000000;stroke-width:1;" x1="468.72" x2="717.9124" y1="359.3379" y2="359.3379"/><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="478.72" cy="372.8872" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="178.958" x="485.72" y="376.4697">UserVerificationId: INT «PK»</text><line style="stroke:#000000;stroke-width:1;" x1="468.72" x2="717.9124" y1="383.4365" y2="383.4365"/><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="478.72" cy="396.9858" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="159.5029" x="485.72" y="400.5683">UserAccountId: INT «FK»</text><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="478.72" cy="413.0844" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="87.917" x="485.72" y="416.667">IsVerified: BIT</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="147.041" x="485.72" y="432.7656">VerifiedAt: DATETIME2</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="227.1924" x="485.72" y="448.8642">VerificationToken: NVARCHAR(255)</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="185.165" x="485.72" y="464.9629">TokenExpiresAt: DATETIME2</text></g><!--class Avatar--><g class="entity" data-qualified-name="Avatar" data-source-line="44" id="ent0005"><rect fill="#FFFFFF" height="124.4932" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="183.5029" x="922.57" y="339.3879"/><ellipse cx="975.5612" cy="353.3879" fill="#FFFFFF" rx="9" ry="9" style="stroke:#000000;stroke-width:1;"/><path d="M971.9206,359.8879 L971.9206,347.7472 L979.5768,347.7472 L979.5768,349.8722 L974.2956,349.8722 L974.2956,352.5285 L979.3112,352.5285 L979.3112,354.6535 L974.2956,354.6535 L974.2956,357.7629 L979.5768,357.7629 L979.5768,359.8879 L971.9206,359.8879 Z " fill="#000000"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="70.0205" x="993.0612" y="358.4704">UserAvatar</text><line style="stroke:#000000;stroke-width:1;" x1="923.57" x2="1105.0729" y1="367.3879" y2="367.3879"/><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="933.57" cy="380.9372" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="150.165" x="940.57" y="384.5197">UserAvatarId: INT «PK»</text><line style="stroke:#000000;stroke-width:1;" x1="923.57" x2="1105.0729" y1="391.4865" y2="391.4865"/><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="933.57" cy="405.0358" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="159.5029" x="940.57" y="408.6183">UserAccountId: INT «FK»</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="115.9443" x="940.57" y="424.717">PhotoId: INT «FK»</text><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="933.57" cy="437.2331" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="78.5723" x="940.57" y="440.8156">IsActive: BIT</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="149.3789" x="940.57" y="456.9142">CreatedAt: DATETIME2</text></g><!--class Follow--><g class="entity" data-qualified-name="Follow" data-source-line="53" id="ent0006"><rect fill="#FFFFFF" height="108.3945" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="188.9443" x="1140.85" y="347.4379"/><ellipse cx="1196.5653" cy="361.4379" fill="#FFFFFF" rx="9" ry="9" style="stroke:#000000;stroke-width:1;"/><path d="M1192.9247,367.9379 L1192.9247,355.7972 L1200.581,355.7972 L1200.581,357.9222 L1195.2997,357.9222 L1195.2997,360.5785 L1200.3153,360.5785 L1200.3153,362.7035 L1195.2997,362.7035 L1195.2997,365.8129 L1200.581,365.8129 L1200.581,367.9379 L1192.9247,367.9379 Z " fill="#000000"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="70.0137" x="1214.0653" y="366.5204">UserFollow</text><line style="stroke:#000000;stroke-width:1;" x1="1141.85" x2="1328.7943" y1="375.4379" y2="375.4379"/><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="1151.85" cy="388.9872" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="150.1582" x="1158.85" y="392.5697">UserFollowId: INT «PK»</text><line style="stroke:#000000;stroke-width:1;" x1="1141.85" x2="1328.7943" y1="399.5365" y2="399.5365"/><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="1151.85" cy="413.0858" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="161.8203" x="1158.85" y="416.6683">FollowerUserId: INT «FK»</text><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="1151.85" cy="429.1844" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="164.9443" x="1158.85" y="432.767">FollowedUserId: INT «FK»</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="149.3789" x="1158.85" y="448.8656">CreatedAt: DATETIME2</text></g><!--class Photo--><g class="entity" data-qualified-name="Photo" data-source-line="61" id="ent0007"><rect fill="#FFFFFF" height="156.6904" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="259.7578" x="884.44" y="556.0779"/><ellipse cx="992.2759" cy="570.0779" fill="#FFFFFF" rx="9" ry="9" style="stroke:#000000;stroke-width:1;"/><path d="M988.6353,576.5779 L988.6353,564.4372 L996.2916,564.4372 L996.2916,566.5622 L991.0103,566.5622 L991.0103,569.2185 L996.0259,569.2185 L996.0259,571.3435 L991.0103,571.3435 L991.0103,574.4529 L996.2916,574.4529 L996.2916,576.5779 L988.6353,576.5779 Z " fill="#000000"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="36.5859" x="1009.7759" y="575.1604">Photo</text><line style="stroke:#000000;stroke-width:1;" x1="885.44" x2="1143.1978" y1="584.0779" y2="584.0779"/><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="895.44" cy="597.6272" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="116.7305" x="902.44" y="601.2097">PhotoId: INT «PK»</text><line style="stroke:#000000;stroke-width:1;" x1="885.44" x2="1143.1978" y1="608.1765" y2="608.1765"/><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="895.44" cy="621.7258" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="136.9102" x="902.44" y="625.3083">Url: NVARCHAR(500)</text><g data-visibility-modifier="IE_MANDATORY"><ellipse cx="895.44" cy="637.8244" fill="#FFFFFF" rx="3" ry="3" style="stroke:#000000;stroke-width:1;"/></g><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="235.7578" x="902.44" y="641.407">CloudinaryPublicId: NVARCHAR(255)</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="66.1172" x="902.44" y="657.5056">Width: INT</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="70.7998" x="902.44" y="673.6042">Height: INT</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="155.5791" x="902.44" y="689.7029">Format: NVARCHAR(10)</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="149.3789" x="902.44" y="705.8015">CreatedAt: DATETIME2</text></g><g class="entity" data-qualified-name="GMN14" data-source-line="81" id="ent0015"><path d="M289.77,351.7879 L289.77,397.7679 L255,401.7679 L289.77,405.7679 L289.77,451.4802 A0,0 0 0 0 289.77,451.4802 L432.8799,451.4802 A0,0 0 0 0 432.8799,451.4802 L432.8799,361.7879 L422.8799,351.7879 L289.77,351.7879 A0,0 0 0 0 289.77,351.7879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M422.8799,351.7879 L422.8799,361.7879 L432.8799,361.7879 L422.8799,351.7879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="109.8398" x="295.77" y="368.9817">Password hashing:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="122.1099" x="295.77" y="383.9304">- Algorithm: Argon2id</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="96.0718" x="295.77" y="398.8792">- Memory: 64MB</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="75.8672" x="295.77" y="413.8279">- Iterations: 4</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="77.3145" x="295.77" y="428.7766">- Salt: 128-bit</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="85.2617" x="295.77" y="443.7254">- Hash: 256-bit</text></g><g class="entity" data-qualified-name="GMN17" data-source-line="90" id="ent0018"><path d="M753.46,374.2079 L753.46,397.7679 L719.1,401.7679 L753.46,405.7679 L753.46,429.054 A0,0 0 0 0 753.46,429.054 L887.1817,429.054 A0,0 0 0 0 887.1817,429.054 L887.1817,384.2079 L877.1817,374.2079 L753.46,374.2079 A0,0 0 0 0 753.46,374.2079" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M877.1817,374.2079 L877.1817,384.2079 L887.1817,384.2079 L877.1817,374.2079" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="112.7217" x="759.46" y="391.4017">Account verification</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="86.709" x="759.46" y="406.3504">via email token</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="61.4072" x="759.46" y="421.2992">with expiry</text></g><g class="entity" data-qualified-name="GMN20" data-source-line="96" id="ent0021"><path d="M1364.61,359.2579 L1364.61,444.0015 L1598.0216,444.0015 L1598.0216,369.2579 L1588.0216,359.2579 L1364.61,359.2579" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1588.0216,359.2579 L1588.0216,369.2579 L1598.0216,369.2579 L1588.0216,359.2579" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="140.1816" x="1370.61" y="376.4517">Core stored procedures:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="117.7554" x="1370.61" y="391.4004">- USP_RegisterUser</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="212.4116" x="1370.61" y="406.3492">- USP_GetUserAccountByUsername</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="166.9053" x="1370.61" y="421.2979">- USP_RotateUserCredential</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="158.2407" x="1370.61" y="436.2466">- USP_UpdateUserAccount</text></g><!--link User to Cred--><g class="link" data-entity-1="ent0002" data-entity-2="ent0003" data-link-type="crowfoot" data-source-line="73" id="lnk8"><path codeLine="73" d="M1017.11,255.3979 C1017.11,292.6779 1017.11,318.7679 1017.11,318.7679 C1017.11,318.7679 515.06,318.7679 272.82,318.7679" fill="none" id="User-Cred" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1013.11" x2="1021.11" y1="251.3979" y2="251.3979"/><line style="stroke:#000000;stroke-width:1;" x1="1013.11" x2="1021.11" y1="254.3979" y2="254.3979"/><line style="stroke:#000000;stroke-width:1;" x1="1017.11" x2="1017.11" y1="255.3979" y2="247.3979"/><line style="stroke:#000000;stroke-width:1;" x1="262.82" x2="254.82" y1="318.7679" y2="324.7679"/><line style="stroke:#000000;stroke-width:1;" x1="262.82" x2="254.82" y1="318.7679" y2="312.7679"/><line style="stroke:#000000;stroke-width:1;" x1="262.82" x2="254.82" y1="318.7679" y2="318.7679"/><ellipse cx="268.82" cy="318.7679" fill="none" rx="4" ry="4" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="20.96" x="650.65" y="315.9617">has</text></g><!--link User to Verify--><g class="link" data-entity-1="ent0002" data-entity-2="ent0004" data-link-type="association" data-source-line="74" id="lnk9"><path codeLine="74" d="M1046.76,255.4779 C1046.76,300.1279 1046.76,335.7679 1046.76,335.7679 C1046.76,335.7679 868.51,335.7679 734.33,335.7679" fill="none" id="User-Verify" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1042.76" x2="1050.76" y1="251.4779" y2="251.4779"/><line style="stroke:#000000;stroke-width:1;" x1="1042.76" x2="1050.76" y1="254.4779" y2="254.4779"/><line style="stroke:#000000;stroke-width:1;" x1="1046.76" x2="1046.76" y1="255.4779" y2="247.4779"/><line style="stroke:#000000;stroke-width:1;" x1="730.33" x2="719.33" y1="335.7679" y2="335.7679"/><ellipse cx="730.33" cy="335.7679" fill="none" rx="4" ry="4" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="723.33" x2="723.33" y1="339.7679" y2="331.7679"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="20.96" x="906.19" y="332.9617">has</text></g><!--link User to Avatar--><g class="link" data-entity-1="ent0002" data-entity-2="ent0005" data-link-type="crowfoot" data-source-line="75" id="lnk10"><path codeLine="75" d="M1076.42,255.5479 C1076.42,286.1879 1076.42,293.3679 1076.42,321.0579" fill="none" id="User-Avatar" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1072.42" x2="1080.42" y1="251.5479" y2="251.5479"/><line style="stroke:#000000;stroke-width:1;" x1="1072.42" x2="1080.42" y1="254.5479" y2="254.5479"/><line style="stroke:#000000;stroke-width:1;" x1="1076.42" x2="1076.42" y1="255.5479" y2="247.5479"/><line style="stroke:#000000;stroke-width:1;" x1="1076.42" x2="1082.42" y1="331.0579" y2="339.0579"/><line style="stroke:#000000;stroke-width:1;" x1="1076.42" x2="1070.42" y1="331.0579" y2="339.0579"/><line style="stroke:#000000;stroke-width:1;" x1="1076.42" x2="1076.42" y1="331.0579" y2="339.0579"/><ellipse cx="1076.42" cy="325.0579" fill="none" rx="4" ry="4" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="20.96" x="1055.42" y="290.5017">has</text></g><!--link User to Follow--><g class="link" data-entity-1="ent0002" data-entity-2="ent0006" data-link-type="crowfoot" data-source-line="76" id="lnk11"><path codeLine="76" d="M1180.96,255.5479 C1180.96,289.2079 1180.96,299.9379 1180.96,329.0879" fill="none" id="User-Follow" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1176.96" x2="1184.96" y1="251.5479" y2="251.5479"/><line style="stroke:#000000;stroke-width:1;" x1="1176.96" x2="1184.96" y1="254.5479" y2="254.5479"/><line style="stroke:#000000;stroke-width:1;" x1="1180.96" x2="1180.96" y1="255.5479" y2="247.5479"/><line style="stroke:#000000;stroke-width:1;" x1="1180.96" x2="1186.96" y1="339.0879" y2="347.0879"/><line style="stroke:#000000;stroke-width:1;" x1="1180.96" x2="1174.96" y1="339.0879" y2="347.0879"/><line style="stroke:#000000;stroke-width:1;" x1="1180.96" x2="1180.96" y1="339.0879" y2="347.0879"/><ellipse cx="1180.96" cy="333.0879" fill="none" rx="4" ry="4" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="39.7363" x="1140.96" y="294.5117">follows</text></g><!--link User to Follow--><g class="link" data-entity-1="ent0002" data-entity-2="ent0006" data-link-type="crowfoot" data-source-line="77" id="lnk12"><path codeLine="77" d="M1221.07,255.5479 C1221.07,289.2079 1221.07,299.9379 1221.07,329.0879" fill="none" id="User-Follow-1" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1217.07" x2="1225.07" y1="251.5479" y2="251.5479"/><line style="stroke:#000000;stroke-width:1;" x1="1217.07" x2="1225.07" y1="254.5479" y2="254.5479"/><line style="stroke:#000000;stroke-width:1;" x1="1221.07" x2="1221.07" y1="255.5479" y2="247.5479"/><line style="stroke:#000000;stroke-width:1;" x1="1221.07" x2="1227.07" y1="339.0879" y2="347.0879"/><line style="stroke:#000000;stroke-width:1;" x1="1221.07" x2="1215.07" y1="339.0879" y2="347.0879"/><line style="stroke:#000000;stroke-width:1;" x1="1221.07" x2="1221.07" y1="339.0879" y2="347.0879"/><ellipse cx="1221.07" cy="333.0879" fill="none" rx="4" ry="4" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="65.0381" x="1155.07" y="310.5117">followed by</text></g><!--link Avatar to Photo--><g class="link" data-entity-1="ent0005" data-entity-2="ent0007" data-link-type="crowfoot" data-source-line="78" id="lnk13"><path codeLine="78" d="M1014.32,482.3279 C1014.32,510.4679 1014.32,517.9779 1014.32,547.7879" fill="none" id="Avatar-Photo" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1014.32" x2="1008.32" y1="472.3279" y2="464.3279"/><line style="stroke:#000000;stroke-width:1;" x1="1014.32" x2="1020.32" y1="472.3279" y2="464.3279"/><line style="stroke:#000000;stroke-width:1;" x1="1014.32" x2="1014.32" y1="472.3279" y2="464.3279"/><ellipse cx="1014.32" cy="478.3279" fill="none" rx="4" ry="4" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="1018.32" x2="1010.32" y1="551.7879" y2="551.7879"/><line style="stroke:#000000;stroke-width:1;" x1="1018.32" x2="1010.32" y1="548.7879" y2="548.7879"/><line style="stroke:#000000;stroke-width:1;" x1="1014.32" x2="1014.32" y1="547.7879" y2="555.7879"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="47.6836" x="966.32" y="507.2517">refers to</text></g><!--link User to GMN20--><g class="link" data-entity-1="ent0002" data-entity-2="ent0021" data-link-type="association" data-source-line="96" id="lnk22"><path d="M1261.58,152.7679 C1362.2,152.7679 1481.32,152.7679 1481.32,152.7679 C1481.32,152.7679 1481.32,287.6979 1481.32,358.8479" fill="none" id="User-GMN20" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><?plantuml-src dLLXRzem4FsUNt5ZqjOYHMffgQQegXGeh55Rn2XqsgV990UnQc9a6xgezB_FTa8n0LQj-MI_Tpc_U_RPdrIACuGv8pJpv1FDvaIG6On9_3GLV94bRSwuWCzT-paH2Kx8WgakprIFw0oXe8GvFACPgdoEm8LAkUSfgXZ2BUPmJHGP4udm4Ekr2VWmaYZW2uGBBIPJD2QAyippp5ZbK3Dq6CTQZQe1aKNuYmTG1uUAaW2YtX0kB_ktLrUQzVsta4mh3A3t60xQD-7WwEpaM8UDUj6FKSU6rg4p8vGv8OrcSoUcIuMqnJfnpPDZozsH0rIByYtCWcs1H64IgW2kms5d6Drt6XeUpPDziCbznwSqsoPUjntIEHCp9yoQPAQEIHlsNpxjMDczBMll4ocVkKXkY4m3qEMqebuu-7LqrZZUuXy8Kov_Ub7MMwu-u6fVYPk0pfyv5IWF1mnmoPzsCzGXac6iw59lGIiQ7ZAvOjeZ2Zef3vorpGAvOvmRyJ7h8bdam6IjR3slrk2kDTH5PfK3gKCilDUZIcNXKhUPi3KLGxTZBF2HQlefLtnlZV_lVPSpnf-jmcBeA2o0GmeB5eM9t2Ecf9Ezz7lAR8LMb1sLcYfrLmmJRBV5wz1cV97GZ8YylnWp6flVgzlvaoOgjLdrv0RfD5NhMPUB6L7EBwU7hmwj_oiCaDcJ8rCwbvwz95Sht-SlnLqGG2qbikOGg_LftwLUreTc7rNkbgOcTlGEhTSUvpMlJFZAVN-rAitLCG8dA2Heppqlumf161E0JwngS-JAcmMqZfHcqy0O3o6RSa5LEWlqopFbMOCc5h_76HTv01VdzoqBH0f5OKi0vnOfhgZJnZT_J9L5YakjqRom26O962LLFOLP-eUoEM3fjAk6bvG0ccT45wERL2FFMY2WQTQycdNCbU8pazPOP_QL2mIfkDcgkU0n9WlTuaMneuV-xm5EgLJ5cNy3lwDokhMLhz-wpL_skjr-0Dx8uhbn4cn4_WK0?></g></svg> |