public ICommittedSnapshot Deserialize(SnapshotDocument doc)
        {
            var snapshotType = Type.GetType(doc.Metadata[MetadataKeys.SnapshotClrType].AsString);

            var data     = (ISnapshot)BsonSerializer.Deserialize(doc.Data, snapshotType);
            var metadata = BsonSerializer.Deserialize <Dictionary <string, object> >(doc.Metadata.ToJson());

            return(new MongoCommittedSnapshot(doc.AggregateId, doc.Version, data, new MetadataCollection(metadata)));
        }
Exemplo n.º 2
0
        private Snapshot Deserialize(SnapshotDocument document)
        {
            object metadata = null;

            if (!string.IsNullOrEmpty(document.MetadataType))
            {
                metadata = document.Metadata.ToObject(this.TypeCache.Resolve(document.MetadataType), this.JsonSerializer);
            }

            return(new Snapshot(document.Body.ToObject(this.TypeCache.Resolve(document.BodyType), this.JsonSerializer), metadata, document.Version));
        }
Exemplo n.º 3
0
        private static SnapshotDocument BuildSnapShotDoc(string streamId, SnapshotModel snapshot,
                                                         long version
                                                         )
        {
            var document = new SnapshotDocument
            {
                StreamId  = streamId,
                Version   = version,
                TimeStamp = DateTimeOffset.Now.ToUnixTimeSeconds(),
                DataType  = snapshot.Data.GetType().AssemblyQualifiedName,
                Data      = snapshot.Data
            };

            return(document);
        }
Exemplo n.º 4
0
        public async Task <IExecutionResult> TakeSnapshotAsync(string stream)
        {
            Optional <TAggregateRoot> root = await _rootRepository.GetAsync(stream);

            root.ThrowsIf(r => !r.HasValue, new AggregateNotFoundException(stream));

            _changeTracker.TryGet(stream, out Aggregate aggregate);

            var serializedState = _eventSerializer.Serialize(root.Value.TakeSnapshot());

            var newSnapshot = new SnapshotDocument(aggregate.Identifier, serializedState, aggregate.ExpectedVersion.Value.ToString(), null, typeof(TSnapshot).TypeQualifiedName());

            await _cosmosDbClient.CreateItemAsync(newSnapshot,
                                                  _cosmosDBConfigurations.SnapshotContainerName).ConfigureAwait(false);

            return(ExecutionResult.Success);
        }
        public SnapshotDocument Serialize(IUncommittedSnapshot serializedSnapshot)
        {
            var id       = serializedSnapshot.Metadata.GetValue(MetadataKeys.SnapshotId, value => Guid.Parse(value.ToString()));
            var data     = BsonDocumentWrapper.Create(serializedSnapshot.Data);
            var metadata = BsonDocument.Create(serializedSnapshot.Metadata);

            var snapshot = new SnapshotDocument
            {
                Id          = id,
                Timestamp   = DateTime.UtcNow,
                AggregateId = serializedSnapshot.AggregateId,
                Version     = serializedSnapshot.AggregateVersion,
                Data        = data,
                Metadata    = metadata,
            };

            return(snapshot);
        }
Exemplo n.º 6
0
        private SnapshotDocument Serialize(object snapshot, object metadata, ulong version, string streamId)
        {
            var document = new SnapshotDocument
            {
                Partition = this.Partition,
                StreamId  = streamId,
                Version   = version,
                BodyType  = snapshot.GetType().AssemblyQualifiedName,
                Body      = JToken.FromObject(snapshot, this.JsonSerializer)
            };

            if (metadata != null)
            {
                document.Metadata     = JToken.FromObject(metadata, this.JsonSerializer);
                document.MetadataType = metadata.GetType().AssemblyQualifiedName;
            }

            return(document);
        }
Exemplo n.º 7
0
        public async Task ThenTheSnapshotForVersionIsPersisted(ulong version)
        {
            var streamId = ScenarioContext.Current.GetStreamId();
            var snapshot = ScenarioContext.Current.GetSnapshot();

            var snapshotUri = UriFactory.CreateDocumentUri(this.Context.Database, this.Context.Collection, SnapshotDocument.GenerateId(streamId, version));
            var snapshotDocumentResponse = await this.Context.Client.ReadDocumentAsync <SnapshotDocument>(snapshotUri, new RequestOptions { PartitionKey = this.Context.PartitionKey });

            Assert.IsNotNull(snapshotDocumentResponse.Document);

            var snapshotDocument = snapshotDocumentResponse.Document;
            var snapshotMetadata = ScenarioContext.Current.GetSnapshotMetadata();

            Assert.AreEqual(this.Context.Partition, snapshotDocument.Partition);
            Assert.AreEqual(DocumentType.Snapshot, snapshotDocument.DocumentType);
            Assert.AreEqual(streamId, snapshotDocument.StreamId);
            Assert.AreEqual(version, snapshotDocument.Version);
            Assert.AreEqual(version + EveneumDocument.GetOrderingFraction(DocumentType.Snapshot), snapshotDocument.SortOrder);

            if (snapshotMetadata == null)
            {
                Assert.IsNull(snapshotDocument.MetadataType);
                Assert.IsFalse(snapshotDocument.Metadata.HasValues);
            }
            else
            {
                Assert.AreEqual(snapshotMetadata.GetType().AssemblyQualifiedName, snapshotDocument.MetadataType);
                Assert.AreEqual(JToken.FromObject(snapshotMetadata), snapshotDocument.Metadata);
            }

            Assert.AreEqual(snapshot.GetType().AssemblyQualifiedName, snapshotDocument.BodyType);
            Assert.AreEqual(JToken.FromObject(snapshot), snapshotDocument.Body);
            Assert.False(snapshotDocument.Deleted);
            Assert.IsNotNull(snapshotDocument.ETag);
        }