/// <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));
        }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        /// <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));
        }
Exemple #6
0
        /// <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);
        }
Exemple #7
0
        /// <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;
            }
        }
Exemple #8
0
 /// <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));
        }