[link al repository](https://gitlab.com/simonemallei/2021_assignment3_elibrary)
Studenti:
* Simone Mallei 844659
* Fabio Marchesi 844941
# Documentazione
Realizzazione del back-end di un sistema di e-library tramite JPA. Il sistema modella le seguenti entità:
- **Autore**: si è interessati a: nome, cognome, anno di nascita.
- **Libro**: si è interessati a: titolo, anno, edizione.
- **Genere**: si è interessati a: nome, secolo e se è realistico o meno (tramite sottoclassi).
- **Genere Realistico**: si è interessati a: violenza.
- **Genere Irrealistico**: si è interessati a: tipo.
- **Prestito**: si è interessati a: data e durata.
- **Utente**: si è interessati a: nome, cognome, anno di nascita e SSN.
Per ogni libro vengono memorizzati: l'autore del libro, una lista di libri simili ed una lista di generi al quale appartiene.
Per ogni prestito vengono memorizzati: l'utente che l'ha eseguito e l'e-book preso in prestito.
Per ogni utente viene memorizzato: il genere preferito.

Le responsabilità assegnate ad ogni singolo componente dell'applicazione sono le seguenti:
- **ELibraryApplication**: classe che contiene il main eseguito con il run dell'applicazione Spring.
- Package ```com.assignment3.elibrary.model```: contiene le classi che rappresentano le entità (con annotazione $@Entity$) dello schema ER, le classi sono le seguenti: **Author**, **Book**, **Genre**, **RealisticGenre**, **UnrealisticiGenre**, **User**, **Rent**.
- Package ```com.assignment3.elibrary.repository```: contiene le interfacce delle repository (con annotazione $@Repository$), le interfacce con le loro operazioni sono le seguenti:
- **AuthorRepository**: contiene operazioni CRUD su **Author** e le funzioni di ricerca tramite:
- attributo *lastName* di **Author**,
- attributo *firstName* di **Author**.
- **BookRepository**: contiene operazioni CRUD su **Book** e le funzioni di ricerca tramite:
- attributo *title* di **Book**,
- attributo *releaseYear* di **Book**,
- attributo *name* delle entità **Genre** associate,
- attributo *name* delle entità **Genre** associate e *lastName* dell'entità **Author** associata.
- **GenreRepository**: contiene operazioni CRUD su **Genre** e le funzioni di ricerca tramite:
- attributo *name* di **Genre**.
- **UserRepository**: contiene operazioni CRUD su **User** e le funzioni di ricerca tramite:
- attributo *ssn* di **User**,
- attributo *lastName* di **User**.
- **RentRepository**: contiene operazioni CRUD su **Rent** e le funzioni di ricerca tramite:
- attributo *ssn* dell'entità **User** associata,
- attributo *name* ell'entità **Book** associata.
- Package ```com.assignment3.elibrary.service```: contiene i servizi (con annotazione $@Service$) che richiamano i metodi delle repository, le classi sono le seguenti: **AuthorService**, **BookService**, **GenreService**, **RentService**, **UserService**.
Sono state sviluppate anche delle classi di test sulle funzionalità dei servizi:
- **AuthorCRUDTest**: verifica il funzionamento delle operazioni di CRUD e search su **Author** definite in **AuthorService**.
- **BookCRUDTest**: verifica il funzionamento delle operazioni di CRUD e search su **Book** definite in **BookService**.
- **GenreCRUDTest**: verifica il funzionamento delle operazioni di CRUD e search su **Genre** definite in **GenreService**.
- **RentCRUDTest**: verifica il funzionamento delle operazioni di CRUD e search su **Rent** definite in **RentService**.
- **UserCRUDTest**: verifica il funzionamento delle operazioni di CRUD e search su **User** definite in **UserService**.