From 998a4d5ab98f3abda5dbc1c0f2af4bfdd58bd7c3 Mon Sep 17 00:00:00 2001 From: csimonapastore Date: Thu, 5 Sep 2024 01:52:07 +0200 Subject: [PATCH] Adding database configuration - wip --- MainProject/Core/Database/MongoDbContext.cs | 26 +++++++++ MainProject/Core/Database/SqlServerContext.cs | 20 +++++++ MainProject/MainProject.csproj | 15 +++++ MainProject/Models/Database/Mongo/Log.cs | 11 ++++ MainProject/Models/Database/SqlServer/Base.cs | 16 ++++++ MainProject/Models/Database/SqlServer/Role.cs | 12 ++++ MainProject/Models/Database/SqlServer/User.cs | 19 +++++++ MainProject/Models/Settings/AppSettings.cs | 1 + .../Models/Settings/DatabaseSettings.cs | 9 +++ .../Models/Settings/MongoDbSettings.cs | 9 +++ MainProject/Program.cs | 9 +-- MainProject/Utils/ProgramUtils.cs | 57 ++++++++++++++++++- MainProject/appsettings.json | 14 ++++- 13 files changed, 210 insertions(+), 8 deletions(-) create mode 100644 MainProject/Core/Database/MongoDbContext.cs create mode 100644 MainProject/Core/Database/SqlServerContext.cs create mode 100644 MainProject/Models/Database/Mongo/Log.cs create mode 100644 MainProject/Models/Database/SqlServer/Base.cs create mode 100644 MainProject/Models/Database/SqlServer/Role.cs create mode 100644 MainProject/Models/Database/SqlServer/User.cs create mode 100644 MainProject/Models/Settings/DatabaseSettings.cs create mode 100644 MainProject/Models/Settings/MongoDbSettings.cs diff --git a/MainProject/Core/Database/MongoDbContext.cs b/MainProject/Core/Database/MongoDbContext.cs new file mode 100644 index 0000000..f3ee5ca --- /dev/null +++ b/MainProject/Core/Database/MongoDbContext.cs @@ -0,0 +1,26 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using MongoDB.Bson; +using MongoDB.Driver; +using MongoDB.EntityFrameworkCore; +using MongoDB.EntityFrameworkCore.Extensions; +using BasicDotnetTemplate.MainProject.Models.Database.Mongo; + + +namespace BasicDotnetTemplate.MainProject.Core.Database +{ + public class MongoDbContext : DbContext + { + public MongoDbContext(DbContextOptions options) : base(options) { } + + public DbSet Logs { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity().ToCollection("Logs"); + } + } +} + + + diff --git a/MainProject/Core/Database/SqlServerContext.cs b/MainProject/Core/Database/SqlServerContext.cs new file mode 100644 index 0000000..e9b15ab --- /dev/null +++ b/MainProject/Core/Database/SqlServerContext.cs @@ -0,0 +1,20 @@ +using Microsoft.EntityFrameworkCore; +using BasicDotnetTemplate.MainProject.Models.Database.SqlServer; + + +namespace BasicDotnetTemplate.MainProject.Core.Database +{ + public class SqlServerContext : DbContext + { + + public SqlServerContext(DbContextOptions options) + : base(options) + { + } + + public DbSet Users { get; set; } + } +} + + + diff --git a/MainProject/MainProject.csproj b/MainProject/MainProject.csproj index b180db7..b004205 100644 --- a/MainProject/MainProject.csproj +++ b/MainProject/MainProject.csproj @@ -13,9 +13,24 @@ all + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + diff --git a/MainProject/Models/Database/Mongo/Log.cs b/MainProject/Models/Database/Mongo/Log.cs new file mode 100644 index 0000000..f3d4e92 --- /dev/null +++ b/MainProject/Models/Database/Mongo/Log.cs @@ -0,0 +1,11 @@ +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace BasicDotnetTemplate.MainProject.Models.Database.Mongo +{ + public class Log + { + [BsonId] + public ObjectId Id { get; set; } + } +} \ No newline at end of file diff --git a/MainProject/Models/Database/SqlServer/Base.cs b/MainProject/Models/Database/SqlServer/Base.cs new file mode 100644 index 0000000..6569442 --- /dev/null +++ b/MainProject/Models/Database/SqlServer/Base.cs @@ -0,0 +1,16 @@ +namespace BasicDotnetTemplate.MainProject.Models.Database.SqlServer +{ + public class Base + { + public int Id { get; set; } + public DateTime CreationTime { get; set; } + public int CreationUserId { get; set; } + public DateTime UpdateTime { get; set; } + public int UpdateUserId { get; set; } + public DateTime DeletionTime { get; set; } + public int DeletionUserId { get; set; } + } +} + + + diff --git a/MainProject/Models/Database/SqlServer/Role.cs b/MainProject/Models/Database/SqlServer/Role.cs new file mode 100644 index 0000000..e5ef2f4 --- /dev/null +++ b/MainProject/Models/Database/SqlServer/Role.cs @@ -0,0 +1,12 @@ +using System.Text.Json.Serialization; + +namespace BasicDotnetTemplate.MainProject.Models.Database.SqlServer +{ + public class Role : Base + { + public required string Name { get; set; } + } +} + + + diff --git a/MainProject/Models/Database/SqlServer/User.cs b/MainProject/Models/Database/SqlServer/User.cs new file mode 100644 index 0000000..5f24212 --- /dev/null +++ b/MainProject/Models/Database/SqlServer/User.cs @@ -0,0 +1,19 @@ +using System.Text.Json.Serialization; + +namespace BasicDotnetTemplate.MainProject.Models.Database.SqlServer +{ + public class User : Base + { + public required string Username { get; set; } + public required string FirstName { get; set; } + public required string LastName { get; set; } + public required string Email { get; set; } + public required Role Role { get; set; } + + [JsonIgnore] + public required string PasswordHash { get; set; } + } +} + + + diff --git a/MainProject/Models/Settings/AppSettings.cs b/MainProject/Models/Settings/AppSettings.cs index 0e26c5e..86dec6d 100644 --- a/MainProject/Models/Settings/AppSettings.cs +++ b/MainProject/Models/Settings/AppSettings.cs @@ -6,6 +6,7 @@ public class AppSettings public Settings? Settings { get; set; } public PrivateSettings? PrivateSettings { get; set; } public OpenApiSettings? OpenApiSettings { get; set; } + public DatabaseSettings? DatabaseSettings { get; set; } #nullable disable } \ No newline at end of file diff --git a/MainProject/Models/Settings/DatabaseSettings.cs b/MainProject/Models/Settings/DatabaseSettings.cs new file mode 100644 index 0000000..af9fd51 --- /dev/null +++ b/MainProject/Models/Settings/DatabaseSettings.cs @@ -0,0 +1,9 @@ +namespace BasicDotnetTemplate.MainProject.Models.Settings; + +public class DatabaseSettings +{ +#nullable enable + public string? SqlServerConnectionString { get; set; } + public MongoDbSettings? MongoDbSettings { get; set; } +#nullable disable +} \ No newline at end of file diff --git a/MainProject/Models/Settings/MongoDbSettings.cs b/MainProject/Models/Settings/MongoDbSettings.cs new file mode 100644 index 0000000..042ddc6 --- /dev/null +++ b/MainProject/Models/Settings/MongoDbSettings.cs @@ -0,0 +1,9 @@ +namespace BasicDotnetTemplate.MainProject.Models.Settings; + +public class MongoDbSettings +{ +#nullable enable + public string? MongoDbConnectionString { get; set; } + public string? DatabaseName { get; set; } +#nullable disable +} \ No newline at end of file diff --git a/MainProject/Program.cs b/MainProject/Program.cs index 9edcba3..95dcd1b 100644 --- a/MainProject/Program.cs +++ b/MainProject/Program.cs @@ -1,11 +1,10 @@ -using System; -using System.Runtime.CompilerServices; -using Microsoft.OpenApi.Models; -using NLog; +using NLog; using BasicDotnetTemplate.MainProject.Models.Settings; using System.Reflection; using BasicDotnetTemplate.MainProject.Utils; + + namespace BasicDotnetTemplate.MainProject; public static class ReflectionProgram @@ -41,8 +40,10 @@ internal static class Program AppSettings appSettings = ProgramUtils.AddConfiguration(ref builder); ProgramUtils.AddServices(ref builder); ProgramUtils.AddOpenApi(ref builder, appSettings); + ProgramUtils.AddDbContext(ref builder, appSettings); WebApplication app = builder.Build(); ProgramUtils.AddMiddlewares(ref app); + Logger.Info("[Program][Initialize] End building"); return app; } diff --git a/MainProject/Utils/ProgramUtils.cs b/MainProject/Utils/ProgramUtils.cs index 701e0e0..b5424f5 100644 --- a/MainProject/Utils/ProgramUtils.cs +++ b/MainProject/Utils/ProgramUtils.cs @@ -1,9 +1,11 @@ -using System; -using System.Runtime.CompilerServices; +using Microsoft.EntityFrameworkCore; using Microsoft.OpenApi.Models; +using MongoDB.Driver; using NLog; +using BasicDotnetTemplate.MainProject.Core.Database; using BasicDotnetTemplate.MainProject.Models.Settings; -using System.Reflection; + + namespace BasicDotnetTemplate.MainProject.Utils; @@ -125,4 +127,53 @@ public static class ProgramUtils Logger.Info("[ProgramUtils][AddMiddlewares] Done middlewares"); } + public static void AddDbContext(ref WebApplicationBuilder builder, AppSettings appSettings) + { + Logger.Info("[ProgramUtils][AddDbContext] Adding DbContext"); + var databaseAdded = ""; + + var connectionString = appSettings?.DatabaseSettings?.SqlServerConnectionString ?? String.Empty; + + if (!String.IsNullOrEmpty(connectionString)) + { + connectionString = connectionString.Replace("SQLSERVER_DB_SERVER", Environment.GetEnvironmentVariable("SQLSERVER_DB_SERVER")); + connectionString = connectionString.Replace("SQLSERVER_DB_DATABASE", Environment.GetEnvironmentVariable("SQLSERVER_DB_DATABASE")); + connectionString = connectionString.Replace("SQLSERVER_DB_USER", Environment.GetEnvironmentVariable("SQLSERVER_DB_USER")); + connectionString = connectionString.Replace("SQLSERVER_DB_PASSWORD", Environment.GetEnvironmentVariable("SQLSERVER_DB_PASSWORD")); + + builder.Services.AddDbContext(options => + options.UseSqlServer(connectionString)); + + databaseAdded += "SqlServer"; + } + + + + connectionString = appSettings?.DatabaseSettings?.MongoDbSettings?.MongoDbConnectionString ?? String.Empty; + + if (!String.IsNullOrEmpty(connectionString)) + { + connectionString = connectionString.Replace("MONGODB_DB_SERVER", Environment.GetEnvironmentVariable("MONGODB_DB_SERVER")); + connectionString = connectionString.Replace("MONGODB_DB_DATABASE", Environment.GetEnvironmentVariable("MONGODB_DB_DATABASE")); + connectionString = connectionString.Replace("MONGODB_DB_USER", Environment.GetEnvironmentVariable("MONGODB_DB_USER")); + connectionString = connectionString.Replace("MONGODB_DB_PASSWORD", Environment.GetEnvironmentVariable("MONGODB_DB_PASSWORD")); + + var mongoClient = new MongoClient(connectionString); + + var databaseName = appSettings?.DatabaseSettings?.MongoDbSettings?.DatabaseName ?? Environment.GetEnvironmentVariable("MONGODB_DB_DATABASE") ?? String.Empty; + + if (!String.IsNullOrEmpty(databaseName)) + { + var dbContextOptions = new DbContextOptionsBuilder() + .UseMongoDB(mongoClient, databaseName); + } + + databaseAdded += (String.IsNullOrEmpty(databaseAdded) ? "" : ", ") + "MongoDB"; + } + + var message = String.IsNullOrEmpty(databaseAdded) ? "No DbContext added" : $"{databaseAdded} added"; + + Logger.Info($"[ProgramUtils][AddDbContext] {message}"); + } + } \ No newline at end of file diff --git a/MainProject/appsettings.json b/MainProject/appsettings.json index 0e20c40..46a5864 100644 --- a/MainProject/appsettings.json +++ b/MainProject/appsettings.json @@ -6,6 +6,13 @@ "Version": "v1.0", "Description": "This template contains basic configuration for a .Net 8 backend" }, + "DatabaseSettings": { + "SqlServerConnectionString": "Server=SQLSERVER_DB_SERVER;Initial Catalog=SQLSERVER_DB_DATABASE;User Id=SQLSERVER_DB_USER;Password=SQLSERVER_DB_PASSWORD;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30;", + "MongoDbSettings": { + "MongoDbConnectionString": "mongodb://MONGODB_DB_USER:MONGODB_DB_PASSWORD@MONGODB_DB_SERVER:27017/MONGODB_DB_DATABASE", + "DatabaseName": "BaseDb" + } + }, "OpenApiSettings": { "TermsOfServiceUrl": "", "OpenApiContact": { @@ -16,7 +23,12 @@ "Name": "MIT License", "Url": "https://github.com/csimonapastore/BasicDotnetTemplate/blob/main/LICENSE.md" } + }, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } } } - } \ No newline at end of file