private async Task <bool> LessonPreviouslyCompleted(UpdateAchievementProgressDto input)
        {
            int numberOfTimesCompleted = await _mimoDbContext.UserLessons
                                         .Where(ul => ul.LessonId == input.LessonId && ul.UserId == input.UserId)
                                         .CountAsync();

            return(numberOfTimesCompleted > 1);
        }
        public async Task <HttpStatusCode> UpdateAchievementProgress(UpdateAchievementProgressDto input)
        {
            bool lessonPreviouslyCompleted = await LessonPreviouslyCompleted(input);

            if (lessonPreviouslyCompleted == true)
            {
                return(HttpStatusCode.OK);
            }
            else
            {
                List <AchievementDto> achievementDtos = await GetAllAchievements();

                List <UserAchievementDto> userAchievementDtos = await _userAchievementsService.GetAllUserAchievements(input.UserId);

                int currentChapterId = await _mimoDbContext.Lessons
                                       .Where(l => l.Id == input.LessonId)
                                       .Select(l => l.ChapterId)
                                       .FirstOrDefaultAsync();

                foreach (AchievementDto achievementDto in achievementDtos)
                {
                    switch (achievementDto.AchievementTypeName)
                    {
                    case "LessonCount":
                        await UpdateLessonCountAchievement(achievementDto, input.UserId, userAchievementDtos);

                        break;

                    case "ChapterCount":
                        await UpdateChapterCountAchievement(achievementDto, input.UserId, input.LessonId, currentChapterId, userAchievementDtos);

                        break;

                    case "CompleteSwiftCourse":
                        await UpdateCompleteSwiftCourseAchievement(achievementDto, input.UserId, input.LessonId, userAchievementDtos);

                        break;

                    case "CompleteJavascriptCourse":
                        await UpdateCompleteJavascriptCourseAchievement(achievementDto, input.UserId, input.LessonId, userAchievementDtos);

                        break;

                    case "CompleteCSharpCourse":
                        await UpdateCSharpCourseAchievement(achievementDto, input.UserId, input.LessonId, userAchievementDtos);

                        break;

                    default:
                        throw new Exception("Achievement type could not be found");
                    }
                }

                return(HttpStatusCode.OK);
            }
        }
        public async Task <HttpResponseMessage> PostLessonCompleted([FromBody] UserLessonDto userLessonDto)
        {
            UserLesson userLesson = new UserLesson
            {
                LessonId  = userLessonDto.LessonId,
                UserId    = userLessonDto.UserId,
                EndTime   = userLessonDto.EndTime,
                StartTime = userLessonDto.StartTime
            };

            await _mimoDbContext.UserLessons.AddAsync(userLesson);

            UpdateAchievementProgressDto updateAchievementProgressDto = new UpdateAchievementProgressDto
            {
                UserId   = userLessonDto.UserId,
                LessonId = userLessonDto.LessonId
            };

            await _mimoDbContext.SaveChangesAsync();

            await _achievementsService.UpdateAchievementProgress(updateAchievementProgressDto);

            return(new HttpResponseMessage(HttpStatusCode.OK));
        }