2023-02-22 08:14:57 +13:00
|
|
|
import { AuditLogFn, Event, IdentityType, HostInfo } from "@budibase/types"
|
2022-05-10 21:33:59 +12:00
|
|
|
import { processors } from "./processors"
|
2023-01-11 22:37:37 +13:00
|
|
|
import identification from "./identification"
|
2023-02-16 01:37:32 +13:00
|
|
|
import { getAppId } from "../context"
|
2022-06-01 08:04:41 +12:00
|
|
|
import * as backfill from "./backfill"
|
2023-02-22 08:14:57 +13:00
|
|
|
import { createQueue, JobQueue } from "../queue"
|
|
|
|
import BullQueue from "bull"
|
2022-04-02 09:29:44 +13:00
|
|
|
|
2023-02-22 08:14:57 +13:00
|
|
|
type AuditLogEvent = {
|
|
|
|
event: Event
|
|
|
|
properties: any
|
|
|
|
opts: {
|
|
|
|
timestamp?: string | number
|
|
|
|
userId?: string
|
|
|
|
appId?: string
|
|
|
|
hostInfo?: HostInfo
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
let auditLogsEnabled = false
|
|
|
|
let auditLogQueue: BullQueue.Queue<AuditLogEvent>
|
2023-02-16 02:49:30 +13:00
|
|
|
|
2023-02-16 07:03:55 +13:00
|
|
|
export const configure = (fn: AuditLogFn) => {
|
2023-02-22 08:14:57 +13:00
|
|
|
auditLogsEnabled = true
|
|
|
|
const writeAuditLogs = fn
|
|
|
|
auditLogQueue = createQueue<AuditLogEvent>(JobQueue.AUDIT_LOG)
|
|
|
|
return auditLogQueue.process(async job => {
|
|
|
|
await writeAuditLogs(job.data.event, job.data.properties, {
|
|
|
|
userId: job.data.opts.userId,
|
|
|
|
timestamp: job.data.opts.timestamp,
|
|
|
|
appId: job.data.opts.appId,
|
|
|
|
hostInfo: job.data.opts.hostInfo,
|
|
|
|
})
|
|
|
|
})
|
2023-02-16 02:49:30 +13:00
|
|
|
}
|
|
|
|
|
2022-05-25 11:15:52 +12:00
|
|
|
export const publishEvent = async (
|
|
|
|
event: Event,
|
|
|
|
properties: any,
|
|
|
|
timestamp?: string | number
|
|
|
|
) => {
|
2022-05-24 09:14:44 +12:00
|
|
|
// in future this should use async events via a distributed queue.
|
2022-05-25 07:01:13 +12:00
|
|
|
const identity = await identification.getCurrentIdentity()
|
2022-06-01 08:04:41 +12:00
|
|
|
|
|
|
|
const backfilling = await backfill.isBackfillingEvent(event)
|
|
|
|
// no backfill - send the event and exit
|
|
|
|
if (!backfilling) {
|
2023-02-22 08:14:57 +13:00
|
|
|
await processors.processEvent(event, identity, properties, timestamp)
|
|
|
|
if (auditLogsEnabled) {
|
|
|
|
// only audit log actual events, don't include backfills
|
|
|
|
const userId =
|
|
|
|
identity.type === IdentityType.USER ? identity.id : undefined
|
|
|
|
// add to event queue, rather than just writing immediately
|
|
|
|
await auditLogQueue.add({
|
|
|
|
event,
|
|
|
|
properties,
|
|
|
|
opts: {
|
|
|
|
userId,
|
|
|
|
timestamp,
|
|
|
|
appId: getAppId(),
|
|
|
|
},
|
2023-02-16 02:49:30 +13:00
|
|
|
})
|
|
|
|
}
|
2022-06-01 08:04:41 +12:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// backfill active - check if the event has been sent already
|
|
|
|
const alreadySent = await backfill.isAlreadySent(event, properties)
|
|
|
|
if (alreadySent) {
|
|
|
|
// do nothing
|
|
|
|
return
|
|
|
|
} else {
|
|
|
|
// send and record the event
|
|
|
|
await processors.processEvent(event, identity, properties, timestamp)
|
|
|
|
await backfill.recordEvent(event, properties)
|
|
|
|
}
|
2022-04-02 09:29:44 +13:00
|
|
|
}
|