loopback-history-extension

DataModels with history extension for Loopback v4

Usage no npm install needed!

<script type="module">
  import loopbackHistoryExtension from 'https://cdn.skypack.dev/loopback-history-extension';
</script>

README

loopback-history-extension

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:

  1. UID: A unique record identifier of the history
  2. BeginDate: Record creation date
  3. EndDate: Record deletion date
  4. ID: 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.


Installation

npm i --save loopback-history-extension

Usage

History Model

  1. Change your model parent class from Entity to HistoryEntity
  2. Remove id property from your model declaration

Example

Change your model from:

@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);
    }
}

To:

import { HistoryEntity } from "loopback-history-extension";

@model()
export class User extends HistoryEntity {
    @property({
        type: "string",
        default: ""
    })
    username: string;

    constructor(data?: Partial<User>) {
        super(data);
    }
}

Tip

Don't use unique columns in your models

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
    })
    username: string;
}

History Repository Mixin

Change your repository parent class from DefaultCrudRepository to HistoryCrudRepositoryMixin()()

Example

Change your repository from:

export class UserRepository extends DefaultCrudRepository<
    User,
    typeof User.prototype.id,
    UserRelations
> {
    // ...
}

To:

import { HistoryCrudRepositoryMixin } from "loopback-history-extension";

export class UserRepository extends HistoryCrudRepositoryMixin<
    User,
    UserRelations
>()() {
    // ...
}

Contributions

License

This project is licensed under the MIT license.
Copyright (c) KoLiBer (koliberr136a1@gmail.com)