tsbase
Version:
Base class libraries for TypeScript
113 lines • 4.23 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Repository = void 0;
const Queryable_1 = require("../../Collections/Queryable/Queryable");
const Result_1 = require("../../Patterns/Result/Result");
const Validator_1 = require("../../Patterns/Validator/Validator");
const Strings_1 = require("../../System/Strings");
/**
* An extension of Queryable<T> that incorporates persistence functionality
* provided by a class implementing IPersister. Previously persisted data is
* loaded on instantiation using the default persister's "Retrieve" method.
*/
class Repository extends Queryable_1.Queryable {
constructor() {
super();
this.savedData = { raw: Strings_1.Strings.Empty, referential: [] };
this.validator = new Validator_1.Validator([]);
}
/**
* A set of rules the repository will check against when new elements are added
* Rules that have a severity of "Error" will not be added
*/
get PendingChanges() {
return {
PendingSave: this.GetUnsavedElements(),
PendingDeletion: this.GetUnpurgedElements()
};
}
static New(persister, validator = new Validator_1.Validator([]), serializer, serializeAs) {
const repository = Object.create(Repository.prototype);
repository.persister = persister;
repository.validator = validator;
repository.serializer = serializer;
repository.serializeAs = serializeAs;
let initialData = Queryable_1.Queryable.From(repository.persister.Retrieve());
initialData = initialData && initialData.length >= 1 ? initialData : Queryable_1.Queryable.From([]);
repository.push(...(repository.serializer && repository.serializeAs ?
repository.getSerializedInstancesFromInitialData(initialData) : initialData));
repository.setSavedData();
return repository;
}
/**
* Calls the underlying persister's "Persist" method saving the data currently in the list
*/
SaveChanges() {
let result = new Result_1.Result(null);
this.GetUnsavedElements().slice().forEach(element => {
result = result.CombineWith(this.itemIsValid(element));
});
this.GetUnpurgedElements().slice().forEach(element => {
result = result.CombineWith(this.itemIsValid(element));
});
if (result.IsSuccess) {
this.persister.Persist(this.slice());
this.setSavedData();
}
return result;
}
/**
* Override for default push that enforces validation
*/
push(...items) {
let result = new Result_1.Result();
items.forEach(element => {
result = result.CombineWith(this.itemIsValid(element));
});
if (result.IsSuccess) {
super.push(...items);
return items.length;
}
else {
return 0;
}
}
/**
* Calls the underlying persister's "Purge" method deleting any data previously persisted
*/
PurgeData() {
this.persister.Purge();
this.splice(0, this.length);
}
/**
* Returns a collection of elements that have not been saved
*/
GetUnsavedElements() {
return Queryable_1.Queryable.From(this.filter(i => !this.savedData.raw.includes(JSON.stringify(i))));
}
/**
* Returns a collection of elements that have not been removed from persistence
*/
GetUnpurgedElements() {
return Queryable_1.Queryable.From(this.savedData.referential).Except(this.slice());
}
getSerializedInstancesFromInitialData(initialData) {
const classInstances = new Array();
initialData.forEach(element => {
classInstances.push(this.serializer
.Deserialize(this.serializeAs, element));
});
return Queryable_1.Queryable.From(classInstances);
}
itemIsValid(item) {
return this.validator.Validate(item);
}
setSavedData() {
this.savedData = {
raw: JSON.stringify(this.slice()),
referential: this.slice()
};
}
}
exports.Repository = Repository;
//# sourceMappingURL=Repository.js.map