From 81274960f67164b8d82d24237be80ace045396cd Mon Sep 17 00:00:00 2001 From: Fred KISSIE Date: Mon, 4 May 2026 20:22:16 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=A7=20refactor?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../[orgId]/settings/logs/request/page.tsx | 7 +-- src/lib/queries.ts | 59 ++++++++++++++++++- 2 files changed, 59 insertions(+), 7 deletions(-) diff --git a/src/app/[orgId]/settings/logs/request/page.tsx b/src/app/[orgId]/settings/logs/request/page.tsx index 6380d0473..86d1a9c25 100644 --- a/src/app/[orgId]/settings/logs/request/page.tsx +++ b/src/app/[orgId]/settings/logs/request/page.tsx @@ -26,7 +26,7 @@ export default function GeneralPage() { const searchParams = useSearchParams(); const [rows, setRows] = useState([]); - const [isRefreshing, setIsRefreshing] = useState(false); + const [isRefreshing, startRefreshingTransition] = useTransition(); const [isExporting, startTransition] = useTransition(); // Pagination state @@ -279,7 +279,6 @@ export default function GeneralPage() { const refreshData = async () => { console.log("Data refreshed"); - setIsRefreshing(true); try { // Refresh data with current date range and pagination await queryDateTime( @@ -294,8 +293,6 @@ export default function GeneralPage() { description: t("refreshError"), variant: "destructive" }); - } finally { - setIsRefreshing(false); } }; @@ -781,7 +778,7 @@ export default function GeneralPage() { title={t("requestLogs")} searchPlaceholder={t("searchLogs")} searchColumn="host" - onRefresh={refreshData} + onRefresh={() => startRefreshingTransition(refreshData)} isRefreshing={isRefreshing} onExport={() => startTransition(exportData)} isExporting={isExporting} diff --git a/src/lib/queries.ts b/src/lib/queries.ts index 3e38a7ba0..9f69f1c34 100644 --- a/src/lib/queries.ts +++ b/src/lib/queries.ts @@ -1,5 +1,6 @@ import { build } from "@server/build"; import type { QueryRequestAnalyticsResponse } from "@server/routers/auditLogs"; +import type { QueryRequestAuditLogResponse } from "@server/routers/auditLogs/types"; import type { ListClientsResponse } from "@server/routers/client"; import type { ListDomainsResponse, @@ -529,7 +530,36 @@ export const logAnalyticsFiltersSchema = z.object({ resourceId: z.coerce.number().optional().catch(undefined) }); -export type LogAnalyticsFilters = z.TypeOf; +export type LogAnalyticsFilters = z.output; + +export const logsFiltersSchema = z.object({ + timeStart: z + .string() + .refine((val) => !isNaN(Date.parse(val)), { + error: "timeStart must be a valid ISO date string" + }) + .optional() + .catch(undefined), + timeEnd: z + .string() + .refine((val) => !isNaN(Date.parse(val)), { + error: "timeEnd must be a valid ISO date string" + }) + .optional() + .catch(undefined), + page: z.coerce.number().optional().catch(0).default(0), + pageSize: z.coerce.number().optional().catch(20).default(20), + resourceId: z.coerce.number().optional().catch(undefined), + action: z.string().optional().catch(undefined), + host: z.string().optional().catch(undefined), + location: z.string().optional().catch(undefined), + actor: z.string().optional().catch(undefined), + method: z.string().optional().catch(undefined), + reason: z.string().optional().catch(undefined), + path: z.string().optional().catch(undefined) +}); + +export type LogFilters = z.output; export const logQueries = { requestAnalytics: ({ @@ -540,7 +570,7 @@ export const logQueries = { filters: LogAnalyticsFilters; }) => queryOptions({ - queryKey: ["REQUEST_LOG_ANALYTICS", orgId, filters] as const, + queryKey: ["REQUEST_LOGS", orgId, "ANALYTICS", filters] as const, queryFn: async ({ signal, meta }) => { const res = await meta!.api.get< AxiosResponse @@ -556,6 +586,31 @@ export const logQueries = { } return false; } + }), + + requests: ({ orgId, filters }: { orgId: string; filters: LogFilters }) => + queryOptions({ + queryKey: ["REQUEST_LOGS", orgId, "ALL", filters] as const, + queryFn: async ({ signal, meta }) => { + const { page, pageSize, ...rest } = filters; + const res = await meta!.api.get< + AxiosResponse + >(`/org/${orgId}/logs/request`, { + params: { + ...rest, + limit: pageSize, + offset: page * pageSize + }, + signal + }); + return res.data.data; + }, + refetchInterval: (query) => { + if (query.state.data) { + return durationToMs(30, "seconds"); + } + return false; + } }) };