1
0
Fork 0
mirror of synced 2024-08-14 17:42:01 +12:00

Most of the way to getting my first test passing.

This commit is contained in:
Sam Rose 2023-10-18 18:02:10 +01:00
parent 6ae5451fdf
commit 1771b5905a
No known key found for this signature in database
3 changed files with 49 additions and 8 deletions

View file

@ -456,9 +456,11 @@ describe("/tables", () => {
const migratedTable = await config.api.table.get(table._id!) const migratedTable = await config.api.table.get(table._id!)
expect(migratedTable.schema["user column"]).toBeDefined() expect(migratedTable.schema["user column"]).toBeDefined()
expect(migratedTable.schema["user relationship"]).not.toBeDefined()
const rows = await config.api.row.fetch(table._id!) const rows = await config.api.row.fetch(table._id!)
expect(rows[0]["user column"]).toBeDefined() expect(rows[0]["user column"]).toBeDefined()
expect(rows[0]["user relationship"]).not.toBeDefined()
}) })
}) })
}) })

View file

@ -16,6 +16,8 @@ import datasources from "../datasources"
import { populateExternalTableSchemas } from "./validation" import { populateExternalTableSchemas } from "./validation"
import sdk from "../../../sdk" import sdk from "../../../sdk"
import { migrate } from "./migration" import { migrate } from "./migration"
import { DocumentInsertResponse } from "@budibase/nano"
import { cloneDeep } from "lodash"
async function getAllInternalTables(db?: Database): Promise<Table[]> { async function getAllInternalTables(db?: Database): Promise<Table[]> {
if (!db) { if (!db) {
@ -75,23 +77,28 @@ function enrichViewSchemas(table: Table): TableResponse {
} }
} }
async function saveTable(table: Table) { async function saveTable(table: Table): Promise<Table> {
const db = context.getAppDB() const db = context.getAppDB()
let resp: DocumentInsertResponse
if (isExternalTable(table._id!)) { if (isExternalTable(table._id!)) {
const datasource = await sdk.datasources.get(table.sourceId!) const datasource = await sdk.datasources.get(table.sourceId!)
datasource.entities![table.name] = table datasource.entities![table.name] = table
await db.put(datasource) resp = await db.put(datasource)
} else { } else {
await db.put(table) resp = await db.put(table)
} }
let tableClone = cloneDeep(table)
tableClone._rev = resp.rev
return tableClone
} }
async function addColumn(table: Table, newColumn: FieldSchema) { async function addColumn(table: Table, newColumn: FieldSchema): Promise<Table> {
if (newColumn.name in table.schema) { if (newColumn.name in table.schema) {
throw `Column "${newColumn.name}" already exists on table "${table.name}"` throw `Column "${newColumn.name}" already exists on table "${table.name}"`
} }
table.schema[newColumn.name] = newColumn table.schema[newColumn.name] = newColumn
await saveTable(table) return await saveTable(table)
} }
export default { export default {

View file

@ -1,15 +1,19 @@
import { BadRequestError } from "@budibase/backend-core" import { BadRequestError, context } from "@budibase/backend-core"
import { import {
BBReferenceFieldMetadata, BBReferenceFieldMetadata,
FieldSchema, FieldSchema,
InternalTable, InternalTable,
RelationshipFieldMetadata, RelationshipFieldMetadata,
Row,
Table, Table,
isBBReferenceField, isBBReferenceField,
isRelationshipField, isRelationshipField,
} from "@budibase/types" } from "@budibase/types"
import sdk from "../../../sdk" import sdk from "../../../sdk"
import { isExternalTable } from "../../../../src/integrations/utils" import { isExternalTable } from "../../../../src/integrations/utils"
import { db as dbCore } from "@budibase/backend-core"
import { EventType, updateLinks } from "../../../../src/db/linkedRows"
import { cloneDeep } from "lodash"
export async function migrate( export async function migrate(
table: Table, table: Table,
@ -17,10 +21,15 @@ export async function migrate(
newColumn: FieldSchema newColumn: FieldSchema
) { ) {
let migrator = getColumnMigrator(table, oldColumn, newColumn) let migrator = getColumnMigrator(table, oldColumn, newColumn)
let oldTable = cloneDeep(table)
await sdk.tables.addColumn(table, newColumn) table = await sdk.tables.addColumn(table, newColumn)
migrator.doMigration() await migrator.doMigration()
delete table.schema[oldColumn.name]
await sdk.tables.saveTable(table)
await updateLinks({ eventType: EventType.TABLE_UPDATED, table, oldTable })
} }
interface ColumnMigrator { interface ColumnMigrator {
@ -80,6 +89,29 @@ class UserColumnMigrator implements ColumnMigrator {
async doMigration() { async doMigration() {
let rows = await sdk.rows.fetch(this.table._id!) let rows = await sdk.rows.fetch(this.table._id!)
let rowsById = rows.reduce((acc, row) => {
acc[row._id!] = row
return acc
}, {} as Record<string, Row>)
let links = await sdk.links.fetchWithDocument(this.table._id!) let links = await sdk.links.fetchWithDocument(this.table._id!)
for (let link of links) {
if (link.doc1.tableId !== this.table._id) {
continue
}
if (link.doc1.fieldName !== this.oldColumn.name) {
continue
}
if (link.doc2.tableId !== InternalTable.USER_METADATA) {
continue
}
let userId = dbCore.getGlobalIDFromUserMetadataID(link.doc2.rowId)
let row = rowsById[link.doc1.rowId]
row[this.newColumn.name] = userId
}
let db = context.getAppDB()
await db.bulkDocs(rows)
} }
} }