This package helps you to track changes made on your entities automatically using a base repository class to extend from:
- Automatically generate change sets containing information about WHO, WHEN and WHAT was changed on your entities.
- Be able to rollback a single or multiple entities to the state of a specified change set or date. (The reset gets also tracked)
- Be able to "softly" delete entities, which have a delete flag on them.
- Be able to restore a single or multiple "softly" deleted entities.
The minimum required code changes to use the library to its full extend is simply registering it in the application.ts
constructor:
import { ChangeRepository, ChangeSetRepository, LbxChangeSetsComponent } from 'lbx-change-sets';
//...
this.component(LbxChangeSetsComponent);
this.repository(ChangeRepository);
this.repository(ChangeSetRepository);
//...
All entities that should make use of the change set functionality need to extend ChangeSetEntity
:
import { ChangeSetEntity } from 'lbx-change-sets';
// ...
@model()
export class TestChangeSetEntity extends ChangeSetEntity {
@property({
type: 'string',
required: true
})
firstName: string;
@property({
type: 'string',
required: true
})
lastName: string;
constructor(data?: Partial<TestChangeSetEntity>) {
super(data);
}
}
The repository needs to extend CrudChangeSetRepository
:
import { CrudChangeSetRepository } from 'lbx-change-sets';
// ...
export class TestChangeSetEntityRepository extends CrudChangeSetRepository<
TestChangeSetEntity,
typeof TestChangeSetEntity.prototype.id,
TestRelations
> {
constructor(
@inject('datasources.db')
dataSource: DbDataSource,
@repository.getter('ChangeSetRepository')
changeSetRepositoryGetter: Getter<ChangeSetRepository>,
@repository(ChangeRepository)
changeRepository: ChangeRepository,
@repository(ChangeSetRepository)
changeSetRepository: ChangeSetRepository,
@inject.getter(SecurityBindings.USER)
getUserProfile: Getter<UserProfile>
) {
super(TestChangeSetEntity, dataSource, changeSetRepositoryGetter, changeRepository, changeSetRepository, getUserProfile);
}
}
That's it. Whenever you user the default actions of the repository like "create" or "updateById" a change set will be generated automatically.
If you use transactions they will be used to guarantee that change sets are only generated when the base operation worked.
INFO: If you have complex relations that should be tracked or rolled back you will probably need to override the corresponding methods.
All existing change sets are available via the normal @hasMany
property "changeSets" on your entity and repository. You can however also get them via the ChangeSetRepository
and ChangeRepository
.
To rollback you can simply call the methods rollback[ToDate | ToChangeSet...]
on your repository.
If you have some properties that you don't want to have in your change sets, you can exlude them by overriding the keysToExcludeFromChangeSets
array in your repository. By default this already doesn't track the entities id.
If you want to use the soft delete features aswell, you can basically follow the same steps above but extend from ChangeSetSoftDeleteEntity
and CrudChangeSetSoftDeleteRepository
.
They provide the same functionality mentionend above and some more:
To softly delete a single or multiple entities you can use the respoitories softDelete[ById | All...]
methods.
To softly delete a single or multiple entities you can use the respoitories restore[ById | All...]
methods.
Because most times you probably want to only return or update entities that aren't deleted, the repository provides some convenience methods for that:
- findNonDeleted:
find
, but limited to not deleted entities - findDeleted:
find
, but limited to deleted entities - updateAllNonDeleted:
updateAll
, but limited to not deleted entities - updateAllDeleted:
updateAll
, but limited to deleted entities - rollbackAllNonDeletedToDate:
rollbackAllToDate
, but limited to not deleted entities - rollbackAllDeletedToDate:
rollbackAllToDate
, but limited to deleted entities - deleteAllDeleted:
deleteAll
, but limited to deleted entities