(control/search) Add ability to suggest removing a site from random exploration

This is what most complaints have been about.
This commit is contained in:
Viktor Lofgren 2023-11-02 15:29:49 +01:00
parent 3047e2dd7c
commit 8e9698c9a0
6 changed files with 33 additions and 4 deletions

View File

@ -32,7 +32,8 @@ public class SearchFlagSiteService {
new CategoryItem("freebooting", "Reposting Stolen Content"), new CategoryItem("freebooting", "Reposting Stolen Content"),
new CategoryItem("broken", "Broken Website"), new CategoryItem("broken", "Broken Website"),
new CategoryItem("shock", "Shocking/Offensive"), new CategoryItem("shock", "Shocking/Offensive"),
new CategoryItem("blacklist", "Review Blacklisting") new CategoryItem("blacklist", "Review Blacklisting"),
new CategoryItem("no-random", "Remove from Random Exploration")
); );
private final Map<String, CategoryItem> categoryItemMap = private final Map<String, CategoryItem> categoryItemMap =

View File

@ -112,4 +112,4 @@
</section> </section>
</footer> </footer>
<script src="tts.js" rel="javascript"></script> <script src="/tts.js" rel="javascript"></script>

View File

@ -6,6 +6,7 @@ public enum DomainComplaintCategory {
BROKEN("broken"), BROKEN("broken"),
SHOCK("shock"), SHOCK("shock"),
BLACKLIST("blacklist"), BLACKLIST("blacklist"),
REMOVE_EXPLORATION("no-random"),
UNKNOWN("unknown"); UNKNOWN("unknown");
private final String categoryName; private final String categoryName;

View File

@ -2,6 +2,7 @@ package nu.marginalia.control.app.svc;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.HikariDataSource;
import lombok.SneakyThrows;
import nu.marginalia.control.Redirects; import nu.marginalia.control.Redirects;
import nu.marginalia.control.app.model.DomainComplaintCategory; import nu.marginalia.control.app.model.DomainComplaintCategory;
import nu.marginalia.control.app.model.DomainComplaintModel; import nu.marginalia.control.app.model.DomainComplaintModel;
@ -27,16 +28,19 @@ public class DomainComplaintService {
private final HikariDataSource dataSource; private final HikariDataSource dataSource;
private final RendererFactory rendererFactory; private final RendererFactory rendererFactory;
private final ControlBlacklistService blacklistService; private final ControlBlacklistService blacklistService;
private final RandomExplorationService randomExplorationService;
private final Logger logger = LoggerFactory.getLogger(getClass()); private final Logger logger = LoggerFactory.getLogger(getClass());
@Inject @Inject
public DomainComplaintService(HikariDataSource dataSource, public DomainComplaintService(HikariDataSource dataSource,
RendererFactory rendererFactory, RendererFactory rendererFactory,
ControlBlacklistService blacklistService ControlBlacklistService blacklistService,
RandomExplorationService randomExplorationService
) { ) {
this.dataSource = dataSource; this.dataSource = dataSource;
this.rendererFactory = rendererFactory; this.rendererFactory = rendererFactory;
this.blacklistService = blacklistService; this.blacklistService = blacklistService;
this.randomExplorationService = randomExplorationService;
} }
public void register() throws IOException { public void register() throws IOException {
@ -59,6 +63,7 @@ public class DomainComplaintService {
return Map.of("complaintsNew", unreviewed, "complaintsReviewed", reviewed); return Map.of("complaintsNew", unreviewed, "complaintsReviewed", reviewed);
} }
@SneakyThrows
private Object reviewComplaint(Request request, Response response) { private Object reviewComplaint(Request request, Response response) {
var domain = new EdgeDomain(request.params("domain")); var domain = new EdgeDomain(request.params("domain"));
String action = request.queryParams("action"); String action = request.queryParams("action");
@ -68,6 +73,7 @@ public class DomainComplaintService {
switch (action) { switch (action) {
case "noop" -> reviewNoAction(domain); case "noop" -> reviewNoAction(domain);
case "appeal" -> approveAppealBlacklisting(domain); case "appeal" -> approveAppealBlacklisting(domain);
case "no-random" -> removeFromRandomDomains(domain);
case "blacklist" -> blacklistDomain(domain); case "blacklist" -> blacklistDomain(domain);
default -> throw new UnsupportedOperationException(); default -> throw new UnsupportedOperationException();
} }
@ -75,7 +81,6 @@ public class DomainComplaintService {
return ""; return "";
} }
public List<DomainComplaintModel> getComplaints() { public List<DomainComplaintModel> getComplaints() {
try (var conn = dataSource.getConnection(); try (var conn = dataSource.getConnection();
var stmt = conn.prepareStatement(""" var stmt = conn.prepareStatement("""
@ -109,6 +114,12 @@ public class DomainComplaintService {
setDecision(domain, "APPROVED"); setDecision(domain, "APPROVED");
} }
private void removeFromRandomDomains(EdgeDomain domain) throws SQLException {
randomExplorationService.removeDomain(domain);
setDecision(domain, "REMOVED-FROM-RANDOM");
}
public void blacklistDomain(EdgeDomain domain) { public void blacklistDomain(EdgeDomain domain) {
blacklistService.addToBlacklist(domain, "Domain complaint"); blacklistService.addToBlacklist(domain, "Domain complaint");

View File

@ -3,6 +3,7 @@ package nu.marginalia.control.app.svc;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.HikariDataSource;
import gnu.trove.list.array.TIntArrayList; import gnu.trove.list.array.TIntArrayList;
import nu.marginalia.model.EdgeDomain;
import nu.marginalia.renderer.RendererFactory; import nu.marginalia.renderer.RendererFactory;
import spark.Request; import spark.Request;
import spark.Response; import spark.Response;
@ -108,6 +109,20 @@ public class RandomExplorationService {
} }
} }
public void removeDomain(EdgeDomain domain) throws SQLException {
try (var conn = dataSource.getConnection();
var stmt = conn.prepareStatement("""
DELETE EC_RANDOM_DOMAINS
FROM EC_RANDOM_DOMAINS
INNER JOIN EC_DOMAIN ON EC_DOMAIN.ID = EC_RANDOM_DOMAINS.DOMAIN_ID
WHERE EC_DOMAIN.DOMAIN_NAME = ?
"""))
{
stmt.setString(1, domain.toString());
stmt.executeUpdate();
}
}
public record RandomDomainResult(int id, String domainName) {} public record RandomDomainResult(int id, String domainName) {}
} }

View File

@ -43,6 +43,7 @@
{{/if}} {{/if}}
{{#unless appeal}} {{#unless appeal}}
<li><a class="dropdown-item" href="#" onClick="handleComplaint('{{domain}}', 'blacklist')">Add Sanction</a></li> <li><a class="dropdown-item" href="#" onClick="handleComplaint('{{domain}}', 'blacklist')">Add Sanction</a></li>
<li><a class="dropdown-item" href="#" onClick="handleComplaint('{{domain}}', 'no-random')">Remove From Random Domains</a></li>
{{/unless}} {{/unless}}
<li><a class="dropdown-item" href="#" onClick="handleComplaint('{{domain}}', 'noop')">Ignore</a></li> <li><a class="dropdown-item" href="#" onClick="handleComplaint('{{domain}}', 'noop')">Ignore</a></li>
</ul> </ul>