From ce9d9dcfd0948308a784f049df280ab804efea45 Mon Sep 17 00:00:00 2001 From: Logesh K <90227668+lokiee0@users.noreply.github.com> Date: Sun, 12 Jul 2026 18:51:12 +0530 Subject: [PATCH 01/11] Refactor chartId to use for reactive updates --- .../components/ui/chart/chart-container.svelte | 2 +- .../ui/toggle-group/toggle-group.svelte | 18 +++++++++++++----- src/lib/server/dns.ts | 4 +--- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/lib/components/ui/chart/chart-container.svelte b/src/lib/components/ui/chart/chart-container.svelte index 93523b2f..d9b8b9da 100644 --- a/src/lib/components/ui/chart/chart-container.svelte +++ b/src/lib/components/ui/chart/chart-container.svelte @@ -17,7 +17,7 @@ config: ChartConfig; } = $props(); - const chartId = `chart-${id || uid.replace(/:/g, "")}`; + const chartId = $derived(`chart-${id || uid.replace(/:/g, "")}`); setChartContext({ get config() { diff --git a/src/lib/components/ui/toggle-group/toggle-group.svelte b/src/lib/components/ui/toggle-group/toggle-group.svelte index 106561c5..fe81878a 100644 --- a/src/lib/components/ui/toggle-group/toggle-group.svelte +++ b/src/lib/components/ui/toggle-group/toggle-group.svelte @@ -5,8 +5,10 @@ type ToggleVariants = VariantProps; - interface ToggleGroupContext extends ToggleVariants { - spacing?: number; + interface ToggleGroupContext { + get variant(): ToggleVariants["variant"]; + get size(): ToggleVariants["size"]; + get spacing(): number | undefined; } export function setToggleGroupCtx(props: ToggleGroupContext) { @@ -33,9 +35,15 @@ }: ToggleGroupPrimitive.RootProps & ToggleVariants & { spacing?: number } = $props(); setToggleGroupCtx({ - variant, - size, - spacing, + get variant() { + return variant; + }, + get size() { + return size; + }, + get spacing() { + return spacing; + }, }); diff --git a/src/lib/server/dns.ts b/src/lib/server/dns.ts index 6533f740..7d58c058 100644 --- a/src/lib/server/dns.ts +++ b/src/lib/server/dns.ts @@ -2,7 +2,7 @@ import dns2 from "dns2"; import dgram, { type Socket } from "dgram"; import tls from "tls"; import { Resolver as NodeResolver } from "node:dns/promises"; -import { AllRecordTypes, IsValidHost, ValidateIpAddress } from "../clientTools"; +import { AllRecordTypes, IsValidHost } from "../clientTools"; interface DNSAnswer { name: string; @@ -135,7 +135,6 @@ class DNSResolver { const port = options.tlsPort ?? DEFAULT_DOT_PORT; const timeoutMs = options.timeoutMs ?? DEFAULT_QUERY_TIMEOUT_MS; const servername = this.resolveTlsServername(nameserver, options.tlsServername); - const ipType = ValidateIpAddress(nameserver); return new Promise((resolve, reject) => { let responseBuffer = Buffer.alloc(0); @@ -146,7 +145,6 @@ class DNSResolver { port, servername, rejectUnauthorized: !options.allowSelfSignedCert, - family: ipType === "IP6" ? 6 : ipType === "IP4" ? 4 : undefined, }); const timeoutId = setTimeout(() => { From 9b2989cbfcf274406ec12e3b4ff423ce7e530061 Mon Sep 17 00:00:00 2001 From: Logesh K <90227668+lokiee0@users.noreply.github.com> Date: Wed, 15 Jul 2026 22:22:12 +0530 Subject: [PATCH 02/11] ci: allow main image matrix jobs to complete --- .github/workflows/publish-main.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish-main.yml b/.github/workflows/publish-main.yml index 0560acb2..446a5ddf 100644 --- a/.github/workflows/publish-main.yml +++ b/.github/workflows/publish-main.yml @@ -14,12 +14,13 @@ env: concurrency: group: main-docker-${{ github.ref }} - cancel-in-progress: true + cancel-in-progress: false jobs: build-and-push-main: name: Build and push main Docker images (with docs) strategy: + fail-fast: false matrix: variant: [debian, alpine] runs-on: ubuntu-latest From 4bd3668a5dbe6bd0b90a8439ae990d866fbdde54 Mon Sep 17 00:00:00 2001 From: LOGESH K <90227668+lokiee0@users.noreply.github.com> Date: Fri, 24 Jul 2026 23:10:15 +0530 Subject: [PATCH 03/11] Pass monitoring status through controller --- src/lib/server/controllers/monitorsController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/server/controllers/monitorsController.ts b/src/lib/server/controllers/monitorsController.ts index 65dd6de6..91c02f55 100644 --- a/src/lib/server/controllers/monitorsController.ts +++ b/src/lib/server/controllers/monitorsController.ts @@ -490,7 +490,7 @@ export const GetStatusCountsByInterval = async ( export const GetMonitoringDataPaginated = async ( page: number, limit: number, - filter?: { monitor_tag?: string; start_time?: number; end_time?: number }, + filter?: { monitor_tag?: string; status?: string; start_time?: number; end_time?: number }, ): Promise<{ data: MonitoringData[]; total: number }> => { const data = await db.getMonitoringDataPaginated(page, limit, filter); const countResult = await db.getMonitoringDataCount(filter); From 9580f0ee78e1379f556b19ce12103fa94ec3b39e Mon Sep 17 00:00:00 2001 From: LOGESH K <90227668+lokiee0@users.noreply.github.com> Date: Fri, 24 Jul 2026 23:10:16 +0530 Subject: [PATCH 04/11] Filter monitoring data and count by status --- src/lib/server/db/repositories/monitoring.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/lib/server/db/repositories/monitoring.ts b/src/lib/server/db/repositories/monitoring.ts index 0e6c93fa..7a4e0fbd 100644 --- a/src/lib/server/db/repositories/monitoring.ts +++ b/src/lib/server/db/repositories/monitoring.ts @@ -82,7 +82,7 @@ export class MonitoringRepository extends BaseRepository { async getMonitoringDataPaginated( page: number, limit: number, - filter?: { monitor_tag?: string; start_time?: number; end_time?: number }, + filter?: { monitor_tag?: string; status?: string; start_time?: number; end_time?: number }, ): Promise { let query = this.knex("monitoring_data").select("*"); @@ -90,6 +90,10 @@ export class MonitoringRepository extends BaseRepository { query = query.where("monitor_tag", filter.monitor_tag); } + if (filter?.status) { + query = query.where("status", filter.status); + } + if (filter?.start_time) { query = query.where("timestamp", ">=", filter.start_time); } @@ -106,6 +110,7 @@ export class MonitoringRepository extends BaseRepository { async getMonitoringDataCount(filter?: { monitor_tag?: string; + status?: string; start_time?: number; end_time?: number; }): Promise<{ count: number }> { @@ -115,6 +120,10 @@ export class MonitoringRepository extends BaseRepository { query = query.where("monitor_tag", filter.monitor_tag); } + if (filter?.status) { + query = query.where("status", filter.status); + } + if (filter?.start_time) { query = query.where("timestamp", ">=", filter.start_time); } From 48e1744c8512abb20b01d8e7a1b70fc758843462 Mon Sep 17 00:00:00 2001 From: LOGESH K <90227668+lokiee0@users.noreply.github.com> Date: Fri, 24 Jul 2026 23:10:18 +0530 Subject: [PATCH 05/11] Parse monitoring status filter --- src/routes/(manage)/manage/api/+server.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/routes/(manage)/manage/api/+server.ts b/src/routes/(manage)/manage/api/+server.ts index 750fdccd..32995f3d 100644 --- a/src/routes/(manage)/manage/api/+server.ts +++ b/src/routes/(manage)/manage/api/+server.ts @@ -245,10 +245,13 @@ export async function POST({ request, cookies }) { } else if (action == "getMonitoringDataPaginated") { const page = parseInt(String(data.page)) || 1; const limit = parseInt(String(data.limit)) || 50; - const filter: { monitor_tag?: string; start_time?: number; end_time?: number } = {}; + const filter: { monitor_tag?: string; status?: string; start_time?: number; end_time?: number } = {}; if (data.monitor_tag && data.monitor_tag !== "ALL") { filter.monitor_tag = data.monitor_tag; } + if (data.status && data.status !== "ALL") { + filter.status = data.status; + } if (data.start_time) { filter.start_time = parseInt(String(data.start_time)); } From 8420b2cc85f79f59e1fda878dbd2589cc0292876 Mon Sep 17 00:00:00 2001 From: LOGESH K <90227668+lokiee0@users.noreply.github.com> Date: Fri, 24 Jul 2026 23:10:19 +0530 Subject: [PATCH 06/11] Add monitoring status dropdown --- .../manage/app/monitoring-data/+page.svelte | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/routes/(manage)/manage/app/monitoring-data/+page.svelte b/src/routes/(manage)/manage/app/monitoring-data/+page.svelte index 5e143537..979f8e23 100644 --- a/src/routes/(manage)/manage/app/monitoring-data/+page.svelte +++ b/src/routes/(manage)/manage/app/monitoring-data/+page.svelte @@ -35,6 +35,8 @@ name: string; } + type StatusFilter = "ALL" | "UP" | "DOWN" | "DEGRADED"; + // Helper to format datetime as YYYY-MM-DDTHH:mm for datetime-local input function formatDateTimeForInput(date: Date): string { return format(date, "yyyy-MM-dd'T'HH:mm"); @@ -68,12 +70,14 @@ let pageNo = $state(1); let showFilters = $state(false); let monitorTagFilter = $state("ALL"); + let statusFilter = $state("ALL"); let startDateTime = $state(formatDateTimeForInput(yesterday)); let endDateTime = $state(formatDateTimeForInput(now)); const limit = 50; const hasActiveFilters = $derived( monitorTagFilter !== "ALL" || + statusFilter !== "ALL" || startDateTime !== formatDateTimeForInput(yesterday) || endDateTime !== formatDateTimeForInput(now) ); @@ -113,6 +117,7 @@ function clearFilters() { monitorTagFilter = "ALL"; + statusFilter = "ALL"; startDateTime = formatDateTimeForInput(yesterday); endDateTime = formatDateTimeForInput(now); pageNo = 1; @@ -189,12 +194,14 @@ page: number; limit: number; monitor_tag: string; + status: StatusFilter; start_time?: number; end_time?: number; } = { page: pageNo, limit, - monitor_tag: monitorTagFilter + monitor_tag: monitorTagFilter, + status: statusFilter }; if (startDateTime) { @@ -241,6 +248,12 @@ } } + function handleStatusChange(value: string | undefined) { + if (value) { + statusFilter = value as StatusFilter; + } + } + // Pagination function goToPage(page: number) { pageNo = page; @@ -304,6 +317,20 @@ +
+ Status + + + {statusFilter === "ALL" ? "All Statuses" : statusFilter} + + + All Statuses + UP + DOWN + DEGRADED + + +