/// <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); }