diff --git a/backend/src/ee/services/audit-log/audit-log-dal.ts b/backend/src/ee/services/audit-log/audit-log-dal.ts index e818f2c83..ad509a743 100644 --- a/backend/src/ee/services/audit-log/audit-log-dal.ts +++ b/backend/src/ee/services/audit-log/audit-log-dal.ts @@ -1,8 +1,8 @@ -import { Knex } from "knex"; +import { Knex, KnexTimeoutError } from "knex"; import { TDbClient } from "@app/db"; import { TableName } from "@app/db/schemas"; -import { DatabaseError } from "@app/lib/errors"; +import { BadRequestError, DatabaseError } from "@app/lib/errors"; import { ormify, selectAllTableCols } from "@app/lib/knex"; import { logger } from "@app/lib/logger"; import { QueueName } from "@app/queue"; @@ -110,6 +110,13 @@ export const auditLogDALFactory = (db: TDbClient) => { return docs; } catch (error) { + if (error instanceof KnexTimeoutError) { + throw new BadRequestError({ + error, + message: "Failed to fetch audit logs due to timeout. Add more search filters." + }); + } + throw new DatabaseError({ error }); } }; diff --git a/frontend/src/hooks/api/auditLogs/queries.tsx b/frontend/src/hooks/api/auditLogs/queries.tsx index 1c74a79ba..5ec69b0e7 100644 --- a/frontend/src/hooks/api/auditLogs/queries.tsx +++ b/frontend/src/hooks/api/auditLogs/queries.tsx @@ -1,5 +1,7 @@ import { useInfiniteQuery, UseInfiniteQueryOptions, useQuery } from "@tanstack/react-query"; +import { AxiosError } from "axios"; +import { createNotification } from "@app/components/notifications"; import { apiRequest } from "@app/config/request"; import { Actor, AuditLog, TGetAuditLogsFilter } from "./types"; @@ -28,27 +30,37 @@ export const useGetAuditLogs = ( return useInfiniteQuery({ queryKey: auditLogKeys.getAuditLogs(projectId, filters), queryFn: async ({ pageParam }) => { - const { data } = await apiRequest.get<{ auditLogs: AuditLog[] }>( - "/api/v1/organization/audit-logs", - { - params: { - ...filters, - offset: pageParam, - startDate: filters?.startDate?.toISOString(), - endDate: filters?.endDate?.toISOString(), - ...(filters.eventMetadata && Object.keys(filters.eventMetadata).length - ? { - eventMetadata: Object.entries(filters.eventMetadata) - .map(([key, value]) => `${key}=${value}`) - .join(",") - } - : {}), - ...(filters.eventType?.length ? { eventType: filters.eventType.join(",") } : {}), - ...(projectId ? { projectId } : {}) + try { + const { data } = await apiRequest.get<{ auditLogs: AuditLog[] }>( + "/api/v1/organization/audit-logs", + { + params: { + ...filters, + offset: pageParam, + startDate: filters?.startDate?.toISOString(), + endDate: filters?.endDate?.toISOString(), + ...(filters.eventMetadata && Object.keys(filters.eventMetadata).length + ? { + eventMetadata: Object.entries(filters.eventMetadata) + .map(([key, value]) => `${key}=${value}`) + .join(",") + } + : {}), + ...(filters.eventType?.length ? { eventType: filters.eventType.join(",") } : {}), + ...(projectId ? { projectId } : {}) + } } + ); + return data.auditLogs; + } catch (error) { + if (error instanceof AxiosError) { + createNotification({ + type: "error", + text: error.response?.data.message + }); } - ); - return data.auditLogs; + return []; + } }, getNextPageParam: (lastPage, pages) => lastPage.length !== 0 ? pages.length * filters.limit : undefined,