Пример #1
0
        private (IList <RatingDataFetchResult> Ratings, IList <ReviewDataFetchResult> Reviews) GetRatingsAndReviews(
            ReviewApiResult reviewApiResult)
        {
            var ratings = new List <RatingDataFetchResult>();
            var reviews = new List <ReviewDataFetchResult>();

            foreach (var freelancerReview in reviewApiResult.Result.Reviews)
            {
                var reviewerInfo =
                    reviewApiResult.Result.Users.SingleOrDefault(u => u.Id == freelancerReview.FromUserId);
                var reviewerAvatarUrl = reviewerInfo != null ? $"https:{reviewerInfo.AvatarCdn}" : null;


                var rating = new RatingDataFetchResult(freelancerReview.Rating);
                var review = new ReviewDataFetchResult($"freelancer_{freelancerReview.ReviewContext.ContextId}",
                                                       DateTimeOffset.FromUnixTimeSeconds(freelancerReview.TimeSubmitted), rating.Identifier, null,
                                                       freelancerReview.Description, reviewerInfo?.DisplayName, reviewerAvatarUrl);

                ratings.Add(rating);
                reviews.Add(review);
            }

            return(ratings, reviews);
        }
        public async Task <PlatformData> AddPlatformData(string userId, string platformId, int numberOfGigs,
                                                         DateTimeOffset?periodStart, DateTimeOffset?periodEnd, IList <RatingDataFetchResult> ratings,
                                                         RatingDataFetchResult averageRating,
                                                         IList <ReviewDataFetchResult> reviews, IList <AchievementFetchResult> achievements, string rawData,
                                                         IAsyncDocumentSession session, CancellationToken cancellationToken = default)
        {
            var platform = await _platformManager.GetPlatform(platformId, session, cancellationToken);

            var platformData = await GetPlatformData(userId, platformId, session, cancellationToken);

            if (platformData == null)
            {
                platformData = new PlatformData(platform.Id, userId);
                await session.StoreAsync(platformData, cancellationToken);
            }

            var rawPlatformData = new RawData(rawData);

            platformData.AddRawDataToDataLog(rawPlatformData);

            platformData.LastUpdated = DateTimeOffset.UtcNow;

            platformData.NumberOfGigs = numberOfGigs;
            platformData.PeriodStart  = periodStart;
            platformData.PeriodEnd    = periodEnd;

            if (averageRating != null)
            {
                platformData.AverageRating = new Rating(averageRating.Identifier, averageRating.Value,
                                                        platform.RatingInfo.MinRating,
                                                        platform.RatingInfo.MaxRating, platform.RatingInfo.SuccessLimit);
            }
            else
            {
                platformData.AverageRating = null;
            }

            var transformedRatings = ratings.Select(r =>
                                                    new KeyValuePair <Guid, Rating>(r.Identifier,
                                                                                    new Rating(r.Identifier, r.Value, platform.RatingInfo.MinRating, platform.RatingInfo.MaxRating,
                                                                                               platform.RatingInfo.SuccessLimit)));

            var transformedReviews = reviews.Select(r =>
            {
                var rating = transformedRatings.SingleOrDefault(kvp => kvp.Key == r.RatingIdentifier).Value;
                return(new ReviewData(r.ReviewIdentifier, r.ReviewText, r.ReviewHeading, r.ReviewerName,
                                      r.ReviewerAvatarUri, r.ReviewDate,
                                      rating?.Identifier));
            });

            platformData.Reviews = transformedReviews;
            platformData.Ratings = transformedRatings.Select(kvp => kvp.Value);

            var transformedAchievements = achievements.Select(a =>
            {
                AchievementScore score = null;
                if (a.Score != null)
                {
                    score = new AchievementScore(a.Score.Value, a.Score.Label);
                }

                return(new Achievement(a.AchievementId, a.Name, a.AchievementPlatformType, a.AchievementType,
                                       a.Description, a.ImageUri, score));
            });

            platformData.Achievements = transformedAchievements;

            return(platformData);
        }
Пример #3
0
        public async Task Handle(PlatformUserUpdateDataMessage message)
        {
            using var _ = _logger.BeginPropertyScope((LoggerPropertyNames.GigPlatformApiRequestId, message.RequestId), ("ResultType", message.ResultType));

            _logger.LogInformation($"Got data fetch result for request id {message.RequestId}");

            string userId     = null;
            string platformId = null;
            string syncLogId  = null;

            try
            {
                (userId, platformId, syncLogId) = await _intermittentDataManager.GetRequestData(message.RequestId);
            }
            catch (CacheDataNotFoundException)
            {
                _logger.LogInformation($"Could not find data in cache for requestId: {message.RequestId}.");
                var headers    = MessageContext.Current.Headers;
                var retryCount = 0;
                if (!headers.ContainsKey("op-retry-count") || (int.TryParse(headers["op-retry-count"], out retryCount) && retryCount < 5))
                {
                    retryCount++;
                    var additionalHeader = new Dictionary <string, string>()
                    {
                        { "op-retry-count", retryCount.ToString() }
                    };
                    await _bus.DeferLocal(TimeSpan.FromSeconds(30), message, additionalHeader);

                    return;
                }

                _logger.LogError($"Could not find request data for requestId: {message.RequestId}. Will ignore message.");
                throw;
            }

            if (message.PlatformData != null)
            {
                var numberOfGigs = message.PlatformData.Interactions.Count;
                var periodStart  = message.PlatformData.Interactions.Min(i => i.Period?.Start);
                var periodEnd    = message.PlatformData.Interactions.Max(i => i.Period?.End);

                var ratings = new List <KeyValuePair <string, GigDataCommon.Library.Models.Rating> >();
                if (message.PlatformData.Interactions != null)
                {
                    foreach (var interaction in message.PlatformData.Interactions)
                    {
                        foreach (var rating in interaction.Outcome.Ratings)
                        {
                            ratings.Add(new KeyValuePair <string, GigDataCommon.Library.Models.Rating>(interaction.Id, rating));
                        }
                    }
                }

                var mappedRatings = new List <RatingDataFetchResult>();
                var interactionIdsToReviewIdentifiers = new Dictionary <string, IList <Guid> >();
                foreach (var rating in ratings)
                {
                    var mappedRating = new RatingDataFetchResult(rating.Value.Value);
                    mappedRatings.Add(mappedRating);

                    var ratingKey = rating.Key;
                    if (string.IsNullOrEmpty(ratingKey))
                    {
                        ratingKey = Guid.NewGuid().ToString();
                    }

                    if (!interactionIdsToReviewIdentifiers.ContainsKey(ratingKey))
                    {
                        interactionIdsToReviewIdentifiers.Add(ratingKey, new List <Guid>());
                    }
                    interactionIdsToReviewIdentifiers[ratingKey].Add(mappedRating.Identifier);
                }

                RatingDataFetchResult averageRating = null;
                if (mappedRatings.Count > 0)
                {
                    var averageRatingValue = mappedRatings.Average(r => r.Value);
                    averageRating = new RatingDataFetchResult(averageRatingValue);
                }

                var mappedReviews = new List <ReviewDataFetchResult>();
                if (message.PlatformData.Interactions != null)
                {
                    foreach (var interaction in message.PlatformData.Interactions)
                    {
                        var interactionId = interaction.Id;
                        if (string.IsNullOrEmpty(interactionId))
                        {
                            interactionId = Guid.NewGuid().ToString();
                        }


                        if (interaction.Outcome.Review == null)
                        {
                            continue;
                        }

                        Guid?ratingIdentifier = null;
                        if (interactionIdsToReviewIdentifiers.ContainsKey(interactionId) && interactionIdsToReviewIdentifiers[interactionId].Count > 0)
                        {
                            ratingIdentifier = interactionIdsToReviewIdentifiers[interactionId][0];
                        }

                        var clientName      = interaction.Client?.Name;
                        var clientAvatarUri = interaction.Client?.PhotoUri;

                        var mappedReview = new ReviewDataFetchResult($"{platformId}_{interactionId}",
                                                                     interaction.Period.End, ratingIdentifier, interaction.Outcome.Review.Title,
                                                                     interaction.Outcome.Review.Text, clientName, clientAvatarUri);

                        mappedReviews.Add(mappedReview);
                    }
                }

                var mappedAchievements = new List <AchievementFetchResult>();
                if (message.PlatformData.Achievements != null)
                {
                    foreach (var achievement in message.PlatformData.Achievements)
                    {
                        var achievementId = achievement.Id;
                        if (string.IsNullOrEmpty(achievementId))
                        {
                            achievementId = Guid.NewGuid().ToString();
                        }

                        AchievementScoreFetchResult achievementScore = null;
                        if (achievement.Score != null)
                        {
                            achievementScore = new AchievementScoreFetchResult(achievement.Score.Value.ToString(CultureInfo.InvariantCulture), achievement.Score.Label);
                        }

                        Common.PlatformAchievementType achievementType = PlatformAchievementType.Badge;
                        switch (achievement.Type)
                        {
                        case GigDataCommon.Library.Models.PlatformAchievementType.Badge:
                            achievementType = PlatformAchievementType.Badge;
                            break;

                        case GigDataCommon.Library.Models.PlatformAchievementType.QualificationAssessment:
                            achievementType = PlatformAchievementType.QualificationAssessment;
                            break;

                        default:
                            throw new ArgumentException($"Unknown platform achievement type {achievement.Type}");
                        }

                        var mappedAchievement = new AchievementFetchResult(achievementId, achievement.Name,
                                                                           achievement.Type.ToString(), achievementType, achievement.Description,
                                                                           achievement.BadgeIconUri, achievementScore);

                        mappedAchievements.Add(mappedAchievement);
                    }
                }


                var platformDataFetchResult = new PlatformDataFetchResult(
                    numberOfGigs, periodStart, periodEnd, averageRating, mappedRatings, mappedReviews,
                    mappedAchievements, message.PlatformData.RawData);


                await _gigPlatformDataFetcher.CompleteDataFetching(userId, platformId, platformDataFetchResult, syncLogId);
            }
            else
            {
                if (message.ResultType == PlatformDataUpdateResultType.Succeess ||
                    message.ResultType == PlatformDataUpdateResultType.MalformedDataResponse)
                {
                    _logger.LogInformation("Got result type {ResultType}. Will complete data fetching.", message.ResultType);
                    await _gigPlatformDataFetcher.CompleteDataFetching(userId, platformId, null, syncLogId);
                }
                else if (message.ResultType == PlatformDataUpdateResultType.UserNotFound)
                {
                    _logger.LogInformation("Got result type {ResultType}. User was not found. Will complete data fetching and signal that connection should be removed.",
                                           message.ResultType);
                    //we should remove the connection
                    await _gigPlatformDataFetcher.CompleteDataFetchingWithConnectionRemoved(userId, platformId,
                                                                                            PlatformConnectionDeleteReason.UserDidNotExist, syncLogId);
                }
                else
                {
                    _logger.LogInformation("Got result type {ResultType}. Will schdule new data fetch.", message.ResultType);
                    //communication error, we should enqueue a new request to try to retrieve the data again.
                    var fetchMessage = new FetchDataForPlatformConnectionMessage(userId, platformId, PlatformIntegrationType.GigDataPlatformIntegration);
                    await _bus.DeferLocal(new TimeSpan(0, 0, 30), fetchMessage);
                }
            }
        }