PreferenzeDiLetturaController.java

package it.unisa.c07.biblionet.preferenzeDiLettura.controller;

import it.unisa.c07.biblionet.model.entity.Genere;
import it.unisa.c07.biblionet.model.entity.utente.Esperto;
import it.unisa.c07.biblionet.model.entity.utente.HaGenere;
import it.unisa.c07.biblionet.model.entity.utente.Lettore;
import it.unisa.c07.biblionet.model.entity.utente.UtenteRegistrato;
import it.unisa.c07.biblionet.preferenzeDiLettura.service.PreferenzeDiLetturaService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Alessio Casolaro
 * @author Antonio Della Porta
 */
@Controller
@RequiredArgsConstructor
@SessionAttributes("loggedUser")
@RequestMapping("/preferenze-di-lettura")
public class PreferenzeDiLetturaController {

    /**
     * Il service per effettuare le operazioni di persistenza.
     */
    private final PreferenzeDiLetturaService preferenzeDiLetturaService;

    /**
     * Implementa la funzionalità di controllare se l'utente in sessione
     * è abilitato ad inserire dei generi, se lo è riceve tutti i generi
     * presenti nel database e rimanda l'utente alla pagina di
     * inserimento dei generi, altrimenti lo rimanda alla home.
     *
     * @param model utilizzato per ottenere l'utente in sessione
     *
     * @return la view di inserimento dei generi se l'utente è
     * Esperto o Lettore, la home altrimenti,
     */
    @RequestMapping("/generi")
    public String generiLetterari(final Model model) {

            UtenteRegistrato utenteRegistrato =
                    (UtenteRegistrato) model.getAttribute("loggedUser");

            if (utenteRegistrato != null
                    && (utenteRegistrato.getTipo().equals("Esperto")
                    ||  utenteRegistrato.getTipo().equals("Lettore"))) {

                HaGenere utente = (HaGenere) utenteRegistrato;
                List<Genere> allGeneri =
                        preferenzeDiLetturaService.getAllGeneri();

                List<Genere> generiUtente = utente.getGeneri();

                if (generiUtente != null) {

                    for (Genere genere : generiUtente) {
                        allGeneri.remove(genere);
                    }
                } else {
                    generiUtente = new ArrayList<>();
                }


                model.addAttribute("generiUtente", generiUtente);
                model.addAttribute("generi", allGeneri);
                return "preferenze-lettura/modifica-generi";
            } else {
                return "index";
            }
    }

    /**
     * Implementa la funzionalità di inserire o rimuovere generi ad un esperto
     * oppure ad un lettore.
     * @param generi i generi che il lettore o l'esperto dovranno possedere
     * @param model utilizzato per prendere l'utente loggato a cui modificare
     *              i generi
     * @return la pagina home
     */
    @RequestMapping(value = "/modifica-generi", method = RequestMethod.POST)
    public String modificaGeneri(@RequestParam("genere") final String[]generi,
                                            final Model model) {

        List<Genere> toAdd = preferenzeDiLetturaService.getGeneriByName(generi);
        UtenteRegistrato utenteRegistrato =
                (UtenteRegistrato) model.getAttribute("loggedUser");

        if (utenteRegistrato != null) {
            if (utenteRegistrato.getTipo().equals("Esperto")) {

                preferenzeDiLetturaService
                        .addGeneriEsperto(toAdd, (Esperto) utenteRegistrato);

            } else if (utenteRegistrato.getTipo().equals("Lettore")) {
                preferenzeDiLetturaService
                        .addGeneriLettore(toAdd, (Lettore) utenteRegistrato);
            }
        }
        return "autenticazione/login";
    }
}