NotificationController.java

package com.is.findyourplace.controller.gestioneAmministratori;

import com.is.findyourplace.persistence.dto.NotificaDto;
import com.is.findyourplace.service.gestioneAmministratori.NotificationService;
import com.is.findyourplace.service.gestioneUtenza.AccountService;
import jakarta.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;


import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

//Gestisce l'invio delle notifiche da parte di un Amministratore
@Controller
public class NotificationController {
    /**
     * Service usato per gestire le notifiche
     * inviate da un amministratore.
     */
    private final NotificationService notificationService;
    /**
     * Service usato per gestire gli account degli utenti.
     */
    private final AccountService accountService;


    /**
     * Costruttore del controller.
     *
     * @param notificationService NotificationService
     * @param accountService AccountService
     */
    public NotificationController(
            final NotificationService notificationService,
            final AccountService accountService) {
        this.notificationService = notificationService;
        this.accountService = accountService;
    }


    /**
     * Mapping pagina per inviare notifica a un utente.
     * @param notificaDto NotificaDto
     * @param result Contiene gli errori
     * @return 201 CREATED / 400 BAD REQUEST
     */
    @PostMapping("/sendNotification")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> invioNot(
            @Valid @ModelAttribute("notifica")
            final NotificaDto notificaDto,
            final BindingResult result) {
        Map<String, Object> response = new HashMap<>();

        notificaDto.setDataInvio(LocalDateTime.now());
        notificaDto.setDataScadenza(LocalDateTime.now().plusMonths(2));
        if (notificaDto.getDestinatario() == null
                || notificaDto.getDestinatario().isBlank()
                || !accountService.existsByUsername(
                        notificaDto.getDestinatario())) {
            result.rejectValue("destinatario", "null",
                    "Destinatario non valido!");
        }

        if (result.hasErrors()) {
            response.put("errors", result.getAllErrors());
            return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
        }
        notificationService.saveNotifica(notificaDto);

        return new ResponseEntity<>(response, HttpStatus.CREATED);
    }

    /**
     * Mapping pagina per inviare notifica broadcast.
     * @param notificaDto NotificaDto
     * @param result Contiene gli errori
     * @return 201 CREATED / 400 BAD REQUEST
     */
    @PostMapping("/sendNotificationAll")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> invioNotAll(
            @Valid @ModelAttribute("notifica")
            final NotificaDto notificaDto,
            final BindingResult result) {
        Map<String, Object> response = new HashMap<>();

        notificaDto.setDataInvio(LocalDateTime.now());
        notificaDto.setDataScadenza(LocalDateTime.now().plusMonths(2));

        if (result.hasErrors()) {
            response.put("errors", result.getAllErrors());
            return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
        }
        notificationService.saveNotificaBroadcast(notificaDto);

        return new ResponseEntity<>(response, HttpStatus.CREATED);
    }
}