public void Add(RoadNetworkChangesArchive archive) { if (archive == null) { throw new ArgumentNullException(nameof(archive)); } _map.Attach(new EventSourcedEntityMapEntry(archive, new StreamName(archive.Id), ExpectedVersion.NoStream)); }
public static RoadNetworkChangesArchive Upload(ArchiveId id) { var instance = new RoadNetworkChangesArchive(); instance.Apply(new RoadNetworkChangesArchiveUploaded { ArchiveId = id }); return(instance); }
public async Task <RoadNetworkChangesArchive> Get(ArchiveId id, CancellationToken ct = default) { var stream = new StreamName(id); if (_map.TryGet(stream, out var entry)) { return((RoadNetworkChangesArchive)entry.Entity); } var page = await _store.ReadStreamForwards(stream, StreamVersion.Start, 1024, ct); if (page.Status == PageReadStatus.StreamNotFound) { var network = RoadNetworkChangesArchive.Factory(); _map.Attach(new EventSourcedEntityMapEntry(network, stream, ExpectedVersion.NoStream)); return(network); } IEventSourcedEntity entity = RoadNetworkChangesArchive.Factory(); var messages = new List <object>(page.Messages.Length); foreach (var message in page.Messages) { messages.Add( JsonConvert.DeserializeObject( await message.GetJsonData(ct), _mapping.GetEventType(message.Type), _settings)); } entity.RestoreFromEvents(messages.ToArray()); while (!page.IsEnd) { messages.Clear(); page = await page.ReadNext(ct); if (page.Status == PageReadStatus.StreamNotFound) { var network = RoadNetworkChangesArchive.Factory(); _map.Attach(new EventSourcedEntityMapEntry(network, stream, ExpectedVersion.NoStream)); return(network); } foreach (var message in page.Messages) { messages.Add( JsonConvert.DeserializeObject( await message.GetJsonData(ct), _mapping.GetEventType(message.Type), _settings)); } entity.RestoreFromEvents(messages.ToArray()); } _map.Attach(new EventSourcedEntityMapEntry(entity, stream, page.LastStreamVersion)); return((RoadNetworkChangesArchive)entity); }
public RoadNetworkChangesArchiveCommandModule( IBlobClient client, IStreamStore store, IRoadNetworkSnapshotReader snapshotReader, IZipArchiveValidator validator, IClock clock) { if (client == null) { throw new ArgumentNullException(nameof(client)); } if (store == null) { throw new ArgumentNullException(nameof(store)); } if (validator == null) { throw new ArgumentNullException(nameof(validator)); } if (clock == null) { throw new ArgumentNullException(nameof(clock)); } For <Messages.UploadRoadNetworkChangesArchive>() .UseRoadRegistryContext(store, snapshotReader, EnrichEvent.WithTime(clock)) .Handle(async(context, message, ct) => { var archiveId = new ArchiveId(message.Body.ArchiveId); var upload = RoadNetworkChangesArchive.Upload(archiveId); var archiveBlob = await client.GetBlobAsync(new BlobName(archiveId), ct); using (var archiveBlobStream = await archiveBlob.OpenAsync(ct)) using (var archive = new ZipArchive(archiveBlobStream, ZipArchiveMode.Read, false)) { upload.ValidateArchiveUsing(archive, validator); } context.RoadNetworkChangesArchives.Add(upload); }); }