From 49344d7ea8f2a0514e8af5c9565df5b36c6a2507 Mon Sep 17 00:00:00 2001 From: Viktor Lofgren Date: Sat, 7 Oct 2023 15:43:18 +0200 Subject: [PATCH] (control) Administrative QOL improvement, GUI for banning spam --- .../control-service/build.gradle | 1 + .../nu/marginalia/control/ControlService.java | 43 ++++++++++++++++++- .../templates/control/partials/nav.hdb | 1 + .../templates/control/search-to-ban.hdb | 37 ++++++++++++++++ .../search/svc/SearchApiQueryService.java | 1 + 5 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 code/services-core/control-service/src/main/resources/templates/control/search-to-ban.hdb diff --git a/code/services-core/control-service/build.gradle b/code/services-core/control-service/build.gradle index f5535f7e..373c1a6f 100644 --- a/code/services-core/control-service/build.gradle +++ b/code/services-core/control-service/build.gradle @@ -45,6 +45,7 @@ dependencies { implementation libs.notnull implementation libs.guice implementation libs.zstd + implementation libs.rxjava implementation libs.trove implementation libs.spark diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/ControlService.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/ControlService.java index c6adb096..305c74f0 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/ControlService.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/ControlService.java @@ -3,6 +3,7 @@ package nu.marginalia.control; import com.google.gson.Gson; import com.google.inject.Inject; import gnu.trove.list.array.TIntArrayList; +import nu.marginalia.client.Context; import nu.marginalia.client.ServiceMonitors; import nu.marginalia.control.actor.Actor; import nu.marginalia.control.model.*; @@ -10,9 +11,11 @@ import nu.marginalia.control.svc.*; import nu.marginalia.db.storage.model.FileStorageId; import nu.marginalia.db.storage.model.FileStorageType; import nu.marginalia.model.EdgeDomain; +import nu.marginalia.model.EdgeUrl; import nu.marginalia.model.gson.GsonFactory; import nu.marginalia.renderer.RendererFactory; import nu.marginalia.screenshot.ScreenshotService; +import nu.marginalia.search.client.SearchClient; import nu.marginalia.service.server.*; import org.eclipse.jetty.util.StringUtil; import org.slf4j.Logger; @@ -38,6 +41,7 @@ public class ControlService extends Service { private final DomainComplaintService domainComplaintService; private final ControlBlacklistService blacklistService; private final RandomExplorationService randomExplorationService; + private final SearchClient searchClient; private final ControlActorService controlActorService; private final StaticResources staticResources; private final MessageQueueService messageQueueService; @@ -59,7 +63,8 @@ public class ControlService extends Service { ControlBlacklistService blacklistService, ControlActionsService controlActionsService, ScreenshotService screenshotService, - RandomExplorationService randomExplorationService + RandomExplorationService randomExplorationService, + SearchClient searchClient ) throws IOException { super(params); @@ -70,6 +75,7 @@ public class ControlService extends Service { this.domainComplaintService = domainComplaintService; this.blacklistService = blacklistService; this.randomExplorationService = randomExplorationService; + this.searchClient = searchClient; var indexRenderer = rendererFactory.renderer("control/index"); var eventsRenderer = rendererFactory.renderer("control/events"); @@ -96,6 +102,7 @@ public class ControlService extends Service { var actionsViewRenderer = rendererFactory.renderer("control/actions"); var blacklistRenderer = rendererFactory.renderer("control/blacklist"); + var searchToBanRenderer = rendererFactory.renderer("control/search-to-ban"); this.controlActorService = controlActorService; @@ -169,6 +176,9 @@ public class ControlService extends Service { Spark.get("/public/blacklist", this::blacklistModel, blacklistRenderer::render); Spark.post("/public/blacklist", this::updateBlacklist, redirectToBlacklist); + Spark.get("/public/search-to-ban", this::searchToBanModel, searchToBanRenderer::render); + Spark.post("/public/search-to-ban", this::searchToBanModel, searchToBanRenderer::render); + // API Keys Spark.get("/public/api-keys", this::apiKeysModel, apiKeysRenderer::render); @@ -242,6 +252,37 @@ public class ControlService extends Service { return Map.of("blacklist", blacklistService.lastNAdditions(100)); } + private Object searchToBanModel(Request request, Response response) { + String q = request.queryParams("q"); + + if (Objects.equals(request.requestMethod(), "POST")) { + request.params().forEach((k,v) -> System.out.println(k + " -- " + v)); + List bannedUrls = new ArrayList<>(); + + String query = request.queryParams("query"); + for (var param : request.queryParams()) { + if ("query".equals(param)) { + continue; + } + EdgeUrl.parse(param).ifPresent(url -> + blacklistService.addToBlacklist(url.domain, query) + ); + bannedUrls.add(param); + } + + request.queryParams().forEach(System.out::println); + q = query; + } + + if (q == null || q.isBlank()) { + return Map.of(); + } else { + return searchClient + .query(Context.fromRequest(request), q, 200, 5) + .blockingFirst(); + } + } + private Object updateBlacklist(Request request, Response response) { var domain = new EdgeDomain(request.queryParams("domain")); if ("add".equals(request.queryParams("act"))) { diff --git a/code/services-core/control-service/src/main/resources/templates/control/partials/nav.hdb b/code/services-core/control-service/src/main/resources/templates/control/partials/nav.hdb index bd34803b..a3c0e463 100644 --- a/code/services-core/control-service/src/main/resources/templates/control/partials/nav.hdb +++ b/code/services-core/control-service/src/main/resources/templates/control/partials/nav.hdb @@ -4,6 +4,7 @@
  • Manage
  • API Keys
  • Blacklist
  • +
  • Blacklist Search
  • Complaints
  • Random Exploration
  • System
  • diff --git a/code/services-core/control-service/src/main/resources/templates/control/search-to-ban.hdb b/code/services-core/control-service/src/main/resources/templates/control/search-to-ban.hdb new file mode 100644 index 00000000..9e1d26d4 --- /dev/null +++ b/code/services-core/control-service/src/main/resources/templates/control/search-to-ban.hdb @@ -0,0 +1,37 @@ + + + + Control Service + + + + +{{> control/partials/nav}} +
    +

    Search to Ban

    +
    +
    + +
    + {{#unless results}} +

    This utility lets you use the search engine to find spammy results, and ban them + by using the checkbox next to the result.

    + {{/unless}} + {{#if results}} +
    +
    + + + + {{#each results}} + + + + {{/each}} +
    {{title}}
    {{description}}
     
    + {{/if}} +
    +
    + + \ No newline at end of file diff --git a/code/services-core/search-service/src/main/java/nu/marginalia/search/svc/SearchApiQueryService.java b/code/services-core/search-service/src/main/java/nu/marginalia/search/svc/SearchApiQueryService.java index ad9d3fd6..8e4e3231 100644 --- a/code/services-core/search-service/src/main/java/nu/marginalia/search/svc/SearchApiQueryService.java +++ b/code/services-core/search-service/src/main/java/nu/marginalia/search/svc/SearchApiQueryService.java @@ -48,6 +48,7 @@ public class SearchApiQueryService { case "1" -> SearchProfile.MODERN; case "2" -> SearchProfile.DEFAULT; case "3" -> SearchProfile.CORPO_CLEAN; + case "5" -> SearchProfile.YOLO; case "blogosphere" -> SearchProfile.BLOGOSPHERE; default -> SearchProfile.CORPO_CLEAN; };