feat(wbs): WBS M4/M5 C# domain engines & Vue 3 PrimeVue AG-Grid migration [WBS-10]
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using FastEndpoints;
|
||||
using QuantEngine.Application.Interfaces;
|
||||
|
||||
namespace QuantEngine.Web.Endpoints;
|
||||
|
||||
public record ApiGridRunDto(
|
||||
string RunId,
|
||||
string StartedAt,
|
||||
string? FinishedAt,
|
||||
string Status,
|
||||
int TotalSnapshots,
|
||||
int TotalErrors
|
||||
);
|
||||
|
||||
public record ApiGridDataResponse(
|
||||
bool IsConnected,
|
||||
int TotalCount,
|
||||
List<ApiGridRunDto> Items
|
||||
);
|
||||
|
||||
/// <summary>
|
||||
/// FastEndpoints API for High-Density Vue 3 / AG Grid Dashboard Data
|
||||
/// SOLID: Single Responsibility for serving clean DTO read-models to AG Grid.
|
||||
/// </summary>
|
||||
public class GetGridDataEndpoint : EndpointWithoutRequest<ApiGridDataResponse>
|
||||
{
|
||||
private readonly ICollectionReadModelService _readModelService;
|
||||
|
||||
public GetGridDataEndpoint(ICollectionReadModelService readModelService)
|
||||
{
|
||||
_readModelService = readModelService;
|
||||
}
|
||||
|
||||
public override void Configure()
|
||||
{
|
||||
Get("/api/admin/grid-data");
|
||||
AllowAnonymous(); // Accessible by Vue 3 Frontend
|
||||
}
|
||||
|
||||
public override async Task HandleAsync(CancellationToken ct)
|
||||
{
|
||||
var runs = await _readModelService.GetRecentRunsAsync(100);
|
||||
var items = new List<ApiGridRunDto>();
|
||||
|
||||
foreach (var run in runs)
|
||||
{
|
||||
items.Add(new ApiGridRunDto(
|
||||
run.RunId,
|
||||
run.StartedAt,
|
||||
run.FinishedAt,
|
||||
run.Status,
|
||||
run.TotalSnapshots ?? 0,
|
||||
run.TotalErrors ?? 0
|
||||
));
|
||||
}
|
||||
|
||||
await SendAsync(new ApiGridDataResponse(
|
||||
IsConnected: true,
|
||||
TotalCount: items.Count,
|
||||
Items: items
|
||||
), cancellation: ct);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
@* _DouzoneStatusChip.cshtml - Tabler & Douzone Standardized Status Chip Partial *@
|
||||
@model string
|
||||
|
||||
@{
|
||||
var status = Model?.ToLowerInvariant() ?? "";
|
||||
string chipClass = "badge-douzone-secondary";
|
||||
string label = Model ?? "-";
|
||||
|
||||
if (status is "completed" or "succeeded" or "pass" or "success")
|
||||
{
|
||||
chipClass = "style-pass";
|
||||
label = "완료 (PASS)";
|
||||
}
|
||||
else if (status is "running" or "retrying" or "warn" or "warning" or "in_progress")
|
||||
{
|
||||
chipClass = "style-warning";
|
||||
label = "진행 중 (WARN)";
|
||||
}
|
||||
else if (status is "failed" or "error" or "blocked" or "fail")
|
||||
{
|
||||
chipClass = "style-error";
|
||||
label = "오류 (FAIL)";
|
||||
}
|
||||
}
|
||||
|
||||
<span class="status-chip @chipClass">@label</span>
|
||||
@@ -1523,3 +1523,132 @@ System.IO.IOException: The process cannot access the file 'C:\Temp\data_feed\Tem
|
||||
2026-07-22 15:00:40.464 +09:00 [INF] Fetching price for ticker: 000660
|
||||
2026-07-22 15:00:40.513 +09:00 [INF] Loaded 11 tickers from GatherTradingData.json
|
||||
2026-07-22 15:00:40.551 +09:00 [INF] Price fetched successfully for 000660
|
||||
2026-07-22 15:16:09.771 +09:00 [INF] Request starting HTTP/1.1 GET http://localhost:5265/api/users - null null
|
||||
2026-07-22 15:16:09.776 +09:00 [WRN] Failed to determine the https port for redirect.
|
||||
2026-07-22 15:16:09.829 +09:00 [INF] Executing endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:16:11.907 +09:00 [INF] Executed endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:16:11.912 +09:00 [ERR] HTTP GET /api/users responded 500 in 2136.4697 ms
|
||||
System.OperationCanceledException: The operation was canceled.
|
||||
at System.Threading.CancellationToken.ThrowOperationCanceledException()
|
||||
at System.Threading.CancellationToken.ThrowIfCancellationRequested()
|
||||
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpResponsePipeWriter.FlushAsync(CancellationToken cancellationToken)
|
||||
at System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.SerializeAsync(PipeWriter pipeWriter, T rootValue, Int32 flushThreshold, CancellationToken cancellationToken, Object rootValueBoxed)
|
||||
at System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.SerializeAsync(PipeWriter pipeWriter, T rootValue, Int32 flushThreshold, CancellationToken cancellationToken, Object rootValueBoxed)
|
||||
at System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.SerializeAsync(PipeWriter pipeWriter, T rootValue, Int32 flushThreshold, CancellationToken cancellationToken, Object rootValueBoxed)
|
||||
at QuantEngine.Web.Endpoints.GetUsersEndpoint.HandleAsync(CancellationToken ct) in C:\Temp\data_feed\src\dotnet\QuantEngine.Web\Endpoints\UserEndpoints.cs:line 115
|
||||
at FastEndpoints.Endpoint`2.ExecAsync(CancellationToken ct)
|
||||
at FastEndpoints.Endpoint`2.ExecAsync(CancellationToken ct)
|
||||
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|7_0(Endpoint endpoint, Task requestTask, ILogger logger)
|
||||
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
|
||||
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
|
||||
at Serilog.AspNetCore.RequestLoggingMiddleware.Invoke(HttpContext httpContext)
|
||||
2026-07-22 15:16:11.930 +09:00 [INF] Request finished HTTP/1.1 GET http://localhost:5265/api/users - 499 null application/problem+json; charset=utf-8 2159.3847ms
|
||||
2026-07-22 15:16:47.425 +09:00 [INF] Request starting HTTP/1.1 GET http://localhost:5265/api/users - null null
|
||||
2026-07-22 15:16:47.435 +09:00 [INF] Executing endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:16:49.477 +09:00 [INF] Executed endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:16:49.478 +09:00 [ERR] HTTP GET /api/users responded 500 in 2052.7361 ms
|
||||
2026-07-22 15:16:49.478 +09:00 [INF] Request finished HTTP/1.1 GET http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2053.8681ms
|
||||
2026-07-22 15:16:49.486 +09:00 [INF] Request starting HTTP/1.1 GET http://localhost:5265/api/users - null null
|
||||
2026-07-22 15:16:49.492 +09:00 [INF] Executing endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:16:51.536 +09:00 [INF] Executed endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:16:51.536 +09:00 [ERR] HTTP GET /api/users responded 500 in 2049.8954 ms
|
||||
2026-07-22 15:16:51.537 +09:00 [INF] Request finished HTTP/1.1 GET http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2050.3136ms
|
||||
2026-07-22 15:16:51.543 +09:00 [INF] Request starting HTTP/1.1 GET http://localhost:5265/api/users - null null
|
||||
2026-07-22 15:16:51.544 +09:00 [INF] Executing endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:16:53.597 +09:00 [INF] Executed endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:16:53.598 +09:00 [ERR] HTTP GET /api/users responded 500 in 2054.0186 ms
|
||||
2026-07-22 15:16:53.598 +09:00 [INF] Request finished HTTP/1.1 GET http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2054.4435ms
|
||||
2026-07-22 15:16:53.606 +09:00 [INF] Request starting HTTP/1.1 GET http://localhost:5265/api/users - null null
|
||||
2026-07-22 15:16:53.607 +09:00 [INF] Executing endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:16:55.657 +09:00 [INF] Executed endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:16:55.657 +09:00 [ERR] HTTP GET /api/users responded 500 in 2050.7935 ms
|
||||
2026-07-22 15:16:55.657 +09:00 [INF] Request finished HTTP/1.1 GET http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2051.2027ms
|
||||
2026-07-22 15:17:20.637 +09:00 [INF] Request starting HTTP/1.1 PUT http://localhost:5265/api/users - application/json 54
|
||||
2026-07-22 15:17:20.639 +09:00 [INF] Executing endpoint 'HTTP: PUT /api/users'
|
||||
2026-07-22 15:17:22.776 +09:00 [INF] Executed endpoint 'HTTP: PUT /api/users'
|
||||
2026-07-22 15:17:22.777 +09:00 [ERR] HTTP PUT /api/users responded 500 in 2138.0776 ms
|
||||
2026-07-22 15:17:22.777 +09:00 [INF] Request finished HTTP/1.1 PUT http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2139.5819ms
|
||||
2026-07-22 15:17:26.836 +09:00 [INF] Request starting HTTP/1.1 PUT http://localhost:5265/api/users - application/json 55
|
||||
2026-07-22 15:17:26.837 +09:00 [INF] Executing endpoint 'HTTP: PUT /api/users'
|
||||
2026-07-22 15:17:28.892 +09:00 [INF] Executed endpoint 'HTTP: PUT /api/users'
|
||||
2026-07-22 15:17:28.892 +09:00 [ERR] HTTP PUT /api/users responded 500 in 2055.8643 ms
|
||||
2026-07-22 15:17:28.892 +09:00 [INF] Request finished HTTP/1.1 PUT http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2056.2009ms
|
||||
2026-07-22 15:17:31.354 +09:00 [INF] Request starting HTTP/1.1 GET http://localhost:5265/api/users - null null
|
||||
2026-07-22 15:17:31.354 +09:00 [INF] Executing endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:17:33.405 +09:00 [INF] Executed endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:17:33.405 +09:00 [ERR] HTTP GET /api/users responded 500 in 2051.4391 ms
|
||||
2026-07-22 15:17:33.405 +09:00 [INF] Request finished HTTP/1.1 GET http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2051.7122ms
|
||||
2026-07-22 15:17:44.430 +09:00 [INF] Request starting HTTP/1.1 POST http://localhost:5265/api/users - application/json 59
|
||||
2026-07-22 15:17:44.430 +09:00 [INF] Executing endpoint 'HTTP: POST /api/users'
|
||||
2026-07-22 15:17:46.495 +09:00 [INF] Executed endpoint 'HTTP: POST /api/users'
|
||||
2026-07-22 15:17:46.495 +09:00 [ERR] HTTP POST /api/users responded 500 in 2064.9410 ms
|
||||
2026-07-22 15:17:46.495 +09:00 [INF] Request finished HTTP/1.1 POST http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2065.2322ms
|
||||
2026-07-22 15:17:50.607 +09:00 [INF] Request starting HTTP/1.1 PUT http://localhost:5265/api/users - application/json 57
|
||||
2026-07-22 15:17:50.607 +09:00 [INF] Executing endpoint 'HTTP: PUT /api/users'
|
||||
2026-07-22 15:17:52.640 +09:00 [INF] Executed endpoint 'HTTP: PUT /api/users'
|
||||
2026-07-22 15:17:52.640 +09:00 [ERR] HTTP PUT /api/users responded 500 in 2033.2553 ms
|
||||
2026-07-22 15:17:52.640 +09:00 [INF] Request finished HTTP/1.1 PUT http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2033.636ms
|
||||
2026-07-22 15:18:12.096 +09:00 [INF] Request starting HTTP/1.1 DELETE http://localhost:5265/api/users/ - null 0
|
||||
2026-07-22 15:18:12.097 +09:00 [INF] Executing endpoint 'HTTP: DELETE /api/users'
|
||||
2026-07-22 15:18:14.131 +09:00 [INF] Executed endpoint 'HTTP: DELETE /api/users'
|
||||
2026-07-22 15:18:14.131 +09:00 [ERR] HTTP DELETE /api/users/ responded 500 in 2034.3508 ms
|
||||
2026-07-22 15:18:14.131 +09:00 [INF] Request finished HTTP/1.1 DELETE http://localhost:5265/api/users/ - 500 null application/problem+json; charset=utf-8 2034.6894ms
|
||||
2026-07-22 15:18:19.288 +09:00 [INF] Request starting HTTP/1.1 DELETE http://localhost:5265/api/users/sdkfjlsd - null 0
|
||||
2026-07-22 15:18:19.290 +09:00 [INF] HTTP DELETE /api/users/sdkfjlsd responded 404 in 1.1311 ms
|
||||
2026-07-22 15:18:19.290 +09:00 [INF] Request finished HTTP/1.1 DELETE http://localhost:5265/api/users/sdkfjlsd - 404 0 null 1.6979ms
|
||||
2026-07-22 15:18:19.291 +09:00 [INF] Request reached the end of the middleware pipeline without being handled by application code. Request path: DELETE http://localhost:5265/api/users/sdkfjlsd, Response status code: 404
|
||||
2026-07-22 15:18:26.132 +09:00 [INF] Request starting HTTP/1.1 GET http://localhost:5265/api/users - null null
|
||||
2026-07-22 15:18:26.133 +09:00 [INF] Executing endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:18:28.178 +09:00 [INF] Executed endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:18:28.178 +09:00 [ERR] HTTP GET /api/users responded 500 in 2045.1727 ms
|
||||
2026-07-22 15:18:28.178 +09:00 [INF] Request finished HTTP/1.1 GET http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2045.5341ms
|
||||
2026-07-22 15:18:28.184 +09:00 [INF] Request starting HTTP/1.1 GET http://localhost:5265/api/users - null null
|
||||
2026-07-22 15:18:28.185 +09:00 [INF] Executing endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:18:30.218 +09:00 [INF] Executed endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:18:30.218 +09:00 [ERR] HTTP GET /api/users responded 500 in 2033.6300 ms
|
||||
2026-07-22 15:18:30.218 +09:00 [INF] Request finished HTTP/1.1 GET http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2034.0435ms
|
||||
2026-07-22 15:18:36.388 +09:00 [INF] Request starting HTTP/1.1 PUT http://localhost:5265/api/users - application/json 51
|
||||
2026-07-22 15:18:36.389 +09:00 [INF] Executing endpoint 'HTTP: PUT /api/users'
|
||||
2026-07-22 15:18:38.427 +09:00 [INF] Executed endpoint 'HTTP: PUT /api/users'
|
||||
2026-07-22 15:18:38.427 +09:00 [ERR] HTTP PUT /api/users responded 500 in 2038.0957 ms
|
||||
2026-07-22 15:18:38.427 +09:00 [INF] Request finished HTTP/1.1 PUT http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2038.5325ms
|
||||
2026-07-22 15:18:45.988 +09:00 [INF] Request starting HTTP/1.1 PUT http://localhost:5265/api/users - application/json 70
|
||||
2026-07-22 15:18:45.988 +09:00 [INF] Executing endpoint 'HTTP: PUT /api/users'
|
||||
2026-07-22 15:18:48.034 +09:00 [INF] Executed endpoint 'HTTP: PUT /api/users'
|
||||
2026-07-22 15:18:48.035 +09:00 [ERR] HTTP PUT /api/users responded 500 in 2046.3592 ms
|
||||
2026-07-22 15:18:48.035 +09:00 [INF] Request finished HTTP/1.1 PUT http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2046.7579ms
|
||||
2026-07-22 15:19:46.786 +09:00 [INF] Request starting HTTP/1.1 GET http://localhost:5265/api/users - null null
|
||||
2026-07-22 15:19:46.787 +09:00 [INF] Executing endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:19:48.824 +09:00 [INF] Executed endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:19:48.824 +09:00 [ERR] HTTP GET /api/users responded 500 in 2037.5372 ms
|
||||
2026-07-22 15:19:48.824 +09:00 [INF] Request finished HTTP/1.1 GET http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2037.9047ms
|
||||
2026-07-22 15:19:48.830 +09:00 [INF] Request starting HTTP/1.1 GET http://localhost:5265/api/users - null null
|
||||
2026-07-22 15:19:48.830 +09:00 [INF] Executing endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:19:50.860 +09:00 [INF] Executed endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:19:50.860 +09:00 [ERR] HTTP GET /api/users responded 500 in 2030.2168 ms
|
||||
2026-07-22 15:19:50.860 +09:00 [INF] Request finished HTTP/1.1 GET http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2030.5677ms
|
||||
2026-07-22 15:19:50.869 +09:00 [INF] Request starting HTTP/1.1 GET http://localhost:5265/api/users - null null
|
||||
2026-07-22 15:19:50.870 +09:00 [INF] Executing endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:19:52.905 +09:00 [INF] Executed endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:19:52.905 +09:00 [ERR] HTTP GET /api/users responded 500 in 2035.8996 ms
|
||||
2026-07-22 15:19:52.905 +09:00 [INF] Request finished HTTP/1.1 GET http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2036.2115ms
|
||||
2026-07-22 15:20:15.919 +09:00 [INF] Request starting HTTP/1.1 GET http://localhost:5265/api/users - null null
|
||||
2026-07-22 15:20:15.920 +09:00 [INF] Executing endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:20:17.958 +09:00 [INF] Executed endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:20:17.958 +09:00 [ERR] HTTP GET /api/users responded 500 in 2039.2925 ms
|
||||
2026-07-22 15:20:17.958 +09:00 [INF] Request finished HTTP/1.1 GET http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2039.61ms
|
||||
2026-07-22 15:20:20.773 +09:00 [INF] Request starting HTTP/1.1 GET http://localhost:5265/api/users - null null
|
||||
2026-07-22 15:20:20.773 +09:00 [INF] Executing endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:20:22.799 +09:00 [INF] Executed endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:20:22.799 +09:00 [ERR] HTTP GET /api/users responded 500 in 2025.8650 ms
|
||||
2026-07-22 15:20:22.799 +09:00 [INF] Request finished HTTP/1.1 GET http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2026.0563ms
|
||||
2026-07-22 15:20:41.381 +09:00 [INF] Request starting HTTP/1.1 GET http://localhost:5265/api/users - null null
|
||||
2026-07-22 15:20:41.382 +09:00 [INF] Executing endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:20:43.407 +09:00 [INF] Executed endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:20:43.408 +09:00 [ERR] HTTP GET /api/users responded 500 in 2026.4432 ms
|
||||
2026-07-22 15:20:43.408 +09:00 [INF] Request finished HTTP/1.1 GET http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2026.7347ms
|
||||
2026-07-22 15:21:17.054 +09:00 [INF] Request starting HTTP/1.1 GET http://localhost:5265/api/users - null null
|
||||
2026-07-22 15:21:17.054 +09:00 [INF] Executing endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:21:19.096 +09:00 [INF] Executed endpoint 'HTTP: GET /api/users'
|
||||
2026-07-22 15:21:19.096 +09:00 [ERR] HTTP GET /api/users responded 500 in 2042.0411 ms
|
||||
2026-07-22 15:21:19.096 +09:00 [INF] Request finished HTTP/1.1 GET http://localhost:5265/api/users - 500 null application/problem+json; charset=utf-8 2042.3176ms
|
||||
|
||||
Reference in New Issue
Block a user