From 75034f9350ab623b7fc3e0db3fc24e4583556fc7 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Sun, 15 Sep 2024 19:50:03 +0400 Subject: [PATCH] feat: more expendable audit logs --- .../ee/services/audit-log/audit-log-dal.ts | 41 +++++++++++++++++-- .../services/audit-log/audit-log-service.ts | 37 ++++++----------- .../ee/services/audit-log/audit-log-types.ts | 1 + 3 files changed, 51 insertions(+), 28 deletions(-) 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 3021beb0d..ce345766b 100644 --- a/backend/src/ee/services/audit-log/audit-log-dal.ts +++ b/backend/src/ee/services/audit-log/audit-log-dal.ts @@ -6,6 +6,9 @@ import { DatabaseError } from "@app/lib/errors"; import { ormify, selectAllTableCols, stripUndefinedInWhere } from "@app/lib/knex"; import { logger } from "@app/lib/logger"; import { QueueName } from "@app/queue"; +import { ActorType } from "@app/services/auth/auth-type"; + +import { EventType } from "./audit-log-types"; export type TAuditLogDALFactory = ReturnType; @@ -25,7 +28,24 @@ export const auditLogDALFactory = (db: TDbClient) => { const auditLogOrm = ormify(db, TableName.AuditLog); const find = async ( - { orgId, projectId, userAgentType, startDate, endDate, limit = 20, offset = 0, actor, eventType }: TFindQuery, + { + orgId, + projectId, + userAgentType, + startDate, + endDate, + limit = 20, + offset = 0, + actorId, + actorType, + eventType, + eventMetadata + }: Omit & { + actorId?: string; + actorType?: ActorType; + eventType?: EventType[]; + eventMetadata?: Record; + }, tx?: Knex ) => { try { @@ -34,7 +54,6 @@ export const auditLogDALFactory = (db: TDbClient) => { stripUndefinedInWhere({ projectId, [`${TableName.AuditLog}.orgId`]: orgId, - eventType, userAgentType }) ) @@ -52,8 +71,22 @@ export const auditLogDALFactory = (db: TDbClient) => { .offset(offset) .orderBy(`${TableName.AuditLog}.createdAt`, "desc"); - if (actor) { - void sqlQuery.whereRaw(`"actorMetadata"->>'userId' = ?`, [actor]); + if (actorId) { + void sqlQuery.whereRaw(`"actorMetadata"->>'userId' = ?`, [actorId]); + } + + if (eventMetadata && Object.keys(eventMetadata).length) { + Object.entries(eventMetadata).forEach(([key, value]) => { + void sqlQuery.whereRaw(`"eventMetadata"->>'${key}' = ?`, [value]); + }); + } + + if (actorType) { + void sqlQuery.where("actor", actorType); + } + + if (eventType?.length) { + void sqlQuery.whereIn("eventType", eventType); } if (startDate) { diff --git a/backend/src/ee/services/audit-log/audit-log-service.ts b/backend/src/ee/services/audit-log/audit-log-service.ts index 11159c37b..a93b2a6e1 100644 --- a/backend/src/ee/services/audit-log/audit-log-service.ts +++ b/backend/src/ee/services/audit-log/audit-log-service.ts @@ -23,25 +23,12 @@ export const auditLogServiceFactory = ({ auditLogQueue, permissionService }: TAuditLogServiceFactoryDep) => { - const listAuditLogs = async ({ - userAgentType, - eventType, - offset, - limit, - endDate, - startDate, - actor, - actorId, - actorOrgId, - actorAuthMethod, - projectId, - auditLogActor - }: TListProjectAuditLogDTO) => { - if (projectId) { + const listAuditLogs = async ({ actorAuthMethod, actorId, actorOrgId, actor, filter }: TListProjectAuditLogDTO) => { + if (filter.projectId) { const { permission } = await permissionService.getProjectPermission( actor, actorId, - projectId, + filter.projectId, actorAuthMethod, actorOrgId ); @@ -65,14 +52,16 @@ export const auditLogServiceFactory = ({ // If project ID is not provided, then we need to return all the audit logs for the organization itself. const auditLogs = await auditLogDAL.find({ - startDate, - endDate, - limit, - offset, - eventType, - userAgentType, - actor: auditLogActor, - ...(projectId ? { projectId } : { orgId: actorOrgId }) + startDate: filter.startDate, + endDate: filter.endDate, + limit: filter.limit, + offset: filter.offset, + eventType: filter.eventType, + userAgentType: filter.userAgentType, + actorId: filter.auditLogActorId, + actorType: filter.actorType, + eventMetadata: filter.eventMetadata, + ...(filter.projectId ? { projectId: filter.projectId } : { orgId: actorOrgId }) }); return auditLogs.map(({ eventType: logEventType, actor: eActor, actorMetadata, eventMetadata, ...el }) => ({ diff --git a/backend/src/ee/services/audit-log/audit-log-types.ts b/backend/src/ee/services/audit-log/audit-log-types.ts index 6d5e6ee9d..542471fac 100644 --- a/backend/src/ee/services/audit-log/audit-log-types.ts +++ b/backend/src/ee/services/audit-log/audit-log-types.ts @@ -15,6 +15,7 @@ export type TListProjectAuditLogDTO = { projectId?: string; auditLogActorId?: string; actorType?: ActorType; + eventMetadata?: Record; }; } & Omit;