Пример #1
0
 public RegistrationDataViewModel(IDinnerEventsRepository dinnerEventsRepository,
                                  IEventParticipationsRepository eventParticipationsRepository,
                                  ITeamsRepository teamsRepository,
                                  IInvitationsRepository invitationsRepository,
                                  IRoutesRepository routesRepository,
                                  IEmailSender emailSender,
                                  IConfiguration configuration,
                                  UserManager <ApplicationUser> userManager,
                                  SignInManager <ApplicationUser> signInManager)
 {
     DinnerEventsRepository        = dinnerEventsRepository;
     EventParticipationsRepository = eventParticipationsRepository;
     TeamsRepository       = teamsRepository;
     InvitationsRepository = invitationsRepository;
     EmailSender           = emailSender;
     RoutesRepository      = routesRepository;
     Configuration         = configuration;
     UserManager           = userManager;
     SignInManager         = signInManager;
     HereMapsHelper        = new HereMapsHelper(configuration);
 }
        /// <summary>
        /// PageHandler for creating routes automatically.
        /// </summary>
        /// <returns></returns>
        public async Task <IActionResult> OnPostCreateRoutes(int factor)
        {
            if (HttpContext.Session.GetString("EventId") == null)
            {
                string returnUrl = HttpContext.Request.Path.ToString();
                return(RedirectToPage("/Account/Login", new { area = "Identity", returnUrl }));
            }

            ViewData["IsParticipating"] = HttpContext.Session.GetString("IsParticipating");
            var eventId     = int.Parse(HttpContext.Session.GetString("EventId"), CultureInfo.CurrentCulture);
            var dinnerEvent = DinnerEventsRepository.GetById(eventId);
            List <CalculationHost> FirstCourseHosts  = new List <CalculationHost>();
            List <CalculationHost> SecondCourseHosts = new List <CalculationHost>();
            List <CalculationHost> ThirdCourseHosts  = new List <CalculationHost>();
            int routeFactor    = factor;
            int numberOfRoutes = routeFactor * 3;
            var teams          = TeamsRepository.SearchFor(x => x.Event.Id == eventId).Take(numberOfRoutes).ToList();

            ///////////////////////////// Sort teams by course
            foreach (Team team in teams)
            {
                if (team.SelectedCourse == "FirstCourse")
                {
                    FirstCourseHosts.Add(new CalculationHost()
                    {
                        HostTeam = team
                    });
                }

                if (team.SelectedCourse == "SecondCourse")
                {
                    SecondCourseHosts.Add(new CalculationHost()
                    {
                        HostTeam = team
                    });
                }

                if (team.SelectedCourse == "ThirdCourse")
                {
                    ThirdCourseHosts.Add(new CalculationHost()
                    {
                        HostTeam = team
                    });
                }
            }

            List <CalculationHost> FirstCourseHostsOrdered  = new List <CalculationHost>();
            List <CalculationHost> SecondCourseHostsOrdered = SecondCourseHosts;
            List <CalculationHost> ThirdCourseHostsOrdered  = new List <CalculationHost>();

            //////////////////////////////// Get GeoCoordinates
            foreach (var secondCourseHost in SecondCourseHosts)
            {
                var address = secondCourseHost.HostTeam.FullAddress + "," + secondCourseHost.HostTeam.City;
                secondCourseHost.Coordinates = await HereMapsHelper.GetCoordinates(address);
            }

            foreach (var thirdCourseHost in ThirdCourseHosts)
            {
                var address = thirdCourseHost.HostTeam.FullAddress + "," + thirdCourseHost.HostTeam.City;
                thirdCourseHost.Coordinates = await HereMapsHelper.GetCoordinates(address);
            }

            foreach (var firstCourseHost in FirstCourseHosts)
            {
                var address = firstCourseHost.HostTeam.FullAddress + "," + firstCourseHost.HostTeam.City;
                firstCourseHost.Coordinates = await HereMapsHelper.GetCoordinates(address);
            }

            /////////////////////////////// Calculate Distances
            foreach (var secondCourseHost in SecondCourseHosts)
            {
                // From Second to First course hosts
                secondCourseHost.HostDistancesToFirst = new List <RouteNodeDistance>();
                foreach (var firstCourseHost in FirstCourseHosts)
                {
                    RouteNodeDistance hostDistance = new RouteNodeDistance
                    {
                        Host1    = secondCourseHost,
                        Distance = secondCourseHost.Coordinates.GetDistanceTo(firstCourseHost.Coordinates),
                        Host2    = firstCourseHost
                    };
                    secondCourseHost.HostDistancesToFirst.Add(hostDistance);
                }

                secondCourseHost.HostDistancesToFirst = secondCourseHost.HostDistancesToFirst.OrderBy(x => x.Distance).ToList();
                // From Second to Third course hosts
                secondCourseHost.HostDistancesToThird = new List <RouteNodeDistance>();
                foreach (var thirdCourseHost in ThirdCourseHosts)
                {
                    RouteNodeDistance hostDistance = new RouteNodeDistance
                    {
                        Host1    = secondCourseHost,
                        Distance = secondCourseHost.Coordinates.GetDistanceTo(thirdCourseHost.Coordinates),
                        Host2    = thirdCourseHost
                    };
                    secondCourseHost.HostDistancesToThird.Add(hostDistance);
                }

                secondCourseHost.HostDistancesToThird = secondCourseHost.HostDistancesToThird.OrderBy(x => x.Distance).ToList();
            }

            //////////////////////// Re-order hosts by distance
            foreach (var secondCourseHost in SecondCourseHosts)
            {
                // Shortest Distance from SecondCourse to FirstCourse
                foreach (var hostDistance in secondCourseHost.HostDistancesToFirst)
                {
                    if (!FirstCourseHostsOrdered.Contains(hostDistance.Host2))
                    {
                        FirstCourseHostsOrdered.Add(hostDistance.Host2);
                        break;
                    }
                }
            }

            foreach (var secondCourseHost in SecondCourseHosts)
            {
                // Shortest Distance from SecondCourse To ThirdCourse
                foreach (var hostDistance in secondCourseHost.HostDistancesToThird)
                {
                    if (!ThirdCourseHostsOrdered.Contains(hostDistance.Host2))
                    {
                        ThirdCourseHostsOrdered.Add(hostDistance.Host2);
                        break;
                    }
                }
            }

            //////////////////// Set SecondCourseHosts (use only ordered Hosts from here!)
            // Start from First
            int i = 0;
            // Start from Second
            int j = 1;

            foreach (var secondCourseHost in SecondCourseHostsOrdered)
            {
                // Add FirstCourseHost
                FirstCourseHostsOrdered[i].GuestTeam1 = secondCourseHost.HostTeam;
                // Add ThirdCourseHost
                ThirdCourseHostsOrdered[j].GuestTeam1 = secondCourseHost.HostTeam;
                i++;
                j++;
                if (i == routeFactor)
                {
                    i = 0;
                }

                if (j == routeFactor)
                {
                    j = 0;
                }
            }

            /////////////////////////////////// Set ThirdCourseHosts
            // Start from First
            i = 0;
            // Start from Second
            j = 1;
            foreach (var thirdCourseHost in ThirdCourseHostsOrdered)
            {
                // Add FirstCourseHost
                FirstCourseHostsOrdered[i].GuestTeam2 = thirdCourseHost.HostTeam;
                // Add SecondCourseHost
                SecondCourseHostsOrdered[j].GuestTeam1 = thirdCourseHost.HostTeam;
                i++;
                j++;
                if (i == routeFactor)
                {
                    i = 0;
                }

                if (j == routeFactor)
                {
                    j = 0;
                }
            }

            /////////////////////////////////// Set FirstCourseHosts
            // Start from Third
            i = 2;
            // Start from Third
            j = 2;
            foreach (var firstCourseHost in FirstCourseHostsOrdered)
            {
                // Add SecondCourseHost
                SecondCourseHostsOrdered[i].GuestTeam2 = firstCourseHost.HostTeam;
                // Add ThirdCourseHost
                ThirdCourseHostsOrdered[j].GuestTeam2 = firstCourseHost.HostTeam;
                i++;
                j++;
                if (i == routeFactor)
                {
                    i = 0;
                }

                if (j == routeFactor)
                {
                    j = 0;
                }
            }

            ///////////////////////// Create routes
            // Add SecondCourse routes
            foreach (var host in SecondCourseHostsOrdered)
            {
                Route newRoute = new Route
                {
                    Event        = dinnerEvent,
                    RouteForTeam = host.HostTeam,
                    // Second Course
                    SecondCourseHostTeam   = host.HostTeam,
                    SecondCourseGuestTeam1 = host.GuestTeam1,
                    SecondCourseGuestTeam2 = host.GuestTeam2
                };
                // First Course
                var firstCourseHostList = from r in FirstCourseHostsOrdered
                                          where r.GuestTeam1.Id == host.HostTeam.Id
                                          select r;
                var firstCourseHost = firstCourseHostList.FirstOrDefault();
                newRoute.FirstCourseHostTeam   = firstCourseHost.HostTeam;
                newRoute.FirstCourseGuestTeam1 = firstCourseHost.GuestTeam1;
                newRoute.FirstCourseGuestTeam2 = firstCourseHost.GuestTeam2;
                // Third Course
                var thirdCourseHostList = from r in ThirdCourseHostsOrdered
                                          where r.GuestTeam1.Id == host.HostTeam.Id
                                          select r;
                var thirdCourseHost = thirdCourseHostList.FirstOrDefault();
                newRoute.ThirdCourseHostTeam   = thirdCourseHost.HostTeam;
                newRoute.ThirdCourseGuestTeam1 = thirdCourseHost.GuestTeam1;
                newRoute.ThirdCourseGuestTeam2 = thirdCourseHost.GuestTeam2;
                RoutesRepository.Insert(newRoute);
            }

            // Add ThirdCourse routes
            foreach (var host in ThirdCourseHostsOrdered)
            {
                Route newRoute = new Route
                {
                    Event        = dinnerEvent,
                    RouteForTeam = host.HostTeam,
                    // Third Course
                    ThirdCourseHostTeam   = host.HostTeam,
                    ThirdCourseGuestTeam1 = host.GuestTeam1,
                    ThirdCourseGuestTeam2 = host.GuestTeam2
                };
                // First Course
                var firstCourseHostList = from r in FirstCourseHostsOrdered
                                          where r.GuestTeam2.Id == host.HostTeam.Id
                                          select r;
                var firstCourseHost = firstCourseHostList.FirstOrDefault();
                newRoute.FirstCourseHostTeam   = firstCourseHost.HostTeam;
                newRoute.FirstCourseGuestTeam1 = firstCourseHost.GuestTeam1;
                newRoute.FirstCourseGuestTeam2 = firstCourseHost.GuestTeam2;
                // Second Course
                var secondCourseHostList = from r in SecondCourseHostsOrdered
                                           where r.GuestTeam1.Id == host.HostTeam.Id
                                           select r;
                var secondCourseHost = secondCourseHostList.FirstOrDefault();
                newRoute.SecondCourseHostTeam   = secondCourseHost.HostTeam;
                newRoute.SecondCourseGuestTeam1 = secondCourseHost.GuestTeam1;
                newRoute.SecondCourseGuestTeam2 = secondCourseHost.GuestTeam2;
                RoutesRepository.Insert(newRoute);
            }

            // Add FirstCourse routes
            foreach (var host in FirstCourseHostsOrdered)
            {
                Route newRoute = new Route
                {
                    Event        = dinnerEvent,
                    RouteForTeam = host.HostTeam,
                    // First Course
                    FirstCourseHostTeam   = host.HostTeam,
                    FirstCourseGuestTeam1 = host.GuestTeam1,
                    FirstCourseGuestTeam2 = host.GuestTeam2
                };
                // Second Course
                var secondCourseHostList = from r in SecondCourseHostsOrdered
                                           where r.GuestTeam2.Id == host.HostTeam.Id
                                           select r;
                var secondCourseHost = secondCourseHostList.FirstOrDefault();
                newRoute.SecondCourseHostTeam   = secondCourseHost.HostTeam;
                newRoute.SecondCourseGuestTeam1 = secondCourseHost.GuestTeam1;
                newRoute.SecondCourseGuestTeam2 = secondCourseHost.GuestTeam2;
                // Third Course
                var thirdCourseHostList = from r in ThirdCourseHostsOrdered
                                          where r.GuestTeam2.Id == host.HostTeam.Id
                                          select r;
                var thirdCourseHost = thirdCourseHostList.FirstOrDefault();
                newRoute.ThirdCourseHostTeam   = thirdCourseHost.HostTeam;
                newRoute.ThirdCourseGuestTeam1 = thirdCourseHost.GuestTeam1;
                newRoute.ThirdCourseGuestTeam2 = thirdCourseHost.GuestTeam2;
                RoutesRepository.Insert(newRoute);
            }

            RoutesRepository.SaveChanges();
            return(RedirectToPage());
        }
        public IActionResult OnGet()
        {
            if (HttpContext.Session.GetString("EventId") == null)
            {
                string returnUrl = HttpContext.Request.Path.ToString();
                return(RedirectToPage("/Account/Login", new { area = "Identity" }));
            }

            ViewData["IsParticipating"] = HttpContext.Session.GetString("IsParticipating");
            var         eventId     = int.Parse(HttpContext.Session.GetString("EventId"), CultureInfo.CurrentCulture);
            DinnerEvent dinnerEvent = DinnerEventsRepository.GetById(eventId);

            if (dinnerEvent != null)
            {
                // Values are passed-through to layout page
                ViewData["EventName"]        = dinnerEvent.EventName;
                ViewData["EventDate"]        = dinnerEvent.EventDate.ToShortDateString();
                ViewData["EventCity"]        = dinnerEvent.City;
                ViewData["EventPictureLink"] = dinnerEvent.EventPictureLink;
            }

            else
            {
                return(RedirectToPage("RegistrationData"));
            }

            ViewData["apiKey"]        = Configuration?.GetMapsSettings("apiKeyJs");
            ViewData["MapCenterLat"]  = "50.113745";
            ViewData["MapCenterLong"] = "8.679317";

            // Routes
            List <Route> routes = RoutesRepository.SearchFor(x => x.Event.Id == eventId)
                                  .Include(a => a.Event)
                                  .Include(a => a.RouteForTeam)
                                  .Include(a => a.FirstCourseHostTeam)
                                  .Include(a => a.FirstCourseGuestTeam1)
                                  .Include(a => a.FirstCourseGuestTeam2)
                                  .Include(a => a.SecondCourseHostTeam)
                                  .Include(a => a.SecondCourseGuestTeam1)
                                  .Include(a => a.SecondCourseGuestTeam2)
                                  .Include(a => a.ThirdCourseHostTeam)
                                  .Include(a => a.ThirdCourseGuestTeam1)
                                  .Include(a => a.ThirdCourseGuestTeam2).ToList();
            List <string> kitchenAddresses = new List <string>();

            foreach (var route in routes)
            {
                if (route.RouteForTeam?.Id == route.FirstCourseHostTeam?.Id)
                {
                    kitchenAddresses.Add(route.FirstCourseHostTeam.FullAddress + "," + dinnerEvent.City);
                }

                if (route.RouteForTeam?.Id == route.SecondCourseHostTeam?.Id)
                {
                    kitchenAddresses.Add(route.SecondCourseHostTeam.FullAddress + "," + dinnerEvent.City);
                }

                if (route.RouteForTeam?.Id == route.ThirdCourseHostTeam?.Id)
                {
                    kitchenAddresses.Add(route.ThirdCourseHostTeam.FullAddress + "," + dinnerEvent.City);
                }
            }

            List <string> kitchenCoordinates = new List <string>();

            foreach (var kitchenAddress in kitchenAddresses)
            {
                string coordinateString = HereMapsHelper.GetCoordinatesWithAddressString(kitchenAddress);
                kitchenCoordinates.Add(coordinateString);
            }

            ViewData["KitchenCoordinates"] = kitchenCoordinates.ToArray();
            List <string> routeAddresses = new List <string>();

            foreach (Route route in routes)
            {
                // First Course Host
                routeAddresses.Add(route.FirstCourseHostTeam.FullAddress + ", " + dinnerEvent.City);
                // Second Course Host
                routeAddresses.Add(route.SecondCourseHostTeam.FullAddress + ", " + dinnerEvent.City);
                // Third Course Host
                routeAddresses.Add(route.ThirdCourseHostTeam.FullAddress + ", " + dinnerEvent.City);
            }

            List <string> routeCoordinates = new List <string>();

            foreach (var routeAddress in routeAddresses)
            {
                string coordinateString = HereMapsHelper.GetCoordinatesString(routeAddress);
                routeCoordinates.Add(coordinateString);
            }

            ViewData["RouteCoordinates"] = routeCoordinates.ToArray();
            string partyLocationCoordinateString = HereMapsHelper.GetCoordinatesWithAddressString(dinnerEvent.PartyLocation);

            ViewData["PartyLocation"] = partyLocationCoordinateString;
            return(Page());
        }
        public async Task <IActionResult> OnGet()
        {
            if (HttpContext.Session.GetString("EventId") == null)
            {
                string returnUrl = HttpContext.Request.Path.ToString();
                return(RedirectToPage("/Account/Login", new { area = "Identity" }));
            }

            ViewData["IsParticipating"] = HttpContext.Session.GetString("IsParticipating");
            var             eventId = int.Parse(HttpContext.Session.GetString("EventId"), CultureInfo.CurrentCulture);
            ApplicationUser user    = await _userManager.GetUserAsync(User);

            if (user == null)
            {
                return(Page());
            }

            bool isParticipating = IsUserParticipating(eventId, user.Id);

            ViewData["IsParticipating"] = isParticipating;
            HttpContext.Session.SetString("IsParticipating", isParticipating.ToString(CultureInfo.CurrentCulture));
            DinnerEvent dinnerEvent = DinnerEventsRepository.GetById(eventId);

            if (dinnerEvent != null)
            {
                // Values are passed-through to layout page
                ViewData["EventName"]        = dinnerEvent.EventName;
                ViewData["EventDate"]        = dinnerEvent.EventDate.ToShortDateString();
                ViewData["EventCity"]        = dinnerEvent.City;
                ViewData["EventPictureLink"] = dinnerEvent.EventPictureLink;
            }

            if (dinnerEvent == null)
            {
                return(Page());
            }
            ViewData["apiKey"]        = Configuration?.GetMapsSettings("apiKeyJs");
            ViewData["MapCenterLat"]  = "50.113745";
            ViewData["MapCenterLong"] = "8.679317";
            Event = dinnerEvent;

            // Load Team
            Team team = TeamsRepository.SearchFor(x => x.Event.Id == dinnerEvent.Id && (x.Partner1.Id == user.Id || x.Partner2.Id == user.Id)).Include("Partner1").Include("Partner2").Include("Event").FirstOrDefault();

            if (!dinnerEvent.RoutesOpen)
            {
                return(Page());
            }

            // Routes
            Route route = RoutesRepository.SearchFor(x => x.Event.Id == eventId && x.RouteForTeam.Id == team.Id)
                          .Include(a => a.Event)
                          .Include(a => a.RouteForTeam)
                          .Include(a => a.FirstCourseHostTeam).ThenInclude(b => b.Partner1)
                          .Include(a => a.FirstCourseHostTeam).ThenInclude(b => b.Partner2)
                          .Include(a => a.FirstCourseGuestTeam1).ThenInclude(b => b.Partner1)
                          .Include(a => a.FirstCourseGuestTeam1).ThenInclude(b => b.Partner2)
                          .Include(a => a.FirstCourseGuestTeam2).ThenInclude(b => b.Partner1)
                          .Include(a => a.FirstCourseGuestTeam2).ThenInclude(b => b.Partner2)
                          .Include(a => a.SecondCourseHostTeam).ThenInclude(b => b.Partner1)
                          .Include(a => a.SecondCourseHostTeam).ThenInclude(b => b.Partner2)
                          .Include(a => a.SecondCourseGuestTeam1).ThenInclude(b => b.Partner1)
                          .Include(a => a.SecondCourseGuestTeam1).ThenInclude(b => b.Partner2)
                          .Include(a => a.SecondCourseGuestTeam2).ThenInclude(b => b.Partner1)
                          .Include(a => a.SecondCourseGuestTeam2).ThenInclude(b => b.Partner2)
                          .Include(a => a.ThirdCourseHostTeam).ThenInclude(b => b.Partner1)
                          .Include(a => a.ThirdCourseHostTeam).ThenInclude(b => b.Partner2)
                          .Include(a => a.ThirdCourseGuestTeam1).ThenInclude(b => b.Partner1)
                          .Include(a => a.ThirdCourseGuestTeam1).ThenInclude(b => b.Partner2)
                          .Include(a => a.ThirdCourseGuestTeam2).ThenInclude(b => b.Partner1)
                          .Include(a => a.ThirdCourseGuestTeam2).ThenInclude(b => b.Partner2).FirstOrDefault();

            FirstCourseTeam  = route.FirstCourseHostTeam;
            SecondCourseTeam = route.SecondCourseHostTeam;
            ThirdCourseTeam  = route.ThirdCourseHostTeam;

            List <string> routeAddresses = new List <string>();

            // First Course Host
            routeAddresses.Add(route.FirstCourseHostTeam.FullAddress + ", " + dinnerEvent.City);
            // Second Course Host
            routeAddresses.Add(route.SecondCourseHostTeam.FullAddress + ", " + dinnerEvent.City);
            // Third Course Host
            routeAddresses.Add(route.ThirdCourseHostTeam.FullAddress + ", " + dinnerEvent.City);

            List <string> kitchenCoordinates = new List <string>();

            foreach (var routeAddress in routeAddresses)
            {
                string coordinateString = HereMapsHelper.GetCoordinatesWithAddressString(routeAddress);
                kitchenCoordinates.Add(coordinateString);
            }

            ViewData["KitchenCoordinates"] = kitchenCoordinates.ToArray();

            List <string> routeCoordinates = new List <string>();

            foreach (var routeAddress in routeAddresses)
            {
                string coordinateString = HereMapsHelper.GetCoordinatesString(routeAddress);
                routeCoordinates.Add(coordinateString);
            }

            ViewData["RouteCoordinates"] = routeCoordinates;
            string partyLocationCoordinateString = HereMapsHelper.GetCoordinatesWithAddressString(dinnerEvent.PartyLocation);

            ViewData["PartyLocation"] = partyLocationCoordinateString;
            return(Page());
        }