public void Add(RoadNetworkChangesArchive archive)
        {
            if (archive == null)
            {
                throw new ArgumentNullException(nameof(archive));
            }

            _map.Attach(new EventSourcedEntityMapEntry(archive, new StreamName(archive.Id), ExpectedVersion.NoStream));
        }
Esempio n. 2
0
        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);
            });
        }