feat: Migrate customer module to DML (#10499)

This commit is contained in:
Harminder Virk
2024-12-11 14:37:27 +05:30
committed by GitHub
parent d8a92dbb2d
commit 16d27ea6e4
13 changed files with 426 additions and 478 deletions

View File

@@ -6231,6 +6231,86 @@ describe("Entity builder", () => {
})
})
test("should define onDelete cascade on pivot entity when applying detach cascade", () => {
const teamUser = model.define("teamUser", {
id: model.number(),
user: model.belongsTo(() => user, { mappedBy: "teams" }),
team: model.belongsTo(() => team, { mappedBy: "users" }),
})
const user = model
.define("user", {
id: model.number(),
username: model.text(),
teams: model.manyToMany(() => team, {
pivotEntity: () => teamUser,
}),
})
.cascades({
detach: ["teams"],
})
const team = model
.define("team", {
id: model.number(),
name: model.text(),
users: model.manyToMany(() => user, {
pivotEntity: () => teamUser,
}),
})
.cascades({
detach: ["users"],
})
type CascadeDetach = Parameters<(typeof team)["cascades"]>[0]["detach"]
expectTypeOf<CascadeDetach>().toEqualTypeOf<"users"[] | undefined>()
const [, , TeamUserEntity] = toMikroOrmEntities([user, team, teamUser])
const teamUserMetadata =
MetadataStorage.getMetadataFromDecorator(TeamUserEntity)
expect(teamUserMetadata.properties).toEqual(
expect.objectContaining({
user_id: {
reference: "scalar",
type: "User",
columnType: "text",
fieldName: "user_id",
nullable: false,
name: "user_id",
getter: false,
setter: false,
},
user: {
name: "user",
reference: "m:1",
entity: "User",
nullable: false,
persist: false,
onDelete: "cascade",
},
team_id: {
reference: "scalar",
type: "Team",
columnType: "text",
fieldName: "team_id",
nullable: false,
name: "team_id",
getter: false,
setter: false,
},
team: {
name: "team",
reference: "m:1",
entity: "Team",
nullable: false,
persist: false,
onDelete: "cascade",
},
})
)
})
test("throw error when unable to locate relationship via mappedBy", () => {
const team = model.define("team", {
id: model.number(),

View File

@@ -71,7 +71,7 @@ export class DmlEntity<
schema: Schema
readonly #tableName: string
#cascades: EntityCascades<string[]> = {}
#cascades: EntityCascades<string[], string[]> = {}
#indexes: EntityIndex<Schema>[] = []
#checks: CheckConstraint<Schema>[] = []
@@ -100,7 +100,7 @@ export class DmlEntity<
name: InferDmlEntityNameFromConfig<TConfig>
tableName: string
schema: DMLSchema
cascades: EntityCascades<string[]>
cascades: EntityCascades<string[], string[]>
indexes: EntityIndex<Schema>[]
checks: CheckConstraint<Schema>[]
} {
@@ -139,7 +139,8 @@ export class DmlEntity<
*/
cascades(
options: EntityCascades<
ExtractEntityRelations<Schema, "hasOne" | "hasOneWithFK" | "hasMany">
ExtractEntityRelations<Schema, "hasOne" | "hasOneWithFK" | "hasMany">,
ExtractEntityRelations<Schema, "manyToMany">
>
) {
const childToParentCascades = options.delete?.filter((relationship) => {

View File

@@ -144,7 +144,7 @@ export function defineHasOneRelationship(
any
>,
{ relatedModelName }: { relatedModelName: string },
cascades: EntityCascades<string[]>
cascades: EntityCascades<string[], string[]>
) {
const shouldRemoveRelated = !!cascades.delete?.includes(relationship.name)
const { schema: relationSchema } = relatedEntity.parse()
@@ -179,7 +179,7 @@ export function defineHasOneWithFKRelationship(
MikroORMEntity: EntityConstructor<any>,
relationship: RelationshipMetadata,
{ relatedModelName }: { relatedModelName: string },
cascades: EntityCascades<string[]>
cascades: EntityCascades<string[], string[]>
) {
const foreignKeyName = camelToSnakeCase(`${relationship.name}Id`)
const shouldRemoveRelated = !!cascades.delete?.includes(relationship.name)
@@ -213,7 +213,7 @@ export function defineHasManyRelationship(
MikroORMEntity: EntityConstructor<any>,
relationship: RelationshipMetadata,
{ relatedModelName }: { relatedModelName: string },
cascades: EntityCascades<string[]>
cascades: EntityCascades<string[], string[]>
) {
const shouldRemoveRelated = !!cascades.delete?.includes(relationship.name)
@@ -259,7 +259,7 @@ export function defineBelongsToRelationship(
* define a onDelete: cascade when we are included in the delete
* list of parent cascade.
*/
const shouldCascade = relationCascades.delete?.includes(mappedBy)
const shouldCascade = !!relationCascades.delete?.includes(mappedBy)
/**
* Ensure the mapped by is defined as relationship on the other side
@@ -337,6 +337,9 @@ export function defineBelongsToRelationship(
DmlManyToMany.isManyToMany(otherSideRelation)
) {
const foreignKeyName = camelToSnakeCase(`${relationship.name}Id`)
const detachCascade =
!!relationship.mappedBy &&
relationCascades.detach?.includes(relationship.mappedBy)
if (DmlManyToMany.isManyToMany(otherSideRelation)) {
Property({
@@ -350,6 +353,7 @@ export function defineBelongsToRelationship(
entity: relatedModelName,
nullable: relationship.nullable,
persist: false,
onDelete: shouldCascade || detachCascade ? "cascade" : undefined,
})(MikroORMEntity.prototype, relationship.name)
} else {
ManyToOne({
@@ -660,7 +664,7 @@ export function defineRelationship(
MikroORMEntity: EntityConstructor<any>,
entity: DmlEntity<any, any>,
relationship: RelationshipMetadata,
cascades: EntityCascades<string[]>,
cascades: EntityCascades<string[], string[]>,
context: Context
) {
/**