in src/dotnet/APIView/APIViewWeb/Helpers/PageModelHelpers.cs [245:375]
public static async Task<ReviewContentModel> GetReviewContentAsync(
IConfiguration configuration, IReviewManager reviewManager, UserPreferenceCache preferenceCache,
ICosmosUserProfileRepository userProfileRepository, IAPIRevisionsManager reviewRevisionsManager, ICommentsManager commentManager,
IBlobCodeFileRepository codeFileRepository, IHubContext<SignalRHub> signalRHubContext, ClaimsPrincipal user, ReviewListItemModel review = null, string reviewId = null,
string revisionId = null, string diffRevisionId = null, bool showDocumentation = false, bool showDiffOnly = false, int diffContextSize = 3,
string diffContextSeperator = "<br><span>.....</span><br>")
{
var reviewPageContent = new ReviewContentModel()
{
Directive = ReviewContentModelDirective.ProceedWithPageLoad
};
var userId = user.GetGitHubLogin();
if (review == null)
{
review = await reviewManager.GetReviewAsync(user, reviewId);
}
if (review == null)
{
reviewPageContent.Directive = ReviewContentModelDirective.TryGetlegacyReview;
return reviewPageContent;
}
var apiRevisions = await reviewRevisionsManager.GetAPIRevisionsAsync(review.Id);
// Try getting latest Automatic Revision, otherwise get latest of any type or default
var activeRevision = await reviewRevisionsManager.GetLatestAPIRevisionsAsync(review.Id, apiRevisions, APIRevisionType.Automatic);
if (activeRevision == null)
{
reviewPageContent.Directive = ReviewContentModelDirective.ErrorDueToInvalidAPIRevisonRedirectToIndexPage;
reviewPageContent.NotificationMessage = $"Review with ID {review.Id} has no valid APIRevisions";
return reviewPageContent;
}
APIRevisionListItemModel diffRevision = null;
if (!string.IsNullOrEmpty(revisionId)) {
if (apiRevisions.Where(x => x.Id == revisionId).Any())
{
activeRevision = apiRevisions.First(x => x.Id == revisionId);
}
else
{
reviewPageContent.NotificationMessage = $"A revision with ID {revisionId} does not exist for review with id {review.Id}";
reviewPageContent.Directive = ReviewContentModelDirective.ErrorDueToInvalidAPIRevisonRedirectToIndexPage;
return reviewPageContent;
}
}
if (activeRevision.Files[0].ParserStyle == ParserStyle.Tree)
{
reviewPageContent.Directive = ReviewContentModelDirective.RedirectToSPAUI;
reviewPageContent.ActiveAPIRevision = activeRevision;
return reviewPageContent;
}
var comments = await commentManager.GetReviewCommentsAsync(review.Id);
var activeRevisionRenderableCodeFile = await codeFileRepository.GetCodeFileAsync(activeRevision.Id, activeRevision.Files[0], activeRevision.Language);
var activeRevisionReviewCodeFile = activeRevisionRenderableCodeFile.CodeFile;
var fileDiagnostics = activeRevisionReviewCodeFile.Diagnostics ?? Array.Empty<CodeDiagnostic>();
var activeRevisionHtmlLines = activeRevisionRenderableCodeFile.Render(showDocumentation: showDocumentation);
var codeLines = new CodeLineModel[0];
var getCodeLines = false;
if (!string.IsNullOrEmpty(diffRevisionId))
{
if (apiRevisions.Where(x => x.Id == diffRevisionId).Any())
{
diffRevision = await reviewRevisionsManager.GetAPIRevisionAsync(user, diffRevisionId);
var diffRevisionRenderableCodeFile = await codeFileRepository.GetCodeFileAsync(diffRevisionId, diffRevision.Files[0], activeRevision.Language);
var diffRevisionHTMLLines = diffRevisionRenderableCodeFile.RenderReadOnly(showDocumentation: showDocumentation);
var diffRevisionTextLines = diffRevisionRenderableCodeFile.RenderText(showDocumentation: showDocumentation);
var activeRevisionTextLines = activeRevisionRenderableCodeFile.RenderText(showDocumentation: showDocumentation);
var diffLines = InlineDiff.Compute(diffRevisionTextLines, activeRevisionTextLines, diffRevisionHTMLLines, activeRevisionHtmlLines);
var headingsOfSectionsWithDiff = activeRevision.HeadingsOfSectionsWithDiff.ContainsKey(diffRevision.Id) ? activeRevision.HeadingsOfSectionsWithDiff[diffRevision.Id] : new HashSet<int>();
codeLines = CreateLines(diagnostics: fileDiagnostics, lines: diffLines, comments: comments, showDiffOnly: showDiffOnly,
reviewDiffContextSize: diffContextSize, diffContextSeparator: diffContextSeperator, headingsOfSectionsWithDiff: headingsOfSectionsWithDiff,
language: activeRevision.Language);
if (!codeLines.Any())
{
getCodeLines = true;
reviewPageContent.NotificationMessage = $"There is no diff between the two revisions. {activeRevision.Id} : {diffRevisionId}";
reviewPageContent.Directive = ReviewContentModelDirective.ErrorDueToInvalidAPIRevisonProceedWithPageLoad;
}
}
else
{
getCodeLines = true;
reviewPageContent.NotificationMessage = $"A diffRevision with ID {diffRevisionId} does not exist for this review.";
reviewPageContent.Directive = ReviewContentModelDirective.ErrorDueToInvalidAPIRevisonProceedWithPageLoad;
}
}
if (string.IsNullOrEmpty(diffRevisionId) || getCodeLines)
{
codeLines = CreateLines(diagnostics: fileDiagnostics, lines: activeRevisionHtmlLines, comments: comments, language: activeRevision.Language);
}
if (codeLines == null || codeLines.Length == 0)
{
reviewPageContent.NotificationMessage = $"A revision with ID {activeRevision.Id} has no content.";
reviewPageContent.Directive = ReviewContentModelDirective.ErrorDueToInvalidAPIRevisonRedirectToIndexPage;
return reviewPageContent;
}
reviewPageContent.codeLines = codeLines;
reviewPageContent.ActiveConversationsInActiveAPIRevision = ComputeActiveConversationsInActiveRevision(activeRevisionHtmlLines, comments);
HashSet<string> preferredApprovers = await GetPreferredApprovers(configuration, preferenceCache, userProfileRepository, user, review);
reviewPageContent.Review = review;
reviewPageContent.Navigation = activeRevisionRenderableCodeFile.CodeFile.Navigation;
reviewPageContent.APIRevisions = apiRevisions.OrderByDescending(c => c.CreatedOn);
reviewPageContent.ActiveAPIRevision = activeRevision;
reviewPageContent.DiffAPIRevision = diffRevision;
reviewPageContent.TotalActiveConversations = comments.Threads.Count(t => !t.IsResolved);
reviewPageContent.HasFatalDiagnostics = fileDiagnostics.Any(d => d.Level == APIView.CodeDiagnosticLevel.Fatal);
reviewPageContent.ActiveConversationsInActiveAPIRevision = ComputeActiveConversationsInActiveRevision(activeRevisionHtmlLines, comments);
reviewPageContent.ActiveConversationsInSampleRevisions = comments.Threads.Count(t => t.Comments.FirstOrDefault()?.CommentType == CommentType.SampleRevision);
reviewPageContent.PreferredApprovers = preferredApprovers;
reviewPageContent.TaggableUsers = commentManager.GetTaggableUsers();
reviewPageContent.PageHasLoadableSections = activeRevisionReviewCodeFile.LeafSections?.Any() ?? false;
return reviewPageContent;
}