using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Gott.Models; using Gott.Services; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; namespace Gott.Endpoints; public static class HistoryEndpoint { public static void MapHistoryEndpoint(this IEndpointRouteBuilder app) { app.MapGet("/api/history", HandleHistory); app.MapGet("/api/history/poll", HandlePoll); } private static async Task HandleHistory(HttpContext ctx, DatabaseService db) { var sessionId = ctx.Request.Query["sessionId"].FirstOrDefault(); var limitStr = ctx.Request.Query["limit"].FirstOrDefault(); var limit = int.TryParse(limitStr, out var l) ? l : 50; IEnumerable chains; if (string.IsNullOrEmpty(sessionId) || sessionId == "null") chains = await db.GetRecentChains(limit); else chains = await db.GetSessionChains(sessionId, limit); var result = new List(); foreach (var chain in chains) { var messages = await db.GetChainMessages(chain.ChainId); result.Add(new { chain, messages }); } await ctx.Response.WriteAsJsonAsync(result); } private static async Task HandlePoll(HttpContext ctx, DatabaseService db) { var afterStr = ctx.Request.Query["afterId"].FirstOrDefault(); var afterId = long.TryParse(afterStr, out var a) ? a : 0; var messages = await db.GetMessagesAfterId(afterId); await ctx.Response.WriteAsJsonAsync(messages); } }