Пример #1
0
        public List <StartingListEntryDto> GetStartingList(string raceId, string startingLaneId)
        {
            if (string.IsNullOrEmpty(raceId))
            {
                throw new ArgumentNullException("Missing RaceId");
            }

            IRepositorySet repositorySet        = repositorySetProvider.GetRepositorySet(raceId);
            var            rootStartingLanes    = repositorySet.StartingLanes.GetStartingLanes();
            var            allowedStartingLanes = new HashSet <string>(flattener.GetLeaves(rootStartingLanes, startingLaneId).Select(l => l.StartingLaneId));
            var            startingList         = repositorySet.StartingList.GetStartingList();
            var            dtos = startingList.Where(e => allowedStartingLanes.Contains(e.StartingLaneId)).Select(BuildStartingList).ToList();

            return(dtos);
        }
Пример #2
0
        public RaceSetupDto GetSetup(string raceId)
        {
            if (string.IsNullOrEmpty(raceId))
            {
                throw new ArgumentNullException("Missing RaceId");
            }
            IRepositorySet repositorySet = repositorySetProvider.GetRepositorySet(raceId);

            var raceSetup = new RaceSetupDto();

            raceSetup.Race          = BuildRaceSettings(raceId, repositorySet.RaceSettings.GetRaceSettings());
            raceSetup.StartingLanes = repositorySet.StartingLanes.GetStartingLanes().Select(BuildStartingLane).ToList();
            raceSetup.ResultsLists  = repositorySet.ResultsLists.GetResultsLists().Select(BuildResultsList).ToList();
            raceSetup.Disciplines   = repositorySet.Disciplines.GetDisciplines().Select(BuildDiscipline).ToList();
            return(raceSetup);
        }
Пример #3
0
 public static IRepositorySet <TEntity, TProperty> ThenInclude <TEntity, TPreviousProperty, TProperty>(this IRepositorySet <TEntity, ICollection <TPreviousProperty> > source, Expression <Func <TPreviousProperty, TProperty> > navigationPropertyPath)
     where TEntity : class, IEntity
 {
     return(source.ThenInclude(navigationPropertyPath));
 }
Пример #4
0
        public void SetupRace(string raceId, RaceSetupDto raceSetupDto)
        {
            if (string.IsNullOrEmpty(raceId))
            {
                throw new ArgumentNullException("Missing RaceId");
            }
            if (raceSetupDto == null)
            {
                throw new ArgumentNullException("Missing RaceSetup");
            }
            if (raceSetupDto.Race == null)
            {
                throw new ArgumentNullException("Missing RaceSetup.Race");
            }
            if (raceSetupDto.Disciplines == null)
            {
                throw new ArgumentNullException("Missing RaceSetup.Disciplines");
            }
            if (raceSetupDto.ResultsLists == null)
            {
                throw new ArgumentNullException("Missing RaceSetup.ResultsLists");
            }
            if (raceSetupDto.StartingLanes == null)
            {
                throw new ArgumentNullException("Missing RaceSetup.StartingLanes");
            }
            IRepositorySet repositorySet = repositorySetProvider.GetRepositorySet(raceId);

            var raceSettings  = VerifyRaceSettings(raceSetupDto.Race);
            var disciplineIds = new HashSet <string>();
            var rulesNames    = rulesProvider.GetNames();
            var disciplines   = new List <Discipline>();

            foreach (var discipline in raceSetupDto.Disciplines)
            {
                disciplines.Add(VerifyDiscipline(discipline, disciplineIds, rulesNames));
            }
            var startingLaneIds = new HashSet <string>();
            var startingLanes   = new List <StartingLane>();

            foreach (var startingLane in raceSetupDto.StartingLanes)
            {
                startingLanes.Add(VerifyStartingLane(startingLane, disciplineIds));
            }
            var resultsListsIds = new HashSet <string>();
            var resultsLists    = new List <ResultsList>();

            foreach (var resultsList in raceSetupDto.ResultsLists)
            {
                resultsLists.Add(VerifyResultsList(resultsList, resultsListsIds, disciplineIds));
            }
            var indexEntry = BuildIndexEntry(raceId, raceSettings);

            repositorySet.RaceSettings.SetRaceSettings(raceSettings);
            repositorySet.Disciplines.SetDisciplines(disciplines);
            repositorySet.StartingLanes.SetStartingLanes(startingLanes);
            repositorySet.ResultsLists.ClearResultLists();
            foreach (var resultsList in resultsLists)
            {
                repositorySet.ResultsLists.SetResultsList(resultsList);
            }
            racesIndexRepository.SaveRace(indexEntry);
        }
Пример #5
0
        public void SetupStartingList(string raceId, string startingLaneId, List <StartingListEntryDto> dtos)
        {
            if (string.IsNullOrEmpty(raceId))
            {
                throw new ArgumentNullException("Missing RaceId");
            }
            if (string.IsNullOrEmpty(startingLaneId))
            {
                throw new ArgumentNullException("Missing StartingLaneId");
            }

            IRepositorySet repositorySet        = repositorySetProvider.GetRepositorySet(raceId);
            var            rootStartingLanes    = repositorySet.StartingLanes.GetStartingLanes();
            var            allowedStartingLanes = new HashSet <string>(flattener.GetLeaves(rootStartingLanes, startingLaneId).Select(l => l.StartingLaneId));
            var            allowedDisciplines   = new HashSet <string>(repositorySet.Disciplines.GetDisciplines().Select(d => d.DisciplineId));
            var            allowedAthletes      = new HashSet <string>(repositorySet.Athletes.GetAthletes().Select(a => a.AthleteId));

            var entries = new List <StartingListEntry>();

            foreach (var dto in dtos)
            {
                if (string.IsNullOrEmpty(dto.AthleteId))
                {
                    throw new ArgumentNullException("Missing Entry.AthleteId");
                }
                if (string.IsNullOrEmpty(dto.StartingLaneId))
                {
                    throw new ArgumentNullException("Missing Entry.StartingLaneId");
                }
                if (string.IsNullOrEmpty(dto.DisciplineId))
                {
                    throw new ArgumentNullException("Missing Entry.DisciplineId");
                }
                if (dto.OfficialTop == DateTimeOffset.MinValue)
                {
                    throw new ArgumentNullException("Missing Entry.OfficialTop");
                }
                if (!allowedAthletes.Contains(dto.AthleteId))
                {
                    throw new ArgumentOutOfRangeException("Unknown Entry.AthleteId " + dto.AthleteId);
                }
                if (!allowedStartingLanes.Contains(dto.StartingLaneId))
                {
                    throw new ArgumentOutOfRangeException("Unknown Entry.StartingLaneId " + dto.StartingLaneId);
                }
                if (!allowedDisciplines.Contains(dto.DisciplineId))
                {
                    throw new ArgumentOutOfRangeException("Unknown Entry.DisciplineId " + dto.DisciplineId);
                }
                entries.Add(new StartingListEntry
                {
                    AthleteId      = dto.AthleteId,
                    DisciplineId   = dto.DisciplineId,
                    StartingLaneId = dto.StartingLaneId,
                    OfficialTop    = dto.OfficialTop,
                    WarmUpTime     = dto.WarmUpTime,
                });
            }

            var fullList = repositorySet.StartingList.GetStartingList();

            fullList.RemoveAll(e => allowedStartingLanes.Contains(e.StartingLaneId));
            fullList.AddRange(entries);
            fullList.Sort(CompareStartingListEntry);
            repositorySet.StartingList.SaveStartingList(fullList);
        }
Пример #6
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);
        }
Пример #7
0
        public ResultsListReport GetReportResultsList(string raceId, string resultsListId, JudgePrincipal principal)
        {
            if (string.IsNullOrEmpty(raceId))
            {
                throw new ArgumentNullException("Missing RaceId");
            }
            if (string.IsNullOrEmpty(resultsListId))
            {
                throw new ArgumentNullException("Missing ResultsListId");
            }
            IRepositorySet repositorySet   = repositorySetProvider.GetRepositorySet(raceId);
            var            isAuthenticated = principal != null;

            var resultsList = repositorySet.ResultsLists.FindResultsList(resultsListId);

            if (resultsList == null)
            {
                throw new ArgumentOutOfRangeException("Wrong ResultsListId");
            }

            var disciplines  = repositorySet.Disciplines.GetDisciplines().ToDictionary(d => d.DisciplineId);
            var columns      = new List <ResultsListColumn>();
            var sortingIndex = -1;

            foreach (var columnSource in resultsList.Columns)
            {
                ResultsListColumn column = new ResultsListColumn(columnSource.Title, columnSource.IsFinal, isAuthenticated);
                foreach (var component in columnSource.Components)
                {
                    Discipline discipline;
                    if (!disciplines.TryGetValue(component.DisciplineId, out discipline))
                    {
                        continue;
                    }
                    IRules rules = rulesProvider.Get(discipline.Rules);
                    column.AddComponent(discipline, rules, component.FinalPointsCoeficient ?? 1.0);
                }
                if (column.IsSortingColumn)
                {
                    sortingIndex = columns.Count;
                }
                columns.Add(column);
            }

            var athletes = repositorySet.Athletes.GetAthletes();
            var entries  = new List <ResultsListReportEntry>();

            foreach (var athlete in athletes)
            {
                if (columns.Any(c => c.IsParticipating(athlete)))
                {
                    entries.Add(new ResultsListReportEntry
                    {
                        Athlete    = ApiAthlete.BuildProfile(athlete),
                        Subresults = columns.Select(c => c.BuildSubresult(athlete)).ToList()
                    });
                }
            }

            if (sortingIndex >= 0)
            {
                entries.Sort(new ResultsListReportEntryComparer(columns[sortingIndex].SortingComparer, sortingIndex));
            }

            return(new ResultsListReport
            {
                Metadata = new ResultsListMetadata
                {
                    Title = resultsList.Title,
                    ResultsListId = resultsList.ResultsListId,
                    Columns = columns.Select(c => c.Metadata).ToList()
                },
                Results = entries
            });
        }
Пример #8
0
        public ResultsListReport GetReportDisciplineResults(string raceId, string disciplineId, JudgePrincipal principal)
        {
            if (string.IsNullOrEmpty(raceId))
            {
                throw new ArgumentNullException("Missing RaceId");
            }
            if (string.IsNullOrEmpty(disciplineId))
            {
                throw new ArgumentNullException("Missing DisciplineId");
            }
            IRepositorySet repositorySet = repositorySetProvider.GetRepositorySet(raceId);

            var discipline = repositorySet.Disciplines.FindDiscipline(disciplineId);

            if (discipline == null)
            {
                throw new ArgumentOutOfRangeException("Unknown DisciplineId " + disciplineId);
            }

            var rules = rulesProvider.Get(discipline.Rules);

            if (rules == null)
            {
                throw new ArgumentOutOfRangeException("Unknown DisciplineRules " + discipline.Rules);
            }

            var athletes = repositorySet.Athletes.GetAthletes();
            var judges   = repositorySet.Judges.GetJudges();

            var allowAnnouncement = principal != null || discipline.AnnouncementsPublic;
            var allowResult       = principal != null || discipline.ResultsPublic;

            var entries = new List <ResultsListReportEntry>();

            foreach (var athlete in athletes)
            {
                var announcement = athlete.Announcements.FirstOrDefault(a => a.DisciplineId == disciplineId);
                var actualResult = athlete.ActualResults.LastOrDefault(r => r.DisciplineId == disciplineId);
                if (announcement == null)
                {
                    continue;                           // does not compete in this discipline, skip
                }
                var judge = actualResult == null ? null : judges.FirstOrDefault(j => j.JudgeId == actualResult.JudgeId);

                var entry = new ResultsListReportEntry();
                entry.Athlete    = ApiAthlete.BuildProfile(athlete);
                entry.Subresults = new List <ResultsListReportEntrySubresult>();
                var subresult = new ResultsListReportEntrySubresult();
                if (allowAnnouncement)
                {
                    subresult.Announcement = BuildReportAnnouncement(announcement);
                }
                if (allowResult)
                {
                    subresult.CurrentResult = BuildReportActualResult(actualResult, judge);
                    subresult.FinalPoints   = subresult.CurrentResult?.FinalPerformance?.Points;
                }
                entry.Subresults.Add(subresult);

                entries.Add(entry);
            }

            entries.Sort(new ResultsListReportEntryComparer(rules.ResultsComparer, 0));

            return(new ResultsListReport
            {
                Metadata = BuildDisciplineReportMetadata(discipline, rules),
                Results = entries
            });
        }