GestioneEventiServiceImpl.java

package it.unisa.c07.biblionet.gestioneEventi.service;

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

import it.unisa.c07.biblionet.model.dao.utente.LettoreDAO;
import it.unisa.c07.biblionet.model.entity.utente.Lettore;
import org.springframework.stereotype.Service;

import it.unisa.c07.biblionet.model.dao.EventoDAO;
import it.unisa.c07.biblionet.model.dao.LibroDAO;
import it.unisa.c07.biblionet.model.entity.Evento;
import it.unisa.c07.biblionet.model.entity.Libro;
import lombok.RequiredArgsConstructor;

/**
 * Implementa la classe che esplicita i metodi definiti nell'interfaccia service
 * per il sottosustema GestioneEventi.
 *
 * @author Nicola Pagliara
 * @author Luca Topo
 * @author Viviana Pentangelo
 */
@Service
@RequiredArgsConstructor
public class GestioneEventiServiceImpl implements GestioneEventiService {

    /**
     * Si occupa delle operazioni CRUD per un evento.
     */
    private final EventoDAO eventoDAO;

    /**
     * Si occupa delle operazioni CRUD per un libro.
     */
    private final LibroDAO libroDAO;

    /**
     * Si occupa delle operazioni CRUD per un lettore.
     */
    private final LettoreDAO lettoreDAO;


    /**
     * Implementa la funzionalità che permette
     * di trovare un evento dato il suo identificativo.
     * @param idEvento L'identificativo dell'evento
     * @return L'Evento trovato
     */
    public Optional<Evento> getEventoById(final int idEvento) {
        return eventoDAO.findById(idEvento);
    }

    /**
     * Implementa la funzionalità che permette ad un Esperto di organizzare un
     * Evento.
     * @param evento L'Evento da memorizzare
     * @return L'Evento appena creato
     */
    @Override
    public Evento creaEvento(final Evento evento) {
        return eventoDAO.save(evento);
    }

    /**
     * Implementa la funzionalità che permette
     * di modificare un evento.
     * @param evento La nuova versione dell'evento
     * @return Optional.empty() se l'evento da modificare
     *         non esiste, altrimenti un optional contenente
     *         l'evento modificato.
     */
    @Override
    public Optional<Evento> modificaEvento(final Evento evento) {
        if (!this.eventoDAO.existsById(evento.getIdEvento())) {
            return Optional.empty();
        }
        var eventoSalvato = eventoDAO.save(evento);
        return Optional.of(eventoSalvato);
    }

   /**
     * Metodo di utilità per recuperare
     * un libro a partire dall'ID.
     * @param id Id del libro da recuperare
     * @return Il libro recuperato
     */
    @Override
    public Optional<Libro> getLibroById(final int id) {
        return libroDAO.findById(id);
    }

    /**
     * Implementa la funzionalità che permette
     * ad un Esperto di eliminare un evento.
     * @param id L'id dell'evento da eliminare
     * @return L'evento che è stato eliminato, o
     *         un Optional vuoto se l'evento non
     *         esiste.
     */
    @Override
    public Optional<Evento> eliminaEvento(final int id) {
        var evento = this.eventoDAO.findById(id);
        if (evento.isEmpty()) {
            return Optional.empty();
        }

        this.eventoDAO.deleteById(id);
        return evento;
    }

    /**
     * Implementa la funzionalità che permette
     * ad un Lettore di partecipare ad un evento.
     * @param idLettore Il lettore da iscrivere all'evento
     * @param idEvento L'id dell'evento a cui partecipare
     * @return Il lettore aggiornato ed iscritto all'evento
     */
    @Override
    public Lettore partecipaEvento(final String idLettore, final int idEvento) {
        Evento evento = eventoDAO.getOne(idEvento);
        Lettore lettore = lettoreDAO.findByID(idLettore);
        List<Evento> listaEventi = lettore.getEventi();
        if (listaEventi == null) {
            listaEventi = new ArrayList<>();
        }
        for (Evento e : listaEventi) {
            if (e.getIdEvento() == evento.getIdEvento()) {
                return lettore;
            }
        }
        listaEventi.add(evento);
        lettore.setEventi(listaEventi);
        Lettore l = lettoreDAO.save(lettore);
        return l;
    }

    /**
     * Implementa la funzionalità che permette
     * ad un Lettore di abbandonare un evento.
     * @param idLettore Il lettore da disiscrivere dall'evento
     * @param idEvento L'id dell'evento da abbandonare
     * @return Il lettore aggiornato ed disiscritto dall'evento
     */
    @Override
    public Lettore abbandonaEvento(final String idLettore, final int idEvento) {
        Evento evento = eventoDAO.getOne(idEvento);
        Lettore lettore = lettoreDAO.findByID(idLettore);
        List<Evento> listaEventi = lettore.getEventi();

        //Per chiunque leggesse, non fate domande e non toccate. Grazie
        int pos = -1;
        for (int i = 0; i < listaEventi.size(); i++) {
            if (listaEventi.get(i).getIdEvento() == evento.getIdEvento()) {
                pos = i;
            }
        }
        if (pos > -1) {
            listaEventi.remove(pos);
        }

        lettore.setEventi(listaEventi);
        Lettore l = lettoreDAO.save(lettore);
        return l;
    }

}