Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        /// <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));
        }