예제 #1
0
        public async Task <IHttpActionResult> PutClassRating(Guid id, ClassRating classRating)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (id != classRating.id)
            {
                return(BadRequest());
            }

            db.Entry(classRating).State = EntityState.Modified;

            try
            {
                await db.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!ClassRatingExists(id))
                {
                    return(NotFound());
                }
                else
                {
                    throw;
                }
            }

            return(StatusCode(HttpStatusCode.NoContent));
        }
예제 #2
0
        public async Task <IHttpActionResult> PostClassRating(ClassRating classRating)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            db.ClassRatings.Add(classRating);

            try
            {
                await db.SaveChangesAsync();
            }
            catch (DbUpdateException)
            {
                if (ClassRatingExists(classRating.id))
                {
                    return(Conflict());
                }
                else
                {
                    throw;
                }
            }

            return(CreatedAtRoute("DefaultApi", new { id = classRating.id }, classRating));
        }
예제 #3
0
        private ClassRating CreateClassRating(string className)
        {
            ClassRating classRating = new ClassRating()
            {
                ClassName     = className,
                PlayersRating = new DriversRating()
                {
                    Rating       = _simulatorRating.PlayersRating.Rating,
                    Deviation    = _simulatorRating.PlayersRating.Deviation,
                    Volatility   = _simulatorRating.PlayersRating.Volatility,
                    CreationTime = DateTime.Now,
                    Difficulty   = _simulatorRating.PlayersRating.Difficulty,
                },
                DifficultyRating = new DriversRating()
                {
                    Rating       = _simulatorRating.PlayersRating.Rating,
                    Deviation    = _simulatorRating.PlayersRating.Deviation,
                    Volatility   = _simulatorRating.PlayersRating.Volatility,
                    CreationTime = DateTime.Now,
                    Difficulty   = _simulatorRating.PlayersRating.Difficulty,
                },
                DifficultySettings = new DifficultySettings()
                {
                    SelectedDifficulty = GetSuggestedDifficulty(_simulatorRating.PlayersRating.Rating),
                    WasUserSelected    = true,
                }
            };

            _simulatorRating.ClassRatings.Add(classRating);
            Logger.Info($"Created Rating for {className}");
            LogRating(classRating.PlayersRating);
            return(classRating);
        }
예제 #4
0
        public async Task <ActionResult <ClassRatingResponse> > getClassRating(int classid)
        {
            GymClasses gymClass = await classRepository.getClassById(classid);

            if (gymClass == null)
            {
                return(StatusCode(StatusCodes.Status404NotFound, "Specified class does not exist!"));
            }

            ClassRating rating = await classRatingRepository.getRating(classid);

            ClassRatingResponse response = new ClassRatingResponse();

            if (rating == null)
            {
                response.classId     = classid;
                response.ratingCount = 0;
                response.ratingSum   = 0;
            }
            else
            {
                response.classId     = rating.ClassIdForeignKey;
                response.ratingCount = rating.RatingCount;
                response.ratingSum   = rating.RatingSum;
            }

            return(Ok(response));
        }
예제 #5
0
        public (DriversRating simRating, DriversRating difficultyRating) GetPlayerRating(string className)
        {
            ClassRating classRating = _simulatorRating.ClassRatings.FirstOrDefault(x => x.ClassName == className) ?? CreateClassRating(className);

            Logger.Info($"Retreived Players Rating for Class {className}");
            LogRating(classRating.PlayersRating);
            return(FillDifficulty(UpdateDeviation(classRating.PlayersRating)), FillDifficulty(UpdateDeviation(classRating.DifficultyRating)));
        }
예제 #6
0
        public void SetSelectedDifficulty(int difficulty, bool wasUserSelected, string className)
        {
            ClassRating classRating = GetOrCreateClassRating(className);

            classRating.DifficultySettings = new DifficultySettings()
            {
                SelectedDifficulty = difficulty,
                WasUserSelected    = wasUserSelected
            };
        }
예제 #7
0
        public async Task <IHttpActionResult> GetClassRating(Guid id)
        {
            ClassRating classRating = await db.ClassRatings.FindAsync(id);

            if (classRating == null)
            {
                return(NotFound());
            }

            return(Ok(classRating));
        }
예제 #8
0
        public async Task <IHttpActionResult> DeleteClassRating(Guid id)
        {
            ClassRating classRating = await db.ClassRatings.FindAsync(id);

            if (classRating == null)
            {
                return(NotFound());
            }

            db.ClassRatings.Remove(classRating);
            await db.SaveChangesAsync();

            return(Ok(classRating));
        }
예제 #9
0
        public void UpdateRating(DriversRating newClassRating, DriversRating newDifficultyRating, DriversRating newSimRating, int difficulty, string trackName, DriverFinishState driverFinishState)
        {
            ClassRating   classRating         = GetOrCreateClassRating(driverFinishState.CarClass);
            DriversRating oldClassRating      = classRating.PlayersRating;
            DriversRating oldDifficultyRating = classRating.DifficultyRating;
            DriversRating oldSimRating        = _simulatorRating.PlayersRating;

            newSimRating                   = NormalizeRatingChange(oldSimRating, newSimRating);
            newClassRating                 = NormalizeRatingChange(oldClassRating, newClassRating);
            newSimRating                   = FillDifficulty(newSimRating);
            newClassRating                 = FillDifficulty(newClassRating);
            newDifficultyRating            = NormalizeRatingChange(oldDifficultyRating, newDifficultyRating);
            newDifficultyRating            = FillDifficulty(newDifficultyRating);
            classRating.PlayersRating      = newClassRating;
            classRating.DifficultyRating   = newDifficultyRating;
            _simulatorRating.PlayersRating = newSimRating;

            if (!classRating.DifficultySettings.WasUserSelected)
            {
                classRating.DifficultySettings.SelectedDifficulty = classRating.DifficultyRating.Difficulty;
            }

            _simulatorRating.LastPlayerClass = driverFinishState.CarClass;
            RaceResult result = new RaceResult()
            {
                CarName               = driverFinishState.CarName,
                ClassName             = driverFinishState.CarClass,
                CreationTime          = DateTime.Now,
                FinishingPosition     = driverFinishState.FinishPosition,
                TrackName             = trackName,
                Difficulty            = difficulty,
                SimulatorRatingChange = new RatingChange()
                {
                    RatingBeforeChange = oldSimRating.Rating,
                    RatingAfterChange  = newSimRating.Rating
                },
                ClassRatingChange = new RatingChange()
                {
                    RatingBeforeChange = oldClassRating.Rating,
                    RatingAfterChange  = newClassRating.Rating
                },
            };

            _simulatorRating.Results.Add(result);
            _simulatorRating.Results = _simulatorRating.Results.Take(500).ToList();
            _ratingRepository.SaveRatings(_ratings);
            NotifyRatingsChanges(CreateChangeArgs(oldClassRating, classRating.PlayersRating, driverFinishState.CarClass), CreateChangeArgs(oldSimRating, _simulatorRating.PlayersRating, SimulatorName), CreateChangeArgs(oldDifficultyRating, newDifficultyRating, driverFinishState.CarClass));
        }
예제 #10
0
        public async Task <ActionResult <AllClassRatingResponse[]> > getGymClassRatings(int gymid)
        {
            Gym gym = await gymRepository.getGymById(gymid);

            if (gym == null)
            {
                return(StatusCode(StatusCodes.Status404NotFound, "Specified gym does not exist!"));
            }

            GymClasses[] classes = await classRepository.getGymClasses(gymid);

            AllClassRatingResponse[] responses = new AllClassRatingResponse[classes.Length];

            for (int i = 0; i < classes.Length; i++)
            {
                ClassRating rating = await classRatingRepository.getRating(classes[i].ClassId);

                if (rating == null)
                {
                    rating = new ClassRating();

                    rating.ClassIdForeignKey = classes[i].ClassId;
                    rating.RatingCount       = 0;
                    rating.RatingSum         = 0;
                }

                responses[i] = new AllClassRatingResponse();

                responses[i].Name        = classes[i].Name;
                responses[i].Instructor  = classes[i].InstructorUsername;
                responses[i].Day         = classes[i].Day;
                responses[i].Time        = classes[i].StartTime;
                responses[i].RatingSum   = rating.RatingSum;
                responses[i].RatingCount = rating.RatingCount;
            }

            return(Ok(responses));
        }
예제 #11
0
        public async Task <ActionResult <ClassRatingResponse> > rateClass(ClassRatingRequest request)
        {
            /* Validate User Exists */
            Users user = await userRepository.getUser(request.username);

            if (user == null)
            {
                return(StatusCode(StatusCodes.Status401Unauthorized, "User specified is not a valid user!"));
            }

            /* Validate Class Exists */
            GymClasses gymClass = await classRepository.getClassById(request.classId);

            if (gymClass == null)
            {
                return(StatusCode(StatusCodes.Status404NotFound, "Specified class does not exist!"));
            }

            /* Validate From Same Gym */
            if (gymClass.GymIdForeignKey != user.GymIdForeignKey)
            {
                return(StatusCode(StatusCodes.Status401Unauthorized, "User rating the class is not from the same gym as the class!"));
            }

            /* Validate Not Instructor Of Class */
            if (gymClass.InstructorUsername == user.Username)
            {
                return(StatusCode(StatusCodes.Status401Unauthorized, "Instructors cannot rate their own classes!"));
            }

            /* Validate Rating Out Of 5 */
            if (request.rating > 5 || request.rating < 0)
            {
                return(StatusCode(StatusCodes.Status400BadRequest, "Rating provided is out of allowed range!"));
            }

            /* Check if existing rating record exists */
            ClassRating rating = await classRatingRepository.getRating(request.classId);

            if (rating == null)
            {
                rating = new ClassRating();

                rating.ClassIdForeignKey = request.classId;
                rating.RatingCount       = 0;
                rating.RatingCount       = 0;

                if (!(await classRatingRepository.addRating(rating)))
                {
                    return(StatusCode(StatusCodes.Status500InternalServerError, "Something went wrong creating the rating record for the class!"));
                }
            }

            rating.RatingCount++;
            rating.RatingSum += request.rating;

            if (!(await classRatingRepository.rateClass(rating)))
            {
                return(StatusCode(StatusCodes.Status500InternalServerError, "Something went wrong adding your rating to the database!"));
            }

            ClassRatingResponse response = new ClassRatingResponse();

            response.classId     = rating.ClassIdForeignKey;
            response.ratingCount = rating.RatingCount;
            response.ratingSum   = rating.RatingSum;

            return(Ok(response));
        }
예제 #12
0
 public async Task <bool> rateClass(ClassRating rating)
 {
     context.Update(rating);
     return((await context.SaveChangesAsync()) > 0);
 }
예제 #13
0
 public async Task <bool> addRating(ClassRating rating)
 {
     context.Add(rating);
     return((await context.SaveChangesAsync()) > 0);
 }