Merge pull request #12151 from Budibase/feature/budi-7607-migrate-user-relationship-columns-to-the-new-user-column-3

Many-to-one user relationship -> user column migration
This commit is contained in:
Sam Rose 2023-10-23 12:11:21 +01:00 committed by GitHub
commit 87d5e32bed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 74 additions and 8 deletions

View File

@ -510,6 +510,67 @@ describe("/tables", () => {
"user relationship": [users[0], users[1]], "user relationship": [users[0], users[1]],
}) })
const row2 = await config.api.row.save(table._id!, {
"user relationship": [users[1], users[2]],
})
await config.api.table.migrate(table._id!, {
oldColumn: table.schema["user relationship"],
newColumn: {
name: "user column",
type: FieldType.BB_REFERENCE,
subtype: FieldSubtype.USERS,
},
})
const migratedTable = await config.api.table.get(table._id!)
expect(migratedTable.schema["user column"]).toBeDefined()
expect(migratedTable.schema["user relationship"]).not.toBeDefined()
const row1Migrated = (await config.api.row.get(table._id!, row1._id!))
.body as Row
expect(row1Migrated["user relationship"]).not.toBeDefined()
expect(row1Migrated["user column"].map((r: Row) => r._id)).toEqual(
expect.arrayContaining([users[0]._id, users[1]._id])
)
const row2Migrated = (await config.api.row.get(table._id!, row2._id!))
.body as Row
expect(row2Migrated["user relationship"]).not.toBeDefined()
expect(row2Migrated["user column"].map((r: Row) => r._id)).toEqual(
expect.arrayContaining([users[1]._id, users[2]._id])
)
})
it("should successfully migrate a many-to-one user relationship to a users column", async () => {
const users = await Promise.all([
config.createUser({ email: "1@example.com" }),
config.createUser({ email: "2@example.com" }),
config.createUser({ email: "3@example.com" }),
])
const table = await config.api.table.create({
name: "table",
type: "table",
schema: {
"user relationship": {
type: FieldType.LINK,
fieldName: "test",
name: "user relationship",
constraints: {
type: "array",
presence: false,
},
relationshipType: RelationshipType.MANY_TO_ONE,
tableId: InternalTable.USER_METADATA,
},
},
})
const row1 = await config.api.row.save(table._id!, {
"user relationship": [users[0], users[1]],
})
const row2 = await config.api.row.save(table._id!, { const row2 = await config.api.row.save(table._id!, {
"user relationship": [users[2]], "user relationship": [users[2]],
}) })

View File

@ -5,8 +5,8 @@ import {
FieldSubtype, FieldSubtype,
InternalTable, InternalTable,
ManyToManyRelationshipFieldMetadata, ManyToManyRelationshipFieldMetadata,
ManyToOneRelationshipFieldMetadata,
OneToManyRelationshipFieldMetadata, OneToManyRelationshipFieldMetadata,
RelationshipFieldMetadata,
RelationshipType, RelationshipType,
Row, Row,
Table, Table,
@ -88,21 +88,24 @@ function getColumnMigrator(
`Column "${oldColumn.name}" is a one-to-many column but "${newColumn.name}" is not a single user column` `Column "${oldColumn.name}" is a one-to-many column but "${newColumn.name}" is not a single user column`
) )
} }
return new OneToManyUserColumnMigrator(table, oldColumn, newColumn) return new SingleUserColumnMigrator(table, oldColumn, newColumn)
} }
if (oldColumn.relationshipType === RelationshipType.MANY_TO_MANY) { if (
oldColumn.relationshipType === RelationshipType.MANY_TO_MANY ||
oldColumn.relationshipType === RelationshipType.MANY_TO_ONE
) {
if (newColumn.subtype !== FieldSubtype.USERS) { if (newColumn.subtype !== FieldSubtype.USERS) {
throw new BadRequestError( throw new BadRequestError(
`Column "${oldColumn.name}" is a many-to-many column but "${newColumn.name}" is not a multi user column` `Column "${oldColumn.name}" is a ${oldColumn.relationshipType} column but "${newColumn.name}" is not a multi user column`
) )
} }
return new ManyToManyUserColumnMigrator(table, oldColumn, newColumn) return new MultiUserColumnMigrator(table, oldColumn, newColumn)
} }
throw new BadRequestError(`Unknown migration type`) throw new BadRequestError(`Unknown migration type`)
} }
class OneToManyUserColumnMigrator implements ColumnMigrator { class SingleUserColumnMigrator implements ColumnMigrator {
constructor( constructor(
private table: Table, private table: Table,
private oldColumn: OneToManyRelationshipFieldMetadata, private oldColumn: OneToManyRelationshipFieldMetadata,
@ -138,10 +141,12 @@ class OneToManyUserColumnMigrator implements ColumnMigrator {
} }
} }
class ManyToManyUserColumnMigrator implements ColumnMigrator { class MultiUserColumnMigrator implements ColumnMigrator {
constructor( constructor(
private table: Table, private table: Table,
private oldColumn: ManyToManyRelationshipFieldMetadata, private oldColumn:
| ManyToManyRelationshipFieldMetadata
| ManyToOneRelationshipFieldMetadata,
private newColumn: BBReferenceFieldMetadata private newColumn: BBReferenceFieldMetadata
) {} ) {}