From 10eefd35460d2c9ff7aa63358322173fb5c93fca Mon Sep 17 00:00:00 2001 From: Richard Date: Mon, 6 Jul 2026 22:34:33 +0200 Subject: [PATCH] Fix API offset limit 400 Bad Request, implement requested UI/UX improvements --- .../Endpoints/JobEndpoints.cs | 57 + src/Predictalytics.Api/wwwroot/css/style.css | 4 +- src/Predictalytics.Api/wwwroot/index.html | 34 +- src/Predictalytics.Api/wwwroot/js/app.js | 48 +- .../Services/AiStrategyAnalysisService.cs | 62 +- .../Services/ScoringService.cs | 103 +- .../Entities/AnalyticsEntities.cs | 3 + .../Entities/BackgroundJob.cs | 20 + src/Predictalytics.Domain/Entities/Market.cs | 6 +- .../Entities/TraderPosition.cs | 3 + src/Predictalytics.Domain/Enums/JobStatus.cs | 9 + src/Predictalytics.Domain/Enums/JobType.cs | 8 + .../Helpers/MarketOutcomeHelper.cs | 26 + .../Interfaces/IJobRepository.cs | 17 + .../Interfaces/ITraderRepository.cs | 1 + .../Data/Repositories/JobRepository.cs | 55 + .../Data/Repositories/MarketRepository.cs | 6 +- .../Data/Repositories/TraderRepository.cs | 25 +- ...260706160010_AddBackgroundJobs.Designer.cs | 1033 ++++++++++++++++ .../20260706160010_AddBackgroundJobs.cs | 67 ++ ...6182931_AddPositionCheckpoints.Designer.cs | 1036 ++++++++++++++++ .../20260706182931_AddPositionCheckpoints.cs | 29 + ...06185428_AddMarketEnhancements.Designer.cs | 1045 ++++++++++++++++ .../20260706185428_AddMarketEnhancements.cs | 51 + .../20260706200702_AddBankroll.Designer.cs | 1051 +++++++++++++++++ .../Migrations/20260706200702_AddBankroll.cs | 40 + .../Migrations/AppDbContextModelSnapshot.cs | 18 + .../Polymarket/PolymarketApiClient.cs | 10 + .../Providers/Polymarket/PolymarketModels.cs | 15 + .../Polymarket/PolymarketProvider.cs | 5 +- .../Services/CopytradingEstimator.cs | 17 +- .../Services/PositionPnLEngine.cs | 79 +- .../Services/TradeHistoryWorker.cs | 35 + .../Services/TradeRetentionWorker.cs | 3 +- .../Services/TraderAnalyticsWorker.cs | 24 + 35 files changed, 4900 insertions(+), 145 deletions(-) create mode 100644 src/Predictalytics.Api/Endpoints/JobEndpoints.cs create mode 100644 src/Predictalytics.Domain/Entities/BackgroundJob.cs create mode 100644 src/Predictalytics.Domain/Enums/JobStatus.cs create mode 100644 src/Predictalytics.Domain/Enums/JobType.cs create mode 100644 src/Predictalytics.Domain/Helpers/MarketOutcomeHelper.cs create mode 100644 src/Predictalytics.Domain/Interfaces/IJobRepository.cs create mode 100644 src/Predictalytics.Infrastructure/Data/Repositories/JobRepository.cs create mode 100644 src/Predictalytics.Infrastructure/Migrations/20260706160010_AddBackgroundJobs.Designer.cs create mode 100644 src/Predictalytics.Infrastructure/Migrations/20260706160010_AddBackgroundJobs.cs create mode 100644 src/Predictalytics.Infrastructure/Migrations/20260706182931_AddPositionCheckpoints.Designer.cs create mode 100644 src/Predictalytics.Infrastructure/Migrations/20260706182931_AddPositionCheckpoints.cs create mode 100644 src/Predictalytics.Infrastructure/Migrations/20260706185428_AddMarketEnhancements.Designer.cs create mode 100644 src/Predictalytics.Infrastructure/Migrations/20260706185428_AddMarketEnhancements.cs create mode 100644 src/Predictalytics.Infrastructure/Migrations/20260706200702_AddBankroll.Designer.cs create mode 100644 src/Predictalytics.Infrastructure/Migrations/20260706200702_AddBankroll.cs diff --git a/src/Predictalytics.Api/Endpoints/JobEndpoints.cs b/src/Predictalytics.Api/Endpoints/JobEndpoints.cs new file mode 100644 index 0000000..e3fe720 --- /dev/null +++ b/src/Predictalytics.Api/Endpoints/JobEndpoints.cs @@ -0,0 +1,57 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Routing; +using Predictalytics.Domain.Entities; +using Predictalytics.Domain.Enums; +using Predictalytics.Domain.Interfaces; + +namespace Predictalytics.Api.Endpoints; + +public static class JobEndpoints +{ + public static void MapJobEndpoints(this IEndpointRouteBuilder routes) + { + var group = routes.MapGroup("/api/jobs"); + + group.MapGet("/", async (IJobRepository repo, int skip = 0, int take = 50, CancellationToken ct = default) => + { + var jobs = await repo.GetAllAsync(skip, take, ct); + return Results.Ok(jobs.Select(j => new + { + j.Id, + JobType = j.JobType.ToString(), + Status = j.Status.ToString(), + j.TraderId, + TraderName = j.Trader?.DisplayName ?? j.Trader?.PlatformUserId, + j.CreatedAt, + j.StartedAt, + j.CompletedAt, + j.ErrorMessage + })); + }); + + group.MapPost("/sync/{traderId:int}", async (int traderId, IJobRepository repo, CancellationToken ct) => + { + var job = new BackgroundJob + { + JobType = JobType.HistorySync, + Status = JobStatus.Pending, + TraderId = traderId + }; + await repo.AddAsync(job, ct); + return Results.Ok(job.Id); + }); + + group.MapPost("/analyze/{traderId:int}", async (int traderId, IJobRepository repo, CancellationToken ct) => + { + var job = new BackgroundJob + { + JobType = JobType.TraderAnalysis, + Status = JobStatus.Pending, + TraderId = traderId + }; + await repo.AddAsync(job, ct); + return Results.Ok(job.Id); + }); + } +} diff --git a/src/Predictalytics.Api/wwwroot/css/style.css b/src/Predictalytics.Api/wwwroot/css/style.css index c4cbad4..0b145c1 100644 --- a/src/Predictalytics.Api/wwwroot/css/style.css +++ b/src/Predictalytics.Api/wwwroot/css/style.css @@ -462,8 +462,8 @@ body { .btn-tab:hover { background: var(--bg-input); color: var(--text-primary); } .btn-tab.active { background: var(--bg-input); - color: var(--primary) !important; - border-bottom: 2px solid var(--primary) !important; + color: var(--accent) !important; + border-bottom: 2px solid var(--accent) !important; border-radius: 6px 6px 0 0; } .stat-group { margin-bottom: 16px; } diff --git a/src/Predictalytics.Api/wwwroot/index.html b/src/Predictalytics.Api/wwwroot/index.html index 8a318be..a20bddc 100644 --- a/src/Predictalytics.Api/wwwroot/index.html +++ b/src/Predictalytics.Api/wwwroot/index.html @@ -142,17 +142,15 @@ - - - +
+ Win Rate > + +
+ +
+ Copyability > + +