summary refs log tree commit diff
path: root/ModAS.Server/Program.cs
blob: 248243fdc825f315166a44ffb326ca9f95ed0965 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
using Microsoft.AspNetCore.Http.Timeouts;
using Microsoft.OpenApi.Models;
using ModAS.Server;
using System.Diagnostics;
using System.Text.Json;
using Elastic.Apm;
using Elastic.Apm.Api;
using Elastic.Apm.AspNetCore;
using Elastic.Apm.NetCoreAll;
using LibMatrix;
using LibMatrix.Services;
using ModAS.Server.Authentication;
using ModAS.Server.Services;
using MxApiExtensions.Services;

// var builder = WebApplication.CreateBuilder(args);
var builder = WebApplication.CreateSlimBuilder(args);

builder.Services.AddControllers().AddJsonOptions(options => { options.JsonSerializerOptions.WriteIndented = true; });
///add wwwroot
// builder.Services.AddDirectoryBrowser();
// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c => {
    c.SwaggerDoc("v1", new OpenApiInfo() {
        Version = "v1",
        Title = "Rory&::ModAS",
        Description = "Moderation tooling, embracing the power of AppServices"
    });
    c.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "ModAS.Server.xml"));
});

builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

builder.Services.AddSingleton<ModASConfiguration>();

builder.Services.AddSingleton<AuthenticationService>();
builder.Services.AddSingleton<UserProviderService>();
builder.Services.AddSingleton<RoomContextService>();
builder.Services.AddSingleton<RoomStateCacheService>();
// builder.Services.AddScoped<UserContextService>();

builder.Services.AddSingleton<TieredStorageService>(x => {
    var config = x.GetRequiredService<ModASConfiguration>();
    return new TieredStorageService(
        cacheStorageProvider: new FileStorageProvider("/run"),
        dataStorageProvider: new FileStorageProvider("/run")
    );
});
builder.Services.AddRoryLibMatrixServices();

//trace init time for app service registration
if (File.Exists("appservice_registration.yaml")) {
    await using var stream = File.OpenRead("appservice_registration.yaml");
    builder.Services.AddSingleton<AppServiceRegistration>(await JsonSerializer.DeserializeAsync<AppServiceRegistration>(stream) ??
                                                          throw new Exception("Failed to deserialize appservice registration file"));
}
else {
    var sw = Stopwatch.StartNew();
    var asr = new AppServiceRegistration();
    File.WriteAllText("appservice_registration.yaml", JsonSerializer.Serialize(asr, new JsonSerializerOptions() { WriteIndented = true }));
    sw.Stop();
    Console.WriteLine($"Generated AppService registration file in {sw.Elapsed}!");
    builder.Services.AddSingleton<AppServiceRegistration>(asr);
}

builder.Services.AddRequestTimeouts(x => {
    x.DefaultPolicy = new RequestTimeoutPolicy {
        Timeout = TimeSpan.FromMinutes(10),
        WriteTimeoutResponse = async context => {
            context.Response.StatusCode = 504;
            context.Response.ContentType = "application/json";
            await context.Response.StartAsync();
            await context.Response.WriteAsJsonAsync(new MatrixException() {
                ErrorCode = "M_TIMEOUT",
                Error = "Request timed out"
            }.GetAsJson());
            await context.Response.CompleteAsync();
        }
    };
});

// builder.Services.AddCors(x => x.AddDefaultPolicy(y => y.AllowAnyHeader().AllowCredentials().AllowAnyOrigin().AllowAnyMethod()));
builder.Services.AddCors(options => {
    options.AddPolicy(
        "Open",
        policy => policy.AllowAnyOrigin().AllowAnyHeader());
});

var app = builder.Build();

// if (app.Environment.IsDevelopment()) {
app.UseSwagger();
app.UseSwaggerUI(c => {
    c.EnableTryItOutByDefault();
});
app.UseReDoc(c => {
    c.EnableUntrustedSpec();
    c.ScrollYOffset(10);
    c.HideHostname();
    c.HideDownloadButton();
    c.HideLoading();
    c.ExpandResponses("200,201");
    c.RequiredPropsFirst();
});
// }

app.UseAllElasticApm(builder.Configuration);
Agent.AddFilter((ISpan span) => {
    if (span.Context.Http is not null && span.Name.StartsWith($"{span.Context.Http.Method} ")) {
        span.Name = $"{span.Context.Http.Method} {span.Context.Http.Url}";
    }

    return span;
});

app.UseFileServer();

app.UseRouting();

app.UseCors("Open");

app.MapControllers();

app.UseMiddleware<AuthMiddleware>();

app.Run();