public static void ExecuteMethod_EnsureUpdateOnStatusSummary(IContainerOwner owner, DateTime updateTime, string[] changedIdList, int removeExpiredEntriesSeconds)
        {
            int retryCount = 10;
            while (retryCount-- >= 0)
            {
                try
                {
                    var statusSummary = StatusSummary.RetrieveFromOwnerContent(owner, "default");
                    if (statusSummary == null)
                    {
                        statusSummary = new StatusSummary();
                        statusSummary.SetLocationAsOwnerContent(owner, "default");
                    }
                    string latestTimestampEntry = statusSummary.ChangeItemTrackingList.FirstOrDefault();
                    long currentTimestampTicks = updateTime.ToUniversalTime().Ticks;
                    if (latestTimestampEntry != null)
                    {
                        long latestTimestampTicks = Convert.ToInt64(latestTimestampEntry.Substring(2));
                        if (currentTimestampTicks <= latestTimestampTicks)
                            currentTimestampTicks = latestTimestampTicks + 1;
                    }
                    string currentTimestampEntry = "T:" + currentTimestampTicks;
                    var timestampedList = statusSummary.ChangeItemTrackingList;
                    // Remove possible older entries of new IDs
                    timestampedList.RemoveAll(changedIdList.Contains);
                    // Add Timestamp and new IDs
                    timestampedList.Insert(0, currentTimestampEntry);
                    timestampedList.InsertRange(1, changedIdList);
                    var removeOlderThanTicks = currentTimestampTicks -
                                               TimeSpan.FromSeconds(removeExpiredEntriesSeconds).Ticks;
                    int firstBlockToRemoveIX = timestampedList.FindIndex(candidate =>
                        {
                            if (candidate.StartsWith("T:"))
                            {
                                long candidateTicks = Convert.ToInt64(candidate.Substring(2));
                                return candidateTicks < removeOlderThanTicks;
                            }
                            return false;
                        });
                    if (firstBlockToRemoveIX > -1)
                    {
                        timestampedList.RemoveRange(firstBlockToRemoveIX, timestampedList.Count - firstBlockToRemoveIX);
                    }
                    statusSummary.StoreInformation();
                    return; // Break from while loop
                }
                catch (Exception ex)
                {

                }
            }
        }
Example #2
0
        internal TranslationStatus(string id, DateTimeOffset createdOn, DateTimeOffset lastModified, DocumentTranslationStatus status, StatusSummary summary)
        {
            if (id == null)
            {
                throw new ArgumentNullException(nameof(id));
            }
            if (summary == null)
            {
                throw new ArgumentNullException(nameof(summary));
            }

            Id           = id;
            CreatedOn    = createdOn;
            LastModified = lastModified;
            Status       = status;
            Summary      = summary;
        }
Example #3
0
        internal TranslationStatusResult(string translationId, DateTimeOffset createdOn, DateTimeOffset lastModified, TranslationStatus status, StatusSummary summary)
        {
            if (translationId == null)
            {
                throw new ArgumentNullException(nameof(translationId));
            }
            if (summary == null)
            {
                throw new ArgumentNullException(nameof(summary));
            }

            TranslationId = translationId;
            CreatedOn     = createdOn;
            LastModified  = lastModified;
            Status        = status;
            Summary       = summary;
        }
Example #4
0
        internal static TranslationStatusResult DeserializeTranslationStatusResult(JsonElement element)
        {
            string                    id = default;
            DateTimeOffset            createdDateTimeUtc    = default;
            DateTimeOffset            lastActionDateTimeUtc = default;
            DocumentTranslationStatus status  = default;
            Optional <JsonElement>    error   = default;
            StatusSummary             summary = default;

            foreach (var property in element.EnumerateObject())
            {
                if (property.NameEquals("id"))
                {
                    id = property.Value.GetString();
                    continue;
                }
                if (property.NameEquals("createdDateTimeUtc"))
                {
                    createdDateTimeUtc = property.Value.GetDateTimeOffset("O");
                    continue;
                }
                if (property.NameEquals("lastActionDateTimeUtc"))
                {
                    lastActionDateTimeUtc = property.Value.GetDateTimeOffset("O");
                    continue;
                }
                if (property.NameEquals("status"))
                {
                    status = new DocumentTranslationStatus(property.Value.GetString());
                    continue;
                }
                if (property.NameEquals("error"))
                {
                    error = property.Value.Clone();
                    continue;
                }
                if (property.NameEquals("summary"))
                {
                    summary = StatusSummary.DeserializeStatusSummary(property.Value);
                    continue;
                }
            }
            return(new TranslationStatusResult(id, createdDateTimeUtc, lastActionDateTimeUtc, status, error, summary));
        }
Example #5
0
 internal TranslationStatusResult(string id, DateTimeOffset createdOn, DateTimeOffset lastModified, DocumentTranslationStatus status, DocumentTranslationError?error, StatusSummary summary)
 {
     Id           = id;
     CreatedOn    = createdOn;
     LastModified = lastModified;
     Status       = status;
     Error        = error;
     Summary      = summary;
 }
Example #6
0
        public async Task <IEnumerable <StatusSummary> > GetAllByBranchAsync(StatusSummary request)
        {
            if (HasPermission(Permission.ViewAllReporting))
            {
                if (request.SiteId == null || request.SiteId != GetCurrentSiteId())
                {
                    request.SiteId = GetCurrentSiteId();
                }

                ICollection <int> systemIds = null;
                if (request.SystemId == null)
                {
                    var systems = await _systemRepository.GetAllAsync((int)request.SiteId);

                    systemIds = systems.Select(_ => _.Id).ToList();
                }
                else
                {
                    systemIds = new List <int>();
                    systemIds.Add((int)request.SystemId);
                }

                var result = new List <StatusSummary>();
                foreach (var systemId in systemIds)
                {
                    var branches = await _branchRepository.GetBySystemAsync(systemId);

                    foreach (var branch in branches)
                    {
                        request.SystemId = systemId;
                        request.BranchId = branch.Id;

                        result.Add(new StatusSummary
                        {
                            BranchId   = branch.Id,
                            BranchName = branch.Name,
                            StartDate  = request.StartDate,
                            EndDate    = request.EndDate,
                            SystemId   = systemId,
                            SiteId     = request.SiteId,

                            RegisteredUsers  = await _userRepository.GetCountAsync(request),
                            PointsEarned     = await _userLogRepository.PointsEarnedTotalAsync(request),
                            ActivityEarnings = await _userLogRepository
                                               .ActivityEarningsTotalAsync(request),
                            CompletedChallenges = await _userLogRepository
                                                  .CompletedChallengeCountAsync(request),
                            BadgesEarned = await _userLogRepository.EarnedBadgeCountAsync(request),
                            DaysUntilEnd = await GetDaysUntilEnd()
                        });
                    }
                }
                return(result);
            }
            else
            {
                var requestingUser = GetClaimId(ClaimType.UserId);
                _logger.LogError($"User {requestingUser} doesn't have permission to view all reporting.");
                throw new Exception("Permission denied.");
            }
        }
 internal TranslationStatusDetail(string translationId, DateTimeOffset createdOn, DateTimeOffset lastModified, TranslationStatus status, DocumentTranslationError error, StatusSummary summary)
 {
     TranslationId = translationId;
     CreatedOn     = createdOn;
     LastModified  = lastModified;
     Status        = status;
     Error         = error;
     Summary       = summary;
 }
Example #8
0
        public async Task <Dictionary <string, int> > ActivityEarningsTotalAsync(StatusSummary request)
        {
            // look up user id restrictions
            var eligibleUserIds = await GetEligibleUserIds(request);

            // build lookup of point translations
            var translationLookup = await _context.PointTranslations
                                    .AsNoTracking()
                                    .ToDictionaryAsync(_ => _.Id);

            // start out with all line items that have a point translation id
            var earnedFilter = DbSet
                               .AsNoTracking()
                               .Where(_ => _.PointTranslationId != null);

            // filter by users if necessary
            if (eligibleUserIds != null)
            {
                earnedFilter = earnedFilter.Where(_ => eligibleUserIds.Contains(_.UserId));
            }

            if (request.StartDate != null)
            {
                earnedFilter = earnedFilter
                               .Where(_ => _.CreatedAt >= request.StartDate);
            }

            if (request.EndDate != null)
            {
                earnedFilter = earnedFilter
                               .Where(_ => _.CreatedAt <= request.EndDate);
            }

            // group them by point translation id
            var earnedTotals = await earnedFilter
                               .GroupBy(_ => _.PointTranslationId)
                               .Select(_ => new
            {
                PointTranslationId = _.Key,
                ActivityTotal      = _.Sum(ae => ae.ActivityEarned)
            })
                               .ToListAsync();

            Dictionary <string, int> result = new Dictionary <string, int>();

            foreach (var earned in earnedTotals)
            {
                int earnedSum          = earned.ActivityTotal ?? 0;
                int pointTranslationId = (int)earned.PointTranslationId;

                string description = translationLookup[pointTranslationId].ActivityDescription;

                if (result.ContainsKey(description))
                {
                    result[description] += earnedSum;
                }
                else
                {
                    result.Add(description, earnedSum);
                }
            }

            Dictionary <string, int> namedResult = new Dictionary <string, int>();

            foreach (var item in result)
            {
                if (item.Value > 1)
                {
                    var name = translationLookup.Values
                               .Where(_ => _.ActivityDescription == item.Key)
                               .Select(_ => _.ActivityDescriptionPlural)
                               .FirstOrDefault();
                    namedResult.Add(name, item.Value);
                }
                else
                {
                    namedResult.Add(item.Key, item.Value);
                }
            }

            return(namedResult);
        }