1
0
Fork 0
mirror of synced 2024-08-23 05:51:29 +12:00

Some typing improvements, as well as getting deletion/setup working a bit better.

This commit is contained in:
mike12345567 2024-05-07 18:27:47 +01:00
parent 654905ea90
commit a2d4f8523c
9 changed files with 60 additions and 19 deletions

View file

@ -264,11 +264,16 @@ export class DatabaseImpl implements Database {
if (body) {
args.body = body
}
const response = await directCouchUrlCall(args)
if (response.status > 300) {
throw new Error(await response.text())
}
return (await response.json()) as T
return this.performCall(() => {
return async () => {
const response = await directCouchUrlCall(args)
const json = await response.json()
if (response.status > 300) {
throw json
}
return json as T
}
})
}
async sql<T extends Document>(

View file

@ -62,7 +62,13 @@ export class DDInstrumentedDatabase implements Database {
): Promise<DocumentDestroyResponse> {
return tracer.trace("db.remove", span => {
span?.addTags({ db_name: this.name, doc_id: id })
return this.db.remove(id, rev)
if (typeof id === "object") {
return this.db.remove(id)
} else if (rev) {
return this.db.remove(id, rev)
} else {
throw new Error("No revision supplied for removal")
}
})
}

View file

@ -492,7 +492,7 @@ export class UserDB {
await platform.users.removeUser(dbUser)
await db.remove(userId, dbUser._rev)
await db.remove(userId, dbUser._rev!)
const creatorsToDelete = (await isCreator(dbUser)) ? 1 : 0
await UserDB.quotas.removeUsers(1, creatorsToDelete)

View file

@ -60,6 +60,7 @@ import sdk from "../../sdk"
import { builderSocket } from "../../websockets"
import { sdk as sharedCoreSDK } from "@budibase/shared-core"
import * as appMigrations from "../../appMigrations"
import { cleanupApp } from "../../sdk/app/tables/internal/sqs"
// utility function, need to do away with this
async function getLayouts() {
@ -589,6 +590,9 @@ async function destroyApp(ctx: UserCtx) {
}
async function preDestroyApp(ctx: UserCtx) {
if (env.SQS_SEARCH_ENABLE) {
await sdk.tables.sqs.cleanupApp()
}
const { rows } = await getUniqueRows([ctx.params.appId])
ctx.rowCount = rows.length
}

View file

@ -325,7 +325,7 @@ class TableSaveFunctions {
user: this.user,
})
if (env.SQS_SEARCH_ENABLE) {
await sdk.tables.sqs.addTableToSqlite(table)
await sdk.tables.sqs.addTable(table)
}
return table
}
@ -519,7 +519,7 @@ export async function internalTableCleanup(table: Table, rows?: Row[]) {
await AttachmentCleanup.tableDelete(table, rows)
}
if (env.SQS_SEARCH_ENABLE) {
await sdk.tables.sqs.removeTableFromSqlite(table)
await sdk.tables.sqs.removeTable(table)
}
}

View file

@ -19,7 +19,7 @@ import {
sqlOutputProcessing,
} from "../../../../api/controllers/row/utils"
import sdk from "../../../index"
import { context } from "@budibase/backend-core"
import { context, SQLITE_DESIGN_DOC_ID } from "@budibase/backend-core"
import {
CONSTANT_INTERNAL_ROW_COLS,
SQS_DATASOURCE_INTERNAL,
@ -195,6 +195,10 @@ export async function search(
}
} catch (err: any) {
const msg = typeof err === "string" ? err : err.message
if (err.status === 404 && err.message?.includes(SQLITE_DESIGN_DOC_ID)) {
await sdk.tables.sqs.syncDefinition()
return search(options, table)
}
throw new Error(`Unable to search by SQL - ${msg}`, { cause: err })
}
}

View file

@ -15,7 +15,9 @@ import {
generateJunctionTableID,
} from "../../../../db/utils"
const BASIC_SQLITE_DOC: SQLiteDefinition = {
type PreSaveSQLiteDefinition = Omit<SQLiteDefinition, "_rev">
const BASIC_SQLITE_DOC: PreSaveSQLiteDefinition = {
_id: SQLITE_DESIGN_DOC_ID,
language: "sqlite",
sql: {
@ -102,7 +104,7 @@ function mapTable(table: Table): SQLiteTables {
}
// nothing exists, need to iterate though existing tables
async function buildBaseDefinition(): Promise<SQLiteDefinition> {
async function buildBaseDefinition(): Promise<PreSaveSQLiteDefinition> {
const tables = await tablesSdk.getAllInternalTables()
const definition = cloneDeep(BASIC_SQLITE_DOC)
for (let table of tables) {
@ -114,9 +116,15 @@ async function buildBaseDefinition(): Promise<SQLiteDefinition> {
return definition
}
export async function addTableToSqlite(table: Table) {
export async function syncDefinition(): Promise<void> {
const db = context.getAppDB()
let definition: SQLiteDefinition
const definition = await buildBaseDefinition()
await db.put(definition)
}
export async function addTable(table: Table) {
const db = context.getAppDB()
let definition: PreSaveSQLiteDefinition | SQLiteDefinition
try {
definition = await db.get<SQLiteDefinition>(SQLITE_DESIGN_DOC_ID)
} catch (err) {
@ -129,7 +137,7 @@ export async function addTableToSqlite(table: Table) {
await db.put(definition)
}
export async function removeTableFromSqlite(table: Table) {
export async function removeTable(table: Table) {
const db = context.getAppDB()
try {
const definition = await db.get<SQLiteDefinition>(SQLITE_DESIGN_DOC_ID)
@ -147,3 +155,18 @@ export async function removeTableFromSqlite(table: Table) {
}
}
}
export async function cleanupApp() {
const db = context.getAppDB()
if (!(await db.exists())) {
throw new Error("Cleanup must be preformed before app deletion.")
}
try {
const definition = await db.get<SQLiteDefinition>(SQLITE_DESIGN_DOC_ID)
// delete the design document
await db.remove(SQLITE_DESIGN_DOC_ID, definition._rev)
await db.sqlCleanup()
} catch (err: any) {
throw new Error(`Unable to cleanup SQS files - ${err.message}`)
}
}

View file

@ -20,6 +20,7 @@ export type SQLiteTables = Record<
export interface SQLiteDefinition {
_id: string
_rev: string
language: string
sql: {
tables: SQLiteTables

View file

@ -135,10 +135,8 @@ export interface Database {
ids: string[],
opts?: { allowMissing?: boolean }
): Promise<T[]>
remove(
id: string | Document,
rev?: string
): Promise<Nano.DocumentDestroyResponse>
remove(idOrDoc: Document): Promise<Nano.DocumentDestroyResponse>
remove(idOrDoc: string, rev: string): Promise<Nano.DocumentDestroyResponse>
put(
document: AnyDocument,
opts?: DatabasePutOpts