MarginaliaSearch/code/services-application/dating-service/java/nu/marginalia/dating/DatingService.java

170 lines
5.7 KiB
Java
Raw Normal View History

2023-03-04 12:19:01 +00:00
package nu.marginalia.dating;
2022-05-19 15:45:26 +00:00
import com.google.inject.Inject;
2023-03-04 12:19:01 +00:00
import nu.marginalia.browse.DbBrowseDomainsRandom;
import nu.marginalia.browse.DbBrowseDomainsSimilarCosine;
import nu.marginalia.browse.model.BrowseResult;
import nu.marginalia.db.DomainBlacklist;
2023-03-04 12:19:01 +00:00
import nu.marginalia.renderer.MustacheRenderer;
import nu.marginalia.renderer.RendererFactory;
import nu.marginalia.screenshot.ScreenshotService;
import nu.marginalia.service.server.BaseServiceParams;
import nu.marginalia.service.server.Service;
2022-05-19 15:45:26 +00:00
import org.jetbrains.annotations.NotNull;
import spark.Request;
import spark.Response;
import spark.Spark;
import java.util.Map;
import java.util.Optional;
public class DatingService extends Service {
private final DomainBlacklist blacklist;
2023-03-04 12:19:01 +00:00
private final DbBrowseDomainsSimilarCosine browseSimilarCosine;
private final DbBrowseDomainsRandom browseRandom;
2022-05-19 15:45:26 +00:00
private final MustacheRenderer<BrowseResult> datingRenderer;
private final ScreenshotService screenshotService;
private final String SESSION_OBJECT_NAME = "so";
2022-05-19 15:45:26 +00:00
@Inject
public DatingService(BaseServiceParams params,
2022-05-19 15:45:26 +00:00
RendererFactory rendererFactory,
DomainBlacklist blacklist,
2023-03-04 12:19:01 +00:00
DbBrowseDomainsSimilarCosine browseSimilarCosine,
DbBrowseDomainsRandom browseRandom,
ScreenshotService screenshotService)
throws Exception
{
2022-05-19 15:45:26 +00:00
super(params);
2022-05-19 15:45:26 +00:00
this.blacklist = blacklist;
datingRenderer = rendererFactory.renderer("dating/dating-view");
2023-03-04 12:19:01 +00:00
this.browseSimilarCosine = browseSimilarCosine;
this.browseRandom = browseRandom;
2022-05-19 15:45:26 +00:00
this.screenshotService = screenshotService;
Spark.get("/reset", this::getReset);
Spark.get("/", this::getInitSession);
Spark.get("/view", this::getCurrent);
Spark.get("/next", this::getNext);
Spark.get("/similar/:id", this::getSimilar);
Spark.get("/rewind", this::getRewind);
Spark.get("/init", this::getInitSession);
2022-05-19 15:45:26 +00:00
}
private Object getInitSession(Request request, Response response) {
var sessionObjectOpt = getSession(request);
if (sessionObjectOpt.isEmpty()) {
request.session(true).attribute(SESSION_OBJECT_NAME, new DatingSessionObject());
}
response.redirect("https://explore.marginalia.nu/view");
return "";
}
private String getReset(Request request, Response response) {
var sessionObjectOpt = getSession(request);
if (sessionObjectOpt.isEmpty()) {
response.redirect("https://explore.marginalia.nu/");
return "";
}
var session = sessionObjectOpt.get();
session.resetQueue();
return getNext(request, response);
}
private String getCurrent(Request request, Response response) {
var sessionObjectOpt = getSession(request);
if (sessionObjectOpt.isEmpty()) {
response.redirect("https://explore.marginalia.nu/");
return "";
}
var session = sessionObjectOpt.get();
var current = session.getCurrent();
if (current == null) {
2023-03-04 12:19:01 +00:00
BrowseResult res = session.next(browseRandom, blacklist);
2022-05-19 15:45:26 +00:00
res = findViableDomain(session, res);
session.browseForward(res);
current = session.getCurrent();
}
return datingRenderer.render(current, Map.of("back", session.hasHistory()));
}
private String getNext(Request request, Response response) {
var sessionObjectOpt = getSession(request);
if (sessionObjectOpt.isEmpty()) {
response.redirect("https://explore.marginalia.nu/");
return "";
}
var session = sessionObjectOpt.get();
2023-03-04 12:19:01 +00:00
BrowseResult res = session.next(browseRandom, blacklist);
2022-05-19 15:45:26 +00:00
res = findViableDomain(session, res);
session.browseForward(res);
response.redirect("https://explore.marginalia.nu/view");
return "";
}
private String getRewind(Request request, Response response) {
var sessionObjectOpt = getSession(request);
if (sessionObjectOpt.isEmpty()) {
response.redirect("https://explore.marginalia.nu/");
return "";
}
var session = sessionObjectOpt.get();
BrowseResult res = session.takeFromHistory();
if (res == null) {
Spark.halt(404);
return "";
}
session.browseBackward(res);
response.redirect("https://explore.marginalia.nu/view");
return "";
}
private String getSimilar(Request request, Response response) {
var sessionObjectOpt = getSession(request);
if (sessionObjectOpt.isEmpty()) {
response.redirect("https://explore.marginalia.nu/");
return "";
}
var session = sessionObjectOpt.get();
int id = Integer.parseInt(request.params("id"));
BrowseResult res = session.nextSimilar(id, browseSimilarCosine, blacklist);
2022-05-19 15:45:26 +00:00
res = findViableDomain(session, res);
session.browseForward(res);
response.redirect("https://explore.marginalia.nu/view");
return "";
}
@NotNull
private BrowseResult findViableDomain(DatingSessionObject session, BrowseResult res) {
while (!screenshotService.hasScreenshot(res.domainId()) || session.isRecent(res)) {
2023-03-04 12:19:01 +00:00
res = session.next(browseRandom, blacklist);
2022-05-19 15:45:26 +00:00
}
return res;
}
private Optional<DatingSessionObject> getSession(Request request) {
return Optional.ofNullable(request.session(false))
.map(s -> s.attribute(SESSION_OBJECT_NAME))
.map(DatingSessionObject.class::cast);
}
}