Skip to content

Entity

An Eicrud Entity is a database schema as well as a DTO (data transfer object) for CRUD operations. It represents "what the data can be".

Schema

Fields that you annotate with Mikro-orm's decorators are part of your database schema.

services/profile/profile.entity.ts
import { Entity, PrimaryKey, Property } from "@mikro-orm/core";

@Entity()
export class Profile implements CrudEntity {

    @PrimaryKey({ name: '_id' })
    id: string;

    @OneToOne(() => User, user => user.profile)
    owner: User | string;

    @Property()
    createdAt: Date;

    @Property()
    updatedAt: Date;

    notPersisted: number;

}

Note

Non annotated fields are not persisted in the database.

Learn how to define entities with Mikro-orm's documentation.

Validation

Fields that you annotate with class-validator's decorators are part of your DTO.

services/profile/profile.entity.ts
import { IsString, IsOptional } from "class-validator";

export class Profile implements CrudEntity {

    @IsOptional()
    @IsString()
    id: string;

    @IsString()
    owner: User | string;

    createdAt: Date;

    updatedAt: Date;

}

Note

Non annotated fields are not allowed in the DTO

Transform

Fields that you annotate with Eicrud's transform decorators will be transformed at the controller level.

services/profile/profile.entity.ts
import { $Transform } from '@eicrud/core/validation';

export class Profile implements CrudEntity {

    id: string;

    @$Transform((value ) => {
    return value.toLowerCase().trim()
    })
    username: User | string;

    createdAt: Date;

    updatedAt: Date;

}

Warning

The class-transformer package isn't compatible with Eicrud's validation, make sure to use Eicrud's decorators.

Mix and match

You can combine all of the above in a single entity class.

services/profile/profile.entity.ts
import { Entity, PrimaryKey, Property } from "@mikro-orm/core";
import { IsString, IsOptional, IsInt } from "class-validator";
import { $Transform } from '@eicrud/core/validation';

@Entity()
export class Profile implements CrudEntity {
    @IsOptional()
    @IsString()
    @PrimaryKey({ name: '_id' })
    id: string;

    @IsString()
    @OneToOne(() => User, user => user.profile)
    owner: User | string;

    @$Transform((value ) => {
    return value.toLowerCase().trim()
    })
    @IsString()
    username: User | string;

    @Property()
    createdAt: Date;

    @Property()
    updatedAt: Date;

    @IsInt()
    notPersisted: number;

}