diff --git a/packages/core/utils/src/dml/__tests__/entity-builder.spec.ts b/packages/core/utils/src/dml/__tests__/entity-builder.spec.ts index d2a2723766..5105202465 100644 --- a/packages/core/utils/src/dml/__tests__/entity-builder.spec.ts +++ b/packages/core/utils/src/dml/__tests__/entity-builder.spec.ts @@ -24,6 +24,8 @@ describe("Entity builder", () => { id: number username: string email: string + created_at: Date + updated_at: Date deleted_at: Date | null }>() @@ -68,6 +70,29 @@ describe("Entity builder", () => { getter: false, setter: false, }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -139,6 +164,29 @@ describe("Entity builder", () => { getter: false, setter: false, }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -209,6 +257,29 @@ describe("Entity builder", () => { getter: false, setter: false, }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -289,6 +360,29 @@ describe("Entity builder", () => { nullable: false, name: "role", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -376,6 +470,29 @@ describe("Entity builder", () => { nullable: false, name: "role", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -461,6 +578,29 @@ describe("Entity builder", () => { nullable: true, name: "role", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -477,6 +617,35 @@ describe("Entity builder", () => { "guest", ]) }) + + test("disallow defining created_at and updated_at timestamps", () => { + const model = new EntityBuilder() + expect(() => + model.define("user", { + id: model.number(), + username: model.text(), + email: model.text(), + created_at: model.dateTime(), + updated_at: model.dateTime(), + }) + ).toThrow( + 'Cannot define field(s) "created_at,updated_at" as they are implicitly defined on every model' + ) + }) + + test("disallow defining deleted_at timestamp", () => { + const model = new EntityBuilder() + expect(() => + model.define("user", { + id: model.number(), + username: model.text(), + email: model.text(), + deleted_at: model.dateTime(), + }) + ).toThrow( + 'Cannot define field(s) "deleted_at" as they are implicitly defined on every model' + ) + }) }) describe("Entity builder | indexes", () => { @@ -551,6 +720,29 @@ describe("Entity builder", () => { getter: false, setter: false, }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -620,6 +812,29 @@ describe("Entity builder", () => { nullable: false, mappedBy: "user", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -688,6 +903,29 @@ describe("Entity builder", () => { nullable: true, mappedBy: "user", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -750,6 +988,29 @@ describe("Entity builder", () => { nullable: false, mappedBy: "owner", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -817,6 +1078,29 @@ describe("Entity builder", () => { mappedBy: "user", cascade: ["perist", "soft-remove"], }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -851,6 +1135,29 @@ describe("Entity builder", () => { getter: false, setter: false, }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -926,6 +1233,29 @@ describe("Entity builder", () => { mappedBy: "user", cascade: ["perist", "soft-remove"], }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -969,6 +1299,29 @@ describe("Entity builder", () => { owner: true, reference: "1:1", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -1033,6 +1386,29 @@ describe("Entity builder", () => { orphanRemoval: true, mappedBy: "user", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -1098,6 +1474,29 @@ describe("Entity builder", () => { mappedBy: "the_user", orphanRemoval: true, }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -1165,6 +1564,29 @@ describe("Entity builder", () => { mappedBy: "user", cascade: ["perist", "soft-remove"], }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -1234,6 +1656,29 @@ describe("Entity builder", () => { mappedBy: "user", cascade: ["perist", "soft-remove"], }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -1283,6 +1728,29 @@ describe("Entity builder", () => { reference: "m:1", onDelete: "cascade", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -1377,6 +1845,29 @@ describe("Entity builder", () => { nullable: false, mappedBy: "user", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -1418,6 +1909,29 @@ describe("Entity builder", () => { owner: true, mappedBy: "email", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -1504,6 +2018,29 @@ describe("Entity builder", () => { nullable: false, mappedBy: "user", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -1545,6 +2082,29 @@ describe("Entity builder", () => { owner: true, mappedBy: "email", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -1631,6 +2191,29 @@ describe("Entity builder", () => { mappedBy: "user", orphanRemoval: true, }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -1679,6 +2262,29 @@ describe("Entity builder", () => { nullable: false, reference: "m:1", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -1765,6 +2371,29 @@ describe("Entity builder", () => { mappedBy: "user", orphanRemoval: true, }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -1813,6 +2442,29 @@ describe("Entity builder", () => { nullable: true, reference: "m:1", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -1965,6 +2617,29 @@ describe("Entity builder", () => { entity: "Team", pivotTable: "team_users", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -2004,6 +2679,29 @@ describe("Entity builder", () => { entity: "User", pivotTable: "team_users", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -2089,6 +2787,29 @@ describe("Entity builder", () => { pivotTable: "team_users", mappedBy: "users", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -2128,6 +2849,29 @@ describe("Entity builder", () => { entity: "User", pivotTable: "team_users", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -2252,6 +2996,29 @@ describe("Entity builder", () => { pivotTable: "team_users", mappedBy: "users", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -2296,6 +3063,29 @@ describe("Entity builder", () => { */ inversedBy: "teams", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -2385,6 +3175,29 @@ describe("Entity builder", () => { */ inversedBy: "users", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -2425,6 +3238,29 @@ describe("Entity builder", () => { pivotTable: "team_users", mappedBy: "teams", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -2539,6 +3375,29 @@ describe("Entity builder", () => { pivotTable: "team_users", inversedBy: "activeTeamsUsers", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", @@ -2586,6 +3445,29 @@ describe("Entity builder", () => { pivotTable: "team_users", mappedBy: "activeTeams", }, + created_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "created_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, + updated_at: { + reference: "scalar", + type: "date", + columnType: "timestamptz", + name: "updated_at", + defaultRaw: "now()", + onCreate: expect.any(Function), + onUpdate: expect.any(Function), + nullable: false, + getter: false, + setter: false, + }, deleted_at: { reference: "scalar", type: "date", diff --git a/packages/core/utils/src/dml/entity-builder.ts b/packages/core/utils/src/dml/entity-builder.ts index c2bdd8b0de..819880f40d 100644 --- a/packages/core/utils/src/dml/entity-builder.ts +++ b/packages/core/utils/src/dml/entity-builder.ts @@ -16,11 +16,30 @@ import type { } from "./types" import { NullableModifier } from "./properties/nullable" +/** + * The implicit properties added by EntityBuilder in every schema + */ +const IMPLICIT_PROPERTIES = ["created_at", "updated_at", "deleted_at"] + /** * Entity builder exposes the API to create an entity and define its * schema using the shorthand methods. */ export class EntityBuilder { + #disallowImplicitProperties(schema: Record) { + const implicitProperties = Object.keys(schema).filter((fieldName) => + IMPLICIT_PROPERTIES.includes(fieldName) + ) + + if (implicitProperties.length) { + throw new Error( + `Cannot define field(s) "${implicitProperties.join( + "," + )}" as they are implicitly defined on every model` + ) + } + } + /** * Define an entity or a model. The name should be unique across * all the entities. @@ -28,12 +47,18 @@ export class EntityBuilder { define< Schema extends Record | RelationshipType> >(name: string, schema: Schema) { + this.#disallowImplicitProperties(schema) + return new DmlEntity< Schema & { + created_at: DateTimeProperty + updated_at: DateTimeProperty deleted_at: NullableModifier } >(name, { ...schema, + created_at: new DateTimeProperty(), + updated_at: new DateTimeProperty(), deleted_at: new DateTimeProperty().nullable(), }) } diff --git a/packages/core/utils/src/dml/helpers/create-mikro-orm-entity.ts b/packages/core/utils/src/dml/helpers/create-mikro-orm-entity.ts index bef8c6ec98..baedcba711 100644 --- a/packages/core/utils/src/dml/helpers/create-mikro-orm-entity.ts +++ b/packages/core/utils/src/dml/helpers/create-mikro-orm-entity.ts @@ -64,6 +64,39 @@ const PROPERTY_TYPES: { json: "any", } +/** + * Properties that needs special treatment based upon their name. + * We can safely rely on these names because they are never + * provided by the end-user. Instead we output them + * implicitly via the DML. + */ +const SPECIAL_PROPERTIES: { + [propertyName: string]: ( + MikroORMEntity: EntityConstructor, + field: PropertyMetadata + ) => void +} = { + created_at: (MikroORMEntity, field) => { + Property({ + columnType: "timestamptz", + type: "date", + nullable: false, + defaultRaw: "now()", + onCreate: () => new Date(), + })(MikroORMEntity.prototype, field.fieldName) + }, + updated_at: (MikroORMEntity, field) => { + Property({ + columnType: "timestamptz", + type: "date", + nullable: false, + defaultRaw: "now()", + onCreate: () => new Date(), + onUpdate: () => new Date(), + })(MikroORMEntity.prototype, field.fieldName) + }, +} + /** * Factory function to create the mikro orm entity builder. The return * value is a function that can be used to convert DML entities @@ -92,6 +125,11 @@ export function createMikrORMEntity() { MikroORMEntity: EntityConstructor, field: PropertyMetadata ) { + if (SPECIAL_PROPERTIES[field.fieldName]) { + SPECIAL_PROPERTIES[field.fieldName](MikroORMEntity, field) + return + } + /** * Defining an enum property */