Ten projekt to backend systemu bibliotecznego realizowanego w ramach laboratoriów AGH.
Całość została zbudowana w Spring Boot + PostgreSQL i spełnia wymagania modułu M1 + M2:
M1:
- pełny model obiektowy + bazodanowy,
- rejestracja użytkownika,
- autentykacja i autoryzacja,
- operacje CRUD na użytkownikach,
- role systemowe (CUSTOMER, LIBRARIAN, ADMIN).
M2:
- operacje CRUD na książkach
- wypożyczanie książki
- rezerwacje
- powiadomienia
- recenzje
GET /api/auth/me
POST /api/auth/register
GET /api/users
GET /api/users/{id}
PUT /api/users/{id}
DELETE /api/users/{id}
GET /api/books
POST /api/books
GET /api/books/{id}
PUT /api/books/{id}
DELETE /api/books/{id}
GET /api/books/{titleId}/copies
GET /api/authors
POST /api/authors
GET /api/authors/{id}
PUT /api/authors/{id}
DELETE /api/authors/{id}
POST /api/reviews
GET /api/reviews/title/{titleId}
GET /api/reviews/user
GET /api/reviews/user/title/{titleId}
GET /api/notifications
PATCH /api/notifications/{id}
POST /api/reservations/borrow
POST /api/reservations/return
POST /api/waitlist/join
GET /api/librarian/users/search
GET /api/librarian/users/{userId}
- Java 21+
- IntelliJ IDEA / Gradle 8+
Wystarczy pobrać pliki projektu i uruchomić go, np. za pomocą Intellij
Aplikacja wraz z frontendem będzie wówczas dostępna pod adresem http://localhost:8080/index.html
Nie wszystkie endpointy są zaimplementowane do frontendu
- Baza jest postawiona online
supabase.com, nie trzeba nic konfigurować lokalnie - Poprawione logowanie i tworzenie konta
- Stworzone dodatkowe CRUD
- Książki
- Autorzy
- Wypożyczanie
- Zapisywanie na waitlistę
- Zarządzanie użytkownikami
- Powiadomienia
- Opinie
- Przejrzysty frontend
- Zaaktualizowany schemat bazy danych
- Tabela
Notification - Tabela
Rewiev
- Tabela
Poprzednia wersja miała m.in.:
- bazę H2 zamiast PostgreSQL,
- nazwy pól (
PermissionID,Firstname,Surname,CountryID), - daty przechowywane jako
String, - hasła przechowywane w czystym tekście,
- brak DTO — API wystawiało encje bezpośrednio,
- brak unikalności email i username.
- brak walidacji pól wejściowych,
- brak obsługi wyjątków,
- kontrolery powiązane bezpośrednio z encjami,
- brak jakiejkolwiek autoryzacji,
- brak testów integracyjnych.
- brak rejestracji użytkownika,
- brak rozdziału DTO/encje,
- brak ról i uprawnień.
Aplikacja została przeniesiona z H2 na PostgreSQL, ponieważ:
- projekt docelowo działa na Postgresie,
- H2 zachowuje się inaczej (inne typy, odmienne zachowanie),
- testy integracyjne muszą działać na prawdziwej bazie.
Zmodyfikowane pliki:
application.properties,- dodano
application-test.properties.
Encje Country, Permission, AppUser zostały całkowicie uporządkowane:
- poprawione nazwy kolumn,
- poprawione relacje ManyToOne,
- poprawione typy pól (np.
LocalDate), - uporządkowane nazewnictwo,
- dodane tabele słownikowe:
countries_dict,permissions_dict.
To była niezbędna refaktoryzacja, bo wcześniejszy model był trudny do utrzymania i niezgodny z JPA.
Wprowadzono prawidłową warstwę API:
RegistrationRequest– dane wejściowe do rejestracji + walidacja,UserResponse– dane wyjściowe, bez hasła, z rolą.
Efekt:
- nie wystawiamy encji JPA na zewnątrz,
- hasło nigdy nie opuszcza backendu,
- walidacja działa na podstawie adnotacji.
Powstał plik SecurityConfig, który:
- włącza HTTP Basic,
- udostępnia
/api/auth/registerpublicznie, - wymaga autoryzacji na
/api/users/**, - obsługuje role: ADMIN, LIBRARIAN, CUSTOMER,
- używa BCrypt do hashowania haseł.
Wcześniej nie było żadnego systemu uprawnień.
Dodany endpoint:
POST /api/auth/register
Proces rejestracji:
- walidacja danych wejściowych,
- sprawdzenie unikalności email i username,
- automatyczne nadanie roli CUSTOMER,
- hashowanie hasła,
- zwracanie bezpiecznego DTO.
Service został rozszerzony o:
- walidację unikalności,
- pobieranie domyślnej roli,
- pełne CRUD,
- konwersję encji do DTO,
- transakcje.
Poprzednio była to jedynie cienka nakładka na repository.
Dodano testy sprawdzające:
- rejestrację użytkownika,
- pobieranie listy użytkowników,
- aktualizację użytkownika,
- usuwanie użytkownika.
Testy działają na tej samej bazie (PostgreSQL), a nie na H2.
AuthControllerAppUserController
RegistrationRequestUserResponseRegistrationRequestTestFactory(dla testów)
AppUserPermission,RoleCountry,CountryName
AppUserService
AppUserRepositoryPermissionRepository
SecurityConfig— role, autoryzacja, hashowanie
- dodano rejestrację użytkownika,
- przyjmuje DTO, zwraca DTO.
- HTTPS Basic Auth,
- endpoint
/api/auth/registerjest publiczny, - pozostałe endpointy wymagają autoryzacji,
- BCryptPasswordEncoder.
- poprawione nazwy pól,
- tabele słownikowe,
- enumy zapisywane jako STRING.
- poprawione nazwy kolumn,
- relacje ManyToOne,
LocalDate birthdate,passwordHash.
- logika rejestracji,
- walidacja unikalności,
- CRUD,
- konwersja do DTO.
- pełny CRUD z autoryzacją,
- zwraca DTO.
- MockMvc,
- PostgreSQL,
- czyszczenie bazy przez
deleteAll().