/// <summary> /// Adds new KindAction. /// </summary> /// <param name="kindAction">The KindAction.</param> /// <returns>The <see cref="Task" />.</returns> public async Task <KindActionResult> AddNewKindAction(KindAction kindAction) { kindAction.DateAdded = DateTime.UtcNow; var kindActionResult = await _kindActionRepository.AddKindAction(kindAction); if (kindActionResult.Status == OperationResultStatus.Success) { var user = await _userRepository.GetUser(kindAction.UserId); var oldUserPoints = user.Points; RewardsCalculator.UpdateUserAfterKindAction(user, kindAction); var userResult = await _userRepository.UpdateUser(user); if (userResult.Status != OperationResultStatus.Success) { return(new KindActionResult(userResult.Status, userResult.Description)); } // new points should always have value // ReSharper disable once PossibleInvalidOperationException await _ratingService.UpdateUserRating(user, oldUserPoints, user.Points.Value); return(new KindActionResult(user.Points.Value, user.CoinsCount ?? 0, user.KindScale.Value)); } return(new KindActionResult(kindActionResult.Status, kindActionResult.Description)); }
/// <summary> /// Adds the kindAction. /// </summary> /// <param name="kindAction"> /// The kindAction. /// </param> /// <returns> /// Task{AddResult}. /// </returns> public async Task <IdResult> AddKindAction(KindAction kindAction) { kindAction.Id = Guid.NewGuid().ToString("N"); var azureModel = kindAction.ToAzureModel(); return(await _azureManager.AddEntityAsync(azureModel)); }
/// <summary> /// To the azure model. /// </summary> /// <param name="kindAction">The kind action.</param> /// <returns>KindActionAzure.</returns> public static KindActionAzure ToAzureModel(this KindAction kindAction) { var azureModel = new KindActionAzure(); kindAction.CopyTo(azureModel); azureModel.Likes = kindAction.Likes.JoinToString(); azureModel.Dislikes = kindAction.Dislikes.JoinToString(); return(azureModel); }
public static Models.Api.KindAction ConvertToApi(this KindAction kindAction, string currentUserId) { var kindActionApi = new Models.Api.KindAction(); kindAction.CopyTo(kindActionApi); kindActionApi.LikesCount = kindAction.Likes?.Count ?? 0; kindActionApi.DislikesCount = kindAction.Dislikes?.Count ?? 0; kindActionApi.AlreadyLiked = (kindAction.Likes?.Contains(currentUserId) ?? false) || (kindAction.Dislikes?.Contains(currentUserId) ?? false); return(kindActionApi); }
/// <summary> /// Updates the specified kind action. /// </summary> /// <param name="kindAction">The kind action.</param> /// <returns></returns> public async Task <OperationResult> UpdateLikes(KindAction kindAction) { var existingKindAction = await GetKindAction(kindAction.Id, kindAction.UserId); if (existingKindAction == null) { return(OperationResult.NotFound); } kindAction.CopyTo(existingKindAction); return(new OperationResult(OperationResultStatus.Success)); }
/// <summary> /// Froms the azure model. /// </summary> /// <param name="azureModel">The azure model.</param> /// <returns>KindAction.</returns> public static KindAction FromAzureModel(this KindActionAzure azureModel) { if (azureModel == null) { return(null); } var domainModel = new KindAction(); azureModel.CopyTo(domainModel); domainModel.Likes = azureModel.Likes.SplitStringByDelimiter(); domainModel.Dislikes = azureModel.Dislikes.SplitStringByDelimiter(); return(domainModel); }
/// <summary> /// Updates the user ater kind action. /// </summary> /// <param name="user">The user.</param> /// <param name="kindAction">The kind action.</param> public static void UpdateUserAfterKindAction(User user, KindAction kindAction) { user.KindActionsCount = (user.KindActionsCount ?? 0) + 1; var withPhoto = !string.IsNullOrEmpty(kindAction.ImageUrl); //Update kind scale var oldKindScale = user.KindScale; user.KindScale += withPhoto ? GameConstants.KindScale.WithPhotoReward : GameConstants.KindScale.BaseReward; if (user.KindScale >= GameConstants.KindScale.MaxUserPoints) { user.KindScale = GameConstants.KindScale.MaxUserPoints; if (oldKindScale < GameConstants.KindScale.MaxUserPoints) { //increasing coins count once right after reaching 100% user.CoinsCount = (user.CoinsCount ?? 0) + GameConstants.Coins.IncreasePerKindActionMaxing; } } if (oldKindScale < GameConstants.KindScale.MaxUserPoints) { //Update light quality var light = user.PersonQualitiesWithScores.FirstOrDefault( pqws => pqws.PersonQualityId == GameConstants.PersonQuality.LightQualityId); if (light == null) { user.PersonQualitiesWithScores.Add( new PersonQualityIdWithScore { PersonQualityId = GameConstants.PersonQuality.LightQualityId, Score = GameConstants.PersonQuality.IncreasePerKindAction }); } else { light.Score += GameConstants.PersonQuality.IncreasePerKindAction; } UpdateRadrugaColor(user, false); //Update total score user.Points = (user.Points ?? 0) + GameConstants.Points.IncreasePerKindAction; } }
/// <summary> /// Adds the kind action. /// </summary> /// <param name="kindAction">The kind action.</param> /// <returns>Task{AddResult}.</returns> public Task <IdResult> AddKindAction(KindAction kindAction) { kindAction.Id = Guid.NewGuid().ToString(); KindActions.Add(kindAction); return(Task.FromResult(new IdResult(kindAction.Id))); }
/// <summary> /// Updates the specified kind action. /// </summary> /// <param name="kindAction">The kind action.</param> /// <returns></returns> public async Task <OperationResult> UpdateLikes(KindAction kindAction) { var updatedKindAction = kindAction.ToAzureModel(); return(await _azureManager.UpsertEntityAsync(updatedKindAction, false)); }