public async Task <StateRecordSlimDTO> GetForTrainingAsync(int trainingId)
        {
            IEnumerable <StateRecord> records = await stateRecords.GetForTrainingAsync(trainingId);

            return(new StateRecordSlimDTO
            {
                TrainingId = trainingId,
                StateRecords = records.Select(rec => new StateRecordSlimDTO.StateRecord
                {
                    CreateTime = rec.CreateTime,
                    TeamMemberId = rec.TeamMemberId,
                    HeartRate = rec.HeartRate,
                    Temperature = rec.Temperature
                })
            });
        }
        public async Task <IEnumerable <CriticalMomentDTO> > GetCriticalMomentsForTrainingAsync(int trainingId)
        {
            TrainingDTO training = await trainingService.GetTrainingAsync(trainingId);

            if (training == null)
            {
                throw new NotFoundException("Training doesn't exist!");
            }

            bool hasCachedInDb = await criticalMoments.IsCachedForTrainingAsync(trainingId);

            IEnumerable <CriticalMoment> moments;

            if (hasCachedInDb)
            {
                moments = await criticalMoments.GetForTrainingAsync(trainingId);
            }
            else
            {
                bool isTrainingOver = await trainingService.IsTrainingOverAsync(trainingId);

                if (!isTrainingOver)
                {
                    throw new BadRequestException("Training hasn't finished yet! Stop it or wait!");
                }

                var states = await stateRecors.GetForTrainingAsync(trainingId);

                moments = stressRecognitionService
                          .FindCriticalMoments(states)
                          .Select(interval => new CriticalMoment
                {
                    TrainingId = trainingId,
                    BeginTime  = interval.Begin,
                    EndTime    = interval.End
                });
                await criticalMoments.SetCachedForTrainingAsync(trainingId);

                await criticalMoments.CreateManyAsync(moments);
            }

            return(moments.Select(moment => new CriticalMomentDTO
            {
                Id = moment.Id,
                TrainingId = moment.TrainingId,
                BeginTime = moment.BeginTime,
                EndTime = moment.EndTime
            }));
        }