diff --git a/packages/backend-core/src/events/publishers/auditLog.ts b/packages/backend-core/src/events/publishers/auditLog.ts new file mode 100644 index 0000000000..b72c135799 --- /dev/null +++ b/packages/backend-core/src/events/publishers/auditLog.ts @@ -0,0 +1,26 @@ +import { + Event, + AuditLogSearchParams, + AuditLogFilterEvent, + AuditLogDownloadEvent, +} from "@budibase/types" +import { publishEvent } from "../events" + +async function filtered(search: AuditLogSearchParams) { + const properties: AuditLogFilterEvent = { + filters: search, + } + await publishEvent(Event.AUDIT_LOG_FILTER, properties) +} + +async function download(search: AuditLogSearchParams) { + const properties: AuditLogDownloadEvent = { + filters: search, + } + await publishEvent(Event.AUDIT_LOG_DOWNLOAD, properties) +} + +export default { + filtered, + download, +} diff --git a/packages/backend-core/src/events/publishers/index.ts b/packages/backend-core/src/events/publishers/index.ts index 34e47b2990..87a34bf3f1 100644 --- a/packages/backend-core/src/events/publishers/index.ts +++ b/packages/backend-core/src/events/publishers/index.ts @@ -21,3 +21,4 @@ export { default as group } from "./group" export { default as plugin } from "./plugin" export { default as backup } from "./backup" export { default as environmentVariable } from "./environmentVariable" +export { default as auditLog } from "./auditLog" diff --git a/packages/types/src/api/web/global/auditLogs.ts b/packages/types/src/api/web/global/auditLogs.ts index 41bb5f022a..8ce0e742d2 100644 --- a/packages/types/src/api/web/global/auditLogs.ts +++ b/packages/types/src/api/web/global/auditLogs.ts @@ -1,5 +1,9 @@ import { Event, AuditedEventFriendlyName } from "../../../sdk" -import { PaginationResponse, PaginationRequest } from "../" +import { + PaginationResponse, + PaginationRequest, + BasicPaginationRequest, +} from "../" import { User, App } from "../../../" export interface AuditLogSearchParams { @@ -9,12 +13,13 @@ export interface AuditLogSearchParams { startDate?: string endDate?: string fullSearch?: string + bookmark?: string } export interface DownloadAuditLogsRequest extends AuditLogSearchParams {} export interface SearchAuditLogsRequest - extends PaginationRequest, + extends BasicPaginationRequest, AuditLogSearchParams {} export enum AuditLogResourceStatus { diff --git a/packages/types/src/api/web/pagination.ts b/packages/types/src/api/web/pagination.ts index ca640d58db..ae4c56971a 100644 --- a/packages/types/src/api/web/pagination.ts +++ b/packages/types/src/api/web/pagination.ts @@ -8,9 +8,12 @@ export enum SortType { number = "number", } -export interface PaginationRequest { - limit?: number +export interface BasicPaginationRequest { bookmark?: string +} + +export interface PaginationRequest extends BasicPaginationRequest { + limit?: number sort?: { order: SortOrder column: string diff --git a/packages/types/src/sdk/db.ts b/packages/types/src/sdk/db.ts index 35d198ccb2..092253d63a 100644 --- a/packages/types/src/sdk/db.ts +++ b/packages/types/src/sdk/db.ts @@ -1,5 +1,6 @@ import Nano from "@budibase/nano" import { AllDocsResponse, AnyDocument, Document } from "../" +import { Writable } from "stream" export type PouchOptions = { inMemory?: boolean @@ -63,6 +64,18 @@ export const isDocument = (doc: any): doc is Document => { return typeof doc === "object" && doc._id && doc._rev } +export interface DatabaseDumpOpts { + filter?: (doc: AnyDocument) => boolean + batch_size?: number + batch_limit?: number + style?: "main_only" | "all_docs" + timeout?: number + doc_ids?: string[] + query_params?: any + view?: string + selector?: any +} + export interface Database { name: string @@ -87,7 +100,7 @@ export interface Database { compact(): Promise // these are all PouchDB related functions that are rarely used - in future // should be replaced by better typed/non-pouch implemented methods - dump(...args: any[]): Promise + dump(stream: Writable, opts?: DatabaseDumpOpts): Promise load(...args: any[]): Promise createIndex(...args: any[]): Promise deleteIndex(...args: any[]): Promise diff --git a/packages/types/src/sdk/events/auditLog.ts b/packages/types/src/sdk/events/auditLog.ts new file mode 100644 index 0000000000..c5e3208536 --- /dev/null +++ b/packages/types/src/sdk/events/auditLog.ts @@ -0,0 +1,10 @@ +import { BaseEvent } from "./event" +import { AuditLogSearchParams } from "../../api" + +export interface AuditLogFilterEvent extends BaseEvent { + filters: AuditLogSearchParams +} + +export interface AuditLogDownloadEvent extends BaseEvent { + filters: AuditLogSearchParams +} diff --git a/packages/types/src/sdk/events/event.ts b/packages/types/src/sdk/events/event.ts index 1be0ea2bdf..119ae4ad7a 100644 --- a/packages/types/src/sdk/events/event.ts +++ b/packages/types/src/sdk/events/event.ts @@ -180,6 +180,10 @@ export enum Event { ENVIRONMENT_VARIABLE_CREATED = "environment_variable:created", ENVIRONMENT_VARIABLE_DELETED = "environment_variable:deleted", ENVIRONMENT_VARIABLE_UPGRADE_PANEL_OPENED = "environment_variable:upgrade_panel_opened", + + // AUDIT LOG + AUDIT_LOG_FILTER = "audit_log:filter", + AUDIT_LOG_DOWNLOAD = "audit_log:download", } // all events that are not audited have been added to this record as undefined, this means @@ -356,6 +360,10 @@ export const AuditedEventFriendlyName: Record = { [Event.INSTALLATION_VERSION_UPGRADED]: undefined, [Event.INSTALLATION_VERSION_DOWNGRADED]: undefined, [Event.INSTALLATION_FIRST_STARTUP]: undefined, + + // AUDIT LOG - NOT AUDITED + [Event.AUDIT_LOG_FILTER]: undefined, + [Event.AUDIT_LOG_DOWNLOAD]: undefined, } // properties added at the final stage of the event pipeline diff --git a/packages/types/src/sdk/events/index.ts b/packages/types/src/sdk/events/index.ts index 009d9beac4..745f84d2a3 100644 --- a/packages/types/src/sdk/events/index.ts +++ b/packages/types/src/sdk/events/index.ts @@ -22,3 +22,4 @@ export * from "./userGroup" export * from "./plugin" export * from "./backup" export * from "./environmentVariable" +export * from "./auditLog"