Exemplo n.º 1
0
        /// <summary>
        ///     The approve request.
        /// </summary>
        /// <param name="id">The id.</param>
        /// <param name="starsCount">The stars count.</param>
        /// <returns>
        ///     The <see cref="Task" />.
        /// </returns>
        public async Task <OperationResult> ApproveRequest(string id, int starsCount)
        {
            var missionRequest = await _missionRequestRepository.GetMissionRequest(id);

            if (missionRequest == null || missionRequest.Status != MissionRequestStatus.NotChecked)
            {
                return(OperationResult.NotFound);
            }

            missionRequest.Status     = MissionRequestStatus.Approved;
            missionRequest.StarsCount = (byte)starsCount;

            var result = await _missionRequestRepository.UpdateMissionRequest(missionRequest);

            if (result.Status == OperationResultStatus.Error)
            {
                return(result);
            }

            var oldUserPoints = missionRequest.User.Points;
            await
            RewardsCalculator.UpdateUserAfterMissionCompletion(
                missionRequest,
                _missionRepository,
                _appCountersService);

            if (result.Status == OperationResultStatus.Error)
            {
                return(result);
            }

            var finalResult = await _userRepository.UpdateUser(missionRequest.User);

            if (finalResult.Status != OperationResultStatus.Error)
            {
                // new points should always have value
                // ReSharper disable once PossibleInvalidOperationException
                await _ratingService.UpdateUserRating(missionRequest.User, oldUserPoints, missionRequest.User.Points.Value);
            }

            await _notificationService.ApproveMissionNotify(missionRequest.UserId, missionRequest.Mission.Name);

            return(finalResult);
        }