152 lines
5.2 KiB
C#
152 lines
5.2 KiB
C#
using System.Text.Json;
|
|
using System.Threading.RateLimiting;
|
|
using dotnet_etcd.interfaces;
|
|
using DysonNetwork.Pusher.Email;
|
|
using DysonNetwork.Pusher.Notification;
|
|
using DysonNetwork.Pusher.Services;
|
|
using DysonNetwork.Shared.Cache;
|
|
using DysonNetwork.Shared.Proto;
|
|
using Microsoft.AspNetCore.RateLimiting;
|
|
using Microsoft.OpenApi.Models;
|
|
using NodaTime;
|
|
using NodaTime.Serialization.SystemTextJson;
|
|
using StackExchange.Redis;
|
|
|
|
namespace DysonNetwork.Pusher.Startup;
|
|
|
|
public static class ServiceCollectionExtensions
|
|
{
|
|
public static IServiceCollection AddAppServices(this IServiceCollection services, IConfiguration configuration)
|
|
{
|
|
services.AddDbContext<AppDatabase>();
|
|
services.AddSingleton<IConnectionMultiplexer>(_ =>
|
|
{
|
|
var connection = configuration.GetConnectionString("FastRetrieve")!;
|
|
return ConnectionMultiplexer.Connect(connection);
|
|
});
|
|
services.AddSingleton<IClock>(SystemClock.Instance);
|
|
services.AddHttpContextAccessor();
|
|
services.AddSingleton<ICacheService, CacheServiceRedis>();
|
|
|
|
services.AddHttpClient();
|
|
|
|
// Register gRPC services
|
|
services.AddGrpc(options =>
|
|
{
|
|
options.EnableDetailedErrors = true; // Will be adjusted in Program.cs
|
|
options.MaxReceiveMessageSize = 16 * 1024 * 1024; // 16MB
|
|
options.MaxSendMessageSize = 16 * 1024 * 1024; // 16MB
|
|
});
|
|
|
|
// Register gRPC reflection for service discovery
|
|
services.AddGrpc();
|
|
|
|
// Register gRPC services
|
|
services.AddScoped<PusherServiceGrpc>();
|
|
|
|
// Register AuthService.AuthServiceClient for AuthMiddleware
|
|
services.AddSingleton(sp =>
|
|
{
|
|
var etcdClient = sp.GetRequiredService<IEtcdClient>();
|
|
var configuration = sp.GetRequiredService<IConfiguration>();
|
|
var clientCertPath = configuration["ClientCert:Path"];
|
|
var clientKeyPath = configuration["ClientKey:Path"];
|
|
var clientCertPassword = configuration["ClientCert:Password"];
|
|
|
|
return GrpcClientHelper.CreateAuthServiceClient(etcdClient, clientCertPath, clientKeyPath, clientCertPassword);
|
|
});
|
|
|
|
// Register OIDC services
|
|
services.AddControllers().AddJsonOptions(options =>
|
|
{
|
|
options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower;
|
|
options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.SnakeCaseLower;
|
|
|
|
options.JsonSerializerOptions.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
|
|
});
|
|
|
|
return services;
|
|
}
|
|
|
|
public static IServiceCollection AddAppRateLimiting(this IServiceCollection services)
|
|
{
|
|
services.AddRateLimiter(o => o.AddFixedWindowLimiter(policyName: "fixed", opts =>
|
|
{
|
|
opts.Window = TimeSpan.FromMinutes(1);
|
|
opts.PermitLimit = 120;
|
|
opts.QueueLimit = 2;
|
|
opts.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
|
|
}));
|
|
|
|
return services;
|
|
}
|
|
|
|
public static IServiceCollection AddAppAuthentication(this IServiceCollection services)
|
|
{
|
|
services.AddCors();
|
|
services.AddAuthorization();
|
|
|
|
return services;
|
|
}
|
|
|
|
public static IServiceCollection AddAppSwagger(this IServiceCollection services)
|
|
{
|
|
services.AddEndpointsApiExplorer();
|
|
services.AddSwaggerGen(options =>
|
|
{
|
|
options.SwaggerDoc("v1", new OpenApiInfo
|
|
{
|
|
Version = "v1",
|
|
Title = "Solar Network API",
|
|
Description = "An open-source social network",
|
|
TermsOfService = new Uri("https://solsynth.dev/terms"),
|
|
License = new OpenApiLicense
|
|
{
|
|
Name = "APGLv3",
|
|
Url = new Uri("https://www.gnu.org/licenses/agpl-3.0.html")
|
|
}
|
|
});
|
|
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
|
|
{
|
|
In = ParameterLocation.Header,
|
|
Description = "Please enter a valid token",
|
|
Name = "Authorization",
|
|
Type = SecuritySchemeType.Http,
|
|
BearerFormat = "JWT",
|
|
Scheme = "Bearer"
|
|
});
|
|
options.AddSecurityRequirement(new OpenApiSecurityRequirement
|
|
{
|
|
{
|
|
new OpenApiSecurityScheme
|
|
{
|
|
Reference = new OpenApiReference
|
|
{
|
|
Type = ReferenceType.SecurityScheme,
|
|
Id = "Bearer"
|
|
}
|
|
},
|
|
[]
|
|
}
|
|
});
|
|
});
|
|
services.AddOpenApi();
|
|
|
|
return services;
|
|
}
|
|
|
|
public static IServiceCollection AddAppFlushHandlers(this IServiceCollection services)
|
|
{
|
|
services.AddSingleton<FlushBufferService>();
|
|
|
|
return services;
|
|
}
|
|
|
|
public static IServiceCollection AddAppBusinessServices(this IServiceCollection services)
|
|
{
|
|
services.AddScoped<EmailService>();
|
|
services.AddScoped<PushService>();
|
|
|
|
return services;
|
|
}
|
|
} |