void.cat/VoidCat/VoidStartup.cs

186 lines
6.2 KiB
C#
Raw Normal View History

using System.Reflection;
2022-08-30 20:59:13 +00:00
using System.Text;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.HttpLogging;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using Newtonsoft.Json;
using StackExchange.Redis;
using VoidCat.Model;
using VoidCat.Services;
using VoidCat.Services.Abstractions;
2022-09-07 11:40:52 +00:00
using VoidCat.Services.Analytics;
2022-08-30 20:59:13 +00:00
using VoidCat.Services.Background;
using VoidCat.Services.Captcha;
using VoidCat.Services.Files;
using VoidCat.Services.InMemory;
using VoidCat.Services.Migrations;
2022-09-07 14:52:40 +00:00
using VoidCat.Services.Payment;
2022-08-30 20:59:13 +00:00
using VoidCat.Services.Redis;
using VoidCat.Services.Stats;
using VoidCat.Services.Users;
using VoidCat.Services.VirusScanner;
namespace VoidCat;
public static class VoidStartup
{
public static void AddDatabaseServices(this IServiceCollection services, VoidSettings voidSettings)
{
if (voidSettings.HasRedis())
{
var cx = ConnectionMultiplexer.Connect(voidSettings.Redis!);
services.AddSingleton(cx);
services.AddSingleton(cx.GetDatabase());
services.AddTransient<ICache, RedisCache>();
}
else
{
services.AddMemoryCache();
services.AddTransient<ICache, InMemoryCache>();
}
}
public static void AddBaseServices(this IServiceCollection services, VoidSettings voidSettings)
{
services.AddStorage(voidSettings);
services.AddMetrics(voidSettings);
2022-09-07 14:52:40 +00:00
services.AddPaymentServices(voidSettings);
2022-08-30 20:59:13 +00:00
services.AddUserServices(voidSettings);
services.AddVirusScanner(voidSettings);
services.AddCaptcha(voidSettings);
}
public static void AddWebServices(this IServiceCollection services, VoidSettings voidSettings)
{
services.AddHttpLogging((o) =>
{
o.LoggingFields = HttpLoggingFields.RequestPropertiesAndHeaders |
HttpLoggingFields.ResponsePropertiesAndHeaders;
2022-08-30 20:59:13 +00:00
o.RequestBodyLogLimit = 4096;
o.ResponseBodyLogLimit = 4096;
o.MediaTypeOptions.Clear();
o.MediaTypeOptions.AddText("application/json");
foreach (var h in voidSettings.RequestHeadersLog ?? Enumerable.Empty<string>())
{
o.RequestHeaders.Add(h);
}
});
2022-08-30 20:59:13 +00:00
services.AddHttpClient();
services.AddSwaggerGen(c =>
{
c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
In = ParameterLocation.Header,
Description = "Please insert JWT with Bearer into field",
Name = "Authorization",
Type = SecuritySchemeType.ApiKey
});
2022-08-30 20:59:13 +00:00
c.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
}
},
new string[] { }
}
});
2022-08-30 20:59:13 +00:00
var path = Path.Combine(AppContext.BaseDirectory, $"{Assembly.GetExecutingAssembly().GetName().Name}.xml");
c.IncludeXmlComments(path);
});
2022-08-30 20:59:13 +00:00
services.AddCors(opt =>
{
opt.AddDefaultPolicy(p =>
{
p.AllowAnyMethod()
2023-04-05 10:10:51 +00:00
.AllowAnyHeader();
2023-04-05 09:30:27 +00:00
if (voidSettings.CorsOrigins.Count > 0)
{
2023-04-05 10:10:51 +00:00
p.WithOrigins(voidSettings.CorsOrigins.Select(a => a.OriginalString).ToArray())
.AllowCredentials();
2023-04-05 09:30:27 +00:00
}
else
{
p.AllowAnyOrigin();
}
2022-08-30 20:59:13 +00:00
});
opt.AddPolicy("*", p =>
{
p.AllowAnyMethod()
.AllowAnyHeader()
.AllowAnyOrigin();
});
2022-08-30 20:59:13 +00:00
});
2022-08-30 20:59:13 +00:00
services.AddRazorPages();
services.AddRouting();
services.AddControllers()
.AddNewtonsoftJson((opt) => { ConfigJsonSettings(opt.SerializerSettings); });
2022-08-30 20:59:13 +00:00
services.AddHealthChecks();
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new()
{
ValidateIssuer = true,
ValidateAudience = false,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = voidSettings.JwtSettings.Issuer,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(voidSettings.JwtSettings.Key))
};
});
services.AddAuthorization((opt) => { opt.AddPolicy(Policies.RequireAdmin, (auth) => { auth.RequireRole(Roles.Admin); }); });
2022-08-30 20:59:13 +00:00
services.AddTransient<RazorPartialToStringRenderer>();
2022-09-07 11:40:52 +00:00
services.AddAnalytics(voidSettings);
2022-08-30 20:59:13 +00:00
}
public static void AddBackgroundServices(this IServiceCollection services, VoidSettings voidSettings)
{
services.AddHostedService<DeleteUnverifiedAccounts>();
2022-09-06 21:32:22 +00:00
services.AddHostedService<DeleteExpiredFiles>();
2022-08-30 20:59:13 +00:00
if (voidSettings.HasVirusScanner())
{
services.AddHostedService<VirusScannerService>();
}
}
public static void AddMigrations(this IServiceCollection services, VoidSettings voidSettings)
{
if (voidSettings.HasPostgres())
2022-08-30 20:59:13 +00:00
{
services.AddTransient<IMigration, EFMigrationSetup>();
services.AddTransient<IMigration, EFMigration>();
2022-08-30 20:59:13 +00:00
}
}
public static JsonSerializerSettings ConfigJsonSettings(JsonSerializerSettings s)
{
s.NullValueHandling = NullValueHandling.Ignore;
s.ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor;
s.MissingMemberHandling = MissingMemberHandling.Ignore;
s.Converters = new List<JsonConverter> {new Base58GuidConverter()};
s.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
2022-08-30 20:59:13 +00:00
return s;
}
}