update pagination

This commit is contained in:
2025-07-16 21:37:05 +07:00
parent f51fd5a5f7
commit b547c01787
13 changed files with 750 additions and 91 deletions

View File

@@ -141,13 +141,17 @@ public class BacktestController : BaseController
/// <param name="requestId">The request ID to filter backtests by.</param>
/// <param name="page">Page number (defaults to 1)</param>
/// <param name="pageSize">Number of items per page (defaults to 50, max 100)</param>
/// <param name="sortBy">Field to sort by (defaults to "score")</param>
/// <param name="sortOrder">Sort order - "asc" or "desc" (defaults to "desc")</param>
/// <returns>A paginated list of backtests associated with the specified request ID.</returns>
[HttpGet]
[Route("ByRequestId/{requestId}/Paginated")]
public async Task<ActionResult<PaginatedBacktestsResponse>> GetBacktestsByRequestIdPaginated(
string requestId,
int page = 1,
int pageSize = 50)
int pageSize = 50,
string sortBy = "score",
string sortOrder = "desc")
{
if (string.IsNullOrEmpty(requestId))
{
@@ -164,7 +168,12 @@ public class BacktestController : BaseController
return BadRequest("Page size must be between 1 and 100");
}
var (backtests, totalCount) = _backtester.GetBacktestsByRequestIdPaginated(requestId, page, pageSize);
if (sortOrder != "asc" && sortOrder != "desc")
{
return BadRequest("Sort order must be 'asc' or 'desc'");
}
var (backtests, totalCount) = _backtester.GetBacktestsByRequestIdPaginated(requestId, page, pageSize, sortBy, sortOrder);
var totalPages = (int)Math.Ceiling(totalCount / (double)pageSize);
@@ -182,6 +191,56 @@ public class BacktestController : BaseController
return Ok(response);
}
/// <summary>
/// Retrieves paginated backtests for the authenticated user.
/// </summary>
/// <param name="page">Page number (defaults to 1)</param>
/// <param name="pageSize">Number of items per page (defaults to 50, max 100)</param>
/// <param name="sortBy">Field to sort by (defaults to "score")</param>
/// <param name="sortOrder">Sort order - "asc" or "desc" (defaults to "desc")</param>
/// <returns>A paginated list of backtests for the user.</returns>
[HttpGet]
[Route("Paginated")]
public async Task<ActionResult<PaginatedBacktestsResponse>> GetBacktestsPaginated(
int page = 1,
int pageSize = 50,
string sortBy = "score",
string sortOrder = "desc")
{
var user = await GetUser();
if (page < 1)
{
return BadRequest("Page must be greater than 0");
}
if (pageSize < 1 || pageSize > 100)
{
return BadRequest("Page size must be between 1 and 100");
}
if (sortOrder != "asc" && sortOrder != "desc")
{
return BadRequest("Sort order must be 'asc' or 'desc'");
}
var (backtests, totalCount) = _backtester.GetBacktestsByUserPaginated(user, page, pageSize, sortBy, sortOrder);
var totalPages = (int)Math.Ceiling(totalCount / (double)pageSize);
var response = new PaginatedBacktestsResponse
{
Backtests = backtests,
TotalCount = totalCount,
CurrentPage = page,
PageSize = pageSize,
TotalPages = totalPages,
HasNextPage = page < totalPages,
HasPreviousPage = page > 1
};
return Ok(response);
}
/// <summary>
/// Runs a backtest with the specified configuration.
/// The returned backtest includes a complete TradingBotConfig that preserves all

View File

@@ -0,0 +1,44 @@
using Managing.Domain.Backtests;
namespace Managing.Api.Models.Requests;
/// <summary>
/// Response model for paginated backtest results
/// </summary>
public class PaginatedBacktestsResponse
{
/// <summary>
/// The list of backtests for the current page
/// </summary>
public IEnumerable<Backtest> Backtests { get; set; } = new List<Backtest>();
/// <summary>
/// Total number of backtests across all pages
/// </summary>
public int TotalCount { get; set; }
/// <summary>
/// Current page number
/// </summary>
public int CurrentPage { get; set; }
/// <summary>
/// Number of items per page
/// </summary>
public int PageSize { get; set; }
/// <summary>
/// Total number of pages
/// </summary>
public int TotalPages { get; set; }
/// <summary>
/// Whether there are more pages available
/// </summary>
public bool HasNextPage { get; set; }
/// <summary>
/// Whether there are previous pages available
/// </summary>
public bool HasPreviousPage { get; set; }
}