using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.IO; using System.Net.Http.Headers; using System.Reflection; using System.Text; using System.Linq; using ReZero.Configuration; using System.Data; namespace ReZero.SuperAPI { public static partial class SuperAPIModule { public static SuperAPIOptions? _apiOptions = null; internal static void Init(IServiceCollection services, ReZeroOptions options) { if (IsInitSupperApi(options)) { var apiOptions = options.SuperApiOptions; _apiOptions = InitializeOptions(apiOptions); InitZeroStaticFileMiddleware(); InitCors(services,_apiOptions); InitializeDataBase(_apiOptions); InitializeData(_apiOptions); AddTransientServices(services, _apiOptions); InitDynamicAttributeApi(); } } private static void InitCors(IServiceCollection services, SuperAPIOptions apiOptions) { if (apiOptions?.InterfaceOptions.CorsOptions?.Enable == true) { var corsOptions = apiOptions.InterfaceOptions.CorsOptions; services.AddCors(option => option.AddPolicy(corsOptions.PolicyName, policy => { policy.WithHeaders(corsOptions.Headers).WithMethods(corsOptions.Methods).WithOrigins(corsOptions.Origins); if (corsOptions.AllowCredentials) { policy.AllowCredentials(); } }) ); services.AddSingleton(provider=>corsOptions); services.AddTransient(); } } private static void InitDynamicAttributeApi() { if (_apiOptions?.DependencyInjectionOptions?.Assemblies?.Any() != true) { return; } var types = _apiOptions? .DependencyInjectionOptions .Assemblies! .SelectMany(it => it.GetTypes()).ToList(); types!.Add(typeof(InternalInitApi)); AttibuteInterfaceInitializerService.InitDynamicAttributeApi(types); } /// /// Initializes ZeroStaticFileMiddleware. /// private static void InitZeroStaticFileMiddleware() { _apiOptions!.UiOptions!.DefaultUiFolderName = SuperAPIStaticFileMiddleware.DefaultUiFolderName; } /// /// Initializes the database based on ReZero options. /// /// ReZero options. private static void InitializeDataBase(SuperAPIOptions options) { if (options.DatabaseOptions == null) { options.DatabaseOptions = new DatabaseOptions(); } if (options.DatabaseOptions!.InitializeTables == false) { return; } if (options.DatabaseOptions?.ConnectionConfig?.DbType == SqlSugar.DbType.Sqlite && options.DatabaseOptions?.ConnectionConfig?.ConnectionString == null) { options.DatabaseOptions!.ConnectionConfig.ConnectionString = "datasource=rezero.db"; } var types = PubMethod.GetTypesDerivedFromDbBase(typeof(DbBase)); var db = new DatabaseContext(options.DatabaseOptions!.ConnectionConfig).SugarClient; App.PreStartupDb = db; if (IsSupportCreateDatabase(db)) { db.DbMaintenance.CreateDatabase(); } db.CodeFirst.InitTables(types?.ToArray()); } private static bool IsSupportCreateDatabase(SqlSugar.ISqlSugarClient db) { return db.CurrentConnectionConfig.DbType != SqlSugar.DbType.Oracle && db.CurrentConnectionConfig.DbType != SqlSugar.DbType.Dm; } /// /// Adds transient services to the IServiceCollection. /// /// The IServiceCollection to which services are added. /// ReZero options. private static void AddTransientServices(IServiceCollection services, SuperAPIOptions options) { // Add transient services to the IServiceCollection. services.AddTransient(); services.AddTransient(); services.AddTransient(); // Create an instance of ORM with the specified connection configuration and add it as a transient service. services.AddTransient(it => new DatabaseContext(options.DatabaseOptions!.ConnectionConfig)); } /// /// Initializes ReZero options. If options are not provided, creates a new instance of ReZeroOptions. /// /// Optional ReZero options. /// Initialized ReZero options. private static SuperAPIOptions InitializeOptions(SuperAPIOptions? options) { options = options ?? new SuperAPIOptions(); return options; } /// /// Initializes data based on ReZero options. /// /// ReZero options. private static void InitializeData(SuperAPIOptions options) { new DataInitializerService().Initialize(options); } private static bool IsInitSupperApi(ReZeroOptions options) { return options.SuperApiOptions.IsEnableSuperAPI; } } }