public async Task <ActionstepMatterValidationResult> ValidateActionstepMatter([ActivityTrigger] ValidateActionstepMatterCommand validateActionstepMatterCommand) { if (validateActionstepMatterCommand is null) { throw new ArgumentNullException(nameof(validateActionstepMatterCommand)); } return(await _mediator.Send(validateActionstepMatterCommand)); }
public async static Task <int?> ValidateActionstepMatterIdWithRetryAsync( this IDurableOrchestrationContext context, string matterReference, string actionstepOrgKey, string actionstepUserId, int minimumMatterIdToSync, Action <IDurableOrchestrationContext, MatterIdStatus, string> onInvalidResult, Action <IDurableOrchestrationContext, string, int> onMatterIdUpdated, ILogger logger) { ActionstepMatterValidationResult actionstepMatterValidationResult = null; var matterIdToValidate = matterReference; do { string exceptionMessage = null; try { var validateActionstepMatterCommand = new ValidateActionstepMatterCommand() { ActionstepOrgKey = actionstepOrgKey, ActionstepUserId = actionstepUserId, MatterId = matterIdToValidate, MinimumMatterIdToSync = minimumMatterIdToSync, }; actionstepMatterValidationResult = await context.CallActivityAsync <ActionstepMatterValidationResult>( nameof(SharedActivities.ValidateActionstepMatter), validateActionstepMatterCommand); } catch (Exception ex) { exceptionMessage = ex.Message; logger.LogError(ex, "Exception encountered while validating Actionstep Matter ID."); } if (actionstepMatterValidationResult?.MatterIdStatus != MatterIdStatus.Valid) { var message = GetMatterInvalidReasonMessage(actionstepMatterValidationResult, matterReference, minimumMatterIdToSync, actionstepOrgKey, exceptionMessage); var matterIdStatus = actionstepMatterValidationResult?.MatterIdStatus ?? MatterIdStatus.InvalidUnknownValidationError; if (!(onInvalidResult is null)) { try { onInvalidResult(context, matterIdStatus, message); } catch (Exception ex) { logger.LogError(ex, $"Exception encountered while running '{nameof(onInvalidResult)}' callback."); } } // No further processing if the matter doesn't pass the minimum number filter. if (matterIdStatus == MatterIdStatus.InvalidBelowMinimum) { return(null); } // Otherwise, wait for an UpdateMatterIdEvent event to fix the matter id. // We expect an int, but convert it back to a string because ValidateActionstepMatterCommand expects a string. var updatedMatterIdEvent = context.WaitForExternalEvent <int>(nameof(Events.UpdateMatterIdEvent)); var retryEvent = context.WaitForExternalEvent(nameof(Events.RetryFailedActivityEvent)); var winner = await Task.WhenAny(updatedMatterIdEvent, retryEvent); if (winner == updatedMatterIdEvent) { if (!(onMatterIdUpdated is null)) { try { onMatterIdUpdated(context, matterIdToValidate, updatedMatterIdEvent.Result); } catch (Exception ex) { logger.LogError(ex, $"Exception encountered while running '{nameof(onMatterIdUpdated)}' callback."); } } matterIdToValidate = updatedMatterIdEvent.Result.ToString(CultureInfo.InvariantCulture); } // If winner is retryEvent, we'll simply loop and retry with the same matter id } } while (actionstepMatterValidationResult?.MatterIdStatus != MatterIdStatus.Valid); return(actionstepMatterValidationResult?.MatterId); }