Esempio n. 1
0
        /// <summary>
        /// Handles all types of command asynchronously.
        /// </summary>
        /// <param name="command">The command.</param>
        /// <returns></returns>
        /// <exception cref="ArgumentNullException">If command is null</exception>
        /// <exception cref="ArgumentOutOfRangeException">If command has unsupported type</exception>
        /// <exception cref="Exception">In case of more generic exception</exception>
        public async Task <BaseItemEvent> HandleAsync(BaseItemCommand command)
        {
            try
            {
                if (command == null)
                {
                    throw new ArgumentNullException(nameof(command));
                }

                BaseItemEvent evt;
                switch (command)
                {
                case CreateItemCommand create:
                    evt = new ItemCreatedEvent(create.Item.Id, create.Item.Name, command.UserName, Guid.NewGuid(), DateTime.UtcNow);
                    break;

                case DeleteItemCommand delete:
                    evt = new ItemDeletedEvent(delete.ItemId, delete.UserName, Guid.NewGuid(), DateTime.UtcNow);
                    break;

                case UpdateItemCommand update:
                    evt = new ItemUpdatedEvent(update.Item.Id, update.Item.Name, update.UserName, Guid.NewGuid(), DateTime.UtcNow);
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(command));
                }

                var applicationResult = await this.root.ApplyEventAsync(evt);

                switch (applicationResult)
                {
                case SuccessAggregateApplicationResult success:
                    await this.root.CommitAsync();

                    await this.publisher.PublishAsync(evt);

                    return(evt);

                case ItemNotFoundApplicationResult notFound:
                    throw new ItemNotFoundException();

                case ItemAlreadyExistsApplicationResult itemExists:
                    throw new ItemAlreadyExistsException(itemExists.Message);

                case FailedAggregateApplicationResult failed:
                    throw new Exception(failed.Error);

                default:
                    throw new ArgumentOutOfRangeException(nameof(applicationResult));
                }
            }
            catch (Exception e)
            {
                await this.root.RollbackAsync();

                this.logger.LogError(e, $"Failed to process command {command.GetType().Name}");
                throw;
            }
        }
Esempio n. 2
0
 private void EventServiceOnItemUpdated(object sender, ItemUpdatedEvent eventObject)
 {
     if (eventObject.Target == Name)
     {
         Updated?.Invoke(this, eventObject);
     }
 }
Esempio n. 3
0
        /// <summary>
        ///     Applies the specified item updated event.
        /// </summary>
        /// <param name="itemUpdatedEvent">The item updated event.</param>
        /// <exception cref="System.InvalidOperationException">Cannot update an item based on a different Item Definition.</exception>
        public void Apply(ItemUpdatedEvent itemUpdatedEvent)
        {
            if (itemUpdatedEvent.ItemDefinitionCode != ItemDefinitionCode)
            {
                throw new InvalidOperationException("Cannot update an item based on a different Item Definition.");
            }

            Value = itemUpdatedEvent.Value;
        }
Esempio n. 4
0
        /// <summary>Updates the item.</summary>
        /// <param name="itemDefinition">The item definition.</param>
        /// <param name="value">The value.</param>
        public virtual void UpdateItem(ItemDefinition itemDefinition, object value)
        {
            //TODO: Figure out how to make sure item definition is valid for this assessment.

            var itemUpdatedEvent = new ItemUpdatedEvent(Key, Version, itemDefinition.CodedConcept.Code, value, itemDefinition.GetIsRequired());

            AssessmentRuleEngineExecutor.CreateRuleEngineExecutor(this)
            .ForItemInstance(new ItemInstance(itemDefinition.CodedConcept.Code, value, itemDefinition.GetIsRequired()))
            .Execute(() => RaiseEvent(itemUpdatedEvent));
        }
Esempio n. 5
0
        public void Handle(ItemUpdatedEvent @event)
        {
            if (!string.IsNullOrEmpty(@event.Name))
            {
                Name = @event.Name;
            }

            if (@event.Quantity.HasValue)
            {
                Quantity = @event.Quantity.Value;
            }
        }
Esempio n. 6
0
        public void Update(string name, int quantity)
        {
            var itemUpdatedEvent = new ItemUpdatedEvent
            {
                AggregateId = Id,
                Name        = name,
                Quantity    = quantity
            };

            ApplyChange(itemUpdatedEvent);
            Events.Add(itemUpdatedEvent);
        }
Esempio n. 7
0
        private void Apply(ItemUpdatedEvent itemUpdatedEvent)
        {
            var itemInstance = ItemInstances.FirstOrDefault(ii => ii.ItemDefinitionCode == itemUpdatedEvent.ItemDefinitionCode);
            var isNull       = itemUpdatedEvent.Value == null || string.IsNullOrEmpty(itemUpdatedEvent.Value.ToString());

            if (itemInstance != null && isNull)
            {
                _itemInstances.Remove(itemInstance);
            }

            if (itemInstance == null)
            {
                itemInstance = new ItemInstance(itemUpdatedEvent.ItemDefinitionCode, itemUpdatedEvent.Value, itemUpdatedEvent.IsRequired);
                if (!isNull)
                {
                    _itemInstances.Add(itemInstance);
                }
            }
            else
            {
                itemInstance.Apply(itemUpdatedEvent);
            }

            var skippingContext = new SkippingContext();

            if (_cachedRuleEngineExecutor == null)
            {
                var assessmentRuleCollectionFactory = new AssessmentRuleCollectionFactory();
                _cachedRuleEngineExecutor = new RuleEngineExecutor <AssessmentInstance> (
                    this,
                    assessmentRuleCollectionFactory.CreateRuleCollection(this.AssessmentName));
            }
            _cachedRuleEngineExecutor
            .ForRuleSet("ItemUpdatedRuleSet" + itemInstance.ItemDefinitionCode)
            .WithContext(itemInstance, itemInstance.ItemDefinitionCode)
            .WithContext(skippingContext)
            .Execute();

            skippingContext.SkippedItemDefinitions.ForEach(
                item =>
            {
                if (item.GetIsRequired() && !_skippedItemDefinitions.Contains(item))
                {
                    _skippedItemDefinitions.Add(item);
                }
                if (ItemInstances.Any(i => i.ItemDefinitionCode == item.CodedConcept.Code))
                {
                    UpdateItem(item, null);
                }
            });
            skippingContext.UnSkippedItemDefinitions.ForEach(item => _skippedItemDefinitions.Remove(item));
        }
Esempio n. 8
0
        private void Apply(ItemUpdatedEvent itemUpdatedEvent)
        {
            var itemInstance = ItemInstances.FirstOrDefault(ii => ii.ItemDefinitionCode == itemUpdatedEvent.ItemDefinitionCode);

            if (itemInstance == null)
            {
                _itemInstances.Add(new ItemInstance(itemUpdatedEvent.ItemDefinitionCode, itemUpdatedEvent.Value));
            }
            else
            {
                itemInstance.Apply(itemUpdatedEvent);
            }
        }
Esempio n. 9
0
        public void UpdateItem(string itemDefinitionCode, object value)
        {
            //TODO: Figure out how to make sure item definition is valid for this assessment.
            //if ( !AssessmentDefinition.ItemDefinitions.Contains ( itemDefinition ) )
            //{
            //    throw new ArgumentException("Assessment Definition does not contain the item definition.","itemDefinition");
            //}
            var itemUpdatedEvent = new ItemUpdatedEvent(Key, Version, itemDefinitionCode, value);

            AssessmentRuleEngineExecutor.CreateRuleEngineExecutor(this)
            .ForItemDefinitionCode(itemDefinitionCode)
            .WithContext(itemUpdatedEvent)
            .Execute(() => RaiseEvent(itemUpdatedEvent));
        }
Esempio n. 10
0
        public void Handle(ItemUpdatedEvent message)
        {
            var          lastModified = _assessmentInstanceRepository.GetLastModifiedDate(message.Key);
            const string cmd          =
                @"UPDATE AssessmentModule.AssessmentInstance SET LastModifiedTime = @LastModifiedTime
                where AssessmentInstanceKey = @AssessmentInstanceKey";

            using (IDbConnection connection = _connectionFactory.CreateConnection())
            {
                connection.Execute(cmd, new
                {
                    AssessmentInstanceKey = message.Key,
                    LastModifiedTime      = lastModified,
                });
            }
        }
Esempio n. 11
0
        /// <summary>Handles the specified message.</summary>
        /// <param name="message">The message.</param>
        public void Handle(ItemUpdatedEvent message)
        {
            var          lastModified       = _assessmentInstanceRepository.GetLastModifiedDate(message.Key);
            var          assessmentInstance = _assessmentInstanceRepository.GetByKey(message.Key);
            const string Cmd =
                @"UPDATE AssessmentModule.AssessmentInstance SET LastModifiedTime = @LastModifiedTime
                where AssessmentInstanceKey = @AssessmentInstanceKey";

            using (var connection = _connectionFactory.CreateConnection())
            {
                connection.Execute(
                    Cmd,
                    new
                {
                    AssessmentInstanceKey = message.Key,
                    LastModifiedTime      = lastModified,
                });
                connection.Execute(
                    "UPDATE AssessmentModule.AssessmentInstance SET PercentComplete = @PercentComplete WHERE AssessmentInstanceKey = @AssessmentInstanceKey",
                    new { assessmentInstance.CalculateCompleteness().PercentComplete, AssessmentInstanceKey = assessmentInstance.Key });
            }
        }
 public async Task <EventResult <int> > Handle(ItemUpdatedEvent request, CancellationToken cancellationToken)
 {
     return(await Task.FromResult(new EventResult <int>(request.Entity.Description.Length)));
 }
Esempio n. 13
0
 public void Publish(ItemUpdatedEvent itemUpdatedEvent)
 {
     _bus.Publish(itemUpdatedEvent);
 }
Esempio n. 14
0
 public virtual void Update(ItemUpdatedEvent message)
 {
 }
Esempio n. 15
0
 public void Handle(ItemUpdatedEvent @event)
 {
     hub.Clients.All.globalMessageRecieved(@event);
 }