diff --git a/packages/backend-core/src/db/couch/DatabaseImpl.ts b/packages/backend-core/src/db/couch/DatabaseImpl.ts index d7220e845c..d4b7918ff1 100644 --- a/packages/backend-core/src/db/couch/DatabaseImpl.ts +++ b/packages/backend-core/src/db/couch/DatabaseImpl.ts @@ -6,6 +6,8 @@ import { DatabaseOpts, DatabaseQueryOpts, DatabasePutOpts, + Document, + isDocument, } from "@budibase/types" import { getCouchInfo } from "./connections" import { directCouchCall } from "./utils" @@ -77,12 +79,23 @@ export class DatabaseImpl implements Database { return this.updateOutput(() => db.get(id)) } - async remove(id?: string, rev?: string) { + async remove(idOrDoc: string | Document, rev?: string) { const db = await this.checkSetup() - if (!id || !rev) { + let _id: string + let _rev: string + + if (isDocument(idOrDoc)) { + _id = idOrDoc._id! + _rev = idOrDoc._rev! + } else { + _id = idOrDoc + _rev = rev! + } + + if (!_id || !_rev) { throw new Error("Unable to remove doc without a valid _id and _rev.") } - return this.updateOutput(() => db.destroy(id, rev)) + return this.updateOutput(() => db.destroy(_id, _rev)) } async put(document: AnyDocument, opts?: DatabasePutOpts) { diff --git a/packages/types/src/sdk/db.ts b/packages/types/src/sdk/db.ts index df873911c8..8979c1ba38 100644 --- a/packages/types/src/sdk/db.ts +++ b/packages/types/src/sdk/db.ts @@ -1,6 +1,6 @@ import PouchDB from "pouchdb" import Nano from "nano" -import { AllDocsResponse, AnyDocument } from "../" +import { AllDocsResponse, AnyDocument, Document } from "../" export type PouchOptions = { inMemory?: boolean @@ -44,13 +44,20 @@ export type DatabaseQueryOpts = { keys?: string[] } +export const isDocument = (doc: any): doc is Document => { + return typeof doc === "object" && doc._id && doc._rev +} + export interface Database { name: string exists(): Promise checkSetup(): Promise> get(id?: string): Promise - remove(id: string, rev: string): Promise + remove( + id: string | Document, + rev?: string + ): Promise put( document: AnyDocument, opts?: DatabasePutOpts