From 3f02b515f369e62c7bc51ff43564b8a37b823113 Mon Sep 17 00:00:00 2001 From: Trezy Date: Tue, 21 Apr 2026 22:25:36 +0000 Subject: [PATCH] fix(event-log): prevent double filtering --- packages/oauth-client/src/client.ts | 35 ++++++++++++++--------------------- src/admin/events.rs | 33 ++++++++++++++++++++++++--------- web/src/app/dashboard/events/page.tsx | 25 ++----------------------- 3 file(s) changed, 40 insertion(s)(+), 53 deletion(s)(-) diff --git a/packages/oauth-client/src/client.ts b/packages/oauth-client/src/client.ts --- a/packages/oauth-client/src/client.ts +++ b/packages/oauth-client/src/client.ts @@ -153,28 +153,21 @@ }); } async deleteSession(did: string): Promise { - const headers: Record = { - "x-client-key": this.clientKey, - }; - if (this.clientSecret) { - headers["x-client-secret"] = this.clientSecret; - } + const session = await this.restoreSession(did); + if (session) { + const resp = await session.fetchHandler( + `${this.instanceUrl}/oauth/sessions/${did}`, + { method: "DELETE" }, + ); - const resp = await this._fetch( - `${this.instanceUrl}/oauth/sessions/${did}`, - { - method: "DELETE", - headers, - }, - ); - - if (!resp.ok && resp.status !== 404) { - const body = await resp.json().catch(() => ({})); - throw new ApiError( - `Failed to delete session: ${resp.status} ${(body as any).message ?? resp.statusText}`, - resp.status, - body, - ); + if (!resp.ok && resp.status !== 404) { + const body = await resp.json().catch(() => ({})); + throw new ApiError( + `Failed to delete session: ${resp.status} ${(body as any).message ?? resp.statusText}`, + resp.status, + body, + ); + } } await this.storage.delete(`${STORAGE_PREFIX}${did}`); diff --git a/src/admin/events.rs b/src/admin/events.rs --- a/src/admin/events.rs +++ b/src/admin/events.rs @@ -57,14 +57,21 @@ if query.event_type.is_some() { sql.push_str(" AND event_type = ?"); } - if query.category.is_some() { - sql.push_str(" AND event_type LIKE ?"); + if let Some(ref cat) = query.category { + let cats: Vec<&str> = cat.split(',').collect(); + let clauses: Vec = cats + .iter() + .map(|_| "event_type LIKE ?".to_string()) + .collect(); + sql.push_str(&format!(" AND ({})", clauses.join(" OR "))); } - if query.severity.is_some() { - sql.push_str(" AND severity = ?"); + if let Some(ref sev) = query.severity { + let count = sev.split(',').count(); + let placeholders: Vec<&str> = (0..count).map(|_| "?").collect(); + sql.push_str(&format!(" AND severity IN ({})", placeholders.join(","))); } if query.subject.is_some() { - sql.push_str(" AND subject = ?"); + sql.push_str(" AND subject LIKE ?"); } if query.cursor.is_some() { sql.push_str(" AND created_at < ?"); @@ -92,13 +99,17 @@ if let Some(ref event_type) = query.event_type { q = q.bind(event_type); } if let Some(ref category) = query.category { - q = q.bind(format!("{category}.%")); + for c in category.split(',') { + q = q.bind(format!("{c}.%")); + } } if let Some(ref severity) = query.severity { - q = q.bind(severity); + for s in severity.split(',') { + q = q.bind(s.to_string()); + } } if let Some(ref subject) = query.subject { - q = q.bind(subject); + q = q.bind(format!("%{subject}%")); } if let Some(ref cursor) = query.cursor { q = q.bind(cursor); @@ -123,7 +134,11 @@ created_at: parse_dt(&row.6), }) .collect(); - let cursor = events.last().map(|e| e.created_at.to_rfc3339()); + let cursor = if events.len() as i64 >= limit { + events.last().map(|e| e.created_at.to_rfc3339()) + } else { + None + }; Ok(Json(EventsListResponse { events, cursor })) } diff --git a/web/src/app/dashboard/events/page.tsx b/web/src/app/dashboard/events/page.tsx --- a/web/src/app/dashboard/events/page.tsx +++ b/web/src/app/dashboard/events/page.tsx @@ -6,9 +6,6 @@ type ColumnDef, type ColumnFiltersState, type VisibilityState, getCoreRowModel, - getFilteredRowModel, - getFacetedRowModel, - getFacetedUniqueValues, useReactTable, } from "@tanstack/react-table"; @@ -268,8 +265,8 @@ const subjectFilter = debouncedFilters.find((f) => f.id === "subject") ?.value as string | undefined; const data = await getEvents({ - category: categoryFilter?.[0] || undefined, - severity: severityFilter?.[0] || undefined, + category: categoryFilter?.length ? categoryFilter.join(",") : undefined, + severity: severityFilter?.length ? severityFilter.join(",") : undefined, subject: subjectFilter || undefined, cursor, limit: 50, @@ -331,7 +328,6 @@ > {row.original.subject ?? "--"} ), - filterFn: "includesString", enableColumnFilter: true, enableSorting: false, meta: { @@ -347,11 +343,6 @@ header: ({ column }) => ( ), cell: ({ row }) => severityBadge(row.original.severity), - filterFn: (row, columnId, filterValue) => { - if (!Array.isArray(filterValue) || filterValue.length === 0) - return true; - return filterValue.includes(row.getValue(columnId)); - }, enableColumnFilter: true, enableSorting: false, enableHiding: false, @@ -374,15 +365,6 @@ ), cell: ({ row }) => ( {row.original.event_type} ), - filterFn: (row, columnId, filterValue) => { - if (!Array.isArray(filterValue) || filterValue.length === 0) - return true; - const eventType = row.getValue(columnId) as string; - return filterValue.some( - (cat: string) => - eventType === cat || eventType.startsWith(cat + "."), - ); - }, enableColumnFilter: true, enableSorting: false, meta: { @@ -444,9 +426,6 @@ }, onColumnFiltersChange: setColumnFilters, onColumnVisibilityChange: setColumnVisibility, getCoreRowModel: getCoreRowModel(), - getFilteredRowModel: getFilteredRowModel(), - getFacetedRowModel: getFacetedRowModel(), - getFacetedUniqueValues: getFacetedUniqueValues(), getRowId: (row) => row.id, }); -- tangled.sh