GestioneDonazioneController.java

package controller;

import model.beans.Campagna;
import model.beans.Donazione;
import model.beans.Utente;
import model.services.CampagnaService;
import model.services.CampagnaServiceImpl;
import model.services.DonazioniService;
import model.services.DonazioniServiceImpl;
import model.services.ReportService;
import model.services.TipoReport;

import javax.servlet.ServletException;
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 = "GestioneDonazioneController",
        value = "/donazione/*")
public final class GestioneDonazioneController extends HttpServlet {

   /**
    * Variabile per il service Donazioni.
    */
   private DonazioniService donazioniService;
   /**
    * Variabile per il service Campagna.
    */
   private CampagnaService campagnaService;

   /**
    * Costruttore classe GestioneDonazioneController.
    *
    * @param ds DonazioneService
    * @param cs CampagnaService
    */
   public GestioneDonazioneController(final DonazioniService ds,
                                      final CampagnaService cs) {
      donazioniService = ds;
      campagnaService = cs;
   }

   /**
    * Costruttore classe GestioneDonazioneController.
    */
   public GestioneDonazioneController() {
      donazioniService = new DonazioniServiceImpl();
      campagnaService = new CampagnaServiceImpl();
   }

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

      String resource = "/WEB-INF/results/visualizzaDonazioni.jsp";
      HttpSession session = request.getSession();
      Utente userSession = (Utente) session.getAttribute("utente");
      String path = request.getPathInfo();
      Donazione donazione = (Donazione) session.getAttribute("donazione");

      if (userSession != null) {
         if ("/scriviCommento".equals(path)) {
            if (donazione != null) {
               request.getRequestDispatcher(
                               "/WEB-INF/results/commentoDonazione.jsp")
                       .forward(request, response);
            } else {
               response.sendError(HttpServletResponse.SC_BAD_REQUEST);
            }
            return;
         } else {
            request.setAttribute("donazioniList",
                    donazioniService.visualizzaDonazioni(userSession));
         }
      } else {
         response.sendRedirect(
                 request.getServletContext().getContextPath()
                         + "/autenticazione/login");
         return;
      }
      request.getRequestDispatcher(resource).forward(request, response);
   }

   @Override
   public void doPost(final HttpServletRequest request,
                      final HttpServletResponse response)
           throws IOException, ServletException {
      String path = request.getPathInfo();
      int id = Integer.parseInt(request.getParameter("idCampagna"));
      HttpSession session = request.getSession();
      Utente utente = (Utente) session.getAttribute("utente");

      Campagna campagna = campagnaService.trovaCampagna(id);

      if (campagna == null) {
         response.sendError(HttpServletResponse.SC_NOT_FOUND);
      } else {
         switch (path) {
            case "/registraDonazione" -> {
               if (utente != null) {
                  Donazione donazione = new Donazione();
                  donazione.setCampagna(campagna);
                  donazione.setUtente((Utente)
                          session.getAttribute("utente"));
                  donazione.setSommaDonata(Double.parseDouble(
                          request.getParameter("sommaDonata")));
                  donazione.setAnonimo(false);
                  donazione.setCommento(null);
                  donazione.setRicevuta(request.getParameter("ricevuta"));
                  donazione.setDataOra(LocalDateTime.now());

                  if (donazioniService.effettuaDonazione(donazione)) {
                     ReportService.creaReport(request,
                             TipoReport.INFO,
                             "Donazione andata a buon fine");
                  } else {
                     ReportService.creaReport(request, TipoReport.ERRORE,
                             "Donazione non salvata");
                  }
                  session.setAttribute("donazione", donazione);

                  request.setAttribute("idCampagna", id);
                  request.getRequestDispatcher(
                                  "/WEB-INF/results/commentoDonazione.jsp")
                          .forward(request, response);
               } else {
                  response.sendError(HttpServletResponse.SC_BAD_REQUEST);
               }
            }
            case "/scriviCommento" -> {
               Donazione donazione = (Donazione) session
                       .getAttribute("donazione");
               if (donazione != null) {
                  donazione.setCommento(request.getParameter("commento"));
                  if (request.getParameter("anonimo") != null) {
                     donazione.setAnonimo(true);
                  } else {
                     donazione.setAnonimo(false);
                  }

                  if (donazioniService.commenta(donazione)) {
                     campagna.setSommaRaccolta(
                             campagna.getSommaRaccolta()
                                     + donazione.getSommaDonata());
                     campagnaService.modificaCampagna(campagna);
                     session.removeAttribute("donazione");
                     ReportService.creaReport(request,
                             TipoReport.INFO,
                             "Commento andato a buon fine");
                     response.sendRedirect(request.getServletContext()
                             .getContextPath()
                             + "/campagna/campagna?idCampagna="
                             + campagna.getIdCampagna());
                  } else {
                     ReportService.creaReport(request, TipoReport.ERRORE,
                             "Commento non salvato");
                     response
                             .sendError(HttpServletResponse
                                     .SC_INTERNAL_SERVER_ERROR);
                  }

                  return;
               } else {
                  response.sendError(HttpServletResponse.SC_BAD_REQUEST);
               }
            }
            default -> {
               response.sendError(HttpServletResponse.SC_NOT_FOUND);
               return;
            }
         }
      }
   }
}