Saving history of Create
, Update
, Delete
of a table sometimes is a big problem in data model design level.
A good approach for saving history is about adding some columns to your tables:
UID
: A unique record identifier of the historyBeginDate
: Record creation dateEndDate
: Record deletion dateID
: History of one data is accessable using their same ID
- Per every
Create
we will create a new record in table - Per every
Update
we will invalid last history, create new record - Per every
Delete
we will invalid last history
Now, using this simple extension you can add all history features to your models and repositories.
Use the package manager npm to install loopback-component-history
.
npm i --save loopback-component-history
Follow these steps to add History
extension to your loopback4 application:
-
Change your model parent class from
Entity
toHistoryEntity
-
Remove
id
property from your model declaration// Old @model() export class User extends Entity { @property({ type: "string", unique: true, id: true, }) id: string; @property({ type: "string", default: "", }) username: string; constructor(data?: Partial<User>) { super(data); } } // New import { HistoryEntity } from "loopback-component-history"; @model() export class User extends HistoryEntity { @property({ type: "string", default: "", }) username: string; constructor(data?: Partial<User>) { super(data); } }
-
Change your repository parent class from
DefaultCrudRepository
toHistoryRepositoryMixin()()
// Old export class UserRepository extends DefaultCrudRepository< User, typeof User.prototype.id, UserRelations > { // ... } // New import { HistoryRepositoryMixin } from "loopback-component-history"; export class UserRepository extends HistoryRepositoryMixin< User, UserRelations >()<Constructor<DefaultCrudRepository<User, string, UserRelations>>>( DefaultCrudRepository ) { // ... }
Don't use unique
indexes in your models, instead add unique
property to model definition
Convert your model from:
export class User extends Entity {
@property({
type: "string",
required: true,
index: {
unique: true,
},
})
username: string;
}
To:
export class User extends HistoryEntity {
@property({
type: "string",
required: true,
unique: true,
})
username: string;
}
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.
Please make sure to update tests as appropriate.
This project is licensed under the MIT.
Copyright (c) KoLiBer ([email protected])