From ae416cc49f5e26d5178d605f4ed7c0ee2ec48a82 Mon Sep 17 00:00:00 2001 From: Risto Lahtela <24460436+Rsl1122@users.noreply.github.com> Date: Sun, 31 Jan 2021 11:06:19 +0200 Subject: [PATCH] Refactored QueryJSONResolver#getResponse method --- .../resolver/json/QueryJSONResolver.java | 45 +++++++++++-------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/QueryJSONResolver.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/QueryJSONResolver.java index 1bfcc5dca..57db94f3e 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/QueryJSONResolver.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/resolver/json/QueryJSONResolver.java @@ -97,32 +97,41 @@ public class QueryJSONResolver implements Resolver { } private Response getResponse(Request request) { - // Attempt to find previously created result - try { - Optional previousResults = request.getQuery().get("timestamp") - .flatMap(queryTimestamp -> jsonStorage.fetchExactJson("query", Long.parseLong(queryTimestamp))); - if (previousResults.isPresent()) { - return Response.builder() - .setMimeType(MimeType.JSON) - .setJSONContent(previousResults.get().json) - .build(); - } - } catch (NumberFormatException e) { - throw new BadRequestException("Could not parse 'timestamp' into a number. Remove parameter or fix it."); - } + Optional cachedResult = checkForCachedResult(request); + if (cachedResult.isPresent()) return cachedResult.get(); String q = request.getQuery().get("q").orElseThrow(() -> new BadRequestException("'q' parameter not set (expecting json array)")); String view = request.getQuery().get("view").orElseThrow(() -> new BadRequestException("'view' parameter not set (expecting json object {afterDate, afterTime, beforeDate, beforeTime})")); - long timestamp = System.currentTimeMillis(); - try { - q = URLDecoder.decode(q, "UTF-8"); - List queries = SpecifiedFilterInformation.parse(q); + String query = URLDecoder.decode(q, "UTF-8"); + List queries = SpecifiedFilterInformation.parse(query); Filter.Result result = filters.apply(queries); List resultPath = result.getInverseResultPath(); Collections.reverse(resultPath); + return buildAndStoreResponse(view, result, resultPath); + } catch (IOException e) { + throw new BadRequestException("Failed to decode json: '" + q + "', " + e.getMessage()); + } + } + + private Optional checkForCachedResult(Request request) { + try { + return request.getQuery().get("timestamp") + .flatMap(queryTimestamp -> jsonStorage.fetchExactJson("query", Long.parseLong(queryTimestamp))) + .map(results -> Response.builder() + .setMimeType(MimeType.JSON) + .setJSONContent(results.json) + .build()); + } catch (NumberFormatException e) { + throw new BadRequestException("Could not parse 'timestamp' into a number. Remove parameter or fix it."); + } + } + + private Response buildAndStoreResponse(String view, Filter.Result result, List resultPath) { + try { + long timestamp = System.currentTimeMillis(); Map json = Maps.builder(String.class, Object.class) .put("path", resultPath) .put("view", new Gson().fromJson(view, FiltersJSONResolver.ViewJSON.class)) @@ -140,8 +149,6 @@ public class QueryJSONResolver implements Resolver { .build(); } catch (ParseException e) { throw new BadRequestException("'view' date format was incorrect (expecting afterDate dd/mm/yyyy, afterTime hh:mm, beforeDate dd/mm/yyyy, beforeTime hh:mm}): " + e.getMessage()); - } catch (IOException e) { - throw new BadRequestException("Failed to parse json: '" + q + "'" + e.getMessage()); } }