4. Arhitektura i dizajn sustava - FranBistrovic/QuantumHotel GitHub Wiki

Arhitektura sustava

Opis arhitekture

Stil arhitekture

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.

Podsustavi

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

Preslikavanje na radnu platformu

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.

Mrežni protokoli

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).

Globalni upravljači tok

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.

Sklopovskoprogramski zahtjevi

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.

Obrazloženje odabira arhitekture

Obrazloženje izbora arhitekture

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.

Ključni čimbenici izbora arhitekture

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).

Principi oblikovanja arhitekture

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.

Organizacija sustava na visokoj razini

Sustav je organiziran u nekoliko ključnih komponenti na višoj razini apstrakcije koje su zajednički odgovorne za funkcionalnost i ispravan rad sustava

Klijent-poslužitelj

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.

Baza podataka

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).

Datotečni sustav

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).  

Grafičko sučelje

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.

Organizacija aplikacije

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.

Frontend sloj

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.

Backend sloj

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.

MVC Arhitektura

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 (Model sloj)

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).

Pogled (View sloj)

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.

Upravljač (Controller sloj)

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.

MVC model

Slika 4.1: Prikaz MVC modela

Baza podataka

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.

Opis tablica

Users

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)

Guest

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)

Employee

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)

AccommodationCategory

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

AccommodationUnit

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)

Reservation

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)

Amenities

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

Parking

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)

OtherAmenities

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)

ReservationAmenity

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

Articles

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)

Pictures

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)

FAQ

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)

Dijagram baze podataka

Relationship schema

Slika 4.2: Relacijski model baze podataka

Dijagram razreda

Dijagram razreda

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.

Konfiguracija

Dijagram razreda - konfiguracija

Slika 4.4: Dijagram razreda - konfiguracija

Kontroleri

Dijagram razreda - kontroleri

Slika 4.5: Dijagram razreda - kontroleri

Servisi

Dijagram razreda - servisi

Slika 4.6: Dijagram razreda - servisi

Korisnik

Dijagram razreda - korisnik

Slika 4.7: Dijagram razreda - korisnik

Dinamičko ponašanje aplikacije

UML dijagrami stanja

UML dijagrami aktivnosti

⚠️ **GitHub.com Fallback** ⚠️