155 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System.Globalization;
 | 
						|
using DysonNetwork.Pass.Account;
 | 
						|
using DysonNetwork.Pass.Auth;
 | 
						|
using DysonNetwork.Pass.Auth.OpenId;
 | 
						|
using DysonNetwork.Pass.Localization;
 | 
						|
using DysonNetwork.Pass.Permission;
 | 
						|
using DysonNetwork.Pass.Wallet;
 | 
						|
using Microsoft.AspNetCore.RateLimiting;
 | 
						|
using NodaTime;
 | 
						|
using NodaTime.Serialization.SystemTextJson;
 | 
						|
using System.Text.Json;
 | 
						|
using System.Text.Json.Serialization;
 | 
						|
using System.Threading.RateLimiting;
 | 
						|
using DysonNetwork.Pass.Auth.OidcProvider.Options;
 | 
						|
using DysonNetwork.Pass.Auth.OidcProvider.Services;
 | 
						|
using DysonNetwork.Pass.Credit;
 | 
						|
using DysonNetwork.Pass.Handlers;
 | 
						|
using DysonNetwork.Pass.Leveling;
 | 
						|
using DysonNetwork.Pass.Mailer;
 | 
						|
using DysonNetwork.Pass.Realm;
 | 
						|
using DysonNetwork.Pass.Safety;
 | 
						|
using DysonNetwork.Pass.Wallet.PaymentHandlers;
 | 
						|
using DysonNetwork.Shared.Cache;
 | 
						|
using DysonNetwork.Shared.GeoIp;
 | 
						|
using DysonNetwork.Shared.Registry;
 | 
						|
 | 
						|
namespace DysonNetwork.Pass.Startup;
 | 
						|
 | 
						|
public static class ServiceCollectionExtensions
 | 
						|
{
 | 
						|
    public static IServiceCollection AddAppServices(this IServiceCollection services, IConfiguration configuration)
 | 
						|
    {
 | 
						|
        services.AddLocalization(options => options.ResourcesPath = "Resources");
 | 
						|
 | 
						|
        services.AddDbContext<AppDatabase>();
 | 
						|
        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
 | 
						|
        });
 | 
						|
        services.AddGrpcReflection();
 | 
						|
 | 
						|
        services.AddRingService();
 | 
						|
 | 
						|
        // Register OIDC services
 | 
						|
        services.AddScoped<OidcService, GoogleOidcService>();
 | 
						|
        services.AddScoped<OidcService, AppleOidcService>();
 | 
						|
        services.AddScoped<OidcService, GitHubOidcService>();
 | 
						|
        services.AddScoped<OidcService, MicrosoftOidcService>();
 | 
						|
        services.AddScoped<OidcService, DiscordOidcService>();
 | 
						|
        services.AddScoped<OidcService, AfdianOidcService>();
 | 
						|
        services.AddScoped<GoogleOidcService>();
 | 
						|
        services.AddScoped<AppleOidcService>();
 | 
						|
        services.AddScoped<GitHubOidcService>();
 | 
						|
        services.AddScoped<MicrosoftOidcService>();
 | 
						|
        services.AddScoped<DiscordOidcService>();
 | 
						|
        services.AddScoped<AfdianOidcService>();
 | 
						|
 | 
						|
        services.AddControllers().AddJsonOptions(options =>
 | 
						|
        {
 | 
						|
            options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowNamedFloatingPointLiterals;
 | 
						|
            options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower;
 | 
						|
            options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.SnakeCaseLower;
 | 
						|
 | 
						|
            options.JsonSerializerOptions.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
 | 
						|
        }).AddDataAnnotationsLocalization(options =>
 | 
						|
        {
 | 
						|
            options.DataAnnotationLocalizerProvider = (type, factory) =>
 | 
						|
                factory.Create(typeof(SharedResource));
 | 
						|
        });
 | 
						|
        services.AddRazorPages();
 | 
						|
 | 
						|
        services.Configure<RequestLocalizationOptions>(options =>
 | 
						|
        {
 | 
						|
            var supportedCultures = new[]
 | 
						|
            {
 | 
						|
                new CultureInfo("en-US"),
 | 
						|
                new CultureInfo("zh-Hans"),
 | 
						|
            };
 | 
						|
 | 
						|
            options.SupportedCultures = supportedCultures;
 | 
						|
            options.SupportedUICultures = supportedCultures;
 | 
						|
        });
 | 
						|
 | 
						|
        return services;
 | 
						|
    }
 | 
						|
 | 
						|
    public static IServiceCollection AddAppAuthentication(this IServiceCollection services)
 | 
						|
    {
 | 
						|
        services.AddAuthorization();
 | 
						|
        services.AddAuthentication(options =>
 | 
						|
            {
 | 
						|
                options.DefaultAuthenticateScheme = AuthConstants.SchemeName;
 | 
						|
                options.DefaultChallengeScheme = AuthConstants.SchemeName;
 | 
						|
            })
 | 
						|
            .AddScheme<DysonTokenAuthOptions, DysonTokenAuthHandler>(AuthConstants.SchemeName, _ => { });
 | 
						|
 | 
						|
        return services;
 | 
						|
    }
 | 
						|
 | 
						|
    public static IServiceCollection AddAppFlushHandlers(this IServiceCollection services)
 | 
						|
    {
 | 
						|
        services.AddSingleton<FlushBufferService>();
 | 
						|
        services.AddScoped<ActionLogFlushHandler>();
 | 
						|
        services.AddScoped<LastActiveFlushHandler>();
 | 
						|
 | 
						|
        return services;
 | 
						|
    }
 | 
						|
 | 
						|
    public static IServiceCollection AddAppBusinessServices(this IServiceCollection services,
 | 
						|
        IConfiguration configuration)
 | 
						|
    {
 | 
						|
        services.AddScoped<CompactTokenService>();
 | 
						|
        services.AddScoped<RazorViewRenderer>();
 | 
						|
        services.Configure<GeoIpOptions>(configuration.GetSection("GeoIP"));
 | 
						|
        services.AddScoped<GeoIpService>();
 | 
						|
        services.AddScoped<EmailService>();
 | 
						|
        services.AddScoped<PermissionService>();
 | 
						|
        services.AddScoped<ActionLogService>();
 | 
						|
        services.AddScoped<AccountService>();
 | 
						|
        services.AddScoped<AccountEventService>();
 | 
						|
        services.AddScoped<NotableDaysService>();
 | 
						|
        services.AddScoped<ActionLogService>();
 | 
						|
        services.AddScoped<RelationshipService>();
 | 
						|
        services.AddScoped<MagicSpellService>();
 | 
						|
        services.AddScoped<AuthService>();
 | 
						|
        services.AddScoped<TokenAuthService>();
 | 
						|
        services.AddScoped<AccountUsernameService>();
 | 
						|
        services.AddScoped<WalletService>();
 | 
						|
        services.AddScoped<SubscriptionService>();
 | 
						|
        services.AddScoped<PaymentService>();
 | 
						|
        services.AddScoped<AfdianPaymentHandler>();
 | 
						|
        services.AddScoped<SafetyService>();
 | 
						|
        services.AddScoped<SocialCreditService>();
 | 
						|
        services.AddScoped<ExperienceService>();
 | 
						|
        services.AddScoped<RealmService>();
 | 
						|
        services.AddScoped<Lotteries.LotteryService>();
 | 
						|
        
 | 
						|
        services.Configure<OidcProviderOptions>(configuration.GetSection("OidcProvider"));
 | 
						|
        services.AddScoped<OidcProviderService>();
 | 
						|
        
 | 
						|
        services.AddHostedService<BroadcastEventHandler>();
 | 
						|
 | 
						|
        return services;
 | 
						|
    }
 | 
						|
}
 |