4. Arhitektura i dizajn sustava - FranBistrovic/QuantumHotel GitHub Wiki
QuantumHotel sustav koristi klijent-poslužitelj (client-server) arhitektonski stil. Prema tome koristi mrežne protokole u ulozi konektora (HTTP, SQL upiti) da bi povezao komponente (klijenta i poslužitelja). Ograničenje ovakvog sustava su da nema međusobne komunikacije između klijenta, već se sva komunikacija izvodi s poslužiteljem. Ovaj arhitektonski stil omogućuje centralizaciju logike i podataka (u bazi) te je pogodan za razvoj web i mobilnih aplikacija. Također, primjenom ovog modela osigurana je skalabilnost i fleksibilnost sustava i jasna podjela odgovornosti među timovima.
Glavni podsustavi QuantumHotel aplikacije uključuju:
- Autentifikacijski podsustav: Upravljanje registracijom i prijavom uz mogućnost prijave Google OAuth2 servisom ili korisničkim podacima
- Podsustav za upravljanje profilima: Omogućuje promjenu korisničkih podataka, brisanje i stvaranje korisničkih računa
- Podsustav za hotelsko poslovanje: Omogućuje pregled i upravljanje smještajnih jedinica, njihovih kategorija i dodatnih usluga, upravljanje i stvaranje rezervacija te upravljanje ostalim funkcionalnostima ključnim za hotelsko poslovanje
- Podsustav za hotelsku statistiku: Omogućuje uvid o statistici noćenja, strukturi gostiju i dodatnim uslugama te omogućuje preuzimanje tih podataka u zadanim formatima
Za implementaciju hotelskog informacijskog sustava odabran je cloud pristup s naglaskom na korištenje kontejnera pomoću Dockera. Ovakav pristup omogućava visoku dostupnost, sigurnost, skalabilnost i fleksibilnost potrebnu za moderno hotelsko poslovanje. Spremišta podataka U svrhu pohranjivanja podataka sustav će koristiti PostgreSQL relacijsku bazu podataka. Ovaj pristup je jednostavan i pogodan za razvojne potrebe sustava te omogućuje učinkovitu pohranu strukturiranih podataka poput podataka o korisnicima, kategorijama smještajnih jedinica i rezervacijama.
Komunikacija između klijenta i poslužitelja odvijat će se korištenjem HTTP protokola. Ovaj protokol omogućuje jednostavan prijenos podataka korištenjem GET, POST, PUT i DELETE metoda te osigurava stabilnost pri velikom broju zahtjeva. Također su moguća proširenja u slučaju potrebe zaštite podataka (npr. HTTPS protokol).
Korisnik započinje interakciju sa sustavom putem registracije ili prijave. Nakon što se korisnik prijavi u sustav, ovisno o svojoj ulozi (gost, djelatnik, admin) ima različite ovlasti. Generalno korisnik može vidjeti lokaciju hotela, članke o dodatnim aktivnostima u hotelu, pretraživati dostupne smještanje jedinice i stvarati rezervacije. Svi potrebni podaci za ove interakcije unutar sustava šalju se preko HTTP protokola uz odgovarajuće komuniciranje s PostgreSQL bazom podataka.
Tehnički zahtjevi za sustav QuantumHotel uključuju podršku za operativne sustave na poslužiteljskoj strani (Linux, Windows Server) i klijentskoj strani (Windows, macOS, iOS, Android). Server treba imati dovoljno RAM memorije (preporučeno najmanje 16 GB) i brzi procesor (barem osam jezgre) za podršku istovremenog rada više korisnika. Za PostgreSQL bazu podataka i aplikacijski server potrebno je osigurati diskovni prostor od minimalno 100 GB za pohranu podataka o rezervacijama, gostima, sobama i statistici hotela. Za optimalne performanse potrebna je stabilna i dovoljno brza mreža.
Odabir klijent-poslužiteljskog arhitektonskog stila za sustav QuantumHotel temelji se na potrebi za centraliziranim upravljanjem podacima i logikom sustava, kao i na zahtjevu za dostupnošću putem različitih uređaja (računalo, tablet, mobilni uređaj). Ovaj arhitektonski pristup omogućuje jasnu podjelu odgovornosti između poslužiteljske i klijentske strane, što pojednostavljuje održavanje, razvoj i nadogradnju sustava. Poslužiteljski dio zadužen je za poslovnu logiku, autentifikaciju korisnika, upravljanje podacima i komunikaciju s bazom PostgreSQL, dok klijentski omogućuje responzivno i intuitivno korisničko sučelje. Korištenje Docker kontejnera dodatno doprinosi prenosivosti i skalabilnosti sustava, što omogućuje jednostavno pokretanje i održavanje u različitim okruženjima, uključujući cloud infrastrukturu.
Pri odabiru arhitekture uzeti su u obzir sljedeći čimbenici:
- Skalabilnost i fleksibilnost: Klijent-poslužitelj model i kontejnerizacija omogućuju horizontalno i vertikalno skaliranje sustava, čime se lako može prilagoditi povećanom broju korisnika i zahtjevima hotela.
- Održavanje i proširivost: Jasna podjela između klijenta, poslužitelja i baze podataka omogućuje neovisne nadogradnje bez prekida rada sustava.
- Sigurnost: Centralizirano upravljanje autentifikacijom putem OAuth2 (Google prijava) i sigurno spremanje u bazi podataka osiguravaju zaštitu osjetljivih korisničkih podataka.
- Performanse i dostupnost: Arhitektura omogućuje optimalno iskorištavanje resursa, dok kontejnerizacija i cloud pristup osiguravaju visoku dostupnost (99% vremena rada).
Prilikom oblikovanja sustava primijenjeni su ključni principi dobrog arhitektonskog dizajna:
- Visoka kohezija: Svaki podsustav (autentifikacija, profili, hotelsko poslovanje, statistika) obavlja jasno definiranu funkciju unutar svog područja odgovornosti.
- Niska povezanost: Komunikacija među podsustavima ostvaruje se putem standardiziranih REST API poziva, što omogućuje njihovu neovisnost i jednostavnu zamjenu ili nadogradnju.
- Fleksibilnost: Sustav je dizajniran modularno, što omogućuje dodavanje novih funkcionalnosti (npr. integracija s dodatnim servisima) bez promjene osnovne strukture.
- Sigurnost: Implementacijom kontrola pristupa i autentifikacijskih mehanizama osigurava se zaštita podataka i sprječava neautorizirani pristup.
Sustav je organiziran u nekoliko ključnih komponenti na višoj razini apstrakcije koje su zajednički odgovorne za funkcionalnost i ispravan rad sustava
QuantumHotel sustav organiziran je u klijent-poslužitelj arhitekturi koja omogućava centralizaciju logike i podataka te fleksibilnost i skalabilnost sustava. Podaci se spremaju i obrađuju na poslužitelju, a klijenti uslugama pristupaju preko vlastitih uređaja. Klijentski dio sustava predstavlja interaktivna aplikacija u kojima korisnici mogu rezervirati smještaj u hotelu uz podrazumijevane funkcionalnosti (prijava, upravljanje računom, pregled sadržaj i dostupnih smještaja…) Poslužiteljski dio zadužen je za poslovnu logiku aplikacije (hotelsko poslovanje), obrađuje zahtjeve klijenata i komunicira s bazom podataka u svrhu upravljanja podacima.
QuantumHotel sustav koristi relacijsku bazu podataka PostgreSQL koja omogućava pohranu svih potrebnih podataka za ispravan rad sustava. Baza sadrži podatke o korisnicima, smještajnim jedinicama, statistici hotela i ostale potrebne informacije. Relacijska baza nudi prednosti poput dosljednosti podataka i nudi mogućnosti kreiranja složenijih upita. Također, korištenje PostgreSQL sustava široko je podržan pristup koji komplimentira ostale komponente sustava (Spring Boot).
Zbog potreba izvoza dokumenata (o statistici) u različite formate i slanja potvrda o rezervacijama korisnicima, sustav će dinamički generirati dokumente bez lokalnog pohranjivanja na disk. Ovaj pristup je jednostavniji za održavanje i u skladu s kontejnerizacijom (Docker).
Korisničko sučelje sustava QuantumHotel implementirano je kao web aplikacija dostupna putem internetskog preglednika. Sučelje je responzivno i omogućuje pristup s različitih uređaja (mobitel, tablet, laptop, stolno računalo). Sama aplikacija pruža intuitivno sučelje za korištenje glavnih usluga sustava poput prijave/registracije, pretraživanja dostupnih smještaja te stvaranja rezervacija.
Aplikacija QuantumHotel organizirana je prema višeslojnoj arhitekturi, koja osigurava modularnost, lakše održavanje i mogućnost proširenja sustava. Glavne komponente sustava čine frontend sloj (klijentski dio) i backend sloj (poslužiteljski dio), koji međusobno komuniciraju putem REST API sučelja.
Njegova glavna uloga je omogućiti korisnicima intuitivno, responzivno i moderno grafičko korisničko sučelje za korištenje aplikacije. Prema tome korisnicima pruža sve već navedene usluge pri čemu komunicira s backendom putem HTTP zahtjeva. Važno je napomenuti da sam frontend sloj nema izravan pristup bazi podataka već svi zahtjevi prolaze kroz backend sloj (osigurava validaciju i sigurnost). Frontend sloj u svrhu implementacije koristi React i Next.js tehnologije.
Ovaj sloj zadužen je za obradu korisničkih zahtjeva, svu poslovnu logiku sustava i za rad s podacima (komunicira s bazom podataka). Implementira funkcionalnosti autentifikacije i autorizacije korisnika, upravljanja korisničkim profilima, dohvat podataka o smještajnim jedinicama, unos novih kategorija smještajnih jedinica, uvid u statistiku i ostale ključne funkcionalnosti. Backend sloj razvijen je s pomoću tehnologija Spring Boot okvira pri čemu s pomoću REST API-ja komunicira s frontend slojem. Organiziranost sloja definirana je MVC (Model – View – Controller) arhitekturom koja je objašnjena u nastavku.
Arhitektura sustava QuantumHotel temelji se na MVC (Model–View–Controller) obrascu, koji omogućuje jasno odvajanje podataka, poslovne logike i korisničkog sučelja. Ovakav pristup olakšava razvoj, održavanje i nadogradnju aplikacije jer se promjene u jednom sloju ne odražavaju izravno na druge.
Model sloj predstavlja temelj aplikacije, zadužen za upravljanje podacima i poslovnim pravilima. U ovom sloju definiraju se klase koje odgovaraju entitetima u bazi podataka primjerice korisnik, rezervacija, smještajna jedinica, kategorija i dodatna usluga. Model komunicira s bazom podataka (PostgreSQL) te omogućuje dohvaćanje, pohranu i ažuriranje informacija na siguran i strukturiran način. Osim pristupa podacima, model može sadržavati i osnovnu poslovnu logiku koja se odnosi na te entitete (npr. provjera dostupnosti smještaja ili izračun cijene rezervacije).
View sloj odgovoran je za vizualni prikaz podataka korisniku i interakciju s aplikacijom. U sustavu QuantumHotel ulogu View sloja preuzima frontend aplikacija razvijena s pomoću React/Next.js tehnologija. Frontend dohvaća podatke putem REST API-ja koje pruža backend te ih prikazuje u obliku responzivnog web sučelja prilagođenog različitim uređajima. Zadaća ovog sloja je prikazati podatke na jasan i intuitivan način, omogućujući korisnicima pregled dostupnih soba, stvaranje rezervacija i pregled profila, bez potrebe za izravnim kontaktom s poslužiteljem ili bazom podataka.
Controller sloj djeluje kao posrednik između pogleda i modela. On prima korisničke zahtjeve (npr. prijava, rezervacija, dohvat statistike) s frontend aplikacije, prosljeđuje ih odgovarajućim servisima u model sloju te nakon obrade vraća rezultate natrag View sloju. QuantumHotel sustav kontrolere implementira unutar Spring Boot okvira i definira API rute koje frontend koristi. Ovakva struktura omogućuje jasnu razdvojenost poslovne logike od prezentacijskog sloja, što znatno pojednostavljuje testiranje i nadogradnju aplikacije.
Slika 4.1: Prikaz MVC modela
Baza podataka predstavlja temelj našeg sustava jer nam omogućuje strukturiranu pohranu, dodavanje, promjenu i pretraživanje podataka te kontrolirani pristup. Temeljni element naše baze je entitet koji posjeduje skup svojstava ili atribute koji ga karakteriziraju. U našoj bazi definirali smo 12 atributa za potrebe uspješnog vođenja evidencije poslovanja i upravljanja podacima. Ti atributi su redom:
- Users
- Guest
- Employee
- AccommodationCategory
- AccommodationUnit
- Reservation
- Amenities
- Parking
- OtherAmenities
- Articles
- Pictures
- FAQ
Osim entiteta, u bazi podataka postoji i tablica:
- ReservationAmenity
koja je nastala zbog n:n veze pa nije entitet, ali jest pomoćna tablica.
Ovaj entitet sadržava sve važne informacije o korisniku aplikacije. Sadrži sljedeće atribute: usr_id, usr_first_name, usr_last_name, usr_email, usr_password, usr_image_url, usr_enabled, usr_account_lock, usr_provider_id, usr_provider, usr_phone_number, usr_date_of_birth, usr_gender, usr_city, usr_role, usr_created, usr_last_updated, usr_last_update_id. Ovaj entitet ima One-to-one vezu s entitetom Guest i One-to-one vezu s entitetom Employee, obje veze preko atributa usr_id. Tu se zapravo radi o specijalizaciji entiteta Users. Također entitet Users ima One-to-many vezu sa samim sobom preko atributa usr_last_update_id zbog uređivanja profila. Sve stvari koje se pohranjuju u bazi, gost i zaposlenik rade odvojeno.
| Atribut | Tip podataka | Opis Varijable |
|---|---|---|
| usr_id | INT | Jedinstveni identifikator korisnika (primarni ključ) |
| usr_first_name | VARCHAR(100) | Ime korisnika |
| usr_last_name | VARCHAR(100) | Prezime korisnika |
| usr_email | VARCHAR(100) | E-mail adresa korisnika |
| usr_password | VARCHAR(255) | Korisnikova lozinka |
| usr_image_url | VARCHAR(100) | Slika profila korisnika |
| usr_enabled | BOOLEAN | Deaktiviran korisnički račun |
| usr_account_lock | BOOLEAN | Zaključavanje u slučaju krive lozinke |
| usr_provider_id | VARCHAR(128) | Jedinstveni identifikator OAuth pružatelja |
| usr_provider | VARCHAR(128) | Naziv OAuth pružatelja |
| usr_phone_number | VARCHAR(50) | Broj mobitela korisnika |
| usr_date_of_birth | DATE | Datum rođenja korisnika |
| usr_gender | VARCHAR(16) | Spol korisnika |
| usr_city | VARCHAR(128) | Grad u kojem korisnik stanuje |
| usr_role | VARCHAR(50) | Uloga (Gost, Djelatnik, Administrator/Vlasnik) |
| usr_created | TIMESTAMP | Trenutak kreiranja korisničkog profila |
| usr_last_updated | TIMESTAMP | Trenutak zadnjeg ažuriranja korisničkog profila |
| usr_last_update_id | INT | Identifikator korisnika koji je učinio zadnju promjenu na profilu (Strani ključ prema Users) |
Ovaj entitet sadrži sve bitne informacije o gostima hotela. Guest ima sljedeće atribute: gst_id, usr_id. Guest ima One-to-one vez s entitetom Users preko atributa usr_id (specijalizacija). Također ima One-to-many identifikacijsku vezu sa slabim entitetom Reservartion. Veza je ostvarena preko atributa gst_id i taj atribut ulazi je identifikacijski u entitetu Reservation.
| Atribut | Tip podataka | Opis Varijable |
|---|---|---|
| gst_id | INT | Jedinstveni identifikator gosta (primarni ključ) |
| usr_id | INT | Jedinstveni identifikator korisnika (strani ključ prema Users) |
Ovaj entitet sadrži sve bitne informacije o gostu hotela koje bi trebale biti evidentirane. Uz atribute User-a, Employee ima i sljedeće atribute: emp_id, emp_position, emp_wage, emp_username, emp_date_from, emp_date_to, usr_id. Employee ima One-to-one vezu sa entitetom Users preko usr_id. Ovaj entitet također ima i One-to-many veze s entitetima Pictures, FAQ, Articles i Amenities preko atributa usr_id gdje se bilježi koji je djelatnik unio neku od ovih stavki. Posljednja veza je One-to-many veza sa atributom Reservation gdje se bilježi koji djelatnik obrađuje rezervaciju.
| Atribut | Tip podataka | Opis Varijable |
|---|---|---|
| emp_id | INT | Jedinstveni identifikator zaposlenika(primarni ključ) |
| emp_position | VARCHAR(50) | Radno mjesto u hotelu |
| emp_wage | NUMERIC(10,5) | Satnica, plaća |
| emp_username | VARCHAR(50) | Dodijeljeno korisničko ime |
| emp_date_from | DATE | Datum zaposlenja |
| emp_date_to | DATE | Datum kraja radnog odnosa |
| usr_id | INT | Jedinstveni identifikator korisnika (strani ključ prema Users) |
Ovaj entitet sadrži sve bitne informacije o kategorijama smještaja u hotelu. Ima sljedeće atribute: cat_id, cat_name, cat_units_number, cat_people_num, cat_twin_beds, cat_check_in, cat_check_out cat_price. Entitet ima One-to-many vezu s entitetom AccommodationUnit preko atributa cat_id i One-to-many vezu s entitetom Reservation također preko atributa cat_id.
| Atribut | Tip podataka | Opis Varijable |
|---|---|---|
| cat_id | INT | Jedinstveni identifikator kategorije smještaja (primarni ključ) |
| cat_name | VARCHAR(100) | Naziv kategorije |
| cat_units_number | INT | Broj soba koje se nude u kategoriji |
| cat_people_num | INT | Broj ljudi koje soba može primiti |
| cat_twin_beds | BOOLEAN | True = soba sadrži odvojene krevete, False = soba sadrži bračni krevet |
| cat_checkin | TIME | Vrijeme do kojeg se gost može preuzeti ključeve |
| cat_checkout | TIME | Vrijeme do kojeg gost mora napustiti sobu |
| cat_price | NUMERIC(10,5) | Cijena jednog noćenja |
Ovaj entitet sadrži sve bitne informacije o pojedinim smještajnim jedinicama. Ima sljedeće atribute: un_id, un_number, un_floor, un_status, cat_id. Entiet ima Many-to-one vezu s entitetom AccommodationCategory preko atributa cat_id te One-to-many vezu sa entitetom Reservation preko atributa un_id.
| Atribut | Tip podataka | Opis Varijable |
|---|---|---|
| un_id | INT | Jedinstveni identifikator smještajne jedinice (primarni ključ) |
| un_number | INT | Broj sobe |
| un_floor | INT | Kat na kojem se soba nalazi |
| un_status | BOOLEAN | Dostupnost sobe ( false -> soba se ne nudi jer se npr. preuređuje) |
| cat_id | INT | Jedinstveni identifikator kategorije smještaja (strani ključ prema AcommodationCategoriy) |
Ovo je slabi entitet koji ovisi isključivo o gostu i trenutku kada je kreiran zahtjev. Ima sljedeće atribute: res_id, res_date_from, res_date_to, res_created, res_processed, res_check_in, res_check_out, res_status, gst_id, emp_id, cat_id, un_id. Ovaj entitet zbog uvođenja res_id nije identifikacijski slab, ali mora imati jedinstvenu kombinaciju (gst_id, res_created). Ovaj entitet ima Many-to-one veze sa entitetima Guest, Employee, AccommodationCategory i AccommodationUnit i to redom atributima gst_id, emp_id, cat_id te un_id. Također ima i Many-to-many vezu sa entitetom Amenities preko atributa res_id, a ta veza je kasnije detaljnije objašnjena.
| Atribut | Tip podataka | Opis Varijable |
|---|---|---|
| res_id | INT | Jedinstveni identifikator rezervacije (primarni ključ) |
| res_date_from | DATE | Zatraženi datum početka tj. datum prvog noćenja |
| res_date_to | DATE | Zatraženi datum završetka tj. datum prvog noćenja |
| res_created | TIMESTAMP | Trenutak u kojem je kreiran zahtjev |
| res_processed | TIMESTAMP | Trenutak kada je potvrđen ili odbijen zahtjev |
| res_check_in | TIMESTAMP | Vrijeme kada se prijavio gost |
| res_check_out | TIMESTAMP | Vrijeme kada je gost napustio hotel |
| res_status | INT | Je li rezervacija potvrđena ili odbijena |
| gst_id | INT | Jedinstveni identifikator gosta (strani ključ prema Guest) |
| emp_id | INT | Jedinstveni identifikator zaposlenika (strani ključ prema Employee) |
| cat_id | INT | Jedinstveni identifikator kategorije (strani ključ prema AccommodationCategory) |
| un_id | INT | Jedinstveni identifikator smještajne jedinice (strani ključ prema AccommodationUnit) |
Ovo je entitet koji bilježi sve dodatne opcije koje gost može odabrati. Ima sljedeće atribute: amn_id, amn_name, amn_description, amn_price. Ovaj entitet ima Many-to-many vezu sa entitetom Reservation preko atributa amn_id te dvije One-to-one veze s entitetima Parking i OtherAmenities preko atributa amn_id.
| Atribut | Tip podataka | Opis Varijable |
|---|---|---|
| amn_id | INT | Jedinstveni identifikator dodatne opcije (primarni ključ) |
| amn_name | VARCHAR(100) | Naziv dodatne opcije |
| amn_description | TEXT | Opis dodatne opcije |
| amn_price | NUMERIC(10,5) | Cijena dodatne opcije po noćenju |
Ovaj entitet bilježi informacije o svim parkirnim mjestima. Ima sljedeće atribute:
| Atribut | Tip podataka | Opis Varijable |
|---|---|---|
| prk_id | INT | Jedinstveni identifikator parkirnog mjesta (primarni ključ) |
| prk_number | INT | Broj parkirnog mjesta |
| prk_garage_floor | INT | Kat u garaži na kojem se mjesto nalazi |
| amn_id | INT | Jedinstveni identifikator dodatne opcije (strani ključ prema Amenities) |
Ovaj entitet opisuje sve ostale dodatne opcije koje ne zahtijevaju dodatne informacije. Ima sljedeće atribute: rst_id, amn_id
| Atribut | Tip podataka | Opis Varijable |
|---|---|---|
| rst_id | INT | Jedinstveni identifikator ostale dodatne opcije (primarni ključ) |
| amn_id | INT | Jedinstveni identifikator dodatne opcije (strani ključ prema Amenities) |
Ovo je tablica koja opisuje Many-to-many vezu između entiteta Reservation i Amenities. Ima sljedeće atribute: res_id, amn_id i quantity.
| Atribut | Tip podataka | Opis Varijable |
|---|---|---|
| res_id | INT | Jedinstveni identifikator rezervacije (strani ključ prema Reservation) |
| amn_id | INT | Jedinstveni identifikator dodatne opcije (strani ključ prema Amenities) |
| quantity | INT | Količina zahtijevane dodatne usluge |
Ovaj entitet sadrži sve važne informacije o člancima koi se objavljuju na stranici. Sadrži atribute: art_id, art_title, art_created, art_edited, art_description, emp_id. Ima Many-to-one vezu sa entitetom Employee preko emp_id.
| Atribut | Tip podataka | Opis Varijable |
|---|---|---|
| art_id | INT | Jedinstveni identifikator članka (primarni ključ) |
| art_title | VARCHAR(100) | Naslov |
| art_created | TIMESTAMP | Trenutak objave članka |
| art_edited | TIMESTAMP | Trenutak zadnje promjene |
| art_description | TEXT | Opis, tekst članka |
| emp_id | INT | Jedinstveni identifikator zaposlenika (strani ključ prema Employee) |
Ovaj entitet sadrži bitne informacije o svim slikama pohranjenim u sustavu i prikazanim u aplikaciji. Sadrži sljedeće atribute: pct_id, pct_description, pct_filename, pct_filepath, pct_created, pct_edited, emp_id. Ima Many-to-one vezu sa entitetom Employee preko emp_id.
| Atribut | Tip podataka | Opis Varijable |
|---|---|---|
| pct_id | INT | Jedinstveni identifikator slike (primarni ključ) |
| pct_description | VARCHAR(255) | Opis slike |
| pct_filename | VARCHAR(100) | Naziv datoteke slike |
| pct_filepath | VARCHAR(255) | Putanja do slike |
| pct_created | TIMESTAMP | Trenutak objave slike |
| pct_edited | TIMESTAMP | Trenutak zadnje promjene |
| emp_id | INT | Jedinstveni identifikator zaposlenika (strani ključ prema Employee) |
Ovaj entitet sadrži pitanja i odgovore za korisničku podršku. Sadrži sljedeće atribute: q_id, q_question, q_answer, q_created, q_edited, emp_id. Ima Many-to-one vezu sa entitetom Employee preko emp_id.
| Atribut | Tip podataka | Opis Varijable |
|---|---|---|
| q_id | INT | Jedinstveni identifikator pitanja (primarni ključ) |
| q_question | TEXT | Pitanje |
| q_answer | TEXT | Odgovor |
| q_created | TIMESTAMP | Trenutak objave |
| q_edited | TIMESTAMP | Trenutak zadnje promjene |
| emp_id | INT | Jedinstveni identifikator zaposlenika (strani ključ prema Employee) |
Slika 4.2: Relacijski model baze podataka
Slika 4.3: Dijagram razreda
Na slici je prikazana skupina klasa i enumeracija koje zajedno čine osnovu sustava za autentifikaciju, autorizaciju i upravljanje korisnicima. Model korisnika predstavljen je klasom User, koja sadrži sva zajednička obilježja potrebna za rad s korisnicima neovisno o njihovoj ulozi u sustavu. Uloga korisnika definirana je enumeracijom Role, dok se način prijave razlikuje uz pomoć enumeracije AuthProvider koja omogućava razlikovanje lokalne prijave i prijave putem OAuth2 servisa (Google). Dodatno, spol korisnika definiran je enumeracijom Gender.
Prijava, registracija, verifikacija e-mail adrese i reset lozinke provode se putem AuthController klase. Ona komunicira s bazom podataka preko UserRepository te koristi EmailService za slanje verifikacijskih i reset poruka. Kako bi se osigurala sigurnost i kontrola pristupa, konfiguracija sigurnosnih pravila nalazi se u SecurityConfig klasi, dok je rad s vanjskim OAuth2 identitetima omogućen putem CustomOidcUserService.
Nakon uspješne prijave, korisnik može pristupiti vlastitim podacima uz pomoć UserController klase koja vraća podatke u obliku DTO objekta UserDto. Dodatne funkcionalnosti nad korisnicima kao što su reset lozinke i kreiranje osoblja omogućene su preko UserService klase, koja koristi UserRepository za spremanje i dohvaćanje podataka iz PostgreSQL baze.
Administrator sustava ima pristup posebnim mogućnostima opisanima u AdminController klasi, poput kreiranja novih korisnika osoblja ili resetiranja njihovih lozinki. Za potrebe prikaza stranica unutar web sučelja privremeno se koriste metode unutar PageController klase. U slučaju pogrešaka u radu aplikacije, CustomErrorController i GlobalExceptionHandler pružaju jasne odgovore korisniku.
Kako bi se sustav inicijalno pripremio, definirana je klasa DataInitializer koja kreira zadane administrativne korisnike prilikom prvog pokretanja aplikacije. Konfiguracija resursa aplikacije (poput statičkih datoteka) nalazi se u WebConfig klasi.
Komunikacija između klijenta i poslužitelja olakšana je korištenjem DTO objekata, poput RegisterRequestDto za registraciju te NewUserDto za rad s korisnicima osoblja. Na taj se način osigurava čitljivost, sigurnost i jasan prijenos podataka unutar sustava.
Slika 4.4: Dijagram razreda - konfiguracija
Slika 4.5: Dijagram razreda - kontroleri
Slika 4.6: Dijagram razreda - servisi
Slika 4.7: Dijagram razreda - korisnik