mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2025-03-10 13:49:17 +01:00
Cache graph responses
This commit is contained in:
parent
f5a9d03da9
commit
b5365d2321
@ -54,7 +54,7 @@ import java.util.regex.Pattern;
|
||||
public class ResponseResolver {
|
||||
|
||||
private final DebugPageResolver debugPageResolver;
|
||||
private QueryPageResolver queryPageResolver;
|
||||
private final QueryPageResolver queryPageResolver;
|
||||
private final PlayersPageResolver playersPageResolver;
|
||||
private final PlayerPageResolver playerPageResolver;
|
||||
private final ServerPageResolver serverPageResolver;
|
||||
|
@ -42,12 +42,14 @@ public interface JSONStorage extends SubSystem {
|
||||
}
|
||||
|
||||
default StoredJSON storeJson(String identifier, Object json) {
|
||||
if (json instanceof String) return storeJson(identifier, (String) json);
|
||||
return storeJson(identifier, new Gson().toJson(json));
|
||||
}
|
||||
|
||||
StoredJSON storeJson(String identifier, String json, long timestamp);
|
||||
|
||||
default StoredJSON storeJson(String identifier, Object json, long timestamp) {
|
||||
if (json instanceof String) return storeJson(identifier, (String) json, timestamp);
|
||||
return storeJson(identifier, new Gson().toJson(json), timestamp);
|
||||
}
|
||||
|
||||
|
@ -17,13 +17,15 @@
|
||||
package com.djrapitops.plan.delivery.webserver.resolver.json;
|
||||
|
||||
import com.djrapitops.plan.delivery.rendering.json.graphs.GraphJSONCreator;
|
||||
import com.djrapitops.plan.delivery.web.resolver.MimeType;
|
||||
import com.djrapitops.plan.delivery.web.resolver.Resolver;
|
||||
import com.djrapitops.plan.delivery.web.resolver.Response;
|
||||
import com.djrapitops.plan.delivery.web.resolver.exception.BadRequestException;
|
||||
import com.djrapitops.plan.delivery.web.resolver.request.Request;
|
||||
import com.djrapitops.plan.delivery.web.resolver.request.WebUser;
|
||||
import com.djrapitops.plan.delivery.webserver.cache.AsyncJSONResolverService;
|
||||
import com.djrapitops.plan.delivery.webserver.cache.DataID;
|
||||
import com.djrapitops.plan.delivery.webserver.cache.JSONCache;
|
||||
import com.djrapitops.plan.delivery.webserver.cache.JSONStorage;
|
||||
import com.djrapitops.plan.identification.Identifiers;
|
||||
|
||||
import javax.inject.Inject;
|
||||
@ -41,14 +43,16 @@ import java.util.UUID;
|
||||
public class GraphsJSONResolver implements Resolver {
|
||||
|
||||
private final Identifiers identifiers;
|
||||
private final AsyncJSONResolverService jsonResolverService;
|
||||
private final GraphJSONCreator graphJSON;
|
||||
|
||||
@Inject
|
||||
public GraphsJSONResolver(
|
||||
Identifiers identifiers,
|
||||
GraphJSONCreator graphJSON
|
||||
AsyncJSONResolverService jsonResolverService, GraphJSONCreator graphJSON
|
||||
) {
|
||||
this.identifiers = identifiers;
|
||||
this.jsonResolverService = jsonResolverService;
|
||||
this.graphJSON = graphJSON;
|
||||
}
|
||||
|
||||
@ -76,12 +80,31 @@ public class GraphsJSONResolver implements Resolver {
|
||||
|
||||
DataID dataID = getDataID(type);
|
||||
|
||||
JSONStorage.StoredJSON graphJSON = getGraphJSON(request, dataID);
|
||||
|
||||
return Response.builder()
|
||||
.setMimeType(MimeType.JSON)
|
||||
.setJSONContent(graphJSON.json)
|
||||
.build();
|
||||
}
|
||||
|
||||
private JSONStorage.StoredJSON getGraphJSON(Request request, DataID dataID) {
|
||||
long timestamp = Identifiers.getTimestamp(request);
|
||||
|
||||
JSONStorage.StoredJSON storedJSON;
|
||||
if (request.getQuery().get("server").isPresent()) {
|
||||
UUID serverUUID = identifiers.getServerUUID(request); // Can throw BadRequestException
|
||||
return JSONCache.getOrCache(dataID, serverUUID, () -> generateGraphDataJSONOfType(dataID, serverUUID));
|
||||
storedJSON = jsonResolverService.resolve(
|
||||
timestamp, dataID, serverUUID,
|
||||
theServerUUID -> generateGraphDataJSONOfType(dataID, theServerUUID)
|
||||
);
|
||||
} else {
|
||||
// Assume network
|
||||
storedJSON = jsonResolverService.resolve(
|
||||
timestamp, dataID, () -> generateGraphDataJSONOfType(dataID)
|
||||
);
|
||||
}
|
||||
// Assume network
|
||||
return JSONCache.getOrCache(dataID, () -> generateGraphDataJSONOfType(dataID));
|
||||
return storedJSON;
|
||||
}
|
||||
|
||||
private DataID getDataID(String type) {
|
||||
|
@ -20,11 +20,11 @@ import com.djrapitops.plan.delivery.rendering.json.network.NetworkTabJSONCreator
|
||||
import com.djrapitops.plan.delivery.web.resolver.MimeType;
|
||||
import com.djrapitops.plan.delivery.web.resolver.Resolver;
|
||||
import com.djrapitops.plan.delivery.web.resolver.Response;
|
||||
import com.djrapitops.plan.delivery.web.resolver.exception.BadRequestException;
|
||||
import com.djrapitops.plan.delivery.web.resolver.request.Request;
|
||||
import com.djrapitops.plan.delivery.web.resolver.request.WebUser;
|
||||
import com.djrapitops.plan.delivery.webserver.cache.AsyncJSONResolverService;
|
||||
import com.djrapitops.plan.delivery.webserver.cache.DataID;
|
||||
import com.djrapitops.plan.identification.Identifiers;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.function.Supplier;
|
||||
@ -62,17 +62,7 @@ public class NetworkTabJSONResolver<T> implements Resolver {
|
||||
private Response getResponse(Request request) {
|
||||
return Response.builder()
|
||||
.setMimeType(MimeType.JSON)
|
||||
.setJSONContent(asyncJSONResolverService.resolve(getTimestamp(request), dataID, jsonCreator).json)
|
||||
.setJSONContent(asyncJSONResolverService.resolve(Identifiers.getTimestamp(request), dataID, jsonCreator).json)
|
||||
.build();
|
||||
}
|
||||
|
||||
private long getTimestamp(Request request) {
|
||||
try {
|
||||
return request.getQuery().get("timestamp")
|
||||
.map(Long::parseLong)
|
||||
.orElseGet(System::currentTimeMillis);
|
||||
} catch (NumberFormatException nonNumberTimestamp) {
|
||||
throw new BadRequestException("'timestamp' was not a number: " + nonNumberTimestamp.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
@ -20,7 +20,6 @@ import com.djrapitops.plan.delivery.rendering.json.ServerTabJSONCreator;
|
||||
import com.djrapitops.plan.delivery.web.resolver.MimeType;
|
||||
import com.djrapitops.plan.delivery.web.resolver.Resolver;
|
||||
import com.djrapitops.plan.delivery.web.resolver.Response;
|
||||
import com.djrapitops.plan.delivery.web.resolver.exception.BadRequestException;
|
||||
import com.djrapitops.plan.delivery.web.resolver.request.Request;
|
||||
import com.djrapitops.plan.delivery.web.resolver.request.WebUser;
|
||||
import com.djrapitops.plan.delivery.webserver.cache.AsyncJSONResolverService;
|
||||
@ -29,7 +28,6 @@ import com.djrapitops.plan.identification.Identifiers;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
@ -68,23 +66,7 @@ public class ServerTabJSONResolver<T> implements Resolver {
|
||||
UUID serverUUID = identifiers.getServerUUID(request); // Can throw BadRequestException
|
||||
return Response.builder()
|
||||
.setMimeType(MimeType.JSON)
|
||||
.setJSONContent(asyncJSONResolverService.resolve(getTimestamp(request), dataID, serverUUID, jsonCreator).json)
|
||||
.setJSONContent(asyncJSONResolverService.resolve(Identifiers.getTimestamp(request), dataID, serverUUID, jsonCreator).json)
|
||||
.build();
|
||||
}
|
||||
|
||||
private long getTimestamp(Request request) {
|
||||
try {
|
||||
long currentTime = System.currentTimeMillis();
|
||||
long timestamp = request.getQuery().get("timestamp")
|
||||
.map(Long::parseLong)
|
||||
.orElse(currentTime);
|
||||
if (currentTime + TimeUnit.SECONDS.toMillis(10L) < timestamp) {
|
||||
throw new BadRequestException("Attempt to get data from the future! " + timestamp + " > " + currentTime);
|
||||
}
|
||||
return timestamp;
|
||||
} catch (NumberFormatException nonNumberTimestamp) {
|
||||
throw new BadRequestException("'timestamp' was not a number: " + nonNumberTimestamp.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -26,6 +26,7 @@ import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* Utility for getting server identifier from different sources.
|
||||
@ -103,4 +104,19 @@ public class Identifiers {
|
||||
public UUID getPlayerUUID(String name) {
|
||||
return uuidUtility.getUUIDOf(name);
|
||||
}
|
||||
|
||||
public static long getTimestamp(Request request) {
|
||||
try {
|
||||
long currentTime = System.currentTimeMillis();
|
||||
long timestamp = request.getQuery().get("timestamp")
|
||||
.map(Long::parseLong)
|
||||
.orElse(currentTime);
|
||||
if (currentTime + TimeUnit.SECONDS.toMillis(10L) < timestamp) {
|
||||
throw new BadRequestException("Attempt to get data from the future! " + timestamp + " > " + currentTime);
|
||||
}
|
||||
return timestamp;
|
||||
} catch (NumberFormatException nonNumberTimestamp) {
|
||||
throw new BadRequestException("'timestamp' was not a number: " + nonNumberTimestamp.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user