From 8b1eaad7b51922cf5f65d9da8377f50ec5bcc282 Mon Sep 17 00:00:00 2001 From: Tuan Dang Date: Mon, 4 Dec 2023 18:23:04 +0700 Subject: [PATCH] Fix audit logs UI rendering --- .../ee/controllers/v1/workspaceController.ts | 37 +++++++++++++++---- backend/src/ee/services/EELicenseService.ts | 2 +- frontend/src/hooks/api/auditLogs/types.tsx | 7 +++- .../AuditLogsPage/components/LogsFilter.tsx | 4 +- .../AuditLogsPage/components/LogsTable.tsx | 1 + 5 files changed, 39 insertions(+), 12 deletions(-) diff --git a/backend/src/ee/controllers/v1/workspaceController.ts b/backend/src/ee/controllers/v1/workspaceController.ts index 2ef25f3ae..a44c1793a 100644 --- a/backend/src/ee/controllers/v1/workspaceController.ts +++ b/backend/src/ee/controllers/v1/workspaceController.ts @@ -3,6 +3,7 @@ import { PipelineStage, Types } from "mongoose"; import { Folder, MachineIdentity, + MachineMembership, Membership, Secret, ServiceTokenData, @@ -669,6 +670,21 @@ export const getWorkspaceAuditLogs = async (req: Request, res: Response) => { ProjectPermissionSub.AuditLogs ); + let actorMetadataQuery = ""; + if (actor) { + switch (actor?.split("-", 2)[0]) { + case ActorType.USER: + actorMetadataQuery = "actor.metadata.userId"; + break; + case ActorType.SERVICE: + actorMetadataQuery = "actor.metadata.serviceId"; + break; + case ActorType.MACHINE: + actorMetadataQuery = "actor.metadata.machineId"; + break; + } + } + const query = { workspace: new Types.ObjectId(workspaceId), ...(eventType @@ -684,13 +700,9 @@ export const getWorkspaceAuditLogs = async (req: Request, res: Response) => { ...(actor ? { "actor.type": actor.substring(0, actor.lastIndexOf("-")), - ...(actor.split("-", 2)[0] === ActorType.USER - ? { - "actor.metadata.userId": actor.substring(actor.lastIndexOf("-") + 1) - } - : { - "actor.metadata.serviceId": actor.substring(actor.lastIndexOf("-") + 1) - }) + ...({ + [actorMetadataQuery]: actor.substring(actor.lastIndexOf("-") + 1) + }) } : {}), ...(startDate || endDate @@ -702,7 +714,9 @@ export const getWorkspaceAuditLogs = async (req: Request, res: Response) => { } : {}) }; + const auditLogs = await AuditLog.find(query).sort({ createdAt: -1 }).skip(offset).limit(limit); + return res.status(200).send({ auditLogs }); @@ -731,6 +745,7 @@ export const getWorkspaceAuditLogActorFilterOpts = async (req: Request, res: Res const userIds = await Membership.distinct("user", { workspace: new Types.ObjectId(workspaceId) }); + const userActors: UserActor[] = ( await User.find({ _id: { @@ -757,9 +772,15 @@ export const getWorkspaceAuditLogActorFilterOpts = async (req: Request, res: Res } })); + const machineIds = await MachineMembership.distinct("machineIdentity", { + workspace: new Types.ObjectId(workspaceId) + }); + const machineActors: MachineActor[] = ( await MachineIdentity.find({ - workspace: new Types.ObjectId(workspaceId) + _id: { + $in: machineIds + } }) ).map((machineIdentity) => ({ type: ActorType.MACHINE, diff --git a/backend/src/ee/services/EELicenseService.ts b/backend/src/ee/services/EELicenseService.ts index 267ccb46b..6baea04dc 100644 --- a/backend/src/ee/services/EELicenseService.ts +++ b/backend/src/ee/services/EELicenseService.ts @@ -69,7 +69,7 @@ class EELicenseService { rbac: false, customRateLimits: false, customAlerts: false, - auditLogs: true, + auditLogs: false, auditLogsRetentionDays: 0, samlSSO: false, status: null, diff --git a/frontend/src/hooks/api/auditLogs/types.tsx b/frontend/src/hooks/api/auditLogs/types.tsx index 56826a273..ce17d490e 100644 --- a/frontend/src/hooks/api/auditLogs/types.tsx +++ b/frontend/src/hooks/api/auditLogs/types.tsx @@ -10,6 +10,11 @@ interface ServiceActorMetadata { name: string; } +interface MachineActorMetadata { + machineId: string; + name: string; +} + interface UserActor { type: ActorType.USER; metadata: UserActorMetadata; @@ -22,7 +27,7 @@ export interface ServiceActor { export interface MachineActor { type: ActorType.MACHINE; - metadata: ServiceActorMetadata; + metadata: MachineActorMetadata; } export type Actor = UserActor | ServiceActor | MachineActor; diff --git a/frontend/src/views/Project/AuditLogsPage/components/LogsFilter.tsx b/frontend/src/views/Project/AuditLogsPage/components/LogsFilter.tsx index c7f39cd97..29d935002 100644 --- a/frontend/src/views/Project/AuditLogsPage/components/LogsFilter.tsx +++ b/frontend/src/views/Project/AuditLogsPage/components/LogsFilter.tsx @@ -53,8 +53,8 @@ export const LogsFilter = ({ control, reset }: Props) => { case ActorType.MACHINE: return ( {actor.metadata.name} diff --git a/frontend/src/views/Project/AuditLogsPage/components/LogsTable.tsx b/frontend/src/views/Project/AuditLogsPage/components/LogsTable.tsx index 273347ae2..eccd843ce 100644 --- a/frontend/src/views/Project/AuditLogsPage/components/LogsTable.tsx +++ b/frontend/src/views/Project/AuditLogsPage/components/LogsTable.tsx @@ -31,6 +31,7 @@ const AUDIT_LOG_LIMIT = 15; export const LogsTable = ({ eventType, userAgentType, actor, startDate, endDate }: Props) => { const { currentWorkspace } = useWorkspace(); + const { data, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } = useGetAuditLogs( currentWorkspace?._id ?? "", {