UNPKG

tsbase

Version:

Base class libraries for TypeScript

113 lines 4.23 kB
"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