deepkit-framework icon indicating copy to clipboard operation
deepkit-framework copied to clipboard

[Feature] Nullable Embedded Data Field

Open Char2sGu opened this issue 2 years ago • 0 comments

Currently embedded data fields cannot be nullable, so we have to write if (entity.embedded.field1 && entity.embedded.field2) {} instead of if (entity.embedded) {}.

This example will throw a database validation error:

import { Database } from "@deepkit/orm";
import { SQLiteDatabaseAdapter } from "@deepkit/sqlite";
import { AutoIncrement, Embedded, entity, PrimaryKey } from "@deepkit/type";

async function main() {
  @entity.name("my-entity")
  class MyEntity {
    id: number & AutoIncrement & PrimaryKey = 0;
    embedded?: Embedded<MyEntityEmbedded>;
  }

  class MyEntityEmbedded {
    prop!: string;
  }

  const database = new Database(new SQLiteDatabaseAdapter(), [MyEntity]);
  await database.migrate();
  await database.persist(new MyEntity());
}

main();
/home/char2s/projects/example/node_modules/@deepkit/orm/src/database-session.ts:164
                        throw new DatabaseValidationError(classState.classSchema, errors);
                              ^
DatabaseValidationError: Validation error for class my-entity:
embedded(type): Not an object
    at DatabaseSessionRound.doPersist (/home/char2s/projects/example/node_modules/@deepkit/orm/src/database-session.ts:164:31)
    at DatabaseSessionRound.commit (/home/char2s/projects/example/node_modules/@deepkit/orm/src/database-session.ts:114:24)
    at async DatabaseSession.flush (/home/char2s/projects/example/node_modules/@deepkit/orm/src/database-session.ts:519:17)
    at async DatabaseSession.commit (/home/char2s/projects/example/node_modules/@deepkit/orm/src/database-session.ts:329:9)
    at async Database.persist (/home/char2s/projects/example/node_modules/@deepkit/orm/src/database.ts:325:9)
    at async main (/home/char2s/projects/example/src/app.ts:43:3) {
  classSchema: ReflectionClass {
    type: {
      kind: 20,
      classType: [Function],
      types: [Array],
      typeArguments: undefined,
      jit: [Object]
    },
    parent: undefined,
    description: '',
    data: { 'orm.database': [Database], classState: [ClassState] },
    disableConstructor: false,
    singleTableInheritance: false,
    indexes: [],
    propertyNames: [ 'id', 'embedded' ],
    methodNames: [],
    properties: [ [ReflectionProperty], [ReflectionProperty] ],
    methods: [],
    references: [],
    primaries: [ [ReflectionProperty] ],
    autoIncrements: [ [ReflectionProperty] ],
    subClasses: [],
    name: 'my-entity'
  },
  errors: [
    ValidationErrorItem {
      path: 'embedded',
      code: 'type',
      message: 'Not an object'
    }
  ]
}

Char2sGu avatar Jun 03 '22 14:06 Char2sGu