Files
fragalytics/src/Fragalytics.Web/Program.cs
T
2026-04-21 08:10:51 -05:00

71 lines
2.5 KiB
C#

using Fragalytics.Web;
using Fragalytics.Web.Infrastructure;
using Fragalytics.Web.Services;
using Fragalytics.Web.Services.Parser;
using Fragalytics.Web.Services.Render;
using Fragalytics.Web.Services.Scoring;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.Options;
var contentRoot = AppPathResolver.ResolveContentRoot(Directory.GetCurrentDirectory(), AppContext.BaseDirectory);
var webRoot = Path.Combine(contentRoot, "wwwroot");
var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
Args = args,
ContentRootPath = contentRoot,
WebRootPath = Directory.Exists(webRoot) ? webRoot : null
});
builder.Services.Configure<FragalyticsOptions>(builder.Configuration.GetSection("Fragalytics"));
var uploadMaxBytes = builder.Configuration.GetValue<long?>("Fragalytics:UploadMaxBytes") ?? 536_870_912;
builder.WebHost.ConfigureKestrel(options =>
{
options.Limits.MaxRequestBodySize = uploadMaxBytes;
});
builder.Services.Configure<FormOptions>(options =>
{
options.MultipartBodyLengthLimit = uploadMaxBytes;
});
var dataProtectionRoot = Path.GetFullPath(Path.Combine(contentRoot, builder.Configuration["Fragalytics:DataDirectory"] ?? "data", "keys"));
Directory.CreateDirectory(dataProtectionRoot);
builder.Services
.AddDataProtection()
.SetApplicationName("Fragalytics.Web")
.PersistKeysToFileSystem(new DirectoryInfo(dataProtectionRoot));
builder.Services.AddRazorPages();
builder.Services.AddSingleton<JsonAppStore>();
builder.Services.AddSingleton<ScoringRulesProvider>();
builder.Services.AddSingleton<IRenderWorkerAdapter, NoOpRenderWorkerAdapter>();
builder.Services.AddSingleton<IDemoParserAdapter>(serviceProvider =>
{
var options = serviceProvider.GetRequiredService<IOptions<FragalyticsOptions>>().Value;
return string.Equals(options.Parser.Mode, "external", StringComparison.OrdinalIgnoreCase)
? new ExternalProcessParserAdapter(serviceProvider.GetRequiredService<IOptions<FragalyticsOptions>>())
: new SampleDemoParserAdapter();
});
builder.Services.AddSingleton<MatchScoringService>();
builder.Services.AddSingleton<DemoIngestService>();
builder.Services.AddSingleton<ClipMediaService>();
builder.Services.AddSingleton<QueryService>();
builder.Services.AddHostedService<DemoProcessingWorker>();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseStaticFiles();
app.UseRouting();
app.MapRazorPages();
app.Run();
public partial class Program
{
}