UNPKG

tsbase

Version:

Base class libraries for TypeScript

130 lines 5.33 kB
"use strict"; 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