1.0.0 • Published 2 years ago
@loctax/mikro-orm-soft-delete v1.0.0
Mikro ORM Soft Delete
Temp publish until https://github.com/TheNightmareX/mikro-orm-soft-delete/pull/3 is merged.
Generic soft delete solution for MikroORM.
npm i mikro-orm-soft-deleteInspired by: https://github.com/mikro-orm/mikro-orm/issues/1492#issuecomment-785394397
Tutorial
Basic
It is so simple to enable soft delete with this package that you only need one example to understand what's going on:
@SoftDeletable(() => User, "deletedAt", () => new Date())
@Entity()
export class User extends BaseEntity<User, "id"> {
@PrimaryKey()
id: number;
@Property({ nullable: true })
deletedAt?: Date;
}This means that:
- A filter with conditions
{ deletedAt: null }has been defined onUserand enabled by default, so that those deleted entities will be filtered out by default. The filter can be disabled by:repo.find({ ... }, { filters: { [SOFT_DELETABLE_FILTER]: false } }); repo.find({ ... }, { filters: false }); // if you are sure that there are no other filters enabled - When you try to delete a
Userentity, it will not be actually deleted from the database, and itsdeletedAtproperty will be set to a newly instantiatedDate. You can find thatdeletestatements are replaced withupdateones with MikroORM's debug mode on.repo.remove(user); await repo.flush(); user.id !== undefined; // true user.deletedAt === true; // true cascade: [Cascade.Remove]andorphanRemoval: truestill work fine withrepo.remove(). But you must avoid removing items from collections when usingorphanRemovalbecause we cannot catch the deletions caused by it.
Inheritance
If you want all your entities to be soft deletable, you can create a SoftDeletableBaseEntity and make all your other entity classes extend it:
@SoftDeletable(() => SoftDeletableBaseEntity, "deletedAt", () => new Date())
export abstract class SoftDeletableBaseEntity<
T,
PK extends keyof T,
> extends BaseEntity<T, PK> {
@Property({ nullable: true })
deletedAt?: Date;
}Hard Deleting
Currently it's impossible to perform perfect hard deletes. As a workaround, we can hard delete entities using the native API:
em.nativeDelete(...);1.0.0
2 years ago