Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

091724/samples api view #9038

Merged
merged 2 commits into from
Oct 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ select {
}

.nav-link:hover, .nav-link:focus {
text-decoration: none;
text-decoration: none !important;
color: var(--link-active);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
$base-bg-color: #fbfaff;
--base-bg-color: #{$base-bg-color};
--base-fg-color: #{tint-color($base-bg-color, 100%)};
--editor-bg-color: #fafafa;
$base-text-color: #212529;
--base-text-color: #{$base-text-color};
--text-muted-color: #{tint-color($base-text-color, 30%)};
Expand Down Expand Up @@ -92,6 +93,7 @@
$base-bg-color: #010409;
--base-bg-color: #{$base-bg-color};
--base-fg-color: #{tint-color($base-bg-color, 5%)};
--editor-bg-color: #1e1e1e;
$base-text-color: #c9d1d9;
--base-text-color: #{$base-text-color};
--text-muted-color: #{shade-color($base-text-color, 30%)};
Expand Down Expand Up @@ -181,6 +183,7 @@
$base-bg-color: #1a1a1a;
--base-bg-color: #{$base-bg-color};
--base-fg-color: #2b2b2b;
--editor-bg-color: #1e1e1e;
$base-text-color: #A9B7C6;
--base-text-color: #{$base-text-color};
--text-muted-color: #{shade-color($base-text-color, 30%)};
Expand Down
22 changes: 16 additions & 6 deletions src/dotnet/APIView/APIViewWeb/Helpers/APIHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,17 @@ public int PageSize
}
}

public class ReviewFilterAndSortParams
public class FilterAndSortParams
{
public string Name { get; set; }
public IEnumerable<string> Languages { get; set; }
public string SortField { get; set; } = "LastUpdatedOn";
public int SortOrder { get; set; } = 1;
public bool? IsApproved { get; set; }
}

public class APIRevisionsFilterAndSortParams : ReviewFilterAndSortParams
{
public bool IsDeleted { get; set; }
public bool AssignedToMe { get; set; }
public string Label { get; set; }
public string Title { get; set; }
public string Author { get; set; }
public string ReviewId { get; set; }
public bool WithTreeStyleTokens { get; set; }
Expand All @@ -47,14 +44,27 @@ public class APIRevisionSoftDeleteParam
public IEnumerable<string> apiRevisionIds { get; set; }
}

public class ReviewCreationParam
public class SamplesRevisionSoftDeleteParam
{
public string reviewId { get; set; }
public IEnumerable<string> samplesRevisionIds { get; set; }
}

public class ReviewCreationParam
{
public IFormFile File { get; set; }
public string Language { get; set; }
public string Label { get; set; }
public string FilePath { get; set; }
}

public class UsageSampleAPIParam
{
public IFormFile File { get; set; }
public string Title { get; set; }
public string Content { get; set; }
}

public class PagedList<T> : List<T>
{
public PagedList(IEnumerable<T> items, int noOfItemsRead, int totalCount, int pageSize)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,26 @@ public APIRevisionsController(ILogger<APIRevisionsController> logger,
}

/// <summary>
/// Endpoint used by Client SPA for listing reviews.
/// Get the APIRevisions for a Review filtered by query parameters
/// </summary>
/// <param name="reviewId"></param>
/// <param name="apiRevisionType"></param>
/// <returns></returns>
[HttpGet("{reviewId}/latest", Name = "GetAPIRevision")]
public async Task<ActionResult<APIRevisionListItemModel>> GetLatestAPIRevisionAsync(string reviewId, APIRevisionType apiRevisionType = APIRevisionType.All)
{
var result = await _apiRevisionsManager.GetLatestAPIRevisionsAsync(reviewId: reviewId, apiRevisionType: apiRevisionType);
return new LeanJsonResult(result, StatusCodes.Status200OK);
}

/// <summary>
/// Endpoint used by Client SPA for listing API Revisions.
/// </summary>
/// <param name="pageParams"></param>
/// <param name="filterAndSortParams"></param>
/// <returns></returns>
[HttpPost(Name = "GetAPIRevisions")]
public async Task<ActionResult<PagedList<APIRevisionListItemModel>>> GetAPIRevisionsAsync([FromQuery] PageParams pageParams, [FromBody] APIRevisionsFilterAndSortParams filterAndSortParams)
public async Task<ActionResult<PagedList<APIRevisionListItemModel>>> GetAPIRevisionsAsync([FromQuery] PageParams pageParams, [FromBody] FilterAndSortParams filterAndSortParams)
{
var result = await _apiRevisionsManager.GetAPIRevisionsAsync(User, pageParams, filterAndSortParams);
Response.AddPaginationHeader(new PaginationHeader(result.NoOfItemsRead, result.PageSize, result.TotalCount));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,12 @@ public CommentsController(ILogger<CommentsController> logger, ICommentsManager c
/// </summary>
/// <param name="reviewId"></param>
/// <param name="isDeleted"></param>
/// <param name="commentType"></param>
/// <returns></returns>
[HttpGet("{reviewId}", Name = "GetComments")]
public async Task<ActionResult<IEnumerable<CommentItemModel>>> GetCommentsAsync(string reviewId, bool isDeleted = false)
public async Task<ActionResult<IEnumerable<CommentItemModel>>> GetCommentsAsync(string reviewId, bool isDeleted = false, CommentType? commentType = null)
{
var comments = await _commentsManager.GetCommentsAsync(reviewId, isDeleted);
var comments = await _commentsManager.GetCommentsAsync(reviewId, isDeleted, commentType);
return new LeanJsonResult(comments, StatusCodes.Status200OK);
}

Expand Down Expand Up @@ -96,16 +97,19 @@ public async Task<ActionResult<IEnumerable<CommentItemModel>>> GetConversationIn
/// </summary>
/// <param name="reviewId"></param>
/// <param name="apiRevisionId"></param>
/// <param name="sampleRevisionId"></param>
/// <param name="elementId"></param>
/// <param name="commentText"></param>
/// <param name="commentType"></param>
/// <param name="resolutionLocked"></param>
/// <returns></returns>
[HttpPost(Name = "CreateComment")]
public async Task<ActionResult> CreateCommentAsync(
string reviewId, string apiRevisionId, string elementId, string commentText, CommentType commentType, bool resolutionLocked = false)
string reviewId, string elementId, string commentText,
CommentType commentType, string apiRevisionId = null, string sampleRevisionId = null,
bool resolutionLocked = false)
{
if (string.IsNullOrEmpty(commentText))
if (string.IsNullOrEmpty(commentText) || (string.IsNullOrEmpty(apiRevisionId) && string.IsNullOrEmpty(sampleRevisionId)))
{
return new BadRequestResult();
}
Expand All @@ -114,6 +118,7 @@ public async Task<ActionResult> CreateCommentAsync(
{
ReviewId = reviewId,
APIRevisionId = apiRevisionId,
SampleRevisionId = sampleRevisionId,
ElementId = elementId,
CommentText = commentText,
ResolutionLocked = resolutionLocked,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public ReviewsController(ILogger<ReviewsController> logger,
/// <param name="filterAndSortParams"></param>
/// <returns></returns>
[HttpGet(Name = "GetReviews")]
public async Task<ActionResult<PagedList<ReviewListItemModel>>> GetReviewsAsync([FromQuery] PageParams pageParams, [FromQuery] ReviewFilterAndSortParams filterAndSortParams)
public async Task<ActionResult<PagedList<ReviewListItemModel>>> GetReviewsAsync([FromQuery] PageParams pageParams, [FromQuery] FilterAndSortParams filterAndSortParams)
{
var result = await _reviewManager.GetReviewsAsync(pageParams, filterAndSortParams);
Response.AddPaginationHeader(new PaginationHeader(result.NoOfItemsRead, result.PageSize, result.TotalCount));
Expand Down Expand Up @@ -151,7 +151,7 @@ public async Task<ActionResult<CodePanelData>> GetReviewContentAsync(string revi

if (activeAPIRevision.Files[0].ParserStyle == ParserStyle.Tree)
{
var comments = await _commentsManager.GetCommentsAsync(reviewId);
var comments = await _commentsManager.GetCommentsAsync(reviewId, commentType: CommentType.APIRevision);
var activeRevisionReviewCodeFile = await _codeFileRepository.GetCodeFileFromStorageAsync(revisionId: activeAPIRevision.Id, codeFileId: activeAPIRevision.Files[0].FileId);

var codePanelRawData = new CodePanelRawData()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
using Microsoft.Extensions.Logging;
using APIViewWeb.Helpers;
using APIViewWeb.LeanModels;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using APIViewWeb.Managers;
using APIViewWeb.Extensions;

namespace APIViewWeb.LeanControllers
{
public class SamplesRevisionsController : BaseApiController
{
private readonly ILogger<SamplesRevisionsController> _logger;
private readonly ISamplesRevisionsManager _samplesRevisionsManager;
private readonly ICommentsManager _commentsManager;

public SamplesRevisionsController(ILogger<SamplesRevisionsController> logger,
ISamplesRevisionsManager samplesRevisionsManager, ICommentsManager commentsManager)
{
_logger = logger;
_samplesRevisionsManager = samplesRevisionsManager;
_commentsManager = commentsManager;
}

/// <summary>
/// Get the APIRevisions for a Review filtered by query parameters
/// </summary>
/// <param name="reviewId"></param>
/// <returns></returns>
[HttpGet("{reviewId}/latest", Name = "GetSampleRevision")]
public async Task<ActionResult<SamplesRevisionModel>> GetLatestSampleRevisionAsync(string reviewId)
{
var result = await _samplesRevisionsManager.GetLatestSampleRevisionsAsync(reviewId: reviewId);
if (result != null)
{
return new LeanJsonResult(result, StatusCodes.Status200OK);
}
else
{
return new LeanJsonResult("No SamplesRevision found", StatusCodes.Status404NotFound);
}
}


/// <summary>
/// Endpoint used by Client SPA for listing samples revisions.
/// </summary>
/// <param name="pageParams"></param>
/// <param name="filterAndSortParams"></param>
/// <returns></returns>
[HttpPost(Name = "GetSamplesRevisions")]
public async Task<ActionResult<PagedList<SamplesRevisionModel>>> GetSamplesRevisionsAsync([FromQuery] PageParams pageParams, [FromBody] FilterAndSortParams filterAndSortParams)
{
var result = await _samplesRevisionsManager.GetSamplesRevisionsAsync(User, pageParams, filterAndSortParams);
Response.AddPaginationHeader(new PaginationHeader(result.NoOfItemsRead, result.PageSize, result.TotalCount));
return new LeanJsonResult(result, StatusCodes.Status200OK);
}


/// <summary>
/// Create usage sample revision
/// </summary>
/// <param name="reviewId"></param>
/// <param name="usageSampleAPIParam"></param>
/// <returns></returns>
[HttpPost("{reviewId}/create", Name = "CreateUsageSample")]
public async Task<ActionResult<SamplesRevisionModel>> CreateUsageSampleAsync(string reviewId, [FromForm] UsageSampleAPIParam usageSampleAPIParam)
{
if (!string.IsNullOrEmpty(usageSampleAPIParam.Content))
{
var samplesRevision = await _samplesRevisionsManager.UpsertSamplesRevisionsAsync(User, reviewId, usageSampleAPIParam.Content, usageSampleAPIParam.Title);
return new LeanJsonResult(samplesRevision, StatusCodes.Status200OK);
}
else if (usageSampleAPIParam.File != null)
{
var samplesRevision = await _samplesRevisionsManager.UpsertSamplesRevisionsAsync(User, reviewId, usageSampleAPIParam.File.OpenReadStream(), usageSampleAPIParam.Title, usageSampleAPIParam.File.FileName);
return new LeanJsonResult(samplesRevision, StatusCodes.Status200OK);
}
else
{
return BadRequest();
}
}

/// <summary>
/// Update usage sample revision
/// </summary>
/// <param name="reviewId"></param>
/// <param name="sampleRevisionId"></param>
/// <param name="usageSampleAPIParam"></param>
/// <returns></returns>
[HttpPatch("{reviewId}/update", Name = "UpdateUsageSample")]
public async Task UpdateUsageSampleAsync(string reviewId, string sampleRevisionId, [FromForm] UsageSampleAPIParam usageSampleAPIParam)
{
await _samplesRevisionsManager.UpdateSamplesRevisionAsync(User, reviewId, sampleRevisionId, usageSampleAPIParam.Content, usageSampleAPIParam.Title);
}

/// <summary>
/// Endpoint used by Client SPA for Deleting Usage Sample.
/// </summary>
/// <param name="deleteParams"></param>
/// <returns></returns>
[HttpPut("delete", Name = "DeleteUsageSample")]
public async Task DeleteUsageSampleAsync([FromBody] SamplesRevisionSoftDeleteParam deleteParams)
{
foreach (var revisionId in deleteParams.samplesRevisionIds)
{
await _samplesRevisionsManager.DeleteSamplesRevisionAsync(User, deleteParams.reviewId, revisionId);
}
}

[Route("{reviewId}/content")]
[HttpGet]
public async Task<ActionResult<string>> GetSamplesContentAsync(string reviewId, [FromQuery] string activeSamplesRevisionId)
{
var activeSamplesRevision = await _samplesRevisionsManager.GetSamplesRevisionAsync(reviewId, activeSamplesRevisionId);
if (activeSamplesRevision != null)
{
string samplesContent = await _samplesRevisionsManager.GetSamplesRevisionContentAsync(activeSamplesRevision.OriginalFileId);
return new LeanJsonResult(samplesContent, StatusCodes.Status200OK);
}
return new LeanJsonResult("SamplesRevision NotFound", StatusCodes.Status404NotFound);
}
}
}
3 changes: 0 additions & 3 deletions src/dotnet/APIView/APIViewWeb/LeanModels/CodePanelModels.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
using APIView.TreeToken;
using APIView;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Text.Json.Serialization;
using APIView.Model.V2;
using ApiView;
using Microsoft.CodeAnalysis;
using System.Text;

namespace APIViewWeb.LeanModels
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public class CommentItemModel
public string Id { get; set; } = IdHelper.GenerateId();
public string ReviewId { get; set; }
public string APIRevisionId { get; set; }
public string SampleRevisionId { get; set; }
public string ElementId { get; set; }
public string SectionClass { get; set; }
public string CommentText { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,10 +143,8 @@ public string PackageVersion
}


public class SamplesRevisionModel
public class SamplesRevisionModel : BaseListitemModel
{
[JsonProperty("id")]
public string Id { get; set; } = IdHelper.GenerateId();
public string ReviewId { get; set; }
public string FileId { get; set; } = IdHelper.GenerateId();
public string OriginalFileId { get; set; } = IdHelper.GenerateId();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public APIRevisionsManager(
/// <param name="pageParams"></param> Contains paginationinfo
/// <param name="filterAndSortParams"></param> Contains filter and sort parameters
/// <returns></returns>
public async Task<PagedList<APIRevisionListItemModel>> GetAPIRevisionsAsync(ClaimsPrincipal user, PageParams pageParams, APIRevisionsFilterAndSortParams filterAndSortParams)
public async Task<PagedList<APIRevisionListItemModel>> GetAPIRevisionsAsync(ClaimsPrincipal user, PageParams pageParams, FilterAndSortParams filterAndSortParams)
{
var revisions = await _apiRevisionsRepository.GetAPIRevisionsAsync(user, pageParams, filterAndSortParams);
List<APIRevisionListItemModel> upgradedList = [];
Expand Down
6 changes: 2 additions & 4 deletions src/dotnet/APIView/APIViewWeb/Managers/CommentsManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,8 @@
using Microsoft.AspNetCore.Authorization;
using Newtonsoft.Json;
using Microsoft.Extensions.Options;
using Microsoft.TeamFoundation.Common;
using APIViewWeb.LeanModels;
using APIViewWeb.Helpers;
using Microsoft.AspNetCore.Mvc.ViewEngines;

namespace APIViewWeb.Managers
{
Expand Down Expand Up @@ -74,9 +72,9 @@ public async void LoadTaggableUsers()
TaggableUsers = new HashSet<GithubUser>(TaggableUsers.OrderBy(g => g.Login));
}

public async Task<IEnumerable<CommentItemModel>> GetCommentsAsync(string reviewId, bool isDeleted = false)
public async Task<IEnumerable<CommentItemModel>> GetCommentsAsync(string reviewId, bool isDeleted = false, CommentType? commentType = null)
{
return await _commentsRepository.GetCommentsAsync(reviewId, isDeleted);
return await _commentsRepository.GetCommentsAsync(reviewId, isDeleted, commentType);
}

public async Task<ReviewCommentsModel> GetReviewCommentsAsync(string reviewId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,14 @@
using System.Security.Claims;
using System.Threading.Tasks;
using APIView.Model;
using Microsoft.ApplicationInsights;
using Microsoft.AspNetCore.Http;

namespace APIViewWeb.Managers.Interfaces
{
public interface IAPIRevisionsManager
{
public Task<IEnumerable<APIRevisionListItemModel>> GetAPIRevisionsAsync(string reviewId, string packageVersion = "", APIRevisionType apiRevisionType = APIRevisionType.All);
public Task<PagedList<APIRevisionListItemModel>> GetAPIRevisionsAsync(ClaimsPrincipal user, PageParams pageParams, APIRevisionsFilterAndSortParams filterAndSortParams);
public Task<PagedList<APIRevisionListItemModel>> GetAPIRevisionsAsync(ClaimsPrincipal user, PageParams pageParams, FilterAndSortParams filterAndSortParams);
public Task<APIRevisionListItemModel> GetLatestAPIRevisionsAsync(string reviewId = null, IEnumerable<APIRevisionListItemModel> apiRevisions = null, APIRevisionType apiRevisionType = APIRevisionType.All);
public Task<APIRevisionListItemModel> GetAPIRevisionAsync(ClaimsPrincipal user, string apiRevisionId);
public Task<APIRevisionListItemModel> GetAPIRevisionAsync(string apiRevisionId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace APIViewWeb.Managers
public interface ICommentsManager
{
public void LoadTaggableUsers();
public Task<IEnumerable<CommentItemModel>> GetCommentsAsync(string reviewId, bool isDeleted = false);
public Task<IEnumerable<CommentItemModel>> GetCommentsAsync(string reviewId, bool isDeleted = false, CommentType? commentType = null);
public Task<ReviewCommentsModel> GetReviewCommentsAsync(string reviewId);
public Task<ReviewCommentsModel> GetUsageSampleCommentsAsync(string reviewId);
public Task AddCommentAsync(ClaimsPrincipal user, CommentItemModel comment);
Expand Down
Loading