@fraktalio/fmodel-ts
Version:
Functional domain modeling with TypeScript. Optimized for event sourcing and CQRS
49 lines • 3.6 kB
JavaScript
;
/*
* Copyright 2023 Fraktalio D.O.O. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "
* AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific
* language governing permissions and limitations under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.MaterializedView = void 0;
/**
* Materialized view is using/delegating a `View` to handle events of type `E` and to maintain a state of projection(s) via `IViewStateRepository` as a result.
* Essentially, it represents the query/view side of the CQRS pattern.
*
* @typeParam S - Materialized View state of type `S`
* @typeParam E - Events of type `E` that are handled by this Materialized View
* @typeParam V - Version of the state
* @typeParam EM - Event Metadata
*
* @author Иван Дугалић / Ivan Dugalic / @idugalic
*/
class MaterializedView {
constructor(view, viewStateRepository) {
this.view = view;
this.viewStateRepository = viewStateRepository;
this.initialState = this.view.initialState;
}
evolve(state, event) {
return this.view.evolve(state, event);
}
async fetch(event) {
return this.viewStateRepository.fetch(event);
}
async save(state, eventMetadata, version) {
return this.viewStateRepository.save(state, eventMetadata, version);
}
async handle(event) {
const currentStateAndVersion = await this.viewStateRepository.fetch(event);
const newState = this.view.evolve(currentStateAndVersion ? currentStateAndVersion : this.view.initialState, event);
return this.viewStateRepository.save(newState, event, currentStateAndVersion);
}
}
exports.MaterializedView = MaterializedView;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWxpemVkLXZpZXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2FwcGxpY2F0aW9uL21hdGVyaWFsaXplZC12aWV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7R0FXRzs7O0FBK0RIOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFhLGdCQUFnQjtJQUczQixZQUNxQixJQUFpQixFQUNqQixtQkFBc0Q7UUFEdEQsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUNqQix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQW1DO1FBRXpFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDN0MsQ0FBQztJQUdELE1BQU0sQ0FBQyxLQUFRLEVBQUUsS0FBUTtRQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFhO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFRLEVBQUUsYUFBaUIsRUFBRSxPQUFpQjtRQUN2RCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFhO1FBQ3hCLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUMvQixzQkFBc0IsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUN4RSxLQUFLLENBQ04sQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FDbEMsUUFBUSxFQUNSLEtBQVcsRUFDWCxzQkFBMkIsQ0FDNUIsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQW5DRCw0Q0FtQ0MifQ==