1
0
Fork 0
mirror of synced 2024-07-15 03:05:57 +12:00

Merge pull request #12255 from Budibase/fix/budi-7720-user-migration

Fix user migration from user table
This commit is contained in:
Michael Drury 2023-11-02 18:33:45 +00:00 committed by GitHub
commit 87b8ef4ad7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 20 deletions

View file

@ -7,6 +7,7 @@ import {
isBBReferenceField, isBBReferenceField,
isRelationshipField, isRelationshipField,
LinkDocument, LinkDocument,
LinkInfo,
RelationshipFieldMetadata, RelationshipFieldMetadata,
RelationshipType, RelationshipType,
Row, Row,
@ -125,7 +126,23 @@ abstract class UserColumnMigrator implements ColumnMigrator {
protected newColumn: BBReferenceFieldMetadata protected newColumn: BBReferenceFieldMetadata
) {} ) {}
abstract updateRow(row: Row, link: LinkDocument): void abstract updateRow(row: Row, linkInfo: LinkInfo): void
pickUserTableLinkSide(link: LinkDocument): LinkInfo {
if (link.doc1.tableId === InternalTable.USER_METADATA) {
return link.doc1
} else {
return link.doc2
}
}
pickOtherTableLinkSide(link: LinkDocument): LinkInfo {
if (link.doc1.tableId === InternalTable.USER_METADATA) {
return link.doc2
} else {
return link.doc1
}
}
async doMigration(): Promise<MigrationResult> { async doMigration(): Promise<MigrationResult> {
let oldTable = cloneDeep(this.table) let oldTable = cloneDeep(this.table)
@ -137,15 +154,17 @@ abstract class UserColumnMigrator implements ColumnMigrator {
let links = await sdk.links.fetchWithDocument(this.table._id!) let links = await sdk.links.fetchWithDocument(this.table._id!)
for (let link of links) { for (let link of links) {
const userSide = this.pickUserTableLinkSide(link)
const otherSide = this.pickOtherTableLinkSide(link)
if ( if (
link.doc1.tableId !== this.table._id || otherSide.tableId !== this.table._id ||
link.doc1.fieldName !== this.oldColumn.name || otherSide.fieldName !== this.oldColumn.name ||
link.doc2.tableId !== InternalTable.USER_METADATA userSide.tableId !== InternalTable.USER_METADATA
) { ) {
continue continue
} }
let row = rowsById[link.doc1.rowId] let row = rowsById[otherSide.rowId]
if (!row) { if (!row) {
// This can happen if the row has been deleted but the link hasn't, // This can happen if the row has been deleted but the link hasn't,
// which was a state that was found during the initial testing of this // which was a state that was found during the initial testing of this
@ -153,7 +172,7 @@ abstract class UserColumnMigrator implements ColumnMigrator {
continue continue
} }
this.updateRow(row, link) this.updateRow(row, userSide)
} }
let db = context.getAppDB() let db = context.getAppDB()
@ -175,20 +194,20 @@ abstract class UserColumnMigrator implements ColumnMigrator {
} }
class SingleUserColumnMigrator extends UserColumnMigrator { class SingleUserColumnMigrator extends UserColumnMigrator {
updateRow(row: Row, link: LinkDocument): void { updateRow(row: Row, linkInfo: LinkInfo): void {
row[this.newColumn.name] = dbCore.getGlobalIDFromUserMetadataID( row[this.newColumn.name] = dbCore.getGlobalIDFromUserMetadataID(
link.doc2.rowId linkInfo.rowId
) )
} }
} }
class MultiUserColumnMigrator extends UserColumnMigrator { class MultiUserColumnMigrator extends UserColumnMigrator {
updateRow(row: Row, link: LinkDocument): void { updateRow(row: Row, linkInfo: LinkInfo): void {
if (!row[this.newColumn.name]) { if (!row[this.newColumn.name]) {
row[this.newColumn.name] = [] row[this.newColumn.name] = []
} }
row[this.newColumn.name].push( row[this.newColumn.name].push(
dbCore.getGlobalIDFromUserMetadataID(link.doc2.rowId) dbCore.getGlobalIDFromUserMetadataID(linkInfo.rowId)
) )
} }
} }

View file

@ -1,17 +1,15 @@
import { Document } from "../document" import { Document } from "../document"
export interface LinkInfo {
rowId: string
fieldName: string
tableId: string
}
export interface LinkDocument extends Document { export interface LinkDocument extends Document {
type: string type: string
doc1: { doc1: LinkInfo
rowId: string doc2: LinkInfo
fieldName: string
tableId: string
}
doc2: {
rowId: string
fieldName: string
tableId: string
}
} }
export interface LinkDocumentValue { export interface LinkDocumentValue {