diff --git a/Constants/XAiApiConstants.cs b/Constants/XAiApiConstants.cs new file mode 100644 index 0000000..8672c95 --- /dev/null +++ b/Constants/XAiApiConstants.cs @@ -0,0 +1,10 @@ +namespace xAiApi.Constants +{ + public struct XAiApiConstants + { + // + // Database Descriptor ... + public const string XAiApiDbIdentifier = "xAiApiDb"; + public const string XAiApiMigrationsAssemblyIdentifier = "xAiApi"; + } +} \ No newline at end of file diff --git a/Database/XAiApiDatabaseDescriptor.cs b/Database/XAiApiDatabaseDescriptor.cs new file mode 100644 index 0000000..44f9ec7 --- /dev/null +++ b/Database/XAiApiDatabaseDescriptor.cs @@ -0,0 +1,20 @@ +using xAiApi.Constants; +using xDataService.Interfaces; +using xDataService.Models; + +namespace xAiApi.Database +{ + /// + /// Ai Api Database Descriptor ... + /// + public class XAiApiDatabaseDescriptor : XDatabaseDescriptor, IXDatabaseDescriptor + { + public XAiApiDatabaseDescriptor() : base( + name: XAiApiConstants.XAiApiDbIdentifier, + repositories: [] + ) + { + OptionsBuilder = b => b.MigrationsAssembly(XAiApiConstants.XAiApiMigrationsAssemblyIdentifier); + } + } +} \ No newline at end of file diff --git a/Database/XAiApiDbContext.cs b/Database/XAiApiDbContext.cs new file mode 100644 index 0000000..a460177 --- /dev/null +++ b/Database/XAiApiDbContext.cs @@ -0,0 +1,60 @@ +using Microsoft.EntityFrameworkCore; +using xAiApi.Constants; +using xAiModels.Providers; +using xDataService.Configuration; +using xDataService.Db; +using xDataService.Providers; +using xFileService.Providers; +using xStringService.Providers; +using xTagService.Providers; + +namespace xAiApi.Database +{ + /// + /// Db Context of AiApi ... + /// + public class XAiApiDbContext : XDbContext + { + // + #region DbSets ... + #endregion + + // + #region Navigation Property Entities ... + #endregion + + // + #region Constructor ... + public XAiApiDbContext( + DbContextOptions options, + XDataServiceConfiguration config, + XEntityRegisterarHandlerService dynamicEntityHandlers + ) : base( + config: config, + options: options, + database: XAiApiConstants.XAiApiDbIdentifier, + dynamicEntityHandlers: dynamicEntityHandlers, + dynamicEntityRegisterarsNames: [ + nameof(XTagEntityRegisterar), + nameof(XFileEntityRegisterar), + nameof(XStringEntityRegisterar), + nameof(XAiMessageEntityRegisterar), + nameof(XAiProjectEntityRegisterar), + nameof(XAiConversationEntityRegisterar), + ] + ) + { } + #endregion + + // + #region Overrides ... + // + public override void OnXModelCreating(ModelBuilder modelBuilder) + { } + + // + public override void OnXConfiguring(DbContextOptionsBuilder optionsBuilder) + { } + #endregion + } +} \ No newline at end of file diff --git a/Db/.gitkeep b/Db/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Program.cs b/Program.cs index 3c03c91..92842c0 100644 --- a/Program.cs +++ b/Program.cs @@ -1,132 +1,259 @@ -using System.Reflection; -using IdentityModel.AspNetCore.OAuth2Introspection; -using xAiApi.Extensions; -using xCommons.Configurations; -using xCommons.Extensions; -using xHttpService.DI; -using System.Text.Json.Serialization; -using System.Text.Json; -using xIdentityService.DI; +// using xHttpService.DI; +// using xAiApi.Database; +// using xFileService.DI; +// using xDataService.DI; +// using xPushService.DI; +// using System.Text.Json; +// using System.Reflection; +// using xAiApi.Extensions; +// using xStringService.DI; +// using xStorageService.DI; +// using xCommons.Extensions; +// using xDataService.Models; +// using xIdentityService.DI; +// using xPushService.Helpers; +// using xCommons.Configurations; +// using System.Text.Json.Serialization; +// using IdentityModel.AspNetCore.OAuth2Introspection; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; -var builder = WebApplication.CreateBuilder(args); - -// -#region Register services ... -// -// Register Validation Provider and all XCommons Module Services ... -builder.Services.AddXCommons(); - -// -// Register App Configuration ... -builder.Services.AddXAppConfiguration(builder.Configuration); -var appConfiguration = builder.Services.GetRegisteredService(); - -// -// Register Allowed Origins ... -builder.Services.AddXCors(appConfiguration.AllowedOrigins); - -// -// Register Swagger ... -var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; -var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); -builder.Services.AddXSwagger(builder.Configuration, xmlFilePath: xmlPath); - -// -// Register HttpService ... -builder.Services.AddXHttpService(builder.Configuration); - -// -// Add Api V1 Versioning ... -builder.Services.AddXApiV1Versioning(); - -// -// OAuthIntrospectin Http Client Handler ... -// this is for handling SSLErrors ... -builder.Services.AddHttpClient(OAuth2IntrospectionDefaults.BackChannelHttpClientName) - .ConfigurePrimaryHttpMessageHandler(() => - { - return new HttpClientHandler - { - ServerCertificateCustomValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true - }; - }); - -// -// Register Authorizations ... -builder.Services.AddXAuthorization(); - -// -// Mapping Controllers ... -builder.Services.AddControllers() - .AddJsonOptions(x => - { - // - // Optional but recommended for .NET 8+: - // Allows reading properties case-insensitively (e.g., "myProp" matches "MyProp") ... - x.JsonSerializerOptions.PropertyNameCaseInsensitive = true; - - // - // This tells STJ to ignore circular references instead of throwing an exception ... - x.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; - - // - // Camel Case Naming Policy ... - x.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; - }); - -// -// Register XIdentity Service ... -builder.Services.AddXIdentityService( - configuration: builder.Configuration, - lifeTime: ServiceLifetime.Scoped -); -#endregion - -// -// Creating Application ... -var app = builder.Build(); - -// -#region Using Middlewares ... -// -// Configure the HTTP request pipeline. -if (app.Environment.IsDevelopment()) +namespace xAiApi { - app.UseDeveloperExceptionPage(); + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }); + } } // -// Use Swagger Middleware ... -app.UseXSwagger(); +#region .net 10 Standard ... +// // +// // Create Application Builder ... +// var builder = WebApplication.CreateBuilder(args); -// -// Force Https Redirection ... -app.UseHttpsRedirection(); +// // +// #region Register services ... +// // +// // Register Validation Provider and all XCommons Module Services ... +// builder.Services.AddXCommons(); -// -// Using Cors ... -app.UseXCors(); +// // +// // Register App Configuration ... +// builder.Services.AddXAppConfiguration(builder.Configuration); +// var appConfiguration = builder.Services.GetRegisteredService(); -// -// Using Routing ... -app.UseRouting(); +// // +// // Register Allowed Origins ... +// builder.Services.AddXCors(appConfiguration.AllowedOrigins); -// -// Use xIdentityService ... -app.UseXIdentityService(); +// // +// // Register Swagger ... +// var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; +// var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); +// builder.Services.AddXSwagger(builder.Configuration, xmlFilePath: xmlPath); -// -// Use Authorization ... -app.UseAuthorization(); +// // +// // Register HttpService ... +// builder.Services.AddXHttpService(builder.Configuration); -// -// Using Endpoints ... -app.UseEndpoints(endpoints => -{ - _ = endpoints.MapControllers(); -}); -#endregion +// // +// // Add Api V1 Versioning ... +// builder.Services.AddXApiV1Versioning(); -// -// Runing Application ... -app.Run(); +// // +// // OAuthIntrospectin Http Client Handler ... +// // this is for handling SSLErrors ... +// builder.Services.AddHttpClient(OAuth2IntrospectionDefaults.BackChannelHttpClientName) +// .ConfigurePrimaryHttpMessageHandler(() => +// { +// return new HttpClientHandler +// { +// ServerCertificateCustomValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true +// }; +// }); + +// // +// // Register Authorizations ... +// builder.Services.AddXAuthorization(); + +// // +// // Mapping Controllers ... +// builder.Services.AddControllers() +// .AddJsonOptions(x => +// { +// // +// // Optional but recommended for .NET 8+: +// // Allows reading properties case-insensitively (e.g., "myProp" matches "MyProp") ... +// x.JsonSerializerOptions.PropertyNameCaseInsensitive = true; + +// // +// // This tells STJ to ignore circular references instead of throwing an exception ... +// x.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; + +// // +// // Camel Case Naming Policy ... +// x.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; +// }); + +// // +// var lifeTime = ServiceLifetime.Scoped; +// var repositoryType = xDataService.Constants.XRepositoryType.EF; + +// // +// // Register XIdentity Service ... +// builder.Services.AddXIdentityService( +// lifeTime: lifeTime, +// configuration: builder.Configuration +// ); + +// // +// // Storage Service ... +// builder.Services.AddXStorageService(builder.Configuration); + +// // +// // Push Service ... +// builder.Services.AddXPushService( +// lifeTime: lifeTime, +// config: builder.Configuration +// ); + +// // +// // Preparing DataBases ... +// var databases = new List +// { +// // +// // Introduce Ai Api Descriptor ... +// new XAiApiDatabaseDescriptor() +// }; +// if (databases.HasChild()) +// { +// // +// databases +// .ToList() +// .ForEach(database => +// { +// // +// // Register DataBase ... +// builder.Services.AddXDatabase( +// lifeTime: lifeTime, +// descriptor: database, +// configuration: builder.Configuration +// ); +// }); +// } + +// // +// // Register String Service ... +// builder.Services.AddXStringService( +// lifeTime: lifeTime, +// repositoryType: repositoryType +// ); + +// // +// // Register File Service ... +// builder.Services.AddXFileService( +// lifeTime: lifeTime, +// repositoryType: repositoryType +// ); +// #endregion + +// // +// // Creating Application ... +// var app = builder.Build(); + +// // +// #region Using Middlewares ... +// // +// // Configure the HTTP request pipeline. +// var isDevelopmentEnvironment = false; +// if (app.Environment.IsDevelopment()) +// { +// isDevelopmentEnvironment = true; +// app.UseDeveloperExceptionPage(); +// } + +// // +// // Use Swagger Middleware ... +// app.UseXSwagger(); + +// // +// // Force Https Redirection ... +// app.UseHttpsRedirection(); + +// // +// // Using Cors ... +// app.UseXCors(); + +// // +// // Using Routing ... +// app.UseRouting(); + +// // +// // Use xIdentityService ... +// app.UseXIdentityService(); + +// // +// // Use Authorization ... +// app.UseAuthorization(); + +// // +// // Using Endpoints ... +// app.UseEndpoints(endpoints => +// { +// _ = endpoints.MapControllers(); +// }); + +// // +// // Use Storage Service ... +// app.UseXStorageService(); + +// // +// // Using DataBase ... +// if (databases.HasChild()) +// { +// // +// databases +// .ToList() +// .ForEach(database => +// { +// // +// app.UseXDatabase( +// descriptor: database, +// isDevelopmentEnvironment: isDevelopmentEnvironment +// ); +// }); +// } + +// // +// // Use PushService ... +// var pushHelper = new XPushServiceHelper(); +// app.UseXPushService(pushHelper); + +// // +// // Using String Service ... +// app.UseXStringService( +// isDevelopmentEnvironment: isDevelopmentEnvironment +// ); + +// // +// // Using File Service ... +// app.UseXFileService( +// isDevelopmentEnvironment: isDevelopmentEnvironment +// ); +// #endregion + +// // +// // Runing Application ... +// app.Run(); +#endregion \ No newline at end of file diff --git a/Startup.cs b/Startup.cs new file mode 100644 index 0000000..079dab6 --- /dev/null +++ b/Startup.cs @@ -0,0 +1,245 @@ +using xTagService.DI; +using xHttpService.DI; +using xAiApi.Database; +using xFileService.DI; +using xDataService.DI; +using xPushService.DI; +using Newtonsoft.Json; +using System.Reflection; +using xAiApi.Extensions; +using xStringService.DI; +using xStorageService.DI; +using xCommons.Extensions; +using xDataService.Models; +using xIdentityService.DI; +using xPushService.Helpers; +using xCommons.Configurations; +using Newtonsoft.Json.Serialization; +using IdentityModel.AspNetCore.OAuth2Introspection; + +namespace xAiApi +{ + public class Startup + { + // + public IConfiguration Configuration { get; } + private readonly List databases; + private readonly XAiApiDatabaseDescriptor apiDatabaseDescriptor; + + public Startup(IConfiguration configuration) + { + // + Configuration = configuration; + + // + // Create an Api Descriptor Class Instance ... + apiDatabaseDescriptor = new XAiApiDatabaseDescriptor(); + databases = new List + { + apiDatabaseDescriptor + }; + } + + public void ConfigureServices(IServiceCollection services) + { + // + // Register Validation Provider and all XCommons Module Services ... + services.AddXCommons(); + + // + // Register App Configuration ... + services.AddXAppConfiguration(Configuration); + var appConfiguration = services.GetRegisteredService(); + + // + // Register Allowed Origins ... + services.AddXCors(appConfiguration.AllowedOrigins); + + // + // Register Swagger ... + var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; + var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); + services.AddXSwagger(Configuration, xmlFilePath: xmlPath); + + // + // Register HttpService ... + services.AddXHttpService(Configuration); + + // + // Add Api V1 Versioning ... + services.AddXApiV1Versioning(); + + // + // OAuthIntrospectin Http Client Handler ... + // this is for handling SSLErrors ... + services.AddHttpClient(OAuth2IntrospectionDefaults.BackChannelHttpClientName) + .ConfigurePrimaryHttpMessageHandler(() => + { + return new HttpClientHandler + { + ServerCertificateCustomValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true + }; + }); + + // + // Register Authorizations ... + services.AddXAuthorization(); + + // + services.AddControllers() + .AddNewtonsoftJson(x => + { + x.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; + x.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); + }); + + // + var lifeTime = ServiceLifetime.Scoped; + var repositoryType = xDataService.Constants.XRepositoryType.EF; + + // + // Register XIdentity Service ... + services.AddXIdentityService( + lifeTime: lifeTime, + configuration: Configuration + ); + + // + // Storage Service ... + services.AddXStorageService(Configuration); + + // + // Push Service ... + services.AddXPushService( + lifeTime: lifeTime, + config: Configuration + ); + + // + // Preparing DataBases ... + if (databases.HasChild()) + { + // + databases + .ToList() + .ForEach(database => + { + // + // Register DataBase ... + services.AddXDatabase( + lifeTime: lifeTime, + descriptor: database, + configuration: Configuration + ); + }); + } + + // + // Register String Service ... + services.AddXStringService( + lifeTime: lifeTime, + repositoryType: repositoryType + ); + + // + // Register Tag Service ... + services.AddXTagService( + lifeTime: lifeTime, + repositoryType: repositoryType + ); + + // + // Register File Service ... + services.AddXFileService( + lifeTime: lifeTime, + repositoryType: repositoryType + ); + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + // + // Configure the HTTP request pipeline. + var isDevelopmentEnvironment = false; + if (env.IsDevelopment()) + { + isDevelopmentEnvironment = true; + app.UseDeveloperExceptionPage(); + } + + // + // Use Swagger Middleware ... + app.UseXSwagger(); + + // + // Force Https Redirection ... + app.UseHttpsRedirection(); + + // + // Using Cors ... + app.UseXCors(); + + // + // Using Routing ... + app.UseRouting(); + + // + // Use xIdentityService ... + app.UseXIdentityService(); + + // + // Use Authorization ... + app.UseAuthorization(); + + // + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); + }); + + // + // Use Storage Service ... + app.UseXStorageService(); + + // + // Use PushService ... + var pushHelper = new XPushServiceHelper(); + app.UseXPushService(pushHelper); + + // + // Using DataBase ... + if (databases.HasChild()) + { + // + databases + .ToList() + .ForEach(database => + { + // + app.UseXDatabase( + descriptor: database, + isDevelopmentEnvironment: isDevelopmentEnvironment + ); + }); + } + + // + // Using String Service ... + app.UseXStringService( + isDevelopmentEnvironment: isDevelopmentEnvironment + ); + + // + // Using XTag Service ... + app.UseXTagService( + isDevelopmentEnvironment: isDevelopmentEnvironment + ); + + // + // Using File Service ... + app.UseXFileService( + isDevelopmentEnvironment: isDevelopmentEnvironment + ); + } + } +} \ No newline at end of file diff --git a/appsettings.json b/appsettings.json index 0898290..4709a07 100644 --- a/appsettings.json +++ b/appsettings.json @@ -24,6 +24,30 @@ "DisableSSLCheck": true, "DefaultClientTimeout": -1 }, + "DataServiceConfiguration": { + "Databases": { + "xAiApiDb": { + "Provider": "SQLITE", + "ConnectionString": "Filename=./Db/XAiApi.db", + "SeedItems": {} + } + }, + "EnableTracking": true, + "EnableSoftDelete": true, + "EnableDetailedErrors": false, + "SeedingMode": "AddIfNotExists", + "EnableSensitiveDataLogging": true, + "PagingConfiguration": { + "DefaultPageSize": 20, + "MaxAvailablePageSize": 400, + "MinAvailablePageSize": 5 + }, + "GraphQLBasePath": "/graphs" + }, + "PushServiceConfiguration": { + "BaseRoute": "hubs", + "AddSupportMessageProtocol": true + }, "Logging": { "LogLevel": { "Default": "Information", @@ -31,4 +55,4 @@ } }, "AllowedHosts": "*" -} +} \ No newline at end of file diff --git a/xAiApi.csproj b/xAiApi.csproj index ed05ba8..7e8d366 100644 --- a/xAiApi.csproj +++ b/xAiApi.csproj @@ -4,12 +4,13 @@ 1.0.0 enable - 13.0 + 12.0 Hadi Khazaee Asl SaherElm IT Center xSaherElm.xAiApi enable - net10.0 + + net8.0 a WebAPI Project which contains all Business Logic of xSaherElm Project's AI. @@ -36,12 +37,19 @@ + + + + + + + @@ -52,4 +60,17 @@ $(NoWarn);1591 + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + \ No newline at end of file