/// <summary> /// add single rating to the database or update it with new value /// </summary> /// /// <param name="song"> /// song to add the rating to /// </param> /// /// <param name="ratingUser"> /// who's adding this rating? /// </param> /// /// <param name="rating"> /// rating value: either 1 or -1 /// </param> /// /// <returns> /// A boolean indicating if rating was in the right input range (between -1 to 1) /// </returns> public virtual PlaylistSongRating RateSong(PlaylistSongRating playlistSongRating, FbUser ratingUser, short rating, bool isAddedByAdmin = false, bool isNewSong = false) { if (PlaylistSongRating.IsRatingValueInvalid(rating)) { return null; } RatingStatus ratingType = RatingStatus.NothingNew; //var currentStatistics = GetCurrentStatistics(song); if (isAddedByAdmin) //if admin votes the song give it a special treatment { if (playlistSongRating.AdminRating != 0 && rating == 0) //admin just cleared his vote { ratingType = RatingStatus.RemovedRating; } if (playlistSongRating.AdminRating == 0 && rating != 0) //admin switched between positive and negative score { ratingType = RatingStatus.AddedNewRating; } if (playlistSongRating.AdminRating == 0 && rating == 0) //admin added song but didn't rate it (can be achieved through harvesting) { ratingType = RatingStatus.AddedNewEmptyRating; } playlistSongRating.SetAdminRating(playlistSongRating.AdminRating, rating, isNewSong); playlistSongRating.AdminRating = rating; } else { ratingType = playlistSongRating.AddRating(ratingUser, rating); } //note: AddRating also adds points to user as well as advances the NumberOfVotes and NumberOfSongs counters UpdateAggregatedInfo(ratingType, ratingUser, isNewSong, isAddedByAdmin); return playlistSongRating; }