예제 #1
0
        public SkaterTargetAnalysis Analyse(ApplicationUser skater, List <SkateLogEntry> allSessions)
        {
            var orderedLog    = allSessions.Where(x => x.ApplicationUserId.Equals(skater.Id, System.StringComparison.CurrentCultureIgnoreCase)).OrderBy(x => x.Logged);
            var totalMiles    = 0M;
            var totalSessions = 0;
            var checkPoints   = checkPointRepository.Get().Where(x => !x.SkateTarget.Equals(SkateTarget.None)).ToList();
            var statistics    = new SkaterTargetAnalysis
            {
                Skater          = skater,
                CheckPointDates = new Dictionary <SkateTarget, DateTime>()
            };

            foreach (var session in orderedLog)
            {
                totalSessions++;
                totalMiles += session.DistanceInMiles;

                foreach (var checkPoint in checkPoints)
                {
                    if (totalMiles >= checkPoint.Distance && !statistics.CheckPointDates.ContainsKey(checkPoint.SkateTarget))
                    {
                        statistics.CheckPointDates.Add(checkPoint.SkateTarget, session.Logged);
                    }
                }
            }

            statistics.TotalMiles    = totalMiles;
            statistics.TotalSessions = totalSessions;

            return(statistics);
        }
예제 #2
0
        public async Task Process(SaveActivityCommand request, CancellationToken cancellationToken)
        {
            try
            {
                if (request.Skater.Target.Equals(SkateTarget.ThereAndBackAgain))
                {
                    // No need to update the user's target.
                    return;
                }

                var userMiles = await context.SkateLogEntries.Where(x => x.ApplicationUserId.Equals(request.Skater.Id)).SumAsync(x => x.DistanceInMiles, cancellationToken);

                var targetCheckPoint = checkPointRepository.Get().First(x => x.SkateTarget.Equals(request.Skater.Target));

                if (userMiles > targetCheckPoint.Distance)
                {
                    request.Skater.Target = GetNewTarget(request.Skater.Target);
                    await userManager.UpdateAsync(request.Skater);
                }
            }
            catch (Exception exception)
            {
                logger.LogError(exception, "Failed to update the user's personal target.");
            }
        }
예제 #3
0
        private IEnumerable <CheckPointStatisticsModel> GetCheckPointStatistics(List <SkaterTargetAnalysis> skaterAnalyses)
        {
            var checkPoints = checkPointRepository.Get().Where(x => !x.SkateTarget.Equals(SkateTarget.None)).ToList();

            foreach (var checkPoint in checkPoints)
            {
                var firstSkater = skaterAnalyses.Where(x => x.CheckPointDates.ContainsKey(checkPoint.SkateTarget))
                                  .OrderBy(x => x.GetMileStoneDate(checkPoint.SkateTarget))
                                  .Select(x => x.Skater)
                                  .FirstOrDefault();
                var lastSkater = skaterAnalyses.Where(x => x.CheckPointDates.ContainsKey(checkPoint.SkateTarget))
                                 .OrderByDescending(x => x.GetMileStoneDate(checkPoint.SkateTarget))
                                 .Select(x => x.Skater)
                                 .FirstOrDefault();

                yield return(new CheckPointStatisticsModel
                {
                    Target = checkPoint.SkateTarget,
                    CheckPointName = checkPoint.Title,
                    FirstSkaterName = firstSkater?.GetDisplaySkaterName(),
                    FirstSkaterProfile = firstSkater != null?GetProfileImage(firstSkater) : null,
                                             LatestSkaterName = lastSkater?.GetDisplaySkaterName(),
                                             LatestSkaterProfile = lastSkater != null?GetProfileImage(lastSkater) : null
                });
            }
        }
예제 #4
0
        public async Task <Unit> Handle(SendRegistrationEmailCommand request, CancellationToken cancellationToken)
        {
            try
            {
                var startPoint = checkPointRepository.Get().OrderBy(x => x.Distance).FirstOrDefault();

                var emailModel = new RegistrationEmailModel
                {
                    LogoUrl = absoluteUrlHelper.Get("/images/AllInSkateChallengeBannerSmall.png"),
                    EmailConfirmationUrl = request.EmailConfirmationUrl,
                    SiteUrl             = absoluteUrlHelper.Get("/"),
                    LogMilesUrl         = absoluteUrlHelper.Get("/skater/skate-log"),
                    SponsorLogoUrl      = absoluteUrlHelper.Get("/images/SkateEverywhereLogo.png"),
                    StartingPostCard    = absoluteUrlHelper.Get(startPoint?.Image),
                    FromSkateEverywhere = request.FromSkateEverywhere
                };

                var emailBody = await viewToStringRenderer.RenderPartialToStringAsync("~/Views/Email/RegistrationEmail.cshtml", emailModel);

                await emailSender.SendEmailAsync(request.Email, "ALL IN Skate Challenge Registration", emailBody);
            }
            catch (Exception exception)
            {
                logger.LogError(exception, "Failed to progress updates when saving mileage entries", request);
            }

            return(Unit.Value);
        }
        public async Task Process(SaveActivityCommand request, SaveActivityCommandResult response, CancellationToken cancellationToken)
        {
            if (!response.WasSuccessful || !request.Skater.AcceptProgressNotifications || !request.Skater.EmailConfirmed)
            {
                return;
            }

            try
            {
                var milesThisSkate = request.Distance;
                switch (request.DistanceUnit)
                {
                case DistanceUnit.Kilometres:
                    milesThisSkate = milesThisSkate * 0.621371M;
                    break;

                case DistanceUnit.Metres:
                    milesThisSkate = milesThisSkate * 0.000621371M;
                    break;
                }

                var totalMiles         = context.SkateLogEntries.Where(x => x.ApplicationUserId.Equals(request.Skater.Id)).Sum(x => x.DistanceInMiles);
                var previousMiles      = totalMiles - milesThisSkate;
                var checkPoints        = checkPointRepository.Get().Where(x => x.SkateTarget <= request.Skater.Target).ToList();
                var targetCheckPoint   = checkPoints.Last();
                var checkPointsReached = checkPoints.Where(x => x.Distance >= previousMiles && x.Distance <= totalMiles).OrderByDescending(x => x.Distance).ToList();

                foreach (var checkPointReached in checkPointsReached)
                {
                    var isFinalCheckpoint = checkPointReached.SkateTarget.Equals(request.Skater.Target);
                    var emailModel        = new SkaterProgressEmailViewModel
                    {
                        LogoUrl          = absoluteUrlHelper.Get("/images/AllInSkateChallengeBannerSmall.png"),
                        SponsorLogoUrl   = absoluteUrlHelper.Get("/images/SkateEverywhereLogo.png"),
                        Skater           = request.Skater,
                        CheckPoint       = checkPointReached,
                        TotalMiles       = totalMiles,
                        NextCheckPoint   = checkPoints.Where(x => x.Distance > totalMiles).OrderBy(x => x.Distance).FirstOrDefault(),
                        TargetCheckPoint = targetCheckPoint
                    };

                    var emailTemplate = isFinalCheckpoint ? "~/Views/Email/ChallengeCompleteEmail.cshtml" : "~/Views/Email/SkaterProgressEmail.cshtml";
                    var emailBody     = await viewToStringRenderer.RenderPartialToStringAsync(emailTemplate, emailModel);

                    await emailSender.SendEmailAsync(request.Skater.Email, "ALL IN Skate Challenge - Your Progress", emailBody);
                }
            }
            catch (Exception exception)
            {
                logger.LogError(exception, "Failed to progress updates when saving mileage entries", request);
            }
        }
        public async Task <Unit> Handle(ResendRegistrationEmailCommand request, CancellationToken cancellationToken)
        {
            try
            {
                var user = await userManager.FindByIdAsync(request.UserId);

                if (user == null)
                {
                    throw new EntityNotFoundException(typeof(ApplicationUser), Guid.Parse(request.UserId));
                }

                var code = await userManager.GenerateEmailConfirmationTokenAsync(user);

                code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));

                var callbackUrl = $"/Identity/Account/ConfirmEmail/?userId={request.UserId}&code={code}&returnUrl=%2F";
                callbackUrl = absoluteUrlHelper.Get(callbackUrl);

                var startPoint = checkPointRepository.Get().OrderBy(x => x.Distance).FirstOrDefault();

                var emailModel = new RegistrationEmailModel
                {
                    LogoUrl = absoluteUrlHelper.Get("/images/AllInSkateChallengeBannerSmall.png"),
                    EmailConfirmationUrl = callbackUrl,
                    SiteUrl             = absoluteUrlHelper.Get("/"),
                    LogMilesUrl         = absoluteUrlHelper.Get("/skater/skate-log"),
                    SponsorLogoUrl      = absoluteUrlHelper.Get("/images/SkateEverywhereLogo.png"),
                    StartingPostCard    = absoluteUrlHelper.Get(startPoint?.Image),
                    FromSkateEverywhere = false
                };

                var emailBody = await viewToStringRenderer.RenderPartialToStringAsync("~/Views/Email/RegistrationEmail.cshtml", emailModel);

                await emailSender.SendEmailAsync(user.Email, "ALL IN Skate Challenge Registration", emailBody);
            }
            catch (Exception exception)
            {
                logger.LogError(exception, "Failed to progress updates when saving mileage entries", request);
            }

            return(Unit.Value);
        }
예제 #7
0
        public override async Task <PageViewModel <SkaterProgressViewModel> > Build()
        {
            var command = new SkaterLogQuery {
                Skater = User
            };
            var commandResponse = await mediator.Send(command);

            var mileageEntries = commandResponse.Entries ?? new List <SkateLogEntry>();
            var analysis       = skaterTargetAnalyser.Analyse(this.User, mileageEntries);

            var totalDistance      = mileageEntries.Sum(x => x.DistanceInMiles);
            var checkPoints        = checkPointRepository.Get();
            var checkPointsReached = checkPoints.Where(x => x.Distance <= totalDistance).OrderBy(x => x.Distance);
            var targetCheckPoint   = checkPoints.First(x => x.SkateTarget.Equals(User.Target));
            var nextCheckPoint     = checkPoints.Where(x => x.Distance > totalDistance && x.Distance <= targetCheckPoint.Distance).OrderBy(x => x.Distance).FirstOrDefault();

            var model = await base.Build();

            model.PageTitle           = "Your Progress";
            model.DisplayPageTitle    = "Your Progress";
            model.IsNoIndexPage       = true;
            model.Content.MilesSkated = totalDistance;
            model.Content.TargetMiles = targetCheckPoint.Distance;
            model.Content.Entries     = mileageEntries;

            model.Content.CheckPointsReached =
                (from cp in checkPointsReached
                 join acp in analysis.CheckPointDates on cp.SkateTarget equals acp.Key
                 orderby acp.Value
                 select new SkaterProgressCheckPoint
            {
                SkateTarget = cp.SkateTarget,
                Distance = cp.Distance,
                Title = cp.Title,
                Description = cp.Description,
                Longitude = cp.Longitude,
                Latitude = cp.Latitude,
                Url = cp.Url,
                Image = cp.Image,
                DigitalBadge = cp.DigitalBadge,
                FinisherDigitalBadge = cp.FinisherDigitalBadge,
                DateAchieved = acp.Value
            }).ToList();

            if (nextCheckPoint != null)
            {
                var distanceToNextCheckpoint = nextCheckPoint.Distance - totalDistance;
                model.Content.NextCheckPoint = new SkaterProgressCheckPoint
                {
                    Title       = "Your Next Checkpoint",
                    Description = $"You have to skate a further {distanceToNextCheckpoint:F2} miles to reach {nextCheckPoint.Title}.",
                    Longitude   = nextCheckPoint.Longitude,
                    Latitude    = nextCheckPoint.Latitude,
                    Url         = nextCheckPoint.Url
                };
            }
            else
            {
                var lastCheckPointReached = model.Content.CheckPointsReached.Last();
                model.Content.NextCheckPoint = lastCheckPointReached;
                model.Content.CheckPointsReached.Remove(lastCheckPointReached);
            }

            return(model);
        }