Exemple #1
0
        public async Task AddEventAsync(BaseItemEvent evt)
        {
            var entity = new EventStoreEntity();
            switch (evt)
            {
                case ItemCreatedEvent created:
                    entity.Type = nameof(ItemCreatedEvent);
                    entity.ItemName = created.Name;
                    break;
                case ItemDeletedEvent deleted:
                    entity.Type = nameof(ItemDeletedEvent);
                    break;
                case ItemUpdatedEvent updated:
                    entity.Type = nameof(ItemUpdatedEvent);
                    entity.ItemName = updated.Name;
                    break;
                default:
                    throw new ArgumentOutOfRangeException($"Specified type {evt.GetType()} is not supported");
            }

            entity.EventId = evt.EventId;
            entity.EventDate = evt.EventDate;
            entity.ItemId = evt.ItemId;
            entity.UserName = evt.UserName;
            entity.Version = evt.Version;

            await this.collection.InsertOneAsync(entity);
        }
Exemple #2
0
        public async Task <EventStoreEntity> InsertEntityAsync(string streamId, string sequence, ConferenceModel model)
        {
            var entity = new EventStoreEntity(streamId, sequence)
            {
                EventType = model.Event,
                Payload   = JsonConvert.SerializeObject(model.Data)
            };

            var insertOrMergeOperation = TableOperation.Insert(entity);

            var result = await _eventStoreTable.ExecuteAsync(insertOrMergeOperation);

            return(result.Result as EventStoreEntity);
        }
        public static async Task UpdateConferenceLookUpProjectionAsync(CloudTable eventProjectionsTable, EventStoreEntity entity)
        {
            var projection = eventProjectionsTable
                             .CreateQuery <EventProjectionsEntity>()
                             .Where(x => x.PartitionKey == "LookUps" && x.RowKey == "AllConferences")
                             .Select(x => x)
                             .SingleOrDefault() ?? await CreateLookUpProjectionAsync(eventProjectionsTable);

            var data = !string.IsNullOrEmpty(projection.Payload)
                ? JsonConvert.DeserializeObject <List <ConferenceDataModel> >(projection.Payload)
                : new List <ConferenceDataModel>();

            var eventData = JsonConvert.DeserializeObject <ConferenceDataModel>(entity?.Payload);

            var conferenceData = data.SingleOrDefault(x => x.Id == eventData.Id);

            switch (entity?.EventType)
            {
            case "Conference.Created":
                data.Add(eventData);
                break;

            case "Conference.SeatsAdded":
                if (conferenceData != null)
                {
                    conferenceData.Seats += eventData.Seats;
                }
                break;

            case "Conference.SeatsRemoved":
                if (conferenceData != null)
                {
                    conferenceData.Seats -= eventData.Seats;
                }
                break;
            }

            projection.Payload = JsonConvert.SerializeObject(data);

            var insertOrMergeOperation = TableOperation.InsertOrReplace(projection);

            await eventProjectionsTable.ExecuteAsync(insertOrMergeOperation);
        }