public async Task <ReviewRelationshipsResultSet> GetReviewRelationships(int artifactId, int userId, bool addDrafts = true, int?versionId = null)
        {
            var revisionId = await _itemInfoRepository.GetRevisionId(artifactId, userId, versionId);

            var reviewType = new List <int> {
                (int)LinkType.ReviewPackageReference
            };
            var reviewLinks = (await GetLinkInfo(artifactId, userId, addDrafts, revisionId, reviewType)).ToList();
            var result      = new ReviewRelationshipsResultSet {
            };

            if (reviewLinks != null)
            {
                var distinctReviewIds   = reviewLinks.Select(a => a.SourceItemId).Distinct().ToList();
                var reviewIdsWithAccess = new List <int>();
                var reviewPermissions   = await _artifactPermissionsRepository.GetArtifactPermissions(distinctReviewIds, userId);

                foreach (var reviewId in distinctReviewIds)
                {
                    if (SqlArtifactPermissionsRepository.HasPermissions(reviewId, reviewPermissions, RolePermissions.Read))
                    {
                        reviewIdsWithAccess.Add(reviewId);
                    }
                }

                var itemDetailsDictionary = (await _itemInfoRepository.GetItemsDetails(userId, reviewIdsWithAccess, true, revisionId))
                                            .ToDictionary(a => a.HolderId);
                var itemRawDataDictionary = (await _itemInfoRepository.GetItemsRawDataCreatedDate(userId, reviewIdsWithAccess, true, revisionId))
                                            .ToDictionary(a => a.ItemId);
                var referencedReviewArtifacts = new List <ReferencedReviewArtifact>();
                ItemRawDataCreatedDate itemRawDataCreatedDate;
                ItemDetails            itemDetails;
                foreach (var reviewId in reviewIdsWithAccess)
                {
                    if ((itemRawDataDictionary.TryGetValue(reviewId, out itemRawDataCreatedDate)) && (itemDetailsDictionary.TryGetValue(reviewId, out itemDetails)))
                    {
                        var status = ReviewRawDataHelper.ExtractReviewStatus(itemRawDataCreatedDate.RawData);
                        referencedReviewArtifacts.Add(new ReferencedReviewArtifact
                        {
                            ItemId         = reviewId,
                            Status         = status,
                            CreatedDate    = itemRawDataCreatedDate.CreatedDateTime,
                            ItemName       = itemDetails.Name,
                            ItemTypePrefix = itemDetails.Prefix
                        });
                    }
                }
                result.ReviewArtifacts = referencedReviewArtifacts;
            }
            return(result);
        }
Example #2
0
        public Review(ReviewData reviewData)
        {
            if (reviewData == null)
            {
                throw new ArgumentNullException(nameof(reviewData));
            }

            Id         = reviewData.Id;
            BaselineId = reviewData.BaselineId;

            if (!ReviewRawDataHelper.TryRestoreData(reviewData.ReviewContentsXml, out _contents))
            {
                _contents = new RDReviewContents();
            }

            if (!ReviewRawDataHelper.TryRestoreData(reviewData.ReviewPackageRawDataXml, out _reviewPackageRawData))
            {
                _reviewPackageRawData = new ReviewPackageRawData();
            }
        }
Example #3
0
        public async Task <ReviewChangeItemsStatusResult> AssignApprovalRequiredToArtifactsAsync(int reviewId, AssignArtifactsApprovalParameter content, int userId)
        {
            if ((content.ItemIds == null || !content.ItemIds.Any()) && content.SelectionType == SelectionType.Selected)
            {
                throw new BadRequestException("Incorrect input parameters", ErrorCodes.OutOfRangeParameter);
            }

            if (!await _permissionsRepository.HasEditPermissions(reviewId, userId))
            {
                throw ReviewsExceptionHelper.UserCannotModifyReviewException(reviewId);
            }

            var reviewInfo = await GetReviewInfoAsync(reviewId, userId);

            if (reviewInfo.LockedByUserId.GetValueOrDefault() != userId)
            {
                throw ExceptionHelper.ArtifactNotLockedException(reviewId, userId);
            }

            var review = await _reviewsRepository.GetReviewAsync(reviewId, userId);

            if (review.ReviewStatus == ReviewPackageStatus.Closed)
            {
                throw ReviewsExceptionHelper.ReviewClosedException();
            }

            if (review.Contents.Artifacts == null ||
                !review.Contents.Artifacts.Any())
            {
                throw ExceptionHelper.ArtifactDoesNotSupportOperation(reviewId);
            }

            // If review is active and formal we throw conflict exception. No changes allowed
            if (review.ReviewStatus == ReviewPackageStatus.Active &&
                review.ReviewType == ReviewType.Formal)
            {
                throw ReviewsExceptionHelper.ReviewActiveFormalException();
            }
            foreach (var artifact in review.Contents.Artifacts)
            {
                if (artifact.ApprovalNotRequested == null)
                {
                    artifact.ApprovalNotRequested = (review.BaselineId == null);
                }
            }
            var resultErrors = new List <ReviewChangeItemsError>();

            var updatingArtifacts = GetReviewArtifacts(content, resultErrors, review.Contents);

            if (updatingArtifacts.Any())
            {
                // For Informal review
                await ExcludeDeletedAndNotInProjectArtifacts(content, review, reviewInfo.ProjectId, resultErrors, updatingArtifacts);
                await ExcludeArtifactsWithoutReadPermissions(content, userId, resultErrors, updatingArtifacts);

                var reviewRawData = review.ReviewPackageRawData;
                if (review.ReviewStatus == ReviewPackageStatus.Active &&
                    updatingArtifacts.Any() &&
                    content.ApprovalRequired)
                {
                    var hasArtifactsRequireApproval = review.Contents.Artifacts.FirstOrDefault(a => a.ApprovalNotRequested == false) != null;
                    // if Review has already artifacts require approval before current action it means that it is already converted to formal
                    if (!hasArtifactsRequireApproval)
                    {
                        var approver =
                            reviewRawData.Reviewers?.FirstOrDefault(r => r.Permission == ReviewParticipantRole.Approver);
                        if (approver != null)
                        {
                            throw new ConflictException(
                                      "Could not update review artifacts because review needs to be converted to Formal.",
                                      ErrorCodes.ReviewNeedsToMoveBackToDraftState);
                        }
                    }
                }

                foreach (var updatingArtifact in updatingArtifacts)
                {
                    updatingArtifact.ApprovalNotRequested = !content.ApprovalRequired;
                }

                var resultArtifactsXml = ReviewRawDataHelper.GetStoreData(review.Contents);

                await _reviewsRepository.UpdateReviewArtifactsAsync(reviewId, userId, resultArtifactsXml, null, false);

                if (content.ApprovalRequired)
                {
                    await EnableRequireESignatureWhenProjectESignatureEnabledByDefaultAsync(reviewId, userId, reviewInfo.ProjectId, reviewRawData);
                }
            }

            var result = new ReviewChangeItemsStatusResult();

            result.ReviewType = await _reviewsRepository.GetReviewTypeAsync(reviewId, userId);

            if (resultErrors.Any())
            {
                result.ReviewChangeItemErrors = resultErrors;
            }

            return(result);
        }