AutenticazioneServiceImpl.java

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

import it.unisa.c07.biblionet.clubDelLibro.service.ClubDelLibroService;
import it.unisa.c07.biblionet.model.dao.utente.BibliotecaDAO;
import it.unisa.c07.biblionet.model.dao.utente.EspertoDAO;
import it.unisa.c07.biblionet.model.dao.utente.LettoreDAO;
import it.unisa.c07.biblionet.model.entity.ClubDelLibro;
import it.unisa.c07.biblionet.model.entity.utente.Biblioteca;
import it.unisa.c07.biblionet.model.entity.utente.Esperto;
import it.unisa.c07.biblionet.model.entity.utente.Lettore;
import it.unisa.c07.biblionet.model.entity.utente.UtenteRegistrato;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.Optional;

/**
 *Implementa la classe che esplicita i metodi
 * definiti nell'interfaccia service per il
 * sottosistema Autenticazione.
 * @author Ciro Maiorino , Giulio Triggiani
 */
@Service
@RequiredArgsConstructor
public class AutenticazioneServiceImpl implements AutenticazioneService {

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

    /**
     * Si occupa delle operazioni CRUD per una biblioteca.
     */
    private final BibliotecaDAO bibliotecaDAO;

    /**
     * Si occupa delle operazioni CRUD un esperto.
     */
    private final EspertoDAO espertoDAO;

    /**
     * I.
     */
    private final ClubDelLibroService clubDelLibroService;

    /**
     * Implementa la funzionalità di login
     * per un Utente registrato.
     * @param email dell'utente.
     * @param password dell'utente.
     * @return un utente registrato.
     */
    @Override
    public UtenteRegistrato login(final String email, final String password) {
        try {
            MessageDigest md;
            md = MessageDigest.getInstance("SHA-256");
            byte[] arr = md.digest(password.getBytes());
            UtenteRegistrato u;

            if ((u = lettoreDAO.findByEmailAndPassword(email, arr)) != null) {
                return u;
            } else if ((u =
                    bibliotecaDAO.findByEmailAndPassword(email, arr)) != null) {
                return u;
            } else {
                u = espertoDAO.findByEmailAndPassword(email, arr);
                return u;
            }

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Implementa la funzionalità di
     * identifica di un utente in sessione.
     * @param utente registrato che si trova già in sessione.
     * @return true se l'utente è un lettore altrimenti false.
     */
    @Override
    public boolean isLettore(final UtenteRegistrato utente) {
        return "Lettore".equals(utente.getClass().getSimpleName());
    }

    /**
     * Implementa la funzionalità di
     * identifica di un utente in sessione.
     * @param utente registrato che si trova già in sessione.
     * @return true se l'utente è un esperto altrimenti false.
     */
    @Override
    public boolean isEsperto(final UtenteRegistrato utente) {
        return "Esperto".equals(utente.getClass().getSimpleName());
    }

    /**
     * Implementa la funzionalità di
     * identifica di un utente in sessione.
     * @param utente registrato che si trova già in sessione.
     * @return true se l'utente è una biblioteca altrimenti false.
     */
    @Override
    public boolean isBiblioteca(final UtenteRegistrato utente) {
        return "Biblioteca".equals(utente.getClass().getSimpleName());
    }

    /**
     * Implementa la funzionalità di salvataggio delle modifiche
     * all'account biblioteca.
     * @param utente La biblioteca da aggiornare
     * @return la biblioteca aggiornata
     */
    public Biblioteca aggiornaBiblioteca(final Biblioteca utente) {
        return bibliotecaDAO.save(utente);
    }

    /**
     * Implementa la funzionalità di salvataggio delle modifiche
     * all'account esperto.
     * @param utente L'esperto da aggiornare
     * @return l'esperto aggiornato
     */
    public Esperto aggiornaEsperto(final Esperto utente) {
        return espertoDAO.save(utente);
    }

    /**
     * Implementa la funzionalità di salvataggio delle modifiche
     * all'account lettore.
     * @param utente Lettore da aggiornare
     * @return il lettore aggiornato
     */
    public Lettore aggiornaLettore(final Lettore utente) {
        return lettoreDAO.save(utente);
    }

    /**
     * Implementa la funzionalità di trovare una biblioteca.
     * @param email La mail della biblioteca
     * @return La biblioteca se c'è, altrimenti null
     */
    @Override
    public final Biblioteca findBibliotecaByEmail(final String email) {

        Optional<UtenteRegistrato> b = bibliotecaDAO.findById(email);
        return (Biblioteca) b.orElse(null);
    }

    /**
     * Implementa la funzionalità di trovare un esperto.
     * @param email La mail dell esperto
     * @return L'esperto se c'è, altrimenti null
     */
    @Override
    public final Esperto findEspertoByEmail(final String email) {

        Optional<UtenteRegistrato> b = espertoDAO.findById(email);
        return (Esperto) b.orElse(null);
    }

    /**
     * Implementa la funzionalità di trovare un lettore.
     * @param email La mail dell lettore
     * @return Il lettore se c'è, altrimenti null
     */
    @Override
    public final Lettore findLettoreByEmail(final String email) {

        Optional<UtenteRegistrato> b = lettoreDAO.findById(email);
        return (Lettore) b.orElse(null);
    }

    /**
     * Implementa la funzionalità di prendere una lista di club
     * del libro a cui un lettore partecipa.
     * @param lettore il lettore preso in esame
     * @return la lista dei club del libro a cui partecipa
     */
    @Override
    public List<ClubDelLibro> findAllByLettori(final Lettore lettore) {
        return clubDelLibroService.findAllByLettori(lettore);
    }

    /**
     * Implementa la funzionalità di prendere una lista di club
     * del libro di cui un esperto è proprietario.
     * @param esperto l' esperto preso in esame
     * @return la lista dei club del libro a cui partecipa
     */
    @Override
    public List<ClubDelLibro> findAllByEsperto(final Esperto esperto) {
        return clubDelLibroService.findAllByEsperto(esperto);
    }

}