import { StoreReadModel } from '../Model/StoreReadModel'; import { StoreRepositoryInterface } from '../StoreRepositoryInterface'; import { StoreFactory } from '../../Redux/Store/StoreFactory'; import { StateReadModel } from '../Model/StateReadModel'; import { Repository } from 'ts-eventsourcing/ReadModel/Repository'; import { Identity } from 'ts-eventsourcing/ValueObject/Identity'; import { ReadModelAction, ReadModelMetadata } from '../ReadModelAction'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { INITIAL_PLAYHEAD } from '../../ValueObject/Playhead'; export class StoreRepository< State, Id extends Identity = Identity, Metadata extends ReadModelMetadata = ReadModelMetadata, Action extends ReadModelAction = ReadModelAction> implements StoreRepositoryInterface { constructor(private readonly stateRepository: Repository, Id>, private readonly storeFactory: StoreFactory) { } public async create(id: Id): Promise> { return new StoreReadModel(id, this.storeFactory.create(), INITIAL_PLAYHEAD); } public save(model: StoreReadModel): Promise { return this.stateRepository.save(new StateReadModel( model.getId(), model.getStore().getState(), model.getPlayhead(), )); } public has(id: Id): Promise { return this.stateRepository.has(id); } public async get(id: Id): Promise> { const data = await this.stateRepository.get(id); return this.createStore(data); } public async find(id: Id): Promise> { const data = await this.stateRepository.find(id); if (data === null) { return null; } return this.createStore(data); } public remove(id: Id): Promise { return this.stateRepository.remove(id); } public findAll(): Observable> { return this.stateRepository.findAll().pipe(map((data) => this.createStore(data))); } private createStore(data: StateReadModel) { const store = this.storeFactory.createFromState(data.getState() as any); return new StoreReadModel(data.getId(), store, data.getPlayhead()); } }