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) { } } }
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; }
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; }
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)); }
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; }
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; }
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); }