private static int CompareStartingListEntries(StartingListReportEntry x, StartingListReportEntry y) { int startTimeComparison = DateTimeOffset.Compare(x.Start.OfficialTop, y.Start.OfficialTop); if (startTimeComparison != 0) { return(startTimeComparison); } return(string.Compare(x.Start.StartingLaneLongName, y.Start.StartingLaneLongName)); }
public StartingListReport GetReportStartingList(string raceId, string startingLaneId, JudgePrincipal principal) { if (string.IsNullOrEmpty(raceId)) { throw new ArgumentNullException("Missing RaceId"); } IRepositorySet repositorySet = repositorySetProvider.GetRepositorySet(raceId); var rootStartingLanes = repositorySet.StartingLanes.GetStartingLanes(); var titleSource = flattener.GetParent(rootStartingLanes, startingLaneId); var allowedStartingLanes = flattener.GetLeaves(rootStartingLanes, startingLaneId).ToDictionary(s => s.StartingLaneId); var athletes = repositorySet.Athletes.GetAthletes().ToDictionary(a => a.AthleteId); var disciplines = repositorySet.Disciplines.GetDisciplines().ToDictionary(d => d.DisciplineId); var startingList = repositorySet.StartingList.GetStartingList(); var judges = repositorySet.Judges.GetJudges().ToDictionary(j => j.JudgeId); var isAuthenticated = principal != null; var report = new StartingListReport(); report.Title = BuildStartingListTitle(titleSource); report.Entries = new List <StartingListReportEntry>(); foreach (var startingListEntry in startingList) { Athlete athlete; Discipline discipline; StartingLaneFlat startingLane; Judge judge = null; if (!athletes.TryGetValue(startingListEntry.AthleteId, out athlete)) { continue; // athlete not found, give up } if (!disciplines.TryGetValue(startingListEntry.DisciplineId, out discipline)) { continue; // discipline does not exist, give up } if (!allowedStartingLanes.TryGetValue(startingListEntry.StartingLaneId, out startingLane)) { continue; // not showing this lane, skip } Announcement announcement = athlete.Announcements.FirstOrDefault(a => a.DisciplineId == startingListEntry.DisciplineId); ActualResult latestResult = athlete.ActualResults.LastOrDefault(r => r.DisciplineId == startingListEntry.DisciplineId); if (latestResult != null) { judges.TryGetValue(latestResult.JudgeId, out judge); } var allowAnnouncement = isAuthenticated || discipline.AnnouncementsPublic; var allowResult = isAuthenticated || discipline.ResultsPublic; StartingListReportEntry entry = new StartingListReportEntry(); entry.Announcement = allowAnnouncement ? BuildReportAnnouncement(announcement) : null; entry.Athlete = ApiAthlete.BuildProfile(athlete); entry.CurrentResult = allowResult ? BuildReportActualResult(latestResult, judge) : null; entry.Discipline = BuildReportDiscipline(discipline); entry.Start = BuildReportStart(startingListEntry, startingLane); report.Entries.Add(entry); } report.Entries.Sort(CompareStartingListEntries); return(report); }