package com.mailserver.controller; import com.mailserver.domain.BlacklistEntry; import com.mailserver.service.SpamFilterService; import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.Map; /** * Контроллер для управления чёрным списком отправителей. */ @RestController @RequestMapping("/api/spam") public class SpamController { private final SpamFilterService spamFilterService; public SpamController(SpamFilterService spamFilterService) { this.spamFilterService = spamFilterService; } private String getCurrentUserEmail(Authentication authentication) { return authentication.getName(); } @GetMapping("/blacklist") public Flux getBlacklist(Mono authenticationMono) { return authenticationMono.flatMapMany(auth -> spamFilterService.getBlacklist(getCurrentUserEmail(auth)) ); } @PostMapping("/blacklist") public Mono addToBlacklist(Mono authenticationMono, @RequestBody Mono> requestMono) { return authenticationMono.zipWith(requestMono).flatMap(pair -> { String email = getCurrentUserEmail(pair.getT1()); String senderEmail = pair.getT2().get("senderEmail"); String reason = pair.getT2().get("reason"); if (senderEmail == null || senderEmail.trim().isEmpty()) { return Mono.error(new IllegalArgumentException("senderEmail is required")); } return spamFilterService.addToBlacklist(email, senderEmail.trim(), reason); }); } @DeleteMapping("/blacklist") public Mono removeFromBlacklist(Mono authenticationMono, @RequestParam String senderEmail) { return authenticationMono.flatMap(auth -> spamFilterService.removeFromBlacklist(getCurrentUserEmail(auth), senderEmail) ); } }