Ejemplo n.º 1
0
        public async Task <IActionResult> GetStrRateByGroupInPeriod(DateTime startDate, DateTime endDate, int daysInSlice)
        {
            /* Validate input */
            if (endDate <= startDate.AddDays(daysInSlice))
            {
                return(BadRequest($"No {daysInSlice} days period between {startDate} and {endDate}"));
            }

            /* Separate period in slices and query them */
            var queries     = new List <Task <ExerciseLiftsInPeriod> >();
            var currentDate = startDate;

            while (currentDate < endDate)
            {
                queries.Add(_workoutRepository.GetExercisesAndLiftsByGroupInPeriod(currentDate, currentDate = currentDate.AddDays(daysInSlice)));
            }
            List <ExerciseLiftsInPeriod> periodsWithExercises = (await Task.WhenAll(queries)).ToList();

            var strRates = new List <GroupStrRate>();

            var exerciseTypes = periodsWithExercises.SelectMany(pe => pe.Exercises.Select(ex => new { ex.TypeId, ex.TypeName })).Distinct().ToList();

            if (!exerciseTypes.Any())
            {
                return(NoContent());
            }
            foreach (var exerciseType in exerciseTypes)
            {
                var exerciseGroup = new GroupStrRate(exerciseType.TypeId, exerciseType.TypeName);
                foreach (var period in periodsWithExercises)
                {
                    var exercisesOfTypeInPeriod = period.Exercises.Where(e => e.TypeId == exerciseType.TypeId).ToList();
                    if (!exercisesOfTypeInPeriod.Any())
                    {
                        continue;
                    }
                    var groupStrRate    = decimal.Round(exercisesOfTypeInPeriod.Average(x => x.Lift.AsDecimal() * x.RepCount), 2);
                    var strRateInPeriod = new StrRateInPeriod(groupStrRate, period.StartDate, period.EndDate);
                    exerciseGroup.StrRateInPeriods.Add(strRateInPeriod);
                }
                strRates.Add(exerciseGroup);
            }
            return(Ok(strRates));
        }