Skip to content

Commit 80e2803

Browse files
committed
fix(audit-log): lazily resolve actor name/email when missing
1 parent 3c470ab commit 80e2803

File tree

1 file changed

+44
-34
lines changed

1 file changed

+44
-34
lines changed

apps/sim/lib/audit/log.ts

Lines changed: 44 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { auditLog, db } from '@sim/db'
2+
import { user } from '@sim/db/schema'
23
import { createLogger } from '@sim/logger'
4+
import { eq } from 'drizzle-orm'
35
import { nanoid } from 'nanoid'
46

57
const logger = createLogger('AuditLog')
@@ -185,41 +187,49 @@ interface AuditLogParams {
185187

186188
/**
187189
* Records an audit log entry. Fire-and-forget — never throws or blocks the caller.
190+
* If actorName and actorEmail are both undefined (not provided by the caller),
191+
* resolves them from the user table before inserting.
188192
*/
189193
export function recordAudit(params: AuditLogParams): void {
190-
try {
191-
const ipAddress =
192-
params.request?.headers.get('x-forwarded-for')?.split(',')[0].trim() ??
193-
params.request?.headers.get('x-real-ip') ??
194-
undefined
195-
const userAgent = params.request?.headers.get('user-agent') ?? undefined
196-
197-
db.insert(auditLog)
198-
.values({
199-
id: nanoid(),
200-
workspaceId: params.workspaceId || null,
201-
actorId: params.actorId,
202-
action: params.action,
203-
resourceType: params.resourceType,
204-
resourceId: params.resourceId,
205-
actorName: params.actorName ?? undefined,
206-
actorEmail: params.actorEmail ?? undefined,
207-
resourceName: params.resourceName,
208-
description: params.description,
209-
metadata: params.metadata ?? {},
210-
ipAddress,
211-
userAgent,
212-
})
213-
.then(() => {
214-
logger.debug('Audit log recorded', {
215-
action: params.action,
216-
resourceType: params.resourceType,
217-
})
218-
})
219-
.catch((error) => {
220-
logger.error('Failed to record audit log', { error, action: params.action })
221-
})
222-
} catch (error) {
223-
logger.error('Failed to initiate audit log', { error, action: params.action })
194+
insertAuditLog(params).catch((error) => {
195+
logger.error('Failed to record audit log', { error, action: params.action })
196+
})
197+
}
198+
199+
async function insertAuditLog(params: AuditLogParams): Promise<void> {
200+
const ipAddress =
201+
params.request?.headers.get('x-forwarded-for')?.split(',')[0].trim() ??
202+
params.request?.headers.get('x-real-ip') ??
203+
undefined
204+
const userAgent = params.request?.headers.get('user-agent') ?? undefined
205+
206+
let { actorName, actorEmail } = params
207+
208+
if (actorName === undefined && actorEmail === undefined && params.actorId) {
209+
try {
210+
const [row] = await db
211+
.select({ name: user.name, email: user.email })
212+
.from(user)
213+
.where(eq(user.id, params.actorId))
214+
.limit(1)
215+
actorName = row?.name ?? null
216+
actorEmail = row?.email ?? null
217+
} catch {}
224218
}
219+
220+
await db.insert(auditLog).values({
221+
id: nanoid(),
222+
workspaceId: params.workspaceId || null,
223+
actorId: params.actorId,
224+
action: params.action,
225+
resourceType: params.resourceType,
226+
resourceId: params.resourceId,
227+
actorName: actorName ?? undefined,
228+
actorEmail: actorEmail ?? undefined,
229+
resourceName: params.resourceName,
230+
description: params.description,
231+
metadata: params.metadata ?? {},
232+
ipAddress,
233+
userAgent,
234+
})
225235
}

0 commit comments

Comments
 (0)