public DopplerSubscriberDto TypeFormToSubscriberDTO(TypeformDTO rawSubscriber, ItemsDto allowedFields) { var rawSubscriberEmail = rawSubscriber.form_response.answers.FirstOrDefault(x => !string.IsNullOrEmpty(x.email)); if ((rawSubscriberEmail == null) && string.IsNullOrEmpty(rawSubscriber.form_response.hidden.dplrid)) { var responseText = string.Format("The response event: {0} to the form: {1} with ID: {2} has not included an email", rawSubscriber.event_id, rawSubscriber.form_response.definition.title, rawSubscriber.form_response.definition.id); _log.LogWarning(responseText); throw new ArgumentNullException(responseText); } var emailSuscriber = rawSubscriberEmail == null ? DecodeDPLRID(rawSubscriber.form_response.hidden.dplrid) : rawSubscriberEmail.email; DopplerSubscriberDto dopplerSubscriber = new DopplerSubscriberDto { Email = emailSuscriber }; var answersById = rawSubscriber.form_response.answers .Where(x => String.IsNullOrEmpty(x.email)) .ToDictionary(y => y.field.id); dopplerSubscriber.Fields = rawSubscriber.form_response.definition.fields .Where(x => x.type != "email") .Select(f => { var name = GENDER_FIELD_NAMES.Contains(f.@ref) ? "GENDER" : COUNTRY_FIELD_NAMES.Contains(f.@ref) ? "COUNTRY" : BASIC_FIELD_NAMES.Contains(f.@ref) ? [email protected]() : f.@ref; var questionType = GENDER_FIELD_NAMES.Contains(f.@ref) ? "gender" : COUNTRY_FIELD_NAMES.Contains(f.@ref) ? "country" : f.@ref == "consent" ? "consent" : Dictionaries.CustomFieldTypes.TryGetValue(f.type, out string convertedQuestionType) ? convertedQuestionType : null; var answerType = Dictionaries.CustomFieldTypes.TryGetValue(answersById[f.id].field.type, out string convertedAnswerType) ? convertedAnswerType : null; var answerValue = GetAnswerValue(answersById[f.id]); var value = GENDER_FIELD_NAMES.Contains(f.@ref) ? GetGenderValue(answerValue.ToString()) : COUNTRY_FIELD_NAMES.Contains(f.@ref) ? GetCountryValue(answerValue.ToString()) : answerValue; return(new { name, questionType, f.id, answersById, value }); }) .Where(y => allowedFields.Items .Any(z => z.Name == y.name && y.questionType == z.Type)) .Select(h => new CustomFieldDto { Name = h.name, Value = h.value }) .ToList(); return(dopplerSubscriber); }
/// <inheritdoc/> public async Task <IActionResult> CreateNewSubscriberAsync(string apiKey, string accountName, long idList, DopplerSubscriberDto subscriber, string origin) { UpdateApiKey(apiKey); var subscriberObjectString = new StringContent(JsonConvert.SerializeObject(subscriber), Encoding.UTF8, "application/json"); HttpRequestMessage requestToDoppler = new HttpRequestMessage { RequestUri = new Uri(_dopplerURLs.GetImportSubscribersURL(accountName, idList)), Content = new StringContent(JsonConvert.SerializeObject(subscriber), Encoding.UTF8, "application/json"), Method = HttpMethod.Post }; requestToDoppler.Headers.Add("X-Doppler-Subscriber-Origin", origin); requestToDoppler.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); var response = await _client.SendAsync(requestToDoppler); var responseBody = await response.Content.ReadAsStringAsync(); // We introduced this patch because in these scenarios we do not want to send an error to the integrations if (!response.IsSuccessStatusCode && !_cannotSuscribeErrorRegex.IsMatch(responseBody)) { _log.LogError(responseBody); throw new Exception(responseBody); } var contentResult = new ContentResult { Content = responseBody, ContentType = response.Headers.ToString(), StatusCode = (int)response.StatusCode }; return(new OkObjectResult(contentResult)); }