Пример #1
0
        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));
        }
Пример #2
0
        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);
        }