using System.Diagnostics; using Azaion.Common.Configs; using LinqToDB; using Microsoft.Extensions.Options; namespace Azaion.Common.Database; public interface IDbFactory { Task Run(Func> func); Task Run(Func func); Task RunAdmin(Func func); } public class DbFactory : IDbFactory { private readonly DataOptions _dataOptions; private readonly DataOptions _dataOptionsAdmin; public DbFactory(IOptions connectionString) { _dataOptions = LoadOptions(connectionString.Value.AzaionDb); _dataOptionsAdmin = LoadOptions(connectionString.Value.AzaionDbAdmin); } private DataOptions LoadOptions(string connStr) { if (string.IsNullOrEmpty(connStr)) throw new ArgumentException($"Empty connection string in config!"); var dataOptions = new DataOptions() .UsePostgreSQL(connStr) .UseMappingSchema(AzaionDbSchemaHolder.MappingSchema); _ = dataOptions.UseTracing(TraceLevel.Info, t => Console.WriteLine(t.SqlText)); return dataOptions; } public async Task Run(Func> func) { await using var db = new AzaionDb(_dataOptions); return await func(db); } public async Task Run(Func func) { await using var db = new AzaionDb(_dataOptions); await func(db); } public async Task RunAdmin(Func func) { await using var db = new AzaionDb(_dataOptionsAdmin); await func(db); } }