public async ValueTask <GeneralLedger> Get(CancellationToken cancellationToken = default) { var optional = await _inner.GetOptional(GeneralLedger.Identifier, cancellationToken); if (optional.HasValue) { return(optional.Value); } var generalLedger = GeneralLedger.Factory(); _inner.Add(generalLedger); return(generalLedger); }
public async ValueTask <GeneralLedger> Get(CancellationToken cancellationToken = default) { if (_unitOfWork.TryGet(GeneralLedger.Identifier, out var a) && a is GeneralLedger generalLedger) { return(generalLedger); } await using var events = _eventStore.ReadStreamAsync(Direction.Backwards, GeneralLedger.Identifier, StreamPosition.End, int.MaxValue, cancellationToken: cancellationToken); generalLedger = GeneralLedger.Factory(); var stack = new Stack <object>(); bool lastEventRead = false; StreamPosition streamPosition = default; await foreach (var resolvedEvent in events) { if (!lastEventRead) { streamPosition = resolvedEvent.OriginalEvent.EventNumber; lastEventRead = true; } var @event = JsonSerializer.Deserialize(resolvedEvent.OriginalEvent.Data.Span, _messageTypeMapper.Map(resolvedEvent.OriginalEvent.EventType), TransactoSerializerOptions.Events); stack.Push(@event); if (@event is GeneralLedgerOpened || @event is AccountingPeriodClosed) { break; } } generalLedger.LoadFromHistory(stack); _unitOfWork.Attach(GeneralLedger.Identifier, generalLedger, streamPosition.ToInt64()); return(generalLedger); }