Files
reactive-mail-server/backend/src/main/java/com/mailserver/controller/SpamController.java
T

62 lines
2.4 KiB
Java

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<BlacklistEntry> getBlacklist(Mono<Authentication> authenticationMono) {
return authenticationMono.flatMapMany(auth ->
spamFilterService.getBlacklist(getCurrentUserEmail(auth))
);
}
@PostMapping("/blacklist")
public Mono<BlacklistEntry> addToBlacklist(Mono<Authentication> authenticationMono, @RequestBody Mono<Map<String, String>> 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<Void> removeFromBlacklist(Mono<Authentication> authenticationMono, @RequestParam String senderEmail) {
return authenticationMono.flatMap(auth ->
spamFilterService.removeFromBlacklist(getCurrentUserEmail(auth), senderEmail)
);
}
}