tsbase
Version:
Base class libraries for TypeScript
130 lines • 5.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Repository = void 0;
var tslib_1 = require("tslib");
var Queryable_1 = require("../../Collections/Queryable/Queryable");
var Result_1 = require("../../Patterns/Result/Result");
var Validator_1 = require("../../Patterns/Validator/Validator");
var 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.
*/
var Repository = /** @class */ (function (_super) {
tslib_1.__extends(Repository, _super);
function Repository() {
var _this = _super.call(this) || this;
_this.savedData = { raw: Strings_1.Strings.Empty, referential: [] };
_this.validator = new Validator_1.Validator([]);
return _this;
}
Object.defineProperty(Repository.prototype, "PendingChanges", {
/**
* 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: function () {
return {
PendingSave: this.GetUnsavedElements(),
PendingDeletion: this.GetUnpurgedElements()
};
},
enumerable: false,
configurable: true
});
Repository.New = function (persister, validator, serializer, serializeAs) {
if (validator === void 0) { validator = new Validator_1.Validator([]); }
var repository = Object.create(Repository.prototype);
repository.persister = persister;
repository.validator = validator;
repository.serializer = serializer;
repository.serializeAs = serializeAs;
var initialData = Queryable_1.Queryable.From(repository.persister.Retrieve());
initialData = initialData && initialData.length >= 1 ? initialData : Queryable_1.Queryable.From([]);
repository.push.apply(repository, tslib_1.__spreadArray([], tslib_1.__read((repository.serializer && repository.serializeAs ?
repository.getSerializedInstancesFromInitialData(initialData) : initialData)), false));
repository.setSavedData();
return repository;
};
/**
* Calls the underlying persister's "Persist" method saving the data currently in the list
*/
Repository.prototype.SaveChanges = function () {
var _this = this;
var result = new Result_1.Result(null);
this.GetUnsavedElements().slice().forEach(function (element) {
result = result.CombineWith(_this.itemIsValid(element));
});
this.GetUnpurgedElements().slice().forEach(function (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
*/
Repository.prototype.push = function () {
var _this = this;
var items = [];
for (var _i = 0; _i < arguments.length; _i++) {
items[_i] = arguments[_i];
}
var result = new Result_1.Result();
items.forEach(function (element) {
result = result.CombineWith(_this.itemIsValid(element));
});
if (result.IsSuccess) {
_super.prototype.push.apply(this, tslib_1.__spreadArray([], tslib_1.__read(items), false));
return items.length;
}
else {
return 0;
}
};
/**
* Calls the underlying persister's "Purge" method deleting any data previously persisted
*/
Repository.prototype.PurgeData = function () {
this.persister.Purge();
this.splice(0, this.length);
};
/**
* Returns a collection of elements that have not been saved
*/
Repository.prototype.GetUnsavedElements = function () {
var _this = this;
return Queryable_1.Queryable.From(this.filter(function (i) { return !_this.savedData.raw.includes(JSON.stringify(i)); }));
};
/**
* Returns a collection of elements that have not been removed from persistence
*/
Repository.prototype.GetUnpurgedElements = function () {
return Queryable_1.Queryable.From(this.savedData.referential).Except(this.slice());
};
Repository.prototype.getSerializedInstancesFromInitialData = function (initialData) {
var _this = this;
var classInstances = new Array();
initialData.forEach(function (element) {
classInstances.push(_this.serializer
.Deserialize(_this.serializeAs, element));
});
return Queryable_1.Queryable.From(classInstances);
};
Repository.prototype.itemIsValid = function (item) {
return this.validator.Validate(item);
};
Repository.prototype.setSavedData = function () {
this.savedData = {
raw: JSON.stringify(this.slice()),
referential: this.slice()
};
};
return Repository;
}(Queryable_1.Queryable));
exports.Repository = Repository;
//# sourceMappingURL=Repository.js.map