GestioneSegnalazioneController.java

package controller;

import controller.utils.Validator;
import model.beans.Campagna;
import model.beans.Segnalazione;
import model.beans.StatoSegnalazione;
import model.beans.Utente;
import model.beans.proxies.CampagnaProxy;
import model.beans.proxyInterfaces.CampagnaInterface;
import model.services.CampagnaService;
import model.services.CampagnaServiceImpl;
import model.services.SegnalazioniService;
import model.services.SegnalazioniServiceImpl;
import model.services.UtenteService;
import model.services.ReportService;
import model.services.UtenteServiceImpl;
import model.services.TipoReport;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.time.LocalDateTime;

@WebServlet(name = "GestioneSegnalazioneController",
        value = "/segnalazioni/*")
public final class GestioneSegnalazioneController extends HttpServlet {
   /**
    * Variabile per il service di Campagna.
    */
   private CampagnaService campagnaService;
   /**
    * Variabile per il service di Segnalazione.
    */
   private SegnalazioniService segnalazioniService;
   /**
    * Variabile per il service di Utente.
    */
   private UtenteService utenteService;

   /**
    * Costruttore del SegnalazioneController.
    *
    * @param cs CampagnaService
    * @param ss CampagnaService
    * @param us UtenteService
    */
   public GestioneSegnalazioneController(final CampagnaService cs,
                                         final SegnalazioniService ss,
                                         final UtenteService us) {
      campagnaService = cs;
      segnalazioniService = ss;
      utenteService = us;
   }

   /**
    * Costruttore del SegnalazioneController.
    */
   public GestioneSegnalazioneController() {
      campagnaService = new CampagnaServiceImpl();
      segnalazioniService = new SegnalazioniServiceImpl();
      utenteService = new UtenteServiceImpl();
   }

   @Override
   public void doGet(final HttpServletRequest request,
                     final HttpServletResponse response)
           throws IOException {
      if (((Utente) request.getSession()
              .getAttribute("utente")).isAdmin()) {
         request.setAttribute("segnalazioni",
                 segnalazioniService.trovaSegnalazioni());
      } else {
         response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
      }
   }

   @Override
   public void doPost(final HttpServletRequest request,
                      final HttpServletResponse response)
           throws IOException {

      String path = request.getPathInfo();
      HttpSession session = request.getSession();

      if (!new Validator(request)
              .isValidBean(Utente.class, session.getAttribute("utente"))) {

         response.sendRedirect(request.getServletContext()
                 .getContextPath() + "/autenticazione/login");
         return;
      }

      Utente userSession = (Utente) session.getAttribute("utente");
      String idCampagna = request.getParameter("idCampagna");

      switch (path) {
         case "/segnala" -> {
            Segnalazione segnalazione = new Segnalazione();
            String descrizione = request.getParameter("descrizione");
            Campagna c = campagnaService.
                    trovaCampagna(Integer.parseInt(idCampagna));
            Utente utente = new Utente();
            utente.setIdUtente(
                    Integer.parseInt(request.getParameter("idUtente")));

            segnalazione.setCampagnaSegnalata(c);
            segnalazione.setSegnalato(utente);
            segnalazione.setSegnalatore(userSession);
            segnalazione.setDescrizione(descrizione);
            segnalazione.setDataOra(LocalDateTime.now());
            segnalazione.setStatoSegnalazione(StatoSegnalazione.ATTIVA);

            if (segnalazioniService.segnalaCampagna(segnalazione)) {
               ReportService.creaReport(request, TipoReport.INFO,
                       "Esito operazione:", "Segnalazione inviata");
            } else {
               ReportService.creaReport(request, TipoReport.ERRORE,
                       "Esito operazione:", "Segnalazione non inviata");
            }

            response.sendRedirect(request.getServletContext().
                    getContextPath()
                    + "/campagna/campagna?idCampagna=" + idCampagna);

         }
         case "/risolvi" -> {
            if (!userSession.isAdmin()) {
               response.sendError(
                       HttpServletResponse.SC_UNAUTHORIZED);
            } else {
               String scelta = request.getParameter("sceltaSegnalazione");
               int id = Integer.parseInt(
                       request.getParameter("idCampagna"));
               int idSegnalazione =
                       Integer.parseInt(
                               request.getParameter("idSegnalazione"));
               Campagna campagna = campagnaService.trovaCampagna(id);
               if (scelta.equals("Risolvi")) {
                  segnalazioniService
                          .risolviSegnalazione(idSegnalazione,
                                  StatoSegnalazione.RISOLTA);
                  Utente utenteSegnalato =
                          utenteService.visualizzaDashboardUtente(
                                  campagna.getUtente().getIdUtente());
                  campagnaService.cancellaCampagna(campagna);
                  utenteService.sospensioneUtente(utenteSegnalato);
                  CampagnaInterface campagnaProxy =
                          new CampagnaProxy(campagna);
                  if (campagnaService
                          .rimborsaDonazioni(campagna, campagnaProxy)) {
                     ReportService.creaReport(request, TipoReport.INFO,
                             "Esito operazione:",
                             "Segnalazione risolta");
                  } else {
                     ReportService.creaReport(request, TipoReport.ERRORE,
                             "Esito operazione:",
                             "Segnalazione non risolta");
                  }
               } else {
                  if (segnalazioniService
                          .risolviSegnalazione(idSegnalazione,
                                  StatoSegnalazione.ARCHIVIATA)) {
                     ReportService.creaReport(request, TipoReport.INFO,
                             "Esito operazione:",
                             "Segnalazione archiviata");
                  } else {
                     ReportService.creaReport(request, TipoReport.ERRORE,
                             "Esito operazione:",
                             "Segnalazione non archviata");
                  }
               }
               response.sendRedirect(request
                       .getServletContext().getContextPath()
                       + "/GestioneUtenteController/visualizzaDashboard");
            }
         }
         default -> response.sendError(HttpServletResponse.SC_NOT_FOUND);
      }
   }
}