package com.github.aesteve.vertx.nubes.context; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class ClientAccesses { private List<Long> history; public ClientAccesses() { history = new ArrayList<>(); } public void newAccess() { history.add(System.currentTimeMillis()); } public boolean isOverLimit(RateLimit limit) { long minBound = System.currentTimeMillis() - limit.getTimeUnit().toMillis(limit.getValue()); long count = history.stream().filter(access -> access > minBound).count(); return count > limit.getCount(); } public void clearHistory(Long keepAfter) { history = history.stream().filter(access -> access > keepAfter).collect(Collectors.toList()); } public boolean noAccess() { return history.isEmpty(); } @SuppressWarnings("unchecked") public static ClientAccesses fromJsonObject(JsonObject json) { ClientAccesses accesses = new ClientAccesses(); JsonArray array = json.getJsonArray("history"); if (array != null) { accesses.history = array.getList(); } return accesses; } public JsonObject toJsonObject() { return new JsonObject().put("history", new JsonArray(history)); } }