/// <inheritdoc /> public override void Execute( StandardUpdateHandlingStatusForRecordOp operation) { operation.MustForArg(nameof(operation)).NotBeNull(); var sqlServerLocator = this.TryGetLocator(operation); var tagIdsCsv = operation.Tags == null ? null : this.GetIdsAddIfNecessaryTag(sqlServerLocator, operation.Tags).Select(_ => _.ToStringInvariantPreferred()).ToCsv(); var storedProcOp = StreamSchema.Sprocs.PutHandling.BuildExecuteStoredProcedureOp( this.Name, operation.Concern, operation.Details, operation.InternalRecordId, operation.NewStatus, operation.AcceptableCurrentStatuses, tagIdsCsv, operation.InheritRecordTags); var sqlProtocol = this.BuildSqlOperationsProtocol(sqlServerLocator); var sprocResult = sqlProtocol.Execute(storedProcOp); sprocResult.MustForOp(nameof(sprocResult)).NotBeNull(); }
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.")); } } } } }