private async Task NotifySearchRequestOrderedEvent( string requestId, SearchRequestOrdered searchRequestOrdered, CancellationToken cancellationToken, int retryTimes, int maxRetryTimes) { var webHookName = "SearchRequest"; if (searchRequestOrdered == null) { throw new ArgumentNullException(nameof(SearchRequestOrdered)); } string eventName = searchRequestOrdered.Action switch { RequestAction.NEW => "CreateSearchRequest", RequestAction.UPDATE => "UpdateSearchRequest", RequestAction.CANCEL => "CancelSearchRequest", _ => null }; foreach (var webHook in _searchRequestOptions.WebHooks) { _logger.LogDebug( $"The webHook {webHookName} notification is attempting to send {eventName} for {webHook.Name} webhook."); if (!URLHelper.TryCreateUri(webHook.Uri, eventName, $"{requestId}", out var endpoint)) { _logger.LogWarning( $"The webHook {webHookName} notification uri is not established or is not an absolute Uri for {webHook.Name}. Set the WebHook.Uri value on SearchApi.WebHooks settings."); throw new Exception($"The webHook {webHookName} notification uri is not established or is not an absolute Uri for {webHook.Name}."); } using var request = new HttpRequestMessage(); try { StringContent content = new StringContent(JsonConvert.SerializeObject(searchRequestOrdered)); content.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); request.Content = content; request.Method = HttpMethod.Post; request.Headers.Accept.Add( System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); request.Headers.Add("X-ApiKey", _searchRequestOptions.ApiKeyForDynadaptor); request.RequestUri = endpoint; var response = await _httpClient.SendAsync(request, cancellationToken); if (!response.IsSuccessStatusCode) { if (response.StatusCode == System.Net.HttpStatusCode.InternalServerError || response.StatusCode == System.Net.HttpStatusCode.GatewayTimeout) { string reason = await response.Content.ReadAsStringAsync(); _logger.LogError( $"The webHook {webHookName} notification has not executed status {eventName} successfully for {webHook.Name} webHook. The error code is {response.StatusCode.GetHashCode()}.Reason is {reason}."); throw(new Exception($"The webHook {webHookName} notification has not executed status {eventName} successfully for {webHook.Name} webHook. The error code is {response.StatusCode.GetHashCode()}.")); } else if (response.StatusCode == System.Net.HttpStatusCode.BadRequest) { string reason = await response.Content.ReadAsStringAsync(); RejectReason reasonObj = JsonConvert.DeserializeObject <RejectReason>(reason); if (reasonObj.ReasonCode.Equals("error", StringComparison.InvariantCultureIgnoreCase)) { throw new Exception("should not get here. the request is wrong."); } await _searchRequestEventPublisher.PublishSearchRequestRejected( searchRequestOrdered, new List <ValidationResult>() { new ValidationResultData() { PropertyName = reasonObj.ReasonCode, ErrorMessage = reasonObj.Message } }); return; } var exContent = await response.Content.ReadAsStringAsync(); throw new Exception($"Message Failed {response.StatusCode}, {exContent}"); } _logger.LogInformation("get response successfully from webhook."); string responseContent = await response.Content.ReadAsStringAsync(); var saved = JsonConvert.DeserializeObject <SearchRequestSavedEvent>(responseContent); //for the new action, we changed from Dynamics push the notification to here, openshift publish notification once sr is created. //for the update action, fmep needs notified and notification from dynamics. if (saved.Action == RequestAction.NEW) { _logger.LogInformation("create sr get success, publish accepted notification"); var notifyEvent = new SearchRequestNotificationEvent { ProviderProfile = saved.ProviderProfile, NotificationType = NotificationType.RequestSaved, RequestId = saved.RequestId, SearchRequestKey = saved.SearchRequestKey, QueuePosition = saved.QueuePosition, Message = $"Activity RequestSaved occured. ", TimeStamp = DateTime.Now, EstimatedCompletion = saved.EstimatedCompletion, FSOName = null, Person = null }; await _searchRequestEventPublisher.PublishSearchRequestNotification(notifyEvent); } if (saved.Action == RequestAction.UPDATE) { _logger.LogInformation($"publish SearchRequestSaved"); await _searchRequestEventPublisher.PublishSearchRequestSaved(saved); _logger.LogInformation("update sr get success, publish accepted notification"); var notifyEvent = new SearchRequestNotificationEvent { ProviderProfile = saved.ProviderProfile, NotificationType = NotificationType.RequestSaved, RequestId = saved.RequestId, SearchRequestKey = saved.SearchRequestKey, QueuePosition = saved.QueuePosition, Message = $"Activity RequestSaved occured. ", TimeStamp = DateTime.Now, EstimatedCompletion = saved.EstimatedCompletion, FSOName = null, Person = null }; await _searchRequestEventPublisher.PublishSearchRequestNotification(notifyEvent); } if (saved.Action == RequestAction.CANCEL) { _logger.LogInformation( $"publish SearchRequestSaved"); await _searchRequestEventPublisher.PublishSearchRequestSaved(saved); } } catch (Exception exception) { _logger.LogError(exception, exception.Message); throw; } } }
public async Task NotifySearchRequestEventAsync(string requestId, SearchRequestOrdered searchRequestOrdered, CancellationToken cancellationToken) { var webHookName = "SearchRequest"; if (searchRequestOrdered == null) { throw new ArgumentNullException(nameof(SearchRequestOrdered)); } string eventName = searchRequestOrdered.Action switch { RequestAction.NEW => "CreateSearchRequest", RequestAction.UPDATE => "UpdateSearchRequest", RequestAction.CANCEL => "CancelSearchRequest", _ => null }; foreach (var webHook in _searchRequestOptions.WebHooks) { _logger.LogDebug( $"The webHook {webHookName} notification is attempting to send {eventName} for {webHook.Name} webhook."); if (!URLHelper.TryCreateUri(webHook.Uri, eventName, $"{requestId}", out var endpoint)) { _logger.LogWarning( $"The webHook {webHookName} notification uri is not established or is not an absolute Uri for {webHook.Name}. Set the WebHook.Uri value on SearchApi.WebHooks settings."); await _searchRequestEventPublisher.PublishSearchRequestFailed( searchRequestOrdered, "notification uri is not established or is not an absolute Uri." ); return; } using var request = new HttpRequestMessage(); try { StringContent content = new StringContent(JsonConvert.SerializeObject(searchRequestOrdered)); content.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); request.Content = content; request.Method = HttpMethod.Post; request.Headers.Accept.Add( System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); request.RequestUri = endpoint; var response = await _httpClient.SendAsync(request, cancellationToken); if (!response.IsSuccessStatusCode) { if (response.StatusCode == System.Net.HttpStatusCode.InternalServerError) { string reason = await response.Content.ReadAsStringAsync(); RejectReason reasonObj = JsonConvert.DeserializeObject <RejectReason>(reason); _logger.LogError( $"The webHook {webHookName} notification has not executed status {eventName} successfully for {webHook.Name} webHook. The error code is {response.StatusCode.GetHashCode()}."); await _searchRequestEventPublisher.PublishSearchRequestRejected( searchRequestOrdered, new List <ValidationResult>() { new ValidationResultData() { PropertyName = reasonObj.ReasonCode, ErrorMessage = reasonObj.Message } }); return; } else if (response.StatusCode == System.Net.HttpStatusCode.BadRequest) { await _searchRequestEventPublisher.PublishSearchRequestRejected( searchRequestOrdered, new List <ValidationResult>() { new ValidationResultData() { PropertyName = "badRequest", ErrorMessage = await response.Content.ReadAsStringAsync() } }); return; } else { throw new Exception("failed"); } } _logger.LogInformation("get response successfully from webhook."); string responseContent = await response.Content.ReadAsStringAsync(); var saved = JsonConvert.DeserializeObject <SearchRequestSavedEvent>(responseContent); //for the new action will get Notification, only failed or rejected are got published. //for the update action, fmep needs notified and notification from dynamics. if (saved.Action != RequestAction.NEW) { _logger.LogInformation( $"publish SearchRequestSaved"); await _searchRequestEventPublisher.PublishSearchRequestSaved(saved); } } catch (Exception exception) { await _searchRequestEventPublisher.PublishSearchRequestFailed(searchRequestOrdered, exception.Message); _logger.LogError($"The webHook {webHookName} notification failed for {eventName} for {webHook.Name} webHook. [{exception.Message}]"); } } } }