public override IReadOnlyDictionary <string, IReadOnlyDictionary <long, HandlingStatus> > Execute(
            GetReactionRegistrationDependenciesStatusOp operation)
        {
            operation.MustForArg(nameof(operation)).NotBeNull();

            var reactionRegistration = operation.ReactionRegistration;

            if (reactionRegistration.Dependencies.Count != 1)
            {
                throw new NotSupportedException(
                          Invariant(
                              $"Only 1 single {typeof(RecordFilterReactorDependency)} is supported, {reactionRegistration.Dependencies.Count} were supplied."));
            }

            var dependency             = reactionRegistration.Dependencies.Single();
            var recordFilterDependency = dependency as RecordFilterReactorDependency;

            if (recordFilterDependency == null)
            {
                throw new NotSupportedException(
                          Invariant($"Only {typeof(RecordFilterReactorDependency)} is supported, {dependency?.GetType().ToStringReadable()}."));
            }

            var result = new Dictionary <string, IReadOnlyDictionary <long, HandlingStatus> >();

            foreach (var recordFilterEntry in recordFilterDependency.Entries)
            {
                var concern             = EvaluateReactionRegistrationOp.BuildHandlingConcern(reactionRegistration, recordFilterEntry);
                var getHandlingStatusOp = new StandardGetHandlingStatusOp(
                    concern,
                    recordFilterEntry.RecordFilter,
                    new HandlingFilter());
                var stream =
                    (IStandardStream)reactionOperationStreamFactory.Execute(new GetStreamFromRepresentationOp(recordFilterEntry.StreamRepresentation));
                stream.MustForOp(nameof(stream))
                .BeAssignableToType <ISyncReturningProtocol <StandardGetHandlingStatusOp, IReadOnlyDictionary <long, HandlingStatus> > >();
                var streamProtocol = (ISyncReturningProtocol <StandardGetHandlingStatusOp, IReadOnlyDictionary <long, HandlingStatus> >)stream;
                var handlingStatusesForDependency = streamProtocol.Execute(getHandlingStatusOp);
                result.Add(recordFilterEntry.Id, handlingStatusesForDependency);
            }

            return(result);
        }
Beispiel #2
0
        public override void Execute(
            CompleteHandlingOnReactionRegistrationDependenciesOp operation)
        {
            operation.MustForArg(nameof(operation)).NotBeNull();

            var reactionRegistration = operation.ReactionRegistration;
            var tags = reactionRegistration.Tags?.Any() ?? false
                ? reactionRegistration.Tags.DeepClone().Concat(this.handlingTags?.DeepClone() ?? new NamedValue <string> [0]).ToList()
                : this.handlingTags;

            if (reactionRegistration.Dependencies.Count != 1)
            {
                throw new NotSupportedException(
                          Invariant(
                              $"Only 1 single {typeof(RecordFilterReactorDependency)} is supported, {reactionRegistration.Dependencies.Count} were supplied."));
            }

            var dependency             = reactionRegistration.Dependencies.Single();
            var recordFilterDependency = dependency as RecordFilterReactorDependency;

            if (recordFilterDependency == null)
            {
                throw new NotSupportedException(
                          Invariant($"Only {typeof(RecordFilterReactorDependency)} is supported, {dependency?.GetType().ToStringReadable()}."));
            }

            foreach (var recordFilterEntry in recordFilterDependency.Entries)
            {
                var concern             = EvaluateReactionRegistrationOp.BuildHandlingConcern(reactionRegistration, recordFilterEntry);
                var getHandlingStatusOp = new StandardGetHandlingStatusOp(
                    concern,
                    recordFilterEntry.RecordFilter,
                    new HandlingFilter(CompleteHandlingOnReactionRegistrationDependenciesOp.AvailableStatuses));
                var stream =
                    (IStandardStream)reactionOperationStreamFactory.Execute(new GetStreamFromRepresentationOp(recordFilterEntry.StreamRepresentation));
                stream.MustForOp(nameof(stream))
                .BeAssignableToType <ISyncReturningProtocol <StandardGetHandlingStatusOp, IReadOnlyDictionary <long, HandlingStatus> > >();
                var streamProtocol = (ISyncReturningProtocol <StandardGetHandlingStatusOp, IReadOnlyDictionary <long, HandlingStatus> >)stream;
                var handlingStatusesForDependency = streamProtocol.Execute(getHandlingStatusOp);
                var missingHandlingMap            = handlingStatusesForDependency
                                                    .Where(
                    _ => CompleteHandlingOnReactionRegistrationDependenciesOp
                    .HandlingStatusesToRegardAsIncomplete.Contains(_.Value))
                                                    .ToDictionary(k => k.Key, v => v.Value);
                if (missingHandlingMap.Any())
                {
                    foreach (var item in missingHandlingMap)
                    {
                        if (!operation.AcceptableHandlingStatuses.Contains(item.Value))
                        {
                            var acceptableStatusesString = operation.AcceptableHandlingStatuses.Select(_ => _.ToString()).ToCsv();
                            throw new InvalidOperationException(Invariant($"Record '{item.Key}' in stream '{stream.Name}' has status '{item.Value}' which is not in the acceptable status list from the operation: {acceptableStatusesString}."));
                        }

                        var completeOp = new StandardUpdateHandlingStatusForRecordOp(
                            item.Key,
                            concern,
                            HandlingStatus.Completed,
                            new[]
                        {
                            HandlingStatus.Running,
                        },
                            operation.Details,
                            tags);

                        var runningOp = new StandardUpdateHandlingStatusForRecordOp(
                            item.Key,
                            concern,
                            HandlingStatus.Running,
                            CompleteHandlingOnReactionRegistrationDependenciesOp.AvailableStatuses,
                            operation.Details,
                            tags);

                        if (CompleteHandlingOnReactionRegistrationDependenciesOp.AvailableStatuses.Contains(item.Value))
                        {
                            stream.Execute(runningOp);
                            stream.Execute(completeOp);
                        }
                        else if (item.Value == HandlingStatus.Running)
                        {
                            stream.Execute(completeOp);
                        }
                        else
                        {
                            throw new NotSupportedException(Invariant($"Record '{item.Key}' in stream '{stream.Name}' has status '{item.Value}' which cannot be reset."));
                        }
                    }
                }
            }
        }