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