private async Task <(bool, string)> ProceedToParticipationSyncRetryProcess(ParticipationDto participation, CrmData crmData, Configurations configuration) { var success = false; var consumerId = string.Empty; // Store locally var failed = new FailedTransactionDto { Id = Guid.NewGuid(), ParticipationId = participation.Id, TermsConsent = true, NewsletterOptin = participation.NewsletterOptin, CreatedDate = DateTimeOffset.UtcNow }; _failedTransactionService.Create(failed); // Another attempt var reSyncResponse = await _scheduler.RetryParticipationSyncImmediately(crmData, configuration, true); var typedResponse = (CrmResponse)reSyncResponse; success = typedResponse.Data.Success; if (success) { var currentParticipation = _participationService.GetParticipation(participation.Id); currentParticipation.Status = ParticipationStatus.PARTICIPATION_RETRY_SUCCESS.ToString(); currentParticipation.ApiStatus = typedResponse.Data.ApiStatus.ToString(); currentParticipation.ConsumerId = typedResponse.Data.Data.ConsumerId; currentParticipation.ApiMessage = typedResponse.Data.ApiMessage; currentParticipation.ModifiedDate = DateTimeOffset.UtcNow; _participationService.UpdateParticipation(currentParticipation); _failedTransactionService.Delete(failed.Id); consumerId = typedResponse.Data.Data.ConsumerId; } else { var currentParticipation = _participationService.GetParticipation(participation.Id); currentParticipation.Status = ParticipationStatus.PARTICIPATION_RETRY_FAILED.ToString(); currentParticipation.ModifiedDate = DateTimeOffset.UtcNow; _participationService.UpdateParticipation(currentParticipation); } return(success, consumerId); }
private CrmData GatherParticipationCrmDataToSend(ParticipationDto participation, CrmData legalDocument, string country) { var crmData = new CrmData(); crmData.Data.Email = participation.Email; crmData.Data.Country = country; crmData.Data.PrivacyConsent = true; crmData.Data.NewsletterOptin = participation.NewsletterOptin; crmData.Data.PrivacyPolicyTextName = legalDocument.Data.Data.Versions[0].LegalTextName; crmData.Data.PrivacyPolicyVersion = legalDocument.Data.Data.Versions[0].Version; crmData.Data.PrivacyPolicyCreation = legalDocument.Data.Data.Versions[0].Created.ToString(); return(crmData); }
public async Task <(bool, string)> ParticipateAsync(ParticipationDto participation, string culture, string country = "GB") { // Save Participation to DB participation.Status = ParticipationStatus.PARTICIPATION_NOT_SYNCED.ToString(); participation.CreatedDate = DateTimeOffset.UtcNow; _participationService.CreateParticipation(participation); // Requesting for legal document var legalDocument = await _crmProvider.ReadTextDocumentAsync(); var crmData = GatherParticipationCrmDataToSend(participation, legalDocument, country); var configuration = Configure(culture); // Sending Participation to Crm var consumer = await _crmProvider.CreateParticipationAsync(crmData, configuration, true); var success = consumer.GetSetting <bool>("Success"); var ApiStatus = consumer.GetSetting <int>("ApiStatus"); var ApiMessage = consumer.GetSetting <string>("ApiMessage"); var consumerId = success ? (string)consumer.Data.Data.ConsumerId : string.Empty; if (success) { var createdParticipation = _participationService.GetParticipation(participation.Id); createdParticipation.Status = ParticipationStatus.PARTICIPATION_SYNCED_SUCCESS.ToString(); createdParticipation.ApiStatus = ApiStatus.ToString(); createdParticipation.ApiMessage = ApiMessage; createdParticipation.ConsumerId = consumerId; _participationService.UpdateParticipation(createdParticipation); } else { var createdParticipation = _participationService.GetParticipation(participation.Id); createdParticipation.Status = ParticipationStatus.PARTICIPATION_SYNCED_FAILED.ToString(); createdParticipation.ApiStatus = ApiStatus.ToString(); createdParticipation.ApiMessage = ApiMessage; _participationService.UpdateParticipation(createdParticipation); (success, consumerId) = await ProceedToParticipationSyncRetryProcess(participation, crmData, configuration); } return(success, consumerId); }
public ExtractModel toExtractModel(ParticipationDto participation) => _mapper.Map <ParticipationDto, ExtractModel>(participation);
public bool UpdateParticipation(ParticipationDto participation) { return(_participationRepository.Update(participation)); }
public bool CreateParticipation(ParticipationDto participation) { return(_participationRepository.Add(participation)); }
public async Task <IHttpActionResult> Participate([FromBody] ParticipationViewModel participate) { dynamic expando = new ExpandoObject(); var apiResponse = new ApiResponse { Success = false, Message = "Bad Request", Data = expando }; try { if (participate == null) { expando.Error = new List <string>() { "Body request data should be as documented" }; apiResponse.Message = "Missing or unknown request body"; apiResponse.Data = expando; _logger.LogWarn("Participate validation Error", "Body request not found or unknown"); return(Content(HttpStatusCode.BadRequest, apiResponse)); } if (!ModelState.IsValid) { var allErrors = ModelState.Values.SelectMany(v => v.Errors); var errorList = allErrors.Select(error => error.ErrorMessage); expando.Error = errorList; apiResponse.Message = "Validation error occured"; apiResponse.Data = expando; _logger.LogWarn("Participate validation Error", string.Join(", ", errorList)); return(Content(HttpStatusCode.BadRequest, apiResponse)); } var dto = new ParticipationDto { Id = Guid.NewGuid(), EmailHash = StringUtility.Md5HashEncode(participate.Email.ToLower()), Email = participate.Email, SiteId = _siteService.GetSiteByCulture(participate.Culture)?.Id, RetailerConsent = participate.RetailerConsent, NewsletterOptin = participate.NewsletterOptin }; var crmResponse = await _journeyService.ParticipateAsync(dto, participate.Culture); var site = _siteService.GetSiteByCulture(participate.Culture); expando.Description = "Your participate has been taken into account."; expando.ConsumerId = crmResponse.Item1 ? crmResponse.Item2 : string.Empty; expando.ParticipationId = dto.Id; apiResponse.Success = true; apiResponse.Message = crmResponse.Item1 ? "Participate successfull" : "Your participate has been considered but CRM sync has failed"; apiResponse.Data = expando; _logger.LogTrace(apiResponse.Message, $"Ok: {dto.Id}"); return(Ok(apiResponse)); } catch (Exception e) { expando.Error = e.Message; apiResponse.Success = false; apiResponse.Message = $"Error occured in {e.Source}"; apiResponse.Data = expando; _logger.LogError(e.Message, e); return(Content(HttpStatusCode.InternalServerError, apiResponse)); } }