academia/docs/architecture/diagrams/02-domain-model.svg

1 line
34 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="CLASS" height="992px" preserveAspectRatio="none" style="width:1576px;height:992px;background:#FFFFFF;" version="1.1" viewBox="0 0 1576 992" width="1576px" zoomAndPan="magnify"><title>Sistema de Registro de Estudiantes - Modelo de Dominio</title><defs/><g><g class="title" data-source-line="7"><text fill="#000000" font-family="Verdana" font-size="22" font-weight="bold" lengthAdjust="spacing" textLength="705.9443" x="430.6586" y="35.4209">Sistema de Registro de Estudiantes - Modelo de Dominio</text></g><!--cluster Domain--><g class="cluster" data-entity="Domain" data-source-line="9" data-uid="ent0002" id="cluster_Domain"><path d="M13.5,57.6094 L74.54,57.6094 A3.75,3.75 0 0 1 77.04,60.1094 L84.04,79.9063 L1147.5,79.9063 A2.5,2.5 0 0 1 1150,82.4063 L1150,982.9994 A2.5,2.5 0 0 1 1147.5,985.4994 L13.5,985.4994 A2.5,2.5 0 0 1 11,982.9994 L11,60.1094 A2.5,2.5 0 0 1 13.5,57.6094" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><line style="stroke:#000000;stroke-width:1;" x1="11" x2="84.04" y1="79.9063" y2="79.9063"/><text fill="#000000" font-family="Verdana" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="60.04" x="15" y="72.6045">Domain</text></g><!--class User--><g class="entity" data-entity="User" data-source-line="11" data-uid="ent0003" id="entity_User"><rect fill="#F8F9FA" height="268.125" rx="2.5" ry="2.5" style="stroke:#495057;stroke-width:1;" width="325.9336" x="27.03" y="92.6094"/><ellipse cx="163.3239" cy="112.7422" fill="#FFFFFF" rx="9" ry="9" style="stroke:#000000;stroke-width:1;"/><path d="M166.2927,118.3828 Q165.7146,118.6797 165.0739,118.8203 Q164.4333,118.9766 163.7302,118.9766 Q161.2302,118.9766 159.9021,117.3359 Q158.5896,115.6797 158.5896,112.5547 Q158.5896,109.4297 159.9021,107.7734 Q161.2302,106.1172 163.7302,106.1172 Q164.4333,106.1172 165.0739,106.2734 Q165.7302,106.4297 166.2927,106.7266 L166.2927,109.4453 Q165.6677,108.8672 165.0739,108.6016 Q164.4802,108.3203 163.8552,108.3203 Q162.5114,108.3203 161.8239,109.3984 Q161.1364,110.4609 161.1364,112.5547 Q161.1364,114.6484 161.8239,115.7266 Q162.5114,116.7891 163.8552,116.7891 Q164.4802,116.7891 165.0739,116.5234 Q165.6677,116.2422 166.2927,115.6641 L166.2927,118.3828 Z " fill="#000000"/><text fill="#000000" font-family="Verdana" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="49.8457" x="178.8239" y="108.748">&#171;Entity&#187;</text><text fill="#000000" font-family="Verdana" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="36.1006" x="185.6965" y="124.5732">User</text><line style="stroke:#495057;stroke-width:1;" x1="28.03" x2="351.9636" y1="132.875" y2="132.875"/><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="45.2471" x="33.03" y="149.8701">-id: int</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="124.6465" x="33.03" y="166.167">-username: string</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="156.3926" x="33.03" y="182.4639">-passwordHash: string</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="187.0928" x="33.03" y="198.7607">-recoveryCodeHash: string</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="81.2314" x="33.03" y="215.0576">-role: string</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="106.4355" x="33.03" y="231.3545">-studentId: int?</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="151.0742" x="33.03" y="247.6514">-createdAt: DateTime</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="168.1367" x="33.03" y="263.9482">-lastLoginAt: DateTime?</text><line style="stroke:#495057;stroke-width:1;" x1="28.03" x2="351.9636" y1="271.25" y2="271.25"/><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" text-decoration="underline" textLength="313.9336" x="33.03" y="288.2451">+Create(username, passwordHash, ...): User</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="242.6279" x="33.03" y="304.542">+UpdatePassword(newHash): void</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="179.3271" x="33.03" y="320.8389">+UpdateLastLogin(): void</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="107.0918" x="33.03" y="337.1357">+IsAdmin: bool</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="117.3389" x="33.03" y="353.4326">+IsStudent: bool</text></g><!--class Student--><g class="entity" data-entity="Student" data-source-line="28" data-uid="ent0004" id="entity_Student"><rect fill="#F8F9FA" height="300.7188" rx="2.5" ry="2.5" style="stroke:#495057;stroke-width:1;" width="307.8799" x="496.06" y="437.7294"/><ellipse cx="614.791" cy="457.8622" fill="#FFFFFF" rx="9" ry="9" style="stroke:#000000;stroke-width:1;"/><path d="M617.7597,463.5028 Q617.1816,463.7997 616.541,463.9403 Q615.9003,464.0966 615.1972,464.0966 Q612.6972,464.0966 611.3691,462.4559 Q610.0566,460.7997 610.0566,457.6747 Q610.0566,454.5497 611.3691,452.8934 Q612.6972,451.2372 615.1972,451.2372 Q615.9003,451.2372 616.541,451.3934 Q617.1972,451.5497 617.7597,451.8466 L617.7597,454.5653 Q617.1347,453.9872 616.541,453.7216 Q615.9472,453.4403 615.3222,453.4403 Q613.9785,453.4403 613.291,454.5184 Q612.6035,455.5809 612.6035,457.6747 Q612.6035,459.7684 613.291,460.8466 Q613.9785,461.9091 615.3222,461.9091 Q615.9472,461.9091 616.541,461.6434 Q617.1347,461.3622 617.7597,460.7841 L617.7597,463.5028 Z " fill="#000000"/><text fill="#000000" font-family="Verdana" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="49.8457" x="638.8271" y="453.868">&#171;Entity&#187;</text><text fill="#000000" font-family="Verdana" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="62.918" x="632.291" y="469.6932">Student</text><line style="stroke:#495057;stroke-width:1;" x1="497.06" x2="802.9399" y1="477.995" y2="477.995"/><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="45.2471" x="502.06" y="494.9901">-id: int</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="94.1104" x="502.06" y="511.287">-name: string</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="91.6699" x="502.06" y="527.5839">-email: Email</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="202.2891" x="502.06" y="543.8807">-activationCodeHash: string?</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="225.7773" x="502.06" y="560.1776">-activationExpiresAt: DateTime?</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="222.0791" x="502.06" y="576.4745">-enrollments: List&lt;Enrollment&gt;</text><line style="stroke:#495057;stroke-width:1;" x1="497.06" x2="802.9399" y1="583.7763" y2="583.7763"/><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="157.8418" x="502.06" y="600.7714">+getTotalCredits(): int</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="126.6973" x="502.06" y="617.0682">+canEnroll(): bool</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="230.3643" x="502.06" y="633.3651">+hasProfessor(professorId): bool</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="240.4336" x="502.06" y="649.662">+addEnrollment(enrollment): void</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="267.5518" x="502.06" y="665.9589">+removeEnrollment(enrollment): void</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="295.8799" x="502.06" y="682.2557">+setActivationCode(hash, expiresIn): void</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="202.1592" x="502.06" y="698.5526">+clearActivationCode(): void</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="128.4951" x="502.06" y="714.8495">+isActivated: bool</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="196.4102" x="502.06" y="731.1464">+isActivationExpired(): bool</text></g><!--class Subject--><g class="entity" data-entity="Subject" data-source-line="47" data-uid="ent0005" id="entity_Subject"><rect fill="#F8F9FA" height="137.75" rx="2.5" ry="2.5" style="stroke:#495057;stroke-width:1;" width="197.2402" x="845.38" y="519.2194"/><ellipse cx="910.5719" cy="539.3522" fill="#FFFFFF" rx="9" ry="9" style="stroke:#000000;stroke-width:1;"/><path d="M913.5406,544.9928 Q912.9625,545.2897 912.3219,545.4303 Q911.6813,545.5866 910.9781,545.5866 Q908.4781,545.5866 907.15,543.9459 Q905.8375,542.2897 905.8375,539.1647 Q905.8375,536.0397 907.15,534.3834 Q908.4781,532.7272 910.9781,532.7272 Q911.6813,532.7272 912.3219,532.8834 Q912.9781,533.0397 913.5406,533.3366 L913.5406,536.0553 Q912.9156,535.4772 912.3219,535.2116 Q911.7281,534.9303 911.1031,534.9303 Q909.7594,534.9303 909.0719,536.0084 Q908.3844,537.0709 908.3844,539.1647 Q908.3844,541.2584 909.0719,542.3366 Q909.7594,543.3991 911.1031,543.3991 Q911.7281,543.3991 912.3219,543.1334 Q912.9156,542.8522 913.5406,542.2741 L913.5406,544.9928 Z " fill="#000000"/><text fill="#000000" font-family="Verdana" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="49.8457" x="932.8273" y="535.358">&#171;Entity&#187;</text><text fill="#000000" font-family="Verdana" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="59.3564" x="928.0719" y="551.1832">Subject</text><line style="stroke:#495057;stroke-width:1;" x1="846.38" x2="1041.6202" y1="559.485" y2="559.485"/><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="45.2471" x="851.38" y="576.4801">-id: int</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="94.1104" x="851.38" y="592.777">-name: string</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="127.4492" x="851.38" y="609.0739">-credits: int {= 3}</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="111.1455" x="851.38" y="625.3707">-professorId: int</text><line style="stroke:#495057;stroke-width:1;" x1="846.38" x2="1041.6202" y1="632.6725" y2="632.6725"/><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="185.2402" x="851.38" y="649.6676">+getProfessor(): Professor</text></g><!--class Professor--><g class="entity" data-entity="Professor" data-source-line="56" data-uid="ent0006" id="entity_Professor"><rect fill="#F8F9FA" height="121.4531" rx="2.5" ry="2.5" style="stroke:#495057;stroke-width:1;" width="226.71" x="907.65" y="165.9494"/><ellipse cx="979.4762" cy="186.0822" fill="#FFFFFF" rx="9" ry="9" style="stroke:#000000;stroke-width:1;"/><path d="M982.4449,191.7228 Q981.8668,192.0197 981.2262,192.1603 Q980.5855,192.3166 979.8824,192.3166 Q977.3824,192.3166 976.0543,190.6759 Q974.7418,189.0197 974.7418,185.8947 Q974.7418,182.7697 976.0543,181.1134 Q977.3824,179.4572 979.8824,179.4572 Q980.5855,179.4572 981.2262,179.6134 Q981.8824,179.7697 982.4449,180.0666 L982.4449,182.7853 Q981.8199,182.2072 981.2262,181.9416 Q980.6324,181.6603 980.0074,181.6603 Q978.6637,181.6603 977.9762,182.7384 Q977.2887,183.8009 977.2887,185.8947 Q977.2887,187.9884 977.9762,189.0666 Q978.6637,190.1291 980.0074,190.1291 Q980.6324,190.1291 981.2262,189.8634 Q981.8199,189.5822 982.4449,189.0041 L982.4449,191.7228 Z " fill="#000000"/><text fill="#000000" font-family="Verdana" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="49.8457" x="1009.8321" y="182.088">&#171;Entity&#187;</text><text fill="#000000" font-family="Verdana" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="75.5576" x="996.9762" y="197.9132">Professor</text><line style="stroke:#495057;stroke-width:1;" x1="908.65" x2="1133.36" y1="206.215" y2="206.215"/><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="45.2471" x="913.65" y="223.2101">-id: int</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="94.1104" x="913.65" y="239.507">-name: string</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="172.5254" x="913.65" y="255.8039">-subjects: List&lt;Subject&gt;</text><line style="stroke:#495057;stroke-width:1;" x1="908.65" x2="1133.36" y1="263.1056" y2="263.1056"/><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="214.71" x="913.65" y="280.1007">+getSubjects(): List&lt;Subject&gt;</text></g><!--class Enrollment--><g class="entity" data-entity="Enrollment" data-source-line="64" data-uid="ent0007" id="entity_Enrollment"><rect fill="#F8F9FA" height="154.0469" rx="2.5" ry="2.5" style="stroke:#495057;stroke-width:1;" width="177.0332" x="820.48" y="815.4494"/><ellipse cx="862.0503" cy="835.5822" fill="#FFFFFF" rx="9" ry="9" style="stroke:#000000;stroke-width:1;"/><path d="M865.0191,841.2228 Q864.4409,841.5197 863.8003,841.6603 Q863.1597,841.8166 862.4566,841.8166 Q859.9566,841.8166 858.6284,840.1759 Q857.3159,838.5197 857.3159,835.3947 Q857.3159,832.2697 858.6284,830.6134 Q859.9566,828.9572 862.4566,828.9572 Q863.1597,828.9572 863.8003,829.1134 Q864.4566,829.2697 865.0191,829.5666 L865.0191,832.2853 Q864.3941,831.7072 863.8003,831.4416 Q863.2066,831.1603 862.5816,831.1603 Q861.2378,831.1603 860.5503,832.2384 Q859.8628,833.3009 859.8628,835.3947 Q859.8628,837.4884 860.5503,838.5666 Q861.2378,839.6291 862.5816,839.6291 Q863.2066,839.6291 863.8003,839.3634 Q864.3941,839.0822 865.0191,838.5041 L865.0191,841.2228 Z " fill="#000000"/><text fill="#000000" font-family="Verdana" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="49.8457" x="897.8238" y="831.588">&#171;Entity&#187;</text><text fill="#000000" font-family="Verdana" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="86.3926" x="879.5503" y="847.4132">Enrollment</text><line style="stroke:#495057;stroke-width:1;" x1="821.48" x2="996.5132" y1="855.715" y2="855.715"/><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="45.2471" x="826.48" y="872.7101">-id: int</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="99.0049" x="826.48" y="889.007">-studentId: int</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="96.2295" x="826.48" y="905.3039">-subjectId: int</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="154.5264" x="826.48" y="921.6007">-enrolledAt: DateTime</text><line style="stroke:#495057;stroke-width:1;" x1="821.48" x2="996.5132" y1="928.9025" y2="928.9025"/><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="165.0332" x="826.48" y="945.8976">+getStudent(): Student</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="159.4824" x="826.48" y="962.1945">+getSubject(): Subject</text></g><!--class Email--><g class="entity" data-entity="Email" data-source-line="74" data-uid="ent0008" id="entity_Email"><rect fill="#F8F9FA" height="105.1563" rx="2.5" ry="2.5" style="stroke:#495057;stroke-width:1;" width="215.0068" x="542.5" y="839.8994"/><ellipse cx="602.4565" cy="860.0322" fill="#FFFFFF" rx="9" ry="9" style="stroke:#000000;stroke-width:1;"/><path d="M605.4253,865.6728 Q604.8472,865.9697 604.2065,866.1103 Q603.5659,866.2666 602.8628,866.2666 Q600.3628,866.2666 599.0347,864.6259 Q597.7222,862.9697 597.7222,859.8447 Q597.7222,856.7197 599.0347,855.0634 Q600.3628,853.4072 602.8628,853.4072 Q603.5659,853.4072 604.2065,853.5634 Q604.8628,853.7197 605.4253,854.0166 L605.4253,856.7353 Q604.8003,856.1572 604.2065,855.8916 Q603.6128,855.6103 602.9878,855.6103 Q601.644,855.6103 600.9565,856.6884 Q600.269,857.7509 600.269,859.8447 Q600.269,861.9384 600.9565,863.0166 Q601.644,864.0791 602.9878,864.0791 Q603.6128,864.0791 604.2065,863.8134 Q604.8003,863.5322 605.4253,862.9541 L605.4253,865.6728 Z " fill="#000000"/><text fill="#000000" font-family="Verdana" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="91.5938" x="617.9565" y="856.038">&#171;Value Object&#187;</text><text fill="#000000" font-family="Verdana" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="43.1963" x="642.1553" y="871.8632">Email</text><line style="stroke:#495057;stroke-width:1;" x1="543.5" x2="756.5068" y1="880.165" y2="880.165"/><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="92.6475" x="548.5" y="897.1601">-value: string</text><line style="stroke:#495057;stroke-width:1;" x1="543.5" x2="756.5068" y1="904.4619" y2="904.4619"/><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" text-decoration="underline" textLength="203.0068" x="548.5" y="921.457">+create(value: string): Email</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="198.5771" x="548.5" y="937.7539">-validate(value: string): void</text></g><!--class EnrollmentDomainService--><g class="entity" data-entity="EnrollmentDomainService" data-source-line="81" data-uid="ent0009" id="entity_EnrollmentDomainService"><rect fill="#F8F9FA" height="105.1563" rx="2.5" ry="2.5" style="stroke:#495057;stroke-width:1;" width="484.5" x="387.75" y="174.0894"/><ellipse cx="523.9331" cy="194.2222" fill="#FFFFFF" rx="9" ry="9" style="stroke:#000000;stroke-width:1;"/><path d="M526.9019,199.8628 Q526.3237,200.1597 525.6831,200.3003 Q525.0425,200.4566 524.3394,200.4566 Q521.8394,200.4566 520.5112,198.8159 Q519.1987,197.1597 519.1987,194.0347 Q519.1987,190.9097 520.5112,189.2534 Q521.8394,187.5972 524.3394,187.5972 Q525.0425,187.5972 525.6831,187.7534 Q526.3394,187.9097 526.9019,188.2066 L526.9019,190.9253 Q526.2769,190.3472 525.6831,190.0816 Q525.0894,189.8003 524.4644,189.8003 Q523.1206,189.8003 522.4331,190.8784 Q521.7456,191.9409 521.7456,194.0347 Q521.7456,196.1284 522.4331,197.2066 Q523.1206,198.2691 524.4644,198.2691 Q525.0894,198.2691 525.6831,198.0034 Q526.2769,197.7222 526.9019,197.1441 L526.9019,199.8628 Z " fill="#000000"/><text fill="#000000" font-family="Verdana" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="109.541" x="588.9795" y="190.228">&#171;Domain Service&#187;</text><text fill="#000000" font-family="Verdana" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="204.6338" x="541.4331" y="206.0532">EnrollmentDomainService</text><line style="stroke:#495057;stroke-width:1;" x1="388.75" x2="871.25" y1="214.355" y2="214.355"/><line style="stroke:#495057;stroke-width:1;" x1="388.75" x2="871.25" y1="222.355" y2="222.355"/><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="433.0361" x="393.75" y="239.3501">+validateEnrollment(student: Student, subject: Subject): void</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="326.2246" x="393.75" y="255.647">-checkMaxEnrollments(student: Student): void</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="472.5" x="393.75" y="271.9439">-checkProfessorConstraint(student: Student, subject: Subject): void</text></g><!--class UserRoles--><g class="entity" data-entity="UserRoles" data-source-line="88" data-uid="ent0010" id="entity_UserRoles"><rect fill="#F8F9FA" height="88.8594" rx="2.5" ry="2.5" style="stroke:#495057;stroke-width:1;" width="115.9512" x="132.02" y="543.6594"/><ellipse cx="145.02" cy="563.7922" fill="#FFFFFF" rx="9" ry="9" style="stroke:#000000;stroke-width:1;"/><path d="M149.1294,569.7922 L141.4106,569.7922 L141.4106,557.4016 L149.1294,557.4016 L149.1294,559.5578 L143.8638,559.5578 L143.8638,562.2297 L148.6294,562.2297 L148.6294,564.3859 L143.8638,564.3859 L143.8638,567.6359 L149.1294,567.6359 L149.1294,569.7922 Z " fill="#000000"/><text fill="#000000" font-family="Verdana" font-size="12" font-style="italic" lengthAdjust="spacing" textLength="91.9512" x="155.02" y="559.798">&#171;Enumeration&#187;</text><text fill="#000000" font-family="Verdana" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="79.126" x="161.4326" y="575.6232">UserRoles</text><line style="stroke:#495057;stroke-width:1;" x1="133.02" x2="246.9712" y1="583.925" y2="583.925"/><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="44.8643" x="138.02" y="600.9201">Admin</text><text fill="#000000" font-family="Verdana" font-size="14" lengthAdjust="spacing" textLength="55.1113" x="138.02" y="617.217">Student</text><line style="stroke:#495057;stroke-width:1;" x1="133.02" x2="246.9712" y1="624.5188" y2="624.5188"/></g><g class="entity" data-entity="GMN19" data-source-line="106" data-uid="ent0020" id="entity_GMN19"><path d="M1165.95,552.8294 L1165.95,623.3606 L1376.0403,623.3606 L1376.0403,562.8294 L1366.0403,552.8294 L1165.95,552.8294" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1366.0403,552.8294 L1366.0403,562.8294 L1376.0403,562.8294 L1366.0403,552.8294" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Verdana" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="106.2979" x="1171.95" y="569.8963">Autenticaci&#243;n:</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="189.0903" x="1171.95" y="585.0291">- PBKDF2-SHA256 (100k iter)</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="127.3657" x="1171.95" y="600.1619">- JWT para sesiones</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="176.1729" x="1171.95" y="615.2947">- Recovery code para reset</text></g><g class="entity" data-entity="GMN22" data-source-line="113" data-uid="ent0023" id="entity_GMN22"><path d="M1165.92,849.6394 L1165.92,935.3034 L1348.087,935.3034 L1348.087,859.6394 L1338.087,849.6394 L1165.92,849.6394" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1338.087,849.6394 L1338.087,859.6394 L1348.087,859.6394 L1338.087,849.6394" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Verdana" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="88.2007" x="1171.92" y="866.7063">Invariantes:</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="161.167" x="1171.92" y="881.8391">- M&#225;ximo 3 inscripciones</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="139.2612" x="1171.92" y="896.9719">- Email v&#225;lido y &#250;nico</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="132.6089" x="1171.92" y="912.1047">- No repetir profesor</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="137.8647" x="1171.92" y="927.2375">- Requiere activaci&#243;n</text></g><g class="entity" data-entity="GMN25" data-source-line="121" data-uid="ent0026" id="entity_GMN25"><path d="M1382.74,864.7794 L1382.74,920.1778 L1569.2615,920.1778 L1569.2615,874.7794 L1559.2615,864.7794 L1382.74,864.7794" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1559.2615,864.7794 L1559.2615,874.7794 L1569.2615,874.7794 L1559.2615,864.7794" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Verdana" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="88.2007" x="1388.74" y="881.8463">Invariantes:</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="124.3887" x="1388.74" y="896.9791">- Cr&#233;ditos = 3 (fijo)</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="165.5215" x="1388.74" y="912.1119">- Pertenece a un profesor</text></g><g class="entity" data-entity="GMN28" data-source-line="127" data-uid="ent0029" id="entity_GMN28"><path d="M1169.03,198.9694 L1169.03,222.6694 L1134.61,226.6694 L1169.03,230.6694 L1169.03,254.3678 A0,0 0 0 0 1169.03,254.3678 L1330.9607,254.3678 A0,0 0 0 0 1330.9607,254.3678 L1330.9607,208.9694 L1320.9607,198.9694 L1169.03,198.9694 A0,0 0 0 0 1169.03,198.9694" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1320.9607,198.9694 L1320.9607,208.9694 L1330.9607,208.9694 L1320.9607,198.9694" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="91.5903" x="1175.03" y="216.0363">Cada profesor</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="140.9307" x="1175.03" y="231.1691">imparte exactamente</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="69.8242" x="1175.03" y="246.3019">2 materias</text></g><!--link User to Student--><g class="link" data-entity-1="User" data-entity-2="Student" data-source-line="94" data-uid="lnk11" id="link_User_Student"><path codeLine="94" d="M353.15,355.1494 C399.52,391.3794 449.87,430.7194 495.7,466.5294" fill="none" id="User-Student" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="74.8135" x="421" y="403.7963">vinculado a</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="24.8066" x="361.1049" y="357.7011">0..1</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="24.8066" x="463.146" y="456.9451">0..1</text></g><!--link User to UserRoles--><g class="link" data-entity-1="User" data-entity-2="UserRoles" data-source-line="95" data-uid="lnk12" id="link_User_UserRoles"><path codeLine="95" d="M190,360.9994 C190,425.3294 190,492.1694 190,537.3694" fill="none" id="User-to-UserRoles" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="190,543.3694,194,534.3694,190,538.3694,186,534.3694,190,543.3694" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="32.9443" x="191" y="403.7963">tiene</text></g><!--reverse link Student to Enrollment--><g class="link" data-entity-1="Student" data-entity-2="Enrollment" data-source-line="96" data-uid="lnk13" id="link_Student_Enrollment"><path codeLine="96" d="M785.7867,747.6229 C808.6067,774.2629 823.67,791.8494 843.78,815.3294" fill="none" id="Student-backto-Enrollment" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="777.98,738.5094,778.8455,745.6683,785.7867,747.6229,784.9212,740.4639,777.98,738.5094" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="32.9443" x="818.83" y="781.5163">tiene</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="8.271" x="776.3797" y="758.7225">1</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="24.8066" x="812.4587" y="804.335">0..3</text></g><!--reverse link Subject to Enrollment--><g class="link" data-entity-1="Subject" data-entity-2="Enrollment" data-source-line="97" data-uid="lnk14" id="link_Subject_Enrollment"><path codeLine="97" d="M934.7212,669.2499 C929.3012,716.1099 923.47,766.4394 917.85,814.9794" fill="none" id="Subject-backto-Enrollment" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="936.1,657.3294,931.4371,662.83,934.7212,669.2499,939.3841,663.7492,936.1,657.3294" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="84.7031" x="923.34" y="781.5163">inscripciones</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="8.271" x="926.9419" y="676.9564">1</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="23.0356" x="894.6159" y="804.4825">0..*</text></g><!--reverse link Professor to Subject--><g class="link" data-entity-1="Professor" data-entity-2="Subject" data-source-line="98" data-uid="lnk15" id="link_Professor_Subject"><path codeLine="98" d="M1005.5958,299.563 C991.9358,363.313 972.93,452.0594 958.64,518.7594" fill="none" id="Professor-backto-Subject" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1008.11,287.8294,1002.9417,292.8581,1005.5958,299.563,1010.7641,294.5343,1008.11,287.8294" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="50.9336" x="985.81" y="403.7963">imparte</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="8.271" x="998.2769" y="307.4125">1</text><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="8.271" x="951.7007" y="508.2694">2</text></g><!--reverse link Student to Email--><g class="link" data-entity-1="Student" data-entity-2="Email" data-source-line="99" data-uid="lnk16" id="link_Student_Email"><path codeLine="99" d="M650,750.5094 C650,786.8194 650,811.2594 650,839.4594" fill="none" id="Student-backto-Email" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="650,738.5094,646,744.5094,650,750.5094,654,744.5094,650,738.5094" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="35.8516" x="651" y="781.5163">email</text></g><!--link EnrollmentDomainService to Student--><g class="link" data-entity-1="EnrollmentDomainService" data-entity-2="Student" data-source-line="101" data-uid="lnk17" id="link_EnrollmentDomainService_Student"><path codeLine="101" d="M632.89,279.5494 C635.19,320.9594 638.2062,375.1487 641.3362,431.3187" fill="none" id="EnrollmentDomainService-to-Student" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="641.67,437.3094,645.1631,428.1008,641.3918,432.3171,637.1755,428.5459,641.67,437.3094" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="39.1016" x="641" y="403.7963">valida</text></g><!--link EnrollmentDomainService to Subject--><g class="link" data-entity-1="EnrollmentDomainService" data-entity-2="Subject" data-source-line="102" data-uid="lnk18" id="link_EnrollmentDomainService_Subject"><path codeLine="102" d="M678.6,279.6894 C717.64,321.8194 773.58,382.9494 821,437.7294 C843.64,463.8994 864.182,488.5345 885.172,514.2045" fill="none" id="EnrollmentDomainService-to-Subject" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="888.97,518.8494,886.3695,509.35,885.805,514.9786,880.1763,514.4141,888.97,518.8494" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Verdana" font-size="13" lengthAdjust="spacing" textLength="39.1016" x="791.39" y="403.7963">valida</text></g><!--link User to GMN19--><g class="link" data-entity-1="User" data-entity-2="GMN19" data-source-line="106" data-uid="lnk21" id="link_User_GMN19"><path d="M353.34,354.1194 C358.85,356.5394 364.41,358.7594 370,360.7294 C511.53,410.8794 898.9,356.1194 1045,390.7294 C1094.75,402.5194 1109.46,406.5694 1150,437.7294 C1191.94,469.9694 1228.33,519.5494 1249.96,552.6294" fill="none" id="User-GMN19" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link Student to GMN22--><g class="link" data-entity-1="Student" data-entity-2="GMN22" data-source-line="113" data-uid="lnk24" id="link_Student_GMN22"><path d="M804.31,726.2494 C812.11,730.7094 820.02,734.8094 828,738.4494 C904.97,773.5894 933.97,747.6994 1016,768.4494 C1077.19,783.9294 1093.95,786.4494 1150,815.4494 C1168.42,824.9794 1187.26,837.3394 1203.9,849.3194" fill="none" id="Student-GMN22" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link Subject to GMN25--><g class="link" data-entity-1="Subject" data-entity-2="GMN25" data-source-line="121" data-uid="lnk27" id="link_Subject_GMN25"><path d="M1021.07,657.2994 C1057.38,686.2094 1102.62,717.8994 1148,738.4494 C1203.99,763.8094 1225.63,746.3994 1283,768.4494 C1322.57,783.6594 1330.08,792.9294 1366,815.4494 C1390.68,830.9294 1417.6,849.4994 1438.63,864.4194" fill="none" id="Subject-GMN25" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--SRC=[fLRDSjis4BxhARRgeN9YgOfTjmt7LKQHhObQk_L4Jdk6YBM4c0HK05JiUlmmEVQSMwvwiIu9_e2arBeJNGHYV_3jjujTV6LN62Ei8oPanzmAkMQQnH16p9YnjLei4ekpKCcv-0jXs5IPAcddzZv2MAY8DwMlMNYxr2gHVA8YfU7hwO_JbzDnIqrfZZfN-UxboV3aXqx72ajUvy9OZ1bmXBUuf0-jqlMviGaNJ5eqq8TBnJ7AzizKBAHGdSwQJcPBX2xjK6HTUEXqW7xPUV3Ee8RJqtD9XzoFHYI4_DS7mGCGqdex2MbB5cC0TBoGIq-q9cyV2FqRPbOxn1f3jK5zFo60-rHKjCjn6XzAEtDWNdcIK2EpoCSsW3DQN8iOFIc5Po_KKaXVxfdto-LpU32MMH4-mYHpsIlYFAo5TGY3mU0Wo3ZpZD-jETbSvOezYHzIPTBRAC5RUXS5h5vROsR6dB8MK0MfgBO_ToHuaaS_YxduwOdSaqIgBn45S9x-UTiij69312dPJD-hdLhdTskXqUmX7b1IggEO09i0BgYI2NMnCzgTe2NQQsLPHFdXmfgKEp-Wvn0owPoaeWPzAsQkjBf1OvJkhOlLZBSr6USLb5w5ivqgZJ7LynEL3TfnZSBUAYidT3pDPDiaZ93fXb5RIvXS1Nahbb9M9eJNkAaNKB9uZ-6N5r3eyfDfmyDFSFpejuYA-eQxHgghR17WygEDkXHzCMxZuY_gCQTZVp7c2baXjYrg8AiQUJhAUizhusmBNFdjQuPDzCvz2ZvVxemkaxlbZh3I7a4H_SwY1E4t5tqzhaqgQfEzi_6wNjwhcHoqEn791T-bM5wCFToxuJT7lH4X4cpt3Vb67RWFi3ZGk-ccwCKvTuT5LagscXULxiKAmzjBTbUvCIq_UwpA8fyeIU4IwlyB8QS4PH9di-ij3LgJ5MCIeyuQH8s0R0YLNtw5v9w-eHT8n4AoGvDjPA-8xd0mUD4b-efLCPK8Yf1X4Z6kW5Nw_Vx8WnE05IXTpHQ6NNBoBFTttFLlKaqxxrs-zhE6jf0cr6BjGQvwHsbtr2rzaKLCpp9RnvDgkReFtAXqTEohii5Wv7EGLT9_6vG8SWFYN2gRlYgjLJ6ec-BzSReOZUb5IXqbf5niFydWzDj5se3wSFNwbxFfKN_-PdnqyZtqNWo7jo0iweDC-lCVrv2-EMakcOAGFgNKlT0Wf5dZv3IRq7PGSaWHj71KbK5GPdB3j7k7LZWkjn_lHApWk9M0WiZDzYD5gU0Ujf-b25Kc-bNHqMkqGkSp8sl-ASG_4u4QywT65lI_m2jRrpvu4xtzcyQLCa2J2detuhro35qXfLuYfOH18YiGZREqMAviUfG_eoQCCnzsNaWqx0arIvEU5jKHnDHL296fdFu3]--></g></svg>