Documente Academic
Documente Profesional
Documente Cultură
PROIECT DE DIPLOMĂ
Aplicație web pentru gestionarea donării de organe
Versiunea 2021
Diana-Ștefania Coman
Coordonator științific:
Conf. Cornel Popescu
BUCUREŞTI
Iulie 2021
UNIVERSITY POLITEHNICA OF BUCHAREST
FACULTY OF AUTOMATIC CONTROL AND COMPUTERS
COMPUTER SCIENCE DEPARTMENT
DIPLOMA PROJECT
Web application for organ donation’s management
2021 version
Diana-Ștefania Coman
Thesis advisor:
Conf. Cornel Popescu
BUCHAREST
July 2021
CUPRINS
Sinopsis ...................................................................................................................................... 3
Abstract ...................................................................................................................................... 3
1 Introducere ........................................................................................................................ 4
1.1 Context ........................................................................................................................ 4
1.2 Problema ..................................................................................................................... 4
1.3 Obiective ..................................................................................................................... 6
1.4 Structura lucrării.......................................................................................................... 6
2 Analiza și specificarea cerințelor........................................................................................ 7
3 Abordări existente ........................................................................................................... 10
4 Tehnologiile folosite......................................................................................................... 12
4.1 Baza de date .............................................................................................................. 12
4.1.1 MySQL ................................................................................................................ 12
4.2 Tehnologii folosite pe backend ................................................................................. 12
4.2.1 Java..................................................................................................................... 12
4.2.2 Spring Framework .............................................................................................. 13
4.2.3 Hibernate ........................................................................................................... 14
4.2.4 Maven ................................................................................................................ 15
4.2.5 Postman ............................................................................................................. 15
4.2.6 IntellIJ IDEA Ultimate Edition ............................................................................. 16
4.3 Tehnologii folosite pe frontend ................................................................................ 16
4.3.1 ReactJS ............................................................................................................... 16
4.3.2 Semantic UI ........................................................................................................ 17
5 Proiectarea Aplicației ....................................................................................................... 18
5.1 Baza de date .............................................................................................................. 18
5.2 Backend-ul ................................................................................................................. 21
5.2.1 Securitate, gestionarea erorilor, entități DTO ................................................... 22
5.2.2 Controller, Service, Repository, Domain............................................................ 23
5.3 Frontend-ul................................................................................................................ 27
5.3.1 Partea de autentificare ...................................................................................... 27
5.3.2 Navigarea în aplicație ca și Administrator ......................................................... 28
1
5.3.3 Navigarea în aplicație ca și Pacient .................................................................... 33
6 Detalii de implementare .................................................................................................. 35
6.1 Implementarea pe partea de backend...................................................................... 35
6.2 Implementarea pe partea de frontend ..................................................................... 42
7 Evaluarea rezultatelor ...................................................................................................... 45
8 Concluzii ........................................................................................................................... 47
9 Bibliografie ....................................................................................................................... 48
10 Anexe ............................................................................................................................... 50
2
SINOPSIS
Această lucrare tratează o problemă prezentă în cadrul instituțiilor medicale, și anume
donarea de organe. Întrucât acest proces este unul implică extrem de mulți factori, atât de
natură tehnică, cât și de natură umană, iar timpul este un element extrem de important, se
propune realizarea unei aplicații care automatizeaza procesul de potrivire a celor care
donează organe (numiți în continuare donatori) cu cei care primesc (numiți în continuare
recipienți).
ABSTRACT
This paper deals with a problem that is observed in medical institutions, namely organ
donations. As this process involves multiple factors, both on the technical and human side,
and also time is a very important element, the development of an application managing the
automation of the process of matching people who donate organs (called from now on
donors) and people who are waiting for an organ transplant (called from now on recipients)
is expected.
As a result of the application being implemented, it was noticed that the automation of this
process brings efficient results, but human implication cannot be completely erased, because
there are many impredictible factors that may appear. Even so, it can be said that obvious
improvements may be noticed, as we will see during this paper.
3
1 INTRODUCERE
1.1 Context
În ziua de azi, se remarcă din ce în ce mai multe accidente de natură medicală. Aceste
accidente au mai mult sau mai puțin impact asupra pacienților, în destule cazuri ducând chiar
la moartea acestora. Eroarea umană este una dintre principalele cauze ale acestor accidente,
precum este expus în [1] . De obicei, pe lângă vătămarea pacientului, acestea pot provoca și
daune materiale, pierderi de resurse, și pierdere de timp.
Din păcate, în medicină timpul este unul dintre cele mai importante aspecte, absolut vital în
multe situații. Până și câteva secunde pot avea un impact de multe ori hotărâtor asupra unor
evenimente din cadrul medical.
1.2 Problema
În cadrul donării de organe, există o scurtă fereastră în care se poate efectua transplantul de
un donator declarat decedat la un recipient, iar transportul organelor răpește deja destul
timp, potrivit [2].
În primul rând trebuie definit conceptul de donator decedat. Conform [3], un pacient este
declarat mort atunci când nu mai prezintă activitate celebrală. De asemenea, trebuie să existe
dovezi că moartea sa este ireversibilă. Astfel mai mult de 10 minute de inactivitate celebrală
sunt necesare pentru ca un om să fie declarat decedat, cum se poate vedea în [4].
Pentru a lua un exemplu, în cadrul donării unei inimi timpul în care aceasta poate fi donată
este de aproximativ de la 4 până la 6 ore de la declarea donatorului ca fiind mort din punct
de vedere celebral. Timpul acesta însă va include găsirea unui recipient compatibil, aflat în
capul listei de așteptare pentru o eventuală donație, si de asemenea, realizarea unor teste de
compatibilitate, aducerea pacientului care va primi organul în instituția medicală, și operația
propriu zisă. Acest proces este preluat și descris în mod simplificat din [5].
Acest interval scurt nu permite realizarea greșelilor în acest proces, erorile răpind timp prețios
și ducând deseori la expirarea timpului de viabilitate a organului respectiv, astfel încât nu mai
poate fi utilizat.
Mai jos voi prezenta timpul de valabilitate al organelor cu care am lucrat pentru această
aplicație, conform [6]:
4
Printre factorii generali după care se potrivesc organele donatorilor cu cele alea pacienților
se numără: grupa de sânge, caracteristicile de măsură ale corpului (înălțime, greutate),
severiatea stării pacientului (numită în continuare prioritate), distanța dintre instituția
medicală de care aparține donatorul și cea de care aparține pacientul care așteaptă donația,
timpul petrecut pe lista de așteptare, dacă pacientul este disponibil (dacă poate fi sau nu
contactat, dacă poate efectua transplantul de organe în timpul alocat). Informațiile
prezentate în acest paragraf sunt preluate din [7] .
Există și criterii specifice fiecărui organ în mod particular. Potrivit [8, 9], în cazul inimilor și al
plămânilor, din cauza timpului foarte redus în care se pot face transplaturile de la moartea
donatorilor, aceste organe se donează pacienților din apropierea spitalului. De asemenea,
pentru aceste organele dimensiunile corpului sunt foarte importante, întrucât trebuie să
permită plasarea acestora comportabil în cutia toracică a pacientului.
Pentru ficat, conform [9], e foarte importantă starea pacientului, deci cât de gravă este
condiția acestuia, dar și factorii geografici, datorită timpului limitat de valabilitate a organului,
și desigur toate celelalte criterii generale.
La rinichi, potrivit [10], apar și alte criterii, trebuie să existe o potrivire între limfocitele
citocotoxice între donator și pacient, dar și o potrivire între antigenii HLA. Mulți rinichi pot sta
în afara corpului până la 36 de ore, așa că zona geografică este bineînțeles mult mai largă
pentru acestia decât pentru celelalte organe care pot fi donate.
În cadrul pancreasului, parametrii sunt cei generali, însă de multe ori transplantul de pancreas
se deșfășoară concomitent cu cel de rinichi, iar în aceste cazuri este bineînteles necesar ca
condițiile pentru potrivirea rinichilor să fie îndeplinite. În cazul tranaplanturilor de rinichi –
pancreas, antigenii HLA au o importanță majoră, conform [11].
Iar nu în ultimul rând, la intestine, potrivit [7], contează ca donatorul să aibă un corp mai mic
din punct de vedere al dimensiunilor ca pacientul recipient, din cauza micșorării cavității
intestinale la cei care așteaptă un astfel de transplant. De asemenea din cauza posibilității
ridicate de apariție a unei infecții, se dorește ca grupa de sânge între donator și pacient să nu
fie doar compatibilă, ci identică. Tot pentru a preveni apariția unei infecții ulterioare, se
recomandă potrivirea pacienților care nu au fost infectați cu cytomegalovirus și/sau virusul
Epstein Barr cu donatorii neinfectați la rândul lor cu aceste două virusuri.
De menționat este și faptul că, în cadrul pacienților care prezintă nevoia unui singur rinichi, a
unui singur plămăn, dar și a celor care au nevoie doar de o parte de ficat, sau doar de o parte
pancreas există posibilitatea donării de organe din partea unei persoane în viață, de obicei o
cunostiință a pacientului, iar potrivirea între cei doi se va face pe baza unor serii de teste,
potrivit [12].
De multe ori, problemele provin din potrivirile greșite realizate de cadrele medicale, în urma
citirii greșite a unor date, a unor calcule realizate greșit sau a ignorării unor situații particulare
5
specifice anumitor pacienți doar. Până când greseala este identificată, iar organul este
redistribuit, acesta poate să nu mai fie viabil, cum s-a menționat și mai sus.
1.3 Obiective
Prin această aplicație de gestionare a donării de organe, se dorește în primul rând
automatizarea procesului de realizare a potrivirii între donatorii de organe și pacienții de pe
lista de așteptare. De asemenea, se vor gestiona și transplanturi specifice (cele în care o
persoană în viață, donează un organ nevital – precum un rinichi, unei persoane cu care are un
fel de relație de rudenie, sau de amiciție).
Pentru potrivirile realizate după moartea donatorului (cele care nu implică o potrivire
specifică), se vor lua în considerare acei parametri prezentați în secțiunea anterioară a lucrării,
și cei generali, și cei specifici fiecărui organ în parte.
6
2 ANALIZA ȘI SPECIFICAREA CERINȚELOR
Am realizat un poll pe marginea subiectului licenței mele, pentru a clarifica care sunt grijile
care pot apărea în cazul donării de organe, și specific în cazul automatizării acestui proces, cu
scopul de avea mai multe perspective și a îmbunătății viziunea mea asupra contextului în care
se va forma aplicația.
La întrebarea „Doriți să deveniți donator de organe după moarte?” s-au obținut următoarele
procente:
Astfel se remarcă cum majoritatea oamenilor (66.6%) doresc să devină donatori de organe,
25% nu s-au hotărât încă, iar 8.3% au răspuns „Nu” la întrebarea de mai sus.
După cum se poate observa, în general îngrijorările înclină spre eficiența procesului și
corectitudinea acestuia. Bineînteles, oamenii își doresc ca organele să ajungă la pacienți fără
părtinire, fără bias între acestia. De asemenea, procesul trebuie sa fie cât mai eficient posibil,
pentru a asigura maximizarea beneficiilor asupra persoanei care primește organele, dar și a
7
procesului prin care corpul pacientului va accepta organul donat după transplant, în
săptămânile sau chiar lunile după acesta.
Următoarea întrebare din pollul meu se referă la cum ar prefera audiența să se deșfăsoare
procesul de potrivire între donatori și pacienții de pe lista de așteptare.
Ultima întrebare din chestionar face referire la motivarea preferinței pentru alegerea
anterioară. Cei care au ales ca gestionarea să fie făcută de o aplicație de gestiune au prezentat
următoarele motive:
Motivațiile celor care au ales gestiunea să se realizeze de către cadrele medicale sunt
următoarele:
Un cadru medical poate avea o anume intuiție care îi lipseste unei aplicații
Pot aparea factori particulari de risc, specifici unei anumite situații doar
Pacienții nu pot fi de încredere să-și introducă datele fără greșeli
Există situații limită în care gândirea critică poate fi vitală
8
În urma părerilor primite, am stabilit că este cel mai bine să construiesc o aplicație care să
mixeze cele două componente oarecum, astfel încât să existe avantaja pe ambele părți.
Aplicația va avea următoarele cerințe:
9
3 ABORDĂRI EXISTENTE
Există multiple aplicații în mediul online care se ocupă cu gestionarea donării de organe, însă
majoritatea dintre acestea sunt mai mult aplicații de înregistrare a propriei persoane pentru
a-ți done organele, iar potrivirile vor fi făcute intern de cadrele medicale după deces, fără
vreun proces de automatizare.
Am găsit, conform [13], un instrument care realizează potriviri între donatori și pacienții care
sunt pe lista de așteptare pentru a primi un ficat, care se adresează atât donatorilor care își
donează organele după moarte, cât și celor care vor să-și doneze o parte din ficat cât sunt
încă în viață, unor cunostiințe.
Din păcate nu am putut găsi o aplicație disponibilă publicului larg care să facă în mod
automatizat potrivirile între donatori și cei de pe lista de așteptare care așteaptă să primească
un organ. Este posibil firește să existe astfel de automatizări la nivel de spital, în mod intern,
însă ele nu sunt accesibile publicului larg pentru a face o comparație completă. De asemenea,
nu găsesc nimic care să reprezinte o rețea de instituții medicale care este conectată în
gestiunea acestui proces într-un mod automat.
Cel mai aproape produs de ceea ce doresc eu să creez, de ceea ce aplicația mea vrea să
reprezinte este realizată de fundația MOHAN1:
1
https://www.mohanfoundation.org/mobile-apps/organ-donation-helpline-app.asp
10
Mai jos urmează un tabel cu funcționalitățoșe oferite de aplicația MOHAN, în comparație cu
aplicația realizată pentru această lucrare:
Astfel, se poate observa cum aplicația deja existentă studiată este mai mult o aplicație cu
funcție de informare și de înrestrare a donatorilor de organe pentru a fi adăagați într-o bază
de date și gestionați intern.
Se poate observa cum aplicația propusă aduce multe elemente noi prin automatizarea
procesului de donare de organe, și extinde la nivel național funcționalitățile prezentate mai
sus.
11
4 TEHNOLOGIILE FOLOSITE
În implementarea programului s-au folosit multiple tehnologii, alese dupa diverse criterii,
după cum vor fi specificate în continuare.
Am ales această variantă deoarece, conform [14], este o tehnologie open source, ceea ce face
debugging-ul și utilizarea funcționalităților să lucreze la nivel maxim. Poți vedea sursa și să faci
schimbări cum îți dorești. De asemenea, din punct de vedere al securității, MySQL oferă un
strat de protecție pentru a proteja datele, se pot seta permisiuni de accesare, iar parole sunt
encriptate cu algoritmi specifici.
Scalabilitatea este de asemenea un factor important, MySQL poate rula pe diferite servere și
poate scala atât orizontal, cât și vertical. Astfel rularea aplicației pe mai multe servere se poate
face relativ facil. De asemenea, prin sistemul de cache la citirea datelor și prin folosirea
indexilor la cantități mari de date, se garanteză o performanță mărită a aplicației.
Nu în ultimul rând, MySQL este disponibil pe cele mai multe sisteme de operare populare
(Windows, Linux, OS2, Solaris, etc.), și beneficiază de API-uri suport pentru toate limbajele de
programare majore, ceea ce îl face ușor de integrat.
Am ales acest limbaj pentru aplicația mea deoarece, potrivit [15], este ușor de învățat, fiind
un limbaj care derivează din C/C++ și are o sintaxă relativ simplă. De asemenea, este un
tehnologie, care se poate scrie o data și va rula mereu, pe orice sistem, cum menționam și
puțin mai sus. Acest lucru în face o alegere bună pentru foarte multe domenii, printre care:
dezvoltarea de aplicații mobile, dezvoltarea de aplicații web, aplicații care necesită
conectarea la baze de date, aplicații de networking si multe altele.
12
Componenta securitate are o importanță uriașă. Java este unul dintre cele mai securizate
limbaje de programare. Are multe API-uri, instrumente de securitate, și un set larg de
protocoale, mecanisme și algoritmi de securitate, punând accent pe criptografie, utilizarea de
chei publice, acces securizat la resurse, procesul de autentificare și de asemenea, comunicare
securizată.
Dar cel mai mare avantaj al limbajului Java sunt bibliotecile și framework-urile în număr
extrem de mare care extind funționalitățile deja existente. Există biblioteci pentru logging,
parsare JSON, parsare XML, parsare HTML, biblioteci criptografice, biblioteci pentru testarea
aplicației etc. Aceste biblioteci fac dezvoltarea aplicațiilor mult mai rapidă și mai eficientă. Iar
framework-urile duc această eficienă la un nivel și mai ridicat.
Un framework reprezintă un pachet software care oferă anumite funționalități generice, fiind
deja implementate, și care pot fi modificate și dezvoltate în continuare de dezvoltatorul
software. Practic se construiesc funcționalități software dezvoltate, având o bază deja
existentă. Printre cele mai folosite framework-uri se numără Spring, Apache Struts, Hibernate,
Grails etc.
Am ales pentru aplicația mea să folosesc framework-ul Spring, așa cum va fi prezentat în
continuare.
În dezvoltarea aplicației mele am folosit mai multe module Spring (de exemplu Core, Beans,
Security, Data JPA, Web etc.). Voi prezenta în continuare cele mai importante și mai utilizate
dintre ele și motivele pentru care am ales să lucrez cu acestea.
13
Spring Web Services
Spring Web Services este un modul Spring care se ocupă cu înleșnirea dezvoltării de aplicații
în domeniul Web. El asigură practic că regulile de best practice sunt respectate, practic le face
mult mai ușor de realizat. Aderă la politica SOAP, permițând crearea de servicii web flexibile,
prin manipularea XML-urilor.
De asemenea, acesta prezintă suport pentru tehnologiile de tip REST sau MVC, folosite
intensiv în dezvoltarea aplicației mele.
MVC (Model – View – Controller) este un design pattern foarte popular, care realizează
separarea datelor de interfața aplicației într-un mod foarte eficient. La bază folosește
principiul de reutilizare a codului, și are un impact destul de mare asupra timpului de
dezvoltare al aplicației.
REST (Representational State Transfer) este un protocol bazat pe HTTP, care realizează
conexiuni între utilizator și serverul aplicației. Este foarte popular în dezvoltarea de aplicații
web, deoarece oferă suport pentru operațiile CRUD într-un mod simplificat, fără reguli stricte
de limitare (precum serviciul SOAP).
Modulul Spring Data JPA face parte din familia Spring Data. El asigură lucrul cu partea de date
ale aplicației și ajută la dezvoltarea repository-urilor. Face mai ușoară dezvoltarea de aplicații
Spring care lucrează cu tehnologii de accesare a datelor.
Printre principalele avantaje ale utilizării acestui framework se numără faptul că face codul
mult mai ușor de scris și de înteles. Cel care foloselte acest modul Spring trebuie doar să scrie
interfețele de lucru cu bazele de date, să descrie metode costum dacă sunt necesare, scriind
doar cererile sub forma de limbaj specific bazei de date, și Spring va pune la dispoziție
implementarea în mod automat.
Cu ajutorul său, se pot astfel construi aplicații cu foarte multe căi de acces către date, într-un
mod clar și concis, și în plus, decuplat de restul aplicației. Astfel, se pot realiza foarte ușor
modificări în acest context.
4.2.3 Hibernate
Hibernate este un framework Java, utilizat în dezvoltarea de aplicații care comunică cu bazele
de date, simplificând mult acest proces. Framework-ul ales dezvoltă API-ul pus la dispoziție
de Spring Data JPA.
14
Nu în ultimul rând un aspect important în reprezintă faptul că este o implementare a JPA. Este
necesar pentru a utilliza Spring Data JPA, fără a defini propriu zis modulele necesare, și a
realiza conexiunea între obiectele create în aplicația în limbajul Java și tabelele din baza de
date MySQL.
4.2.4 Maven
Apache Maven este un utilitare care ajută la contrucția și gestionarea proiectelor software.
Este folosit în principal pentru proiectele în limbajul Java, dar poate fi utilizat și cu alte limbaje
de programare. Ajută în procesul de build al aplicației, dar mai ales și în integrarea
dependențelor acesteia.
Maven se utilizează prin fișiere de tipul XML, cu numele de POM (Project Object Manager).
Fișierul POM contine informații despre modulele și dependențele proiectului, dar și alte
informații folosite la generarea documentației acestuia, inclusiv autorul, drepturile, licența și
alte metadate de acest fel. Maven descarcă în mod dinamic bibliotecile Java și pluggin-urile
Maven specificate in POM, din repositoarele sale, și apoi le stochează local, integrându-le în
proiect în mod automat.
Am ales să folosesc Maven în partea de backend a aplicaței mele deoarece aduce diferite
beneficii, cum ar fi implicarea în procesul de build al aplicațiiei. Maven construiește practic
executabile de diferite tipuri (de exemplu JAR sau WAR) care vor fi rulate apoi. De asemenea
Maven este destul de ușor de utilizat, doar se specifică ce este necesar în fișierul POM și
procesul de configurare se desfășoară automat.
4.2.5 Postman
Postman este o platformă realizată pentru dezvoltarea și mentenența de API-uri, în special pe
partea de testare a aplicațiilor, testare atât manuală, cât și automată.
Este util și pentru alte caracteristici în dezvoltarea de produse software, cum ar fi: crearea și
publicarea de documentație pentru o aplicație, în formatul limbaj mașină, procesul de
monotorizare al aplicației, prin verificarea performanțelor sale la un interval de timp
prestabilit, și, destul de important și în general motivul pentru care este ales față de alte
produse asemănătoare de pe piață, posibilitatea de a partaja spațiul de lucru cu alți utilizatori
ai aplicației. Acest lucru este folositor bineînteles, în cadrul proiectelor mari, realizate în
echipe cu mulți oameni.
15
Am ales să folosesc acest instrument pentru partea de testare a aplicației mele. Motivația
constă din faptul că se pot testa ușor cererile venite sub format REST, și Postman oferă diferite
funcționalități care înlesnesc tot acest proces, cum ar fi: posibilitatea de salvare a cererilor în
diferite directoare, pentru o bună organizare a testării, funcția de a seta anumite teste să se
repete la un interval de timp, vizualizarea cu ușurință a rezultatelor și a erorilor, într-un limbaj
ușor de citit, care de asemenea poate fi costumizat, și de asemenea, design-ul care face
aplicația ușor de folosit.
Pentru dezvoltarea aplicației mele, am folosit versiunea Ultimate a IntellIJ. Motivația pentru
care am ales să lucrez în această platforma este reprezentată de numeroasele beneficii pe
care IntellIJ le oferă, precum: debugging automat integrat, conectarea automată cu bazele de
date, integrarea Maven în mod facil, asistență în scrierea codului, suport pentru sistemele de
versionare si integrare.
De asemenea, sugestiile oferite de platformă chiar în timpul scrierii codului, cât și analiza în
amănunt a acestuia, reprezintă un mare avantaj, care înlesnește și precipitează procesul de
dezvoltare.
Am ales să folosesc ReactJS pentru aplicația mea deoarece folosește JavaScript, limbaj cu care
eram deja familiară, și care are multe avantaje în dezvoltarea de aplicații frontend, precum
comunicarea asincronă, viteza mare, simplitate și versabilitate.
Pe lângă asta, conform [17], ReactJS este extrem de ușor de învățat, existând documentații și
foarte multe tutoriale online pentru a te familizariza cu această bibliotecă. De asemenea
foloseste componente reutilizabile, lucru care înleșneste și precipită foarte mult procesul de
dezvoltare al front-end-ului aplicației, dar face și accesibilă conectarea cu backendul, prin
intermediul bibliotecii de JavaScript Axios.
În plus, ReactJS are multe biblioteci adiționale care pot fi adăugate și facilitează scrierea
aplicației.
16
4.3.2 Semantic UI
Semantic UI este un framework ReactJS care aduce imbunatățiri prin simplicarea scrierii
elementelor și integrarea lor în aplicație. Am ales să folosesc acest framework deoarece face
codul mult mai clar și mentenanța și debugging-ul mult mai ușoare.
În plus, înlenește și dezvoltarea aplicației, obținând elemente ușor de modificat într-un timp
mic. Este ușor de utilizat și se poate învăța foarte ușor.
Un alt avantaj major al acestui framework este că oferă elemente cu caracteristici incorporate
pentru dispozitivele mobile.
Am ales să utilizez în proiectul meu două componente ale framework-ului Semantic UI. Prima
dintre ele este reprezentată de Semantic-UI-React, pentru definirea mai ușoară a
componentelor necesare în paginile aplicației. A doua componentă folosită este Semantic-UI-
CSS, utilizată pentru înlesnirea procesului de stilizare a elemetelor definite cu Semantic-UI-
React, dar și cele de tip HTML.
17
5 PROIECTAREA APLICAȚIEI
18
Figura 5.2 Baza de date a aplicației (Partea 2)
După cum se poate vedea mai sus, cele sașe tabele modelate p3entru dezvoltarea proiectului
meu sunt:
Tabela Organizations – folosită pentru a reține instituțiile medicale în care se vor desfășura
donările de organe și transplanturile. Are ca și câmpuri id-ul, numele instituției, orașul în care
se află, județul și regiunea. Regiunea se va completa automat în funcției de județul din care
face parte instituția. Am hotărât să împart județele României în patru regiuni, pentru a se
putea desfășura donări de organe în interiorul unei regiuni, pentru cele care au o viabilitate
mai mare, în timpul în care s-ar putea face donația luând în considerare distanța geografică.
Cele 4 regiuni sunt:
Regiunea 1, alcătuită din județele Alba, Arad, Bihor, Satu Mare, Maramureș, Sălaj, Cluj,
Bistrița-Năsăud, Mureș, Sibiu
Regiunea 2, alcătuită din județele Suceava, Botoșani, Iași, Neamț, Harghita, Vaslui,
Galați, Covasna, Bacău, Vrancea
Regiunea 3, alcătuită din județele Timiș, Caraș-Severin, Hunedoara, Golj, Dolj, Vâlcea,
Argeș, Mehedinți, Olt, Teleorman
Regiunea 4, alcătuită din județele Brașov, Prahova, Dâmbovița, Buzău, Brăila, Ilfov,
București, Tulcea, Constanța, Ialomița, Călărași, Giurgiu
Tabela Users – folosită pentru a reține informații despre utilizatorii aplicației. Conține
informațiile specifice, precum id, username, parola (care va fi encriptată de către backend).
Token-ul va fi generat la autentificare și stocat în aceasta tabelă. De asemenea rolul user-ului
19
va fi stocat aici, dar și rolul pentru care aplică un utilizator, în momentul in care se
înregistrează. Aceste două câmpuri pot avea valorea „Admin” sau „Patient”. Următoarele
câmpuri sunt Patient_role si Patient_id. Patient_Role poate avea valorile „None” (pentru
Admin) și „Donor” sau „Recipient” (pentru Patient). Patient_Id este o cheie străină către
tabela Patients, și face referință la detaliile pacientului. Apoi vin alte detalii specifice userului,
precum numele, prenumele și emailul. Ultimele două câmpuri sunt Active și Organization_Id.
Active arată dacă contul utilizatorului este activ sau nu, iar Organization_Id semnalizează
instituția medicală din care acesta face parte.
Tabela Blacklist_token este folosită pentru a evidenția token-urile care sunt încă valide, dar
au fost dezactivate de utilizator prin procesul de delogare din aplicație, pentru a le menține
inactive până la expirare. Tabela conține si câmpuL „Created_at”, cu format de dată, pentru
a reține data la care s-a adăugat intrarea în tabelă, deoarece se dorește să se steargă regulat
token-urile vechi din tabelă.
Tabela Patients conține detaliile pacienților înregistrați ca donori sau ca recipienți. Conține
tipul pacientului (Donor/Recipient), informații precum vârsta, prioriatatea (in cazul pațienților
de tip Recipient), grupa de sânge, înălțimea și greutatea. Mai conține și statusul, câmp specific
donatorilor și care poate avea valorile „Dead” sau „Alive”. Câmpul „Date_added” face referire
la data adăugării pentru Recipienți și la ce data morții pentru Donorii cu statusul „Dead”.
Câmpul Organization_Id face referire la organizația de care aparține pacientul. Apoi urmează
câmpurile specifice organelor (Heart, Left_lung, Right_lung, Liver, Left_kidney, Right_kidney,
Pancreata și Intestines). Aceste valori sunt de tip Boolean. În cazul în care Donorul poate dona
acel organ sau Recipientul are nevoie de acel organ, aceste câmpuri vor avea valoarea True,
altfel vor avea valoarea False. Câmpurile CMV_Negative și EBM_Negative fac referire la niște
parametrii specifice potrivirilor în care sunt implicați rinichii, și au și ele valori booleene. În
ultimul rând mai există și câmpul Not_Check_Region, tot un Boolean. Acest câmp face referire
la verificarea pentru potriviri pe toatâ regiunea de care aparține spitalul. După un timp,
organele valabile pentru transplantul pe regiune (rinichii, intestinele) nu vor mai putea donate
decât în același județ din cauza distanței geografice.
Tabela Matches conține informații despre potrivirile realizate între pacienții de pe lista de
așteptare și donatori. Câmpurile Recipient_id si Donor_id fac referire la Id-ul userilor implicați
în potrivire. De asemenea, Organization_id reprezintă instituția medicală asociată cu cel care
va primi organul, și în care se va face de obicei transplantul. Se mai rețin de asemenea și
username-ul celor doi pacienți implicați, din motive de accesibilitate a datelor. Câmpul
Confrimed_match ne arată dacă potrivirea este aprobată de cadrele medicale.
Următoarele câmpuri sunt specifice potrivirilor care implică rinichii. Câmpul Is_kidney ne
spune așadar dacă rinichii sunt sau nu implicați in acest proces. Hla_antigens_match și
Negative_lymphocytotoxic_crossmatch sunt câmpuri care simbolizează teste care se fac după
potrivire, pentru a confirma transplantul de rinichi, printre alți factori. Următoarele câmpiri
sunt Transplant_Date, care reprezintă data transplantului, și Transplant_done, care ne arată
20
dacă transplantul s-a finalizat. Urmează cele opt câmpuri care arată pe ce organe s-a facut
potrivirea între recipient și donor (Is_heart, Is_left_lung, Is_right_lung, Is_liver, Is_pancreata,
Is_right_kidney, Is_left_kidney,Is_intestines). Acestea sunt valori booleene, care pot lua
valoarea True dacă organul e implicat în proces și False, în caz contrar. Ultimul câmp din tabelă
este Is_specific și reprezintă dacă potrivirea s-a făcut specific, pe baza unei rude sau
cunostiințe, sau pacientul va primi organul/organele necesare, de la un donator necunoscut,
în urma algoritmului de potrivire pentru acest caz.
Tabela Blacklist conține potriviri între donatori și pacienți de pe lista de așteptare pentru
primirea unui organ care nu s-au înfăptuit. În unele cazuri pot exista motive pentru care după
potrivire, aceasta să nu poată fi confirmată. Motivele pot varia: un test poate arăta de fapt
invaliditatea unui organ, cei doi pot să nu fie compatibili în urma unor teste de laborator
făcute între cei doi, recipientul să nu poate fi contactat sau să nu poată ajunge la spital în timp
util penru transplant. Astfel procesul nu poate fi contiunuat, iar în urma stergerii potrivirii se
vor adăuga date în această tabelă, pentru a reține ca este nepotrivită. Acest lucru împiedică
la scanarea pentru o nouă potrivire, să se facă aceeași ca cea de dinainte.
5.2 Backend-ul
Partea de backend a aplicației este realizată în limbajul Java și cu ajutorul framework-ului
Spring. Aceasta urmează la rândul ei anumite patten-uri, pentru a asigura o funcționare
performantă a aplicației, după cum va urma mai jos.
Se poate vedea cum aplicația este împărțită în mai multe clase și pachete, legate unele de
altele prin anumite funcții.
21
5.2.1 Securitate, gestionarea erorilor, entități DTO
În primul rând se poate cum există un layer de securitate, reprezentat de clasa
WebSecurityConfig și pachetul security. Clasa WebSecurityConfig adaugă header-ul CORS
aplicației noastre, asigurând acces limitat la căile aplicației, cât și setarea căilor care se vor
accesa liber, fără permsiuni de logare. Pentru accesarea căilor securizarte se va folosi JWT
Token.
Pachetul security conține două fișiere, astfel:
Pachetul Dto (Data Transfer Object) se asigură de transportul datelor din frontend in backend
prin Body-ul cererilor, definind acele entități. Este folosit în general pentru a nu trimite
parolele care parametrii, ci în Body-ul cererii.
După cum este menționat și mai sus, m-am conentrat pe cererile care implică parola ca și
parametru, și anume: autentificare, înregistrare și resetarea parolei.
Următorul pachet este pachetul error, în care s-a definit comportamentul aplicației în cadrul
apariției de comportament neprevăzut, în cadrul cererilor cu parametrii gresiți sau care
22
cauzează probleme. Toate acestea sunt făcute din punct de vedere HTTP, deci răspunsurile se
vor trimite direct pe server.
23
Se observă cum această legătură între entitățile din figura 9 merge în direcția Controller ->
Service -> Repository -> Domain.
Controller-ul este o entitate cu rolul de a acționa ca o poartă între cererile HTTP primite de la
front-end și funcționalitățile backend-lui. Preia cererea, o corelează cu una din metodele
declarate, apelează mai departe controller-ul și așteaptă un răspuns de la acesta, pe care în
va trimite mai departe către front-end.
UserController, care primește cereri legate de utilizatorii aplicației (în afară de cele de
autentificare și înregistrare, care au fost descrise la partea de securitate)
Match Controller, care preia cereri legate de potrivirile dintre donatori și recipienți
OrganizationController, care primește request-uri în legătură cu gestionarea
instituțiilor medicale
Operațiile sunt vizibile în figura 5.7, în principal sunt operații de creare, modificare, stergere
și afișare a datelor, dar și lucruri mai specifice, precum aprovarea unui user și adăugarea
rolului său, confirmarea unei potriviri, delogarea din aplicație a utilizatorului sau adăugarea
detaliilor specifice pacienților.
Controller-ul va întoarce către frontend un răspuns de tip HTTP, fie cu detaliile trimise de
Service în format JSON, fie în cazul în care se produce vreo eroare sau vreo excepție, se va
întoarce aceasta, cu codul său specific, și un mesaj personalizat, pentru ca front-end-ul să
gestioneze apoi situația respectivă.
24
Figura 5.8 Clasele de tip Service
Clasele de tip Service se ocupa cu logica de business a aplicației, el este cel care se ocupă cu
modificarea propriu zisă a datelor aplicației sau cu apelul de Repository-uri, care la rândul lor
au acces direct la date.
Există 5 interfețe care au fost mai departe extinse în clase care implementează metodele
definite în acestea, și o clasă numită EmailConfiguration. EmailConfiguration și EmailService
definesc setările de mesagerie prin email ale aplicației și personalizare formatului sub care
vor fi trimise emailurile.
OrganizationService și MatchService definesc metode care vor prelucra datele din tabelele
Match și Organization, ca și modifcări, stergeri sau alte operații precum aprobarea potrivirilor.
Clasa UserService prezintă metode care vor avea impact pe tabelele Users și Patients,
realizând multe operații care vor avea impact asupra utilizatorilor aplicației, precum crearea
userilor, stergerea, resetarea parolei, schimbarea emailului, updatarea detaliilor specifice
userilor și a celor specifice pacienților, aprobarea conturilor și ala mai departe.
25
Figura 5.9 Clasele de tip Repository
Repository-urile au rolul de executa operațiile pe baza de date. Ele extind interfața JPA a
framework-ului Spring, și metodele definite ori sunt deja implemetate de JPA, ori cu Query-
uri definite și personalizate.
Există câte o interfață de tip Repository pentru fiecare tabelă din baza de date, definind astfel
operații simple pe baza de date, care vor fi apelate din clasele de tip Service.
26
Pachetul domain prezintă entitățile definite pentru a reprezenta tabele din baza de date a
aplicației, și pentru a lucra în unele situații direct pe acestea.
Interfețele de tip Repository și clasele din pachetul domain formează împreună patternul DAO
(Data Access Object), care, așa cum sugerează și numele, lucrează direct pe baza de date a
aplicației.
5.3 Frontend-ul
Partea de frontend a aplicației mele prezintă mai multe pagini legate între ele.
Login este pagina cu care se deschide aplicația. Există câmpuri în care poți introduce
username-ul și parola, iar în caz că sunt corecte, vei fi condus către pagina MyAccount a
aplicației, care e și homepage-ul pentru utilizatorii logați. De acolo sau din orice altă pagină în
care utilizatorul se află fiind logat, poate accesa meniul aplicației și să apese opțiunea de
logout, fiind condus înapoi la pagina de login.
În pagina de login mai există două butoane: unul care va redirecționa către pagina de register,
unde se pot intreduce date pentru a te înregistra în aplicației. Celelalt buton duce către pagina
în care poți cere resetarea parolei: trebuie să se introducă emailul cu care este asociat contul
utilizatorului în aplicației, iar acesta va primi un mesaj pe adresa de email cu un link pentru
resetarea parolei.
27
Pagina MyAccount prezintă opțiuni diferite în funcției de rolul utilizatorului în aplcației,
administratorii vor avea acces la anumite resurse, iar pacienții la altele. Această pagină va
conține informații despre utilizatorul curent.
Iar pentru cei de tip Patient, pe lângă aceste lucruri, va mai conține și detaliile specifice
pacienților, precum vârstă, status, prioritate, grupă de sânge, ce tip de pacient este (donor
sau recipient), înălțime, greutate, etc..
28
Figura 5.13 Meniul aplicației
Se poate vedea cum, accesând opțiunile meniului, se pot accesa paginile Institutions List,
Users List. Matches List, sau se poate realiza delogarea, ca și utilizator cu drepturi de
administrator. Trebuie menționat că meniul este valabil în fiecare pagină a aplicației, în care
utilizatorul este logat, dar pentru simplificarea graficelor, nu-l voi mai reprezenta în
următoarele pagini.
De asemenea, apăsând pe iconița de Home din oricare pagină a aplicației va atrage după sine
redirecționarea către pagina de MyAccount, fapt care, din nou, nu va fi reprezentat pentru
simplificarea graficelor realizate.
Pe lângă opțiunile oferite de meniu, în pagina MyAccount se mai poate accesa opțiunea
Change Email, care va redirecționa aplicația către această opțiune, în care utilizatorul își poate
schimba emailul, completând un formular care cere parola contului și noua adresă de email
pe care utilizatorul dorește să o asocieze cu contul său.
29
Mai jos se vor detalia cum sunt construite paginile care pot fi accesate din meniul aplicației,
cu excepția paginii de logout, care a fost deja prezentată mai sus.
Figura 5.15 arată paginile ce pot fi accesate din pagina numită Institutions List. În Institutions
List, se pot vedea instituțiile înregistrate în aplicație. Există și un buton pentru a crea o
instituție nouă, iar fiecare instituției din listă prezintă butoane de stergere a instituției, lucru
care se va întâmpla fără redirecționări, printr-un pop-up în cadrul paginii curente, dar și de
vizualizare a acelei instituției, de editare sau de vizualizare a utilizatorilor înregistrați în acea
instituției. Aceste opțiuni vor redirecționa aplicația către alte pagini după cum se poate vedea
mai sus, cu funcționalitățile promise.
Pagina Create Institution conține un formular în care se vor scrie numele instiituției, orașul
din care face parte și județul, urmând ca regiunea să fie adăugată în partea de backend a
aplicației, în mod automat.
Pagina View Institution prezintă informații precum: ID-ul instituției (este necesar pentru
înregistrarea în aplicație a utilizatorilor noi), numele instituției, orașul și județul acesteia,
precum și regiunea sa.
Pagina Edit Institution permite editarea numelui, orașului și județului instituției medicale. Și
aici regiunea se va seta automat, în backend-ul aplicației.
Institution Users List conține o listă cu utilizatorii înregistrați în acea instituție. Pe această
pagină putem apăsa pe butonul Add Admin, și să introducem un admistrator nou în acea
instituție, introducând email, username, nume și prenume urmând ca acesta să folosească
funcția de „Forgot Password” pentru a-și seta parola în apllicație. De asemenea în această
30
pagină administratorul poate apăsa pe utiliatori pentru a le vedea detaliile, fără a avea însă
drept de editare sau stergere la o instituție de care nu aparține.
Users List este o pagină în care există lista cu utilizatorii care fac parte din instituția medicală
a administratorului. Utilizatorii prezintă următoarele detalii în cadrul listei: nume, username,
rolul, si dacă sunt sau nu activi în aplicație.
Astfel fiecare utilizator din listă poate avea următoarele butoane: buton de aprobare a
contului (pentru utilizatorii care nu sunt în activi), buton de stergere al utilizatorului, și buton
de editare a detaliilor acestuia, pentru utilizatorii cu rol de pacient. Primele două acțiuni se
desfășoară în aceeași pagină, fără redirectionare, iar ultima dintre ele va conduce spre pagina
de editare, în care se pot adăuga și modifica detalii specifice pacientului, precum grupă de
sânge, vârstă, data morții pentru donatorii decedați, data adăugării pentru pacienți de tip
recipient, prioritatea, organele de care pacientul are nevoie sau pe care le donează, etc.
Apăsând pe oricare din utilizatorii din lista dată va duce la o pagină în care se vor putea
vizualiza detaliile acestuia, atât pentru admistratori cât și pentru pacienți. De aici se poate
alege, pentru cei din urmă, să se selecteze una dintre cele două opțiuni: Add Specific Match
și Search for Matches. Prima variantă va redirecționa administratorul către o pagină în care
se cere completarea numelui de utilizatorul al donatorului sau a recipientului cu care se va
face potrivirea, și care firește va avea tipul opus față de utilizatorul selectat pentru acest
proces. De notat este că, în cadrul pacienților recipient se acceptă doar donatorii în viață în
acest caz, care doresc să doneze specific către acel pacient un organ nevital (de exemplu: o
cunostiință sau o rudă).
31
Opțiunea Search for Matches va conduce la o pagină unde se pot căuta și forma potriviri prin
intermdiul unui algoritm care va ține cont de toți factorii specifici unui astfel de proces.
Potrivirile formate vor putea fi vizualizate de administrator, accesând opțiunea Matches din
meniul aplicației. Această opțiune nu va ține cont de donatorii înca în viață care sunt
înregistrați în aplicație.
De asemenea, se poate accesa opțiunea de a se crea utilizatori, atât de tip pacienți, cât și de
tip administrator. Pentru pacienți există un formular care cere numele, prenumele,
username-ul și rolul. Pentru cei de tip administrator, se va mai cere și adresa de email, pentru
a se putea seta parola prin intermediul acesteia. În cadrul pacienților, crearea unui cont de un
administrator se va face în general pentru donatorii decedați sau pacienții în stare foarte
gravă, care nu-și pot crea singuri un cont la acel moment.
În pagina cu lista de potriviri se pot vedea potrivirile în care sunt implicați pacienții instituției
medicale din care aparține administratorul logat în aplicație. În listă fiecare potrivire are
anumite detalii incluse, precum numele de utilizator al celor doi pacienți implicați și dacă a
primit confirmarea din partea cadrelor medicale.
32
Într-ul final, apăsând pe una din potrivirile din listă, va conduce la o pagină în care se vor putea
vedea detaliile potrivirii, fiind cele care au fost menționate și în cadrul editării acesteia, și, în
plus, numele de utilizator al pacienților implicați.
În primul rând, meniul pentru pacienți este mult mai restrâns, așa cum se poate vedea în
Figura 5.18.
Astfel, se poate observa cum din pagina de Home a aplicației se pot accesa doar 3 opțiune:
schimbarea mailului și logout, care sunt general valabile, și opțiunea de a-ți vedea propriile
potrivire.
33
Astfel, Pagina de MyAccount pentru utilizatorii de tip Pacient va conține atât informații
specifice de cont, precum email, sau username, cât și informații legate de rolul avut, precum
grupa de sânge, vârstă, status, înălțime, greutate, etc..
Din această pagină, există opțiunea de schimbare a emailului. Ca și în cadrul administratorului,
dacă această opțiune este selectată, va conduce la o pagină cu un fomular cerând parola și
noul cont dorit de utilizator.
Din meniu, din cele două opțiuni se poate selecta cea de logout, care va produce delogarea
din aplicație și redirecționarea către pagina de login, din nou identic cu ce se întâmplă cu
administratorul în acest caz.
Ultima opțiune disponibilă din meniu, My Matches, va conduce utilizatorul spre o pagină în
care se găseste o listă cu potrivirile curente ale acestuia. Din listă se va vedea dacă potrivirea
a fost sau nu confirmată încă. Apăsând pe o potrivire, pacientul este condus către pagina în
care poate vedea detaliile acesteia, precum data la care se va face transplantul, detaliile
specifice pentru rinichi, în cadrul în care acestiu sunt implicați, etc.
Prin urmare, se poate afirma încă o dată ca uilizatorii cu rol de pacient au mult mai puține
drepturi în cadrul aplicației. Acest lucru produce securizarea aplicaței dintr-un anumit punct
de vedere, asigurând că nimic nu se paote întâmpla fără ca persoane cu expertiză medicală să
fie implicate, dar în același timp refuzându-le și acestora accesul deplin la procesele din
spatele aplicației, pentru a evita anumite conflicte.
34
6 DETALII DE IMPLEMENTARE
În proiectarea aplicației s-au întâlnit dificultăți în unele cazuri, atât în cazul dezvoltării pe
partea de backend, cât și a celei pe frontend. De asemenea, există firește unele aspecte
notabile, care se cer a fi menționate, atât pentru a întelege legica din spatele unor lucruri, cât
și pentru a pune în evidență și a întelege mai bine proiectul ca un total.
Mai sus sunt prezentate anumite metode din clasa UserRepository, spre exemplificarea felului
în care sunt făcute operațiile direct pe baza de date, folosind adnotația Query și scriind cereri
direct în limbajul MySQL. Spre exemplu, în metoda findWaitingUsersByOrganizationId se va
întoarce o listă cu toți utilizatorii aplicației (toate coloanele din tabele Users) dintr-o
organizație specificată prin cadrul unui parametru dat, care așteaptă să le fie activat contul,
nefiind încă activi în aplicație.
Interesant este și cum a fost adăugat un filtru de securitate în aplicație, folosind CORS. CORS
(Cross-Origin Resource Sharing) este un mecanism prin care se poate controla și limita accesul
la unele date ale unei aplicații. CORS a fost folosit în cadrul aplicației pentru a permite doar
utilizatorilor înregistrați să acceseze majoritatea elementelor din cadrul resurselor aplicației.
COSR a fost introdus în aplicația mea utilizând partea de Spring Web Security din cadrul
framework-ului Spring.
35
Figura 6.2 Utilizarea CORS
36
Layerul de JWTAuthorizationFilter, prezentat în figura 6.3, asigură verificarea, validarea și
integritatea cererilor venite de pe server, ținând cont și de procesul de delogare din aplicație.
Crearea tokenurilor se vor face la logarea userilor în aplicației, în cazul în care credințialele
introduse sunt corecte.
Cum este expus și în figura 6.4, token-urile au nevoie de o cheie secretă, de o cheie de
identificare, de permisiunile utilizatorului, cât și de username-ul acestuia, de data la care se
generează, de un algoritm de generare (în cadrul aplicației mele se folosește algoritmul
HS512) , și de o dată de expirare. Toate aceste elemente fac ca acesta să fie aproape imposibil
de spart prin brute-force, token-ul fiind foarte lung și folosind encriptări. În cadrul aplicației
mele, un token va fi valabil timp de o oră.
O altă problemă apărută în cadrul folosirii token-rilor face referire la procesul de delogare din
aplicație al utilizatorului. Prin felul în care token-urile sunt folosite în mod universal, în
momentul în care un utilizator se deloghează din aplicație, acesta doar nu mai are acces la
token-ul cu care folosea elementele dorite. Însă token-ul este încă valid pentru o perioadă de
timp, ele nu pot fi expirate manual, ci vor expira doar atunci când trece perioada lor de
valabilitate. Acest lucru nu este foarte sigur, deoarece cineva poate accesa acel token în timp
util, în special prin sistemul de cache al unui browser web.
Aici intervine tabela Blacklist_Token, în care vor fi reținute token-urile utilizatorilor care s-au
delogat din aplicației, împreună cu dara creării acestora, pentru o perioadă de timp.
37
Figura 6.5 Verificarea token-urilor
Această metoda de a verifica token-urile mai ridica o problemă totuși. Dacă presupunem că
mulți utilizatori vor utiliza aplicația, vor exista multe cereri de delogare, prin urmare vor exista
foarte multe intrări în tabela Blacklist_Token, lucru care va îngreuna enorm operațiile pe
această tabelă, respectiv în cadrul procesului de autentificare, unde se verifică daca tokenul
este prezent în tabelă. Astfel, trebuie ca datele să fie curătate la un anumit interval, mai ales
pentru că după o oră token-ul va expira de la sine, și nu va mai fi nevoie de prezența sa în
tabelă.
Astfel, se remarcă cum la fiecare 24 de ore, se sterg toate datele din tabelă, fără cele din
ultima oră, considerând ca acelea ar putea conține încă token-uri valabile.
38
În primul rând, utilizatorul trebuie sa facă cerere să primească prin email un link de resetare
a parolei. Un cont de gmail este configurat în aplicație, setat pentru a trimite mesaje.
În figura 6.7 se poate observa cum, cu ajutorul serviciului JavaMailSender, se pot seta
parametrii emailului care se dorește trimis (destinatar, expeditor, subiect, și corpul mesajului)
și se poate trimite emailul propriu-zis.
Precum se poate vedea în Figura 6.8, trimiterea emailului se realizează pe un thread nou.
Acest lucru se întamplă deoarece, întrucât serverele de gmail pot fi mai mult sau mai puțin
ocupate, procesul poate dura destul de mult, chiar mai mult de 20 secunde, și nu se dorește
blocarea aplicației din această cauză.
39
În final, după ce utilizatorul primește pe mail linkul de resetare al parolei, accesându-l va fi
trimis într-o pagină în care își poate introduce noua parolă, și confirmarea acesteia. Procesul
din spate este ilustrat în figura 6.9.
Se observă cum mai întăi se obține numele de utilizatorul a celui care a făcut cererea, apoi se
verifică dacă username-ul este unul valid. După aceasta se validează dacă parola are formatul
necesar (parola trebuie să conțină minim 8 caractere, dintre care o literă mare, o literă mică,
un număr și un caracter special. Apoi se verifică dacă parola corespunde cu introducerea sa
încă o dată, în câmpul alocat pentru asta.
În cazul în care una din aceste verificări nu se validează, se trimite către frontend un mesaj de
eroare în format HTTP (în acest caz un BadRequestException). Aceste erori se vor trimite
peste tot în aplicație unde apar neregului. BadRequestException este o eroare mai generală,
existând și AuthentificationException (pentru probleme de autentificare) și EntityNotFound
(pentru când nu se pot întoarce datele cerute).
40
Deci se va crea o eroare de tip „Bad Request” cu statusul UNAUTHORIZED și mesajul dat ca
parametru.
În cazul în care nu există erori, controllerul va trimite către frontend un răspuns în format
JSON, cu statusul 200 (OK).
Precum este exemplificat în figura 6.11, cu ajutorul bibiliotecii GSON, se va converti răspunsul
trimis de service cererii din Controller, în obiect String cu formatul JSON, și se va întoarce către
către server.
Probabil cea mai provocatoare parte a realizării aplicației a fost reprezentată de realizarea
algoritmului de potrivire între donori și recipienți, ținând cont de toți factorii evidențiați în
capitolele anterioare.
În Anexa 1, este prezentată modalitatea cum se realizează căutarea de potriviri pentru donori.
Se ține cont de poziția geografică, căutând mai întâi în aceeși instituție, apoi în același oraș, și
dacă organele care au rămas o permit, în același județ și regiune. Se ordonează recipienții în
funcție de prioritate și data adăugării, iar apoi se verifică celelaltă criterii comparând
donatorul cu recipientul, cu funcția isMatch, prezentată în Anexa 3.
În Anexa 2, se află metoda similară pentru recipienți, se ține cont din nou de poziția
geografică, și se verifică celelalte aspecte cu funcția isMatch.
Anexa 3 prezintă funcția isMatch, în care se verifică dacă donorul are toate organele necesare
recipientului, și celelalte aspecte, precum greutate, grupă de sânge, înălțime, detaliile
specifice rinichilor, etc.
41
Problema ridicată de această abordare a provenit din faptul că, în momentul în care nu se
poate confirma o potrivire, în urma stergerii acesteia și reîncercarea căutării de potriviri, de
cele mai multe ori se obține din nou un match între aceeași utilizatori.
Pentru a rezolva acest lucru s-a creat o tabelă Blacklist, și la stergerea potrivirilor, se va reține
aici perechea de utilizatori pentru a se evita acest caz, cum se poate vedea în figura 6.13.
Tabela va fi golită pe parcursul plecării recipientilor din organizația, pentru a evita
aglomerarea cu timpul.
În primul rând, validarea datelor introduce în formulare s-a făcut în funcții, prin erori și
avertizări afișate apoi pe câmpuri.
42
În figura 6.14 se poate observa funcția de salvare a datelor introduce la schimbarea adresei
de email. Se fac verificări pentru a avea date concrete, și se afișează utilizatorului prin
variabilele error.
În continuare în figura 6.15, este vizibil cum frontend-ul gestionează erorile semnalate de
backend, afișând din nou erorile pe câmpurile formularului, pentru a putea fi gestionate de
utilizatorul care încearcă să își schimbe emailul.
Un alt lucru de menționat este procesul de delogare din aplicație. Pe lângă momentul în care
se deloghează utilizatorul din butonul de logout, la fiecare cerere, cum se poate vedea și în
exemplul de mai sus, se verifică dacă există vreo eroare și dacă aceasta provine de la faptul
că token-ul a expirat.
43
În figura 6.16 e reprezentat procesul de logout, se observă cum se face cerere de logout, apoi
se redirecționează aplicația către pagina de login.
O altă problemă apărută pe partea de frontend a fost la afișarea listelor. Mai exact, în
momentul în care există foarte multe elemente de afișat într-o listă, durează mult până se
găsește intrarea căutată. De aceea s-a decis să se introducă un filtru în listele care pot ajunge
să conțină foarte multe intrări.
Ca exemplu, așa cum este vizibil și în figura 6.17, pentru listele cu utilizatori, se pot filtra
rezultatele după nume de utilizator, status, rol, nume și prenume. Aceste lucruri pot fi utile
atât atunci când se caută un user anume, cât și atunci când se caută un grup: de exemplu când
se dorește să se verifice utilizatorii care așteaptă aprobarea de a utiliza aplicația.
Per total, pe frontend au contat mult micile detalii, pentru a realiza o interfață cât mai clară
și ușor de utilizat.
44
7 EVALUAREA REZULTATELOR
Testarea aplicației s-a realizat în trei feluri: în Postman și Java (pentru backend) și direct din
browserul web (pentru frontend).
În cazul testării în Postman, procesul a fost unul manual, s-au testat cererile care se fac de la
frontend către backend, în diferite forme, pentru a vedea dacă toate excepțiile ce pot apărea
pe parcurs sunt bine gestionate.
După cum se vede în exemplul din figura 7.1, în Postman se pot testa nu doar cazurile bune,
dar și cele care ridică probleme, precum încercarea de logare cu un nume de utilizator care
nu se află în baza de date.
În cadrul testării automate realizate în Java, s-au definit o serie de teste la nivelul claselor de
tip Service, pentru a verifica diferite funcționalități.
45
Asa cum se poate vedea în figura 7.2, testarea în Java a permis de asemenea și verificarea
cazurilor bune, dar și a excepțiilor.
Pe frontend testarea s-a făcut din browser, așa cum s-a explicat și mai sus, pentru a permite
interacțiunea cu interfața și a verifica factorii care contează în acest domeniu: responsive-
ness-ul, portabilitatea etc.
Per total, se poate spune că aplicația își îndeplinește cerințele stabilite la începutul acestei
lucrări: este un sistem închis, în care utilizatorii obișnuiți au foarte puține drepturi, totul fiind
administrat de utilizatorii cu rol privilegiat.
De asemenea, aplicația reusește să creeze potriviri între pacienții de tip recipient și cei de tip
donor, atât în mod specific, dar și, cel mai important, în mod automat pentru potrivirile la
care este necesară o căutare în sistem.
Există procese automate de mentenență (de exemplu, curățarea datelor vechi din baza de
date a aplicației) care permin aplicației să aibă o funcționare optimă și îmbunătățesc
performața acesteia.
Din păcate, deoarece nu există sisteme de acest gen pe piață (sau cel puțin, nu disponibile
publicului larg) nu este posibilă realizarea unei comparații un sistem asemănător.
46
8 CONCLUZII
Digitalizarea lumii se întâmplă fără îndoială constant, aproape fiecare domeniu de activittate
umană încearcă să automatizeze și să scaleze procesele, acolo unde există această
posibilitate.
Pe plan medical, mai ales în România, există mii de astfel de posibilități, în special ținând cont
de precipitarea cu care astfel de lucruri se întâmplă de obicei.
Prin felul în care gestionează atât combinația între expertiza umană și avantajele lumii
digitale, acest proiect prezintă automatizare acolo unde este necesar, dar și prelucrare a
indivizilor umani pentru a lansa un proces cu beneficii multiple.
Sistemul închis și felul în care aplicația își gestionează utilizatorii este de asemenea un factor
de luat în seamă, potrivit în opinia mea pentru un astfel de proces.
În concluzie, consider că aplicația de față îndeplinește scopul pentru care a fost creată: o
încercare de gestionare a donării de organe în instituțiile medicale. Firește, există multe
lucruri care pot fi îmbunătățite, dar, în opiinia mea, lucrul cel mai important este că dovedește
că, și în domeniul medical, există posibilitatea ca oamenii să colaboreze cu mașinile la un nivel
cât mai înalt.
47
9 BIBLIOGRAFIE
[1] M. A. Makari și M. Daniel, „Medical error—the third leading cause of death in the US,”
The BMJ, vol. 353, nr. 8056, pp. 21-39, 2016.
[2] H. K. S. Saidi RF, „Challenges of organ shortage for transplantation: solutions and
opportunities,” Int J Organ Transplant Med, vol. 5, nr. 3, pp. 87-96, 2014.
[3] R. Beyar, „Challenges in Organ Transplantation,” Rambam Maimonides Med J, vol. 2, nr.
2, 2011.
[5] E. M. Hsich, „Matching the Market for Heart Transplantation,” Circulation: Heart Failure,
vol. 9, nr. 4, pp. 951-964, 2016.
[6] N. Lanesse, „How Long Can Organs Stay Outside the Body Before Being Transplanted? -
LiveScience,” 29 12 2019. [Interactiv]. Available: https://www.livescience.com/how-
long-can-donated-organs-last-before-transplant.html. [Accesat 13 6 2021].
[8] H. C. e. al., „Donor heart and lung procurement: A consensus statement,” The Journal
Of Heart And Lung Transplantation, vol. 39, nr. 6, pp. 501-517, 2021.
48
[13] R. B. O. F. J. D. R. J. D. P. J. B. Halldorson, „D-MELD, a Simple Predictor of Post Liver
Transplant Mortality for Optimization of Donor/Recipient Matching,” American Journal
Of Transplantation, vol. 9, nr. 2, pp. 318-326, 2009.
[15] A. Davies, „Why Should You Use Java for Your Backend Infrastructure? -
DevTeam.Space,” 24 9 2020. [Interactiv]. Available:
https://www.devteam.space/blog/why-should-you-use-java-for-your-backend-
infrastructure/. [Accesat 24 6 2021].
[16] K. Chandrakant, „Why Choose Spring as Your Java Framework? - Baeldung,” 13 12 2019.
[Interactiv]. Available: https://www.baeldung.com/spring-why-to-choose. [Accesat 10 6
2021].
[17] N. Pandit, „What and Why React.js - C-SharpCorner,” 10 2 2021. [Interactiv]. Available:
https://www.c-sharpcorner.com/article/what-and-why-reactjs/. [Accesat 10 6 2021].
49
10 ANEXE
Anexa 1 – Potrivirile pentru donori
50
51
Anexa 2: Potrivirile pentru recipienți
52
53
Anexa 3: Verificări între donor și recipient
54
Anexa 4: Verificarea grupei de sânge
55
56