feat: mark all DML entities as soft delete-able by default (#7744)

This commit is contained in:
Harminder Virk authored and GitHub committed 2024-06-17 16:16:56 +05:30
1 parent 4e86caba30
commit 0886869148
3 files changed
+423 -4

No files matched your search

@@ -24,11 +24,22 @@ describe("Entity builder", () => {
id: number id: number
username: string username: string
email: string email: string
deleted_at: Date | null
}>() }>()
const metaData = MetadataStorage.getMetadataFromDecorator(User) const metaData = MetadataStorage.getMetadataFromDecorator(User)
expect(metaData.className).toEqual("User") expect(metaData.className).toEqual("User")
expect(metaData.path).toEqual("User") expect(metaData.path).toEqual("User")
expect(metaData.filters).toEqual({
softDeletable: {
name: "softDeletable",
cond: expect.any(Function),
default: true,
args: false,
},
})
expect(metaData.properties).toEqual({ expect(metaData.properties).toEqual({
id: { id: {
reference: "scalar", reference: "scalar",
@@ -57,6 +68,15 @@ describe("Entity builder", () => {
getter: false, getter: false,
setter: false, setter: false,
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
@@ -74,11 +94,22 @@ describe("Entity builder", () => {
id: number id: number
username: string username: string
email: string email: string
deleted_at: Date | null
}>() }>()
const metaData = MetadataStorage.getMetadataFromDecorator(User) const metaData = MetadataStorage.getMetadataFromDecorator(User)
expect(metaData.className).toEqual("User") expect(metaData.className).toEqual("User")
expect(metaData.path).toEqual("User") expect(metaData.path).toEqual("User")
expect(metaData.filters).toEqual({
softDeletable: {
name: "softDeletable",
cond: expect.any(Function),
default: true,
args: false,
},
})
expect(metaData.properties).toEqual({ expect(metaData.properties).toEqual({
id: { id: {
reference: "scalar", reference: "scalar",
@@ -108,6 +139,15 @@ describe("Entity builder", () => {
getter: false, getter: false,
setter: false, setter: false,
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
@@ -125,11 +165,22 @@ describe("Entity builder", () => {
id: number id: number
username: string | null username: string | null
email: string email: string
deleted_at: Date | null
}>() }>()
const metaData = MetadataStorage.getMetadataFromDecorator(User) const metaData = MetadataStorage.getMetadataFromDecorator(User)
expect(metaData.className).toEqual("User") expect(metaData.className).toEqual("User")
expect(metaData.path).toEqual("User") expect(metaData.path).toEqual("User")
expect(metaData.filters).toEqual({
softDeletable: {
name: "softDeletable",
cond: expect.any(Function),
default: true,
args: false,
},
})
expect(metaData.properties).toEqual({ expect(metaData.properties).toEqual({
id: { id: {
reference: "scalar", reference: "scalar",
@@ -158,6 +209,15 @@ describe("Entity builder", () => {
getter: false, getter: false,
setter: false, setter: false,
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
@@ -177,12 +237,23 @@ describe("Entity builder", () => {
username: string username: string
email: string email: string
role: "moderator" | "admin" | "guest" role: "moderator" | "admin" | "guest"
deleted_at: Date | null
}>() }>()
const metaData = MetadataStorage.getMetadataFromDecorator(User) const metaData = MetadataStorage.getMetadataFromDecorator(User)
expect(metaData.className).toEqual("User") expect(metaData.className).toEqual("User")
expect(metaData.path).toEqual("User") expect(metaData.path).toEqual("User")
expect(metaData.filters).toEqual({
softDeletable: {
name: "softDeletable",
cond: expect.any(Function),
default: true,
args: false,
},
})
expect(metaData.properties).toEqual({ expect(metaData.properties).toEqual({
id: { id: {
reference: "scalar", reference: "scalar",
@@ -218,7 +289,17 @@ describe("Entity builder", () => {
nullable: false, nullable: false,
name: "role", name: "role",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
expect(metaData.properties["role"].items()).toEqual([ expect(metaData.properties["role"].items()).toEqual([
"moderator", "moderator",
"admin", "admin",
@@ -242,12 +323,23 @@ describe("Entity builder", () => {
username: string username: string
email: string email: string
role: "moderator" | "admin" | "guest" role: "moderator" | "admin" | "guest"
deleted_at: Date | null
}>() }>()
const metaData = MetadataStorage.getMetadataFromDecorator(User) const metaData = MetadataStorage.getMetadataFromDecorator(User)
expect(metaData.className).toEqual("User") expect(metaData.className).toEqual("User")
expect(metaData.path).toEqual("User") expect(metaData.path).toEqual("User")
expect(metaData.filters).toEqual({
softDeletable: {
name: "softDeletable",
cond: expect.any(Function),
default: true,
args: false,
},
})
expect(metaData.properties).toEqual({ expect(metaData.properties).toEqual({
id: { id: {
reference: "scalar", reference: "scalar",
@@ -284,6 +376,15 @@ describe("Entity builder", () => {
nullable: false, nullable: false,
name: "role", name: "role",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
expect(metaData.properties["role"].items()).toEqual([ expect(metaData.properties["role"].items()).toEqual([
"moderator", "moderator",
@@ -308,12 +409,23 @@ describe("Entity builder", () => {
username: string username: string
email: string email: string
role: "moderator" | "admin" | "guest" | null role: "moderator" | "admin" | "guest" | null
deleted_at: Date | null
}>() }>()
const metaData = MetadataStorage.getMetadataFromDecorator(User) const metaData = MetadataStorage.getMetadataFromDecorator(User)
expect(metaData.className).toEqual("User") expect(metaData.className).toEqual("User")
expect(metaData.path).toEqual("User") expect(metaData.path).toEqual("User")
expect(metaData.filters).toEqual({
softDeletable: {
name: "softDeletable",
cond: expect.any(Function),
default: true,
args: false,
},
})
expect(metaData.properties).toEqual({ expect(metaData.properties).toEqual({
id: { id: {
reference: "scalar", reference: "scalar",
@@ -349,6 +461,15 @@ describe("Entity builder", () => {
nullable: true, nullable: true,
name: "role", name: "role",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
expect(metaData.properties["role"].items()).toEqual([ expect(metaData.properties["role"].items()).toEqual([
"moderator", "moderator",
@@ -377,7 +498,12 @@ describe("Entity builder", () => {
expectTypeOf(new User()).toMatchTypeOf<{ expectTypeOf(new User()).toMatchTypeOf<{
id: number id: number
username: string username: string
email: EntityConstructor<{ email: string; isVerified: boolean }> deleted_at: Date | null
email: EntityConstructor<{
email: string
isVerified: boolean
deleted_at: Date | null
}>
}>() }>()
const metaData = MetadataStorage.getMetadataFromDecorator(User) const metaData = MetadataStorage.getMetadataFromDecorator(User)
@@ -409,6 +535,15 @@ describe("Entity builder", () => {
nullable: false, nullable: false,
mappedBy: "user", mappedBy: "user",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
@@ -431,7 +566,12 @@ describe("Entity builder", () => {
expectTypeOf(new User()).toMatchTypeOf<{ expectTypeOf(new User()).toMatchTypeOf<{
id: number id: number
username: string username: string
emails: EntityConstructor<{ email: string; isVerified: boolean }> | null deleted_at: Date | null
emails: EntityConstructor<{
email: string
isVerified: boolean
deleted_at: Date | null
}> | null
}>() }>()
const metaData = MetadataStorage.getMetadataFromDecorator(User) const metaData = MetadataStorage.getMetadataFromDecorator(User)
@@ -463,6 +603,15 @@ describe("Entity builder", () => {
nullable: true, nullable: true,
mappedBy: "user", mappedBy: "user",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
@@ -516,6 +665,15 @@ describe("Entity builder", () => {
nullable: false, nullable: false,
mappedBy: "owner", mappedBy: "owner",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
@@ -574,6 +732,15 @@ describe("Entity builder", () => {
mappedBy: "user", mappedBy: "user",
cascade: ["perist", "soft-remove"], cascade: ["perist", "soft-remove"],
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
const Email = entityBuilder(email) const Email = entityBuilder(email)
@@ -599,6 +766,15 @@ describe("Entity builder", () => {
getter: false, getter: false,
setter: false, setter: false,
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
@@ -665,6 +841,15 @@ describe("Entity builder", () => {
mappedBy: "user", mappedBy: "user",
cascade: ["perist", "soft-remove"], cascade: ["perist", "soft-remove"],
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
const Email = entityBuilder(email) const Email = entityBuilder(email)
@@ -699,6 +884,15 @@ describe("Entity builder", () => {
owner: true, owner: true,
reference: "1:1", reference: "1:1",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
}) })
@@ -754,6 +948,15 @@ describe("Entity builder", () => {
orphanRemoval: true, orphanRemoval: true,
mappedBy: "user", mappedBy: "user",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
@@ -810,6 +1013,15 @@ describe("Entity builder", () => {
mappedBy: "the_user", mappedBy: "the_user",
orphanRemoval: true, orphanRemoval: true,
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
@@ -868,6 +1080,15 @@ describe("Entity builder", () => {
mappedBy: "user", mappedBy: "user",
cascade: ["perist", "soft-remove"], cascade: ["perist", "soft-remove"],
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
@@ -928,6 +1149,15 @@ describe("Entity builder", () => {
mappedBy: "user", mappedBy: "user",
cascade: ["perist", "soft-remove"], cascade: ["perist", "soft-remove"],
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
const emailMetaData = MetadataStorage.getMetadataFromDecorator(Email) const emailMetaData = MetadataStorage.getMetadataFromDecorator(Email)
@@ -968,6 +1198,15 @@ describe("Entity builder", () => {
reference: "m:1", reference: "m:1",
onDelete: "cascade", onDelete: "cascade",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
}) })
@@ -995,12 +1234,15 @@ describe("Entity builder", () => {
expectTypeOf(new User()).toMatchTypeOf<{ expectTypeOf(new User()).toMatchTypeOf<{
id: number id: number
username: string username: string
deleted_at: Date | null
email: EntityConstructor<{ email: EntityConstructor<{
email: string email: string
isVerified: boolean isVerified: boolean
deleted_at: Date | null
user: EntityConstructor<{ user: EntityConstructor<{
id: number id: number
username: string username: string
deleted_at: Date | null
}> }>
}> }>
}>() }>()
@@ -1008,12 +1250,15 @@ describe("Entity builder", () => {
expectTypeOf(new Email()).toMatchTypeOf<{ expectTypeOf(new Email()).toMatchTypeOf<{
email: string email: string
isVerified: boolean isVerified: boolean
deleted_at: Date | null
user: EntityConstructor<{ user: EntityConstructor<{
id: number id: number
username: string username: string
deleted_at: Date | null
email: EntityConstructor<{ email: EntityConstructor<{
email: string email: string
isVerified: boolean isVerified: boolean
deleted_at: Date | null
}> }>
}> }>
}>() }>()
@@ -1047,6 +1292,15 @@ describe("Entity builder", () => {
nullable: false, nullable: false,
mappedBy: "user", mappedBy: "user",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
const emailMetaData = MetadataStorage.getMetadataFromDecorator(Email) const emailMetaData = MetadataStorage.getMetadataFromDecorator(Email)
@@ -1079,6 +1333,15 @@ describe("Entity builder", () => {
owner: true, owner: true,
mappedBy: "email", mappedBy: "email",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
@@ -1156,6 +1419,15 @@ describe("Entity builder", () => {
nullable: false, nullable: false,
mappedBy: "user", mappedBy: "user",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
const emailMetaData = MetadataStorage.getMetadataFromDecorator(Email) const emailMetaData = MetadataStorage.getMetadataFromDecorator(Email)
@@ -1188,6 +1460,15 @@ describe("Entity builder", () => {
owner: true, owner: true,
mappedBy: "email", mappedBy: "email",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
@@ -1265,6 +1546,15 @@ describe("Entity builder", () => {
mappedBy: "user", mappedBy: "user",
orphanRemoval: true, orphanRemoval: true,
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
const emailMetaData = MetadataStorage.getMetadataFromDecorator(Email) const emailMetaData = MetadataStorage.getMetadataFromDecorator(Email)
@@ -1304,6 +1594,15 @@ describe("Entity builder", () => {
nullable: false, nullable: false,
reference: "m:1", reference: "m:1",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
@@ -1381,6 +1680,15 @@ describe("Entity builder", () => {
mappedBy: "user", mappedBy: "user",
orphanRemoval: true, orphanRemoval: true,
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
const emailMetaData = MetadataStorage.getMetadataFromDecorator(Email) const emailMetaData = MetadataStorage.getMetadataFromDecorator(Email)
@@ -1420,6 +1728,15 @@ describe("Entity builder", () => {
nullable: true, nullable: true,
reference: "m:1", reference: "m:1",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
@@ -1563,6 +1880,15 @@ describe("Entity builder", () => {
entity: "Team", entity: "Team",
pivotTable: "team_users", pivotTable: "team_users",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
const teamMetaData = MetadataStorage.getMetadataFromDecorator(Team) const teamMetaData = MetadataStorage.getMetadataFromDecorator(Team)
@@ -1593,6 +1919,15 @@ describe("Entity builder", () => {
entity: "User", entity: "User",
pivotTable: "team_users", pivotTable: "team_users",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
@@ -1669,6 +2004,15 @@ describe("Entity builder", () => {
pivotTable: "team_users", pivotTable: "team_users",
mappedBy: "users", mappedBy: "users",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
const teamMetaData = MetadataStorage.getMetadataFromDecorator(Team) const teamMetaData = MetadataStorage.getMetadataFromDecorator(Team)
@@ -1699,6 +2043,15 @@ describe("Entity builder", () => {
entity: "User", entity: "User",
pivotTable: "team_users", pivotTable: "team_users",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
@@ -1814,6 +2167,15 @@ describe("Entity builder", () => {
pivotTable: "team_users", pivotTable: "team_users",
mappedBy: "users", mappedBy: "users",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
const teamMetaData = MetadataStorage.getMetadataFromDecorator(Team) const teamMetaData = MetadataStorage.getMetadataFromDecorator(Team)
@@ -1849,6 +2211,15 @@ describe("Entity builder", () => {
*/ */
inversedBy: "teams", inversedBy: "teams",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
@@ -1929,6 +2300,15 @@ describe("Entity builder", () => {
*/ */
inversedBy: "users", inversedBy: "users",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
const teamMetaData = MetadataStorage.getMetadataFromDecorator(Team) const teamMetaData = MetadataStorage.getMetadataFromDecorator(Team)
@@ -1960,6 +2340,15 @@ describe("Entity builder", () => {
pivotTable: "team_users", pivotTable: "team_users",
mappedBy: "teams", mappedBy: "teams",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
@@ -2065,6 +2454,15 @@ describe("Entity builder", () => {
pivotTable: "team_users", pivotTable: "team_users",
inversedBy: "activeTeamsUsers", inversedBy: "activeTeamsUsers",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
const teamMetaData = MetadataStorage.getMetadataFromDecorator(Team) const teamMetaData = MetadataStorage.getMetadataFromDecorator(Team)
@@ -2103,6 +2501,15 @@ describe("Entity builder", () => {
pivotTable: "team_users", pivotTable: "team_users",
mappedBy: "activeTeams", mappedBy: "activeTeams",
}, },
deleted_at: {
reference: "scalar",
type: "date",
columnType: "timestamptz",
name: "deleted_at",
nullable: true,
getter: false,
setter: false,
},
}) })
}) })
}) })
@@ -10,6 +10,7 @@ import { BelongsTo } from "./relations/belongs-to"
import { DateTimeSchema } from "./schema/date-time" import { DateTimeSchema } from "./schema/date-time"
import { ManyToMany } from "./relations/many-to-many" import { ManyToMany } from "./relations/many-to-many"
import type { RelationshipOptions, RelationshipType, SchemaType } from "./types" import type { RelationshipOptions, RelationshipType, SchemaType } from "./types"
import { NullableModifier } from "./schema/nullable"
/** /**
* Entity builder exposes the API to create an entity and define its * Entity builder exposes the API to create an entity and define its
@@ -23,7 +24,14 @@ export class EntityBuilder {
define< define<
Schema extends Record<string, SchemaType<any> | RelationshipType<any>> Schema extends Record<string, SchemaType<any> | RelationshipType<any>>
>(name: string, schema: Schema) { >(name: string, schema: Schema) {
return new DmlEntity(name, schema) return new DmlEntity<
Schema & {
deleted_at: NullableModifier<Date, DateTimeSchema>
}
>(name, {
...schema,
deleted_at: new DateTimeSchema().nullable(),
})
} }
/** /**
@@ -6,6 +6,7 @@ import {
OneToOne, OneToOne,
ManyToMany, ManyToMany,
ManyToOne, ManyToOne,
Filter,
} from "@mikro-orm/core" } from "@mikro-orm/core"
import { DmlEntity } from "../entity" import { DmlEntity } from "../entity"
import { camelToSnakeCase, pluralize } from "../../common" import { camelToSnakeCase, pluralize } from "../../common"
@@ -20,6 +21,7 @@ import type {
EntityConstructor, EntityConstructor,
RelationshipMetadata, RelationshipMetadata,
} from "../types" } from "../types"
import { DALUtils } from "../../bundles"
import { HasOne } from "../relations/has-one" import { HasOne } from "../relations/has-one"
import { HasMany } from "../relations/has-many" import { HasMany } from "../relations/has-many"
import { ManyToMany as DmlManyToMany } from "../relations/many-to-many" import { ManyToMany as DmlManyToMany } from "../relations/many-to-many"
@@ -427,6 +429,8 @@ export function createMikrORMEntity() {
/** /**
* Converting class to a MikroORM entity * Converting class to a MikroORM entity
*/ */
return Entity({ tableName })(MikroORMEntity) as Infer<T> return Entity({ tableName })(
Filter(DALUtils.mikroOrmSoftDeletableFilterOptions)(MikroORMEntity)
) as Infer<T>
} }
} }