From 0f76df92b95ec3883bbd6026e2965fe73290aab9 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Mon, 10 Nov 2025 00:00:08 +0000 Subject: [PATCH] Refactor date range initialization to fetch earliest timestamp from API and set default values Signed-off-by: Adam Warner --- scripts/js/queries.js | 51 +++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/scripts/js/queries.js b/scripts/js/queries.js index 3ef5f5a3..3aa0943b 100644 --- a/scripts/js/queries.js +++ b/scripts/js/queries.js @@ -9,10 +9,12 @@ "use strict"; -const beginningOfTime = 1_262_304_000; // Jan 01 2010, 00:00 in seconds -const endOfTime = 2_147_483_647; // Jan 19, 2038, 03:14 in seconds -let from = beginningOfTime; -let until = endOfTime; +// These values are provided by the API (/info/database). +// We initialize them as null and populate them during page init. +let beginningOfTime = null; // seconds since epoch (set from API: info/database.earliest_timestamp) +let endOfTime = null; // seconds since epoch (set to end of today) +let from = null; +let until = null; const dateformat = "MMM Do YYYY, HH:mm"; @@ -40,7 +42,30 @@ function getDnssecConfig() { }); } +// Fetch database info (earliest timestamp, sizes, ...) from the API and +// initialize related globals. +function getDatabaseInfo() { + $.getJSON(document.body.dataset.apiurl + "/info/database", data => { + // earliest_timestamp is provided in seconds since epoch + beginningOfTime = Number(data.earliest_timestamp_disk); + // Round down to nearest 5-minute segment (300 seconds) + beginningOfTime = Math.floor(beginningOfTime / 300) * 300; + + // endOfTime should be the end of today (local), in seconds since epoch + endOfTime = moment().endOf("day").unix(); + + // If from/until were not provided via GET, default them + from ??= beginningOfTime; + until ??= endOfTime; + + initDateRangePicker(); + }); +} + function initDateRangePicker() { + const minDateMoment = moment.unix(beginningOfTime); + const maxDateMoment = moment.unix(endOfTime); + $("#querytime").daterangepicker( { timePicker: true, @@ -52,21 +77,24 @@ function initDateRangePicker() { ranges: { "Last 10 Minutes": [moment().subtract(10, "minutes"), moment()], "Last Hour": [moment().subtract(1, "hours"), moment()], - Today: [moment().startOf("day"), moment().endOf("day")], + Today: [moment().startOf("day"), maxDateMoment], Yesterday: [ moment().subtract(1, "days").startOf("day"), moment().subtract(1, "days").endOf("day"), ], - "Last 7 Days": [moment().subtract(6, "days"), moment().endOf("day")], - "Last 30 Days": [moment().subtract(29, "days"), moment().endOf("day")], + "Last 7 Days": [moment().subtract(6, "days"), maxDateMoment], + "Last 30 Days": [moment().subtract(29, "days"), maxDateMoment], "This Month": [moment().startOf("month"), moment().endOf("month")], "Last Month": [ moment().subtract(1, "month").startOf("month"), moment().subtract(1, "month").endOf("month"), ], "This Year": [moment().startOf("year"), moment().endOf("year")], - "All Time": [moment(beginningOfTime * 1000), moment(endOfTime * 1000)], // convert to milliseconds since epoch + "All Time": [minDateMoment, maxDateMoment], }, + // Don't allow selecting dates outside the database range + minDate: minDateMoment, + maxDate: maxDateMoment, opens: "center", showDropdowns: true, autoUpdateInput: true, @@ -510,14 +538,15 @@ $(() => { const apiURL = getAPIURL(GETDict); if ("from" in GETDict) { - from = GETDict.from; + from = Number(GETDict.from); } if ("until" in GETDict) { - until = GETDict.until; + until = Number(GETDict.until); } - initDateRangePicker(); + // Fetch earliest timestamp from API and initialize date picker / table + getDatabaseInfo(); table = $("#all-queries").DataTable({ ajax: {