diff --git a/back/src/Kyoo.Postgresql/PostgresContext.cs b/back/src/Kyoo.Postgresql/PostgresContext.cs index fbc5ccf1..dac43056 100644 --- a/back/src/Kyoo.Postgresql/PostgresContext.cs +++ b/back/src/Kyoo.Postgresql/PostgresContext.cs @@ -24,6 +24,12 @@ using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Query.SqlExpressions; using Npgsql; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using Dapper; +using InterpolatedSql.SqlBuilders; +using Kyoo.Postgresql.Utils; +using Kyoo.Utils; namespace Kyoo.Postgresql; @@ -42,15 +48,6 @@ public class PostgresContext : DatabaseContext /// private readonly bool _skipConfigure; - // TODO: This needs ot be updated but ef-core still does not offer a way to use this. - [Obsolete] - static PostgresContext() - { - NpgsqlConnection.GlobalTypeMapper.MapEnum(); - NpgsqlConnection.GlobalTypeMapper.MapEnum(); - NpgsqlConnection.GlobalTypeMapper.MapEnum(); - } - /// /// Design time constructor (dotnet ef migrations add). Do not use /// @@ -102,11 +99,46 @@ public class PostgresContext : DatabaseContext "md5", args, nullable: true, - argumentsPropagateNullability: new[] { false }, + argumentsPropagateNullability: [false], type: args[0].Type, typeMapping: args[0].TypeMapping )); + + SqlMapper.TypeMapProvider = (type) => + { + return new CustomPropertyTypeMap( + type, + (type, name) => + { + string newName = Regex.Replace( + name, + "(^|_)([a-z])", + (match) => match.Groups[2].Value.ToUpperInvariant() + ); + // TODO: Add images handling here (name: poster_source, newName: PosterSource) should set Poster.Source + return type.GetProperty(newName)!; + } + ); + }; + SqlMapper.AddTypeHandler( + typeof(Dictionary), + new JsonTypeHandler>() + ); + SqlMapper.AddTypeHandler( + typeof(Dictionary), + new JsonTypeHandler>() + ); + SqlMapper.AddTypeHandler( + typeof(Dictionary), + new JsonTypeHandler>() + ); + SqlMapper.AddTypeHandler(typeof(List), new ListTypeHandler()); + SqlMapper.AddTypeHandler(typeof(List), new ListTypeHandler()); + SqlMapper.AddTypeHandler(typeof(Wrapper), new Wrapper.Handler()); + InterpolatedSqlBuilderOptions.DefaultOptions.ReuseIdenticalParameters = true; + InterpolatedSqlBuilderOptions.DefaultOptions.AutoFixSingleQuotes = false; + base.OnModelCreating(modelBuilder); } diff --git a/back/src/Kyoo.Postgresql/PostgresModule.cs b/back/src/Kyoo.Postgresql/PostgresModule.cs index 56c65264..59b8bbdb 100644 --- a/back/src/Kyoo.Postgresql/PostgresModule.cs +++ b/back/src/Kyoo.Postgresql/PostgresModule.cs @@ -16,16 +16,9 @@ // You should have received a copy of the GNU General Public License // along with Kyoo. If not, see . -using System; -using System.Collections.Generic; using System.Data.Common; -using System.Text.RegularExpressions; -using Dapper; -using InterpolatedSql.SqlBuilders; -using Kyoo.Abstractions.Controllers; using Kyoo.Abstractions.Models; -using Kyoo.Postgresql.Utils; -using Kyoo.Utils; +using Kyoo.Abstractions.Controllers; using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; @@ -43,43 +36,6 @@ public class PostgresModule(IConfiguration configuration, IWebHostEnvironment en /// public string Name => "Postgresql"; - static PostgresModule() - { - SqlMapper.TypeMapProvider = (type) => - { - return new CustomPropertyTypeMap( - type, - (type, name) => - { - string newName = Regex.Replace( - name, - "(^|_)([a-z])", - (match) => match.Groups[2].Value.ToUpperInvariant() - ); - // TODO: Add images handling here (name: poster_source, newName: PosterSource) should set Poster.Source - return type.GetProperty(newName)!; - } - ); - }; - SqlMapper.AddTypeHandler( - typeof(Dictionary), - new JsonTypeHandler>() - ); - SqlMapper.AddTypeHandler( - typeof(Dictionary), - new JsonTypeHandler>() - ); - SqlMapper.AddTypeHandler( - typeof(Dictionary), - new JsonTypeHandler>() - ); - SqlMapper.AddTypeHandler(typeof(List), new ListTypeHandler()); - SqlMapper.AddTypeHandler(typeof(List), new ListTypeHandler()); - SqlMapper.AddTypeHandler(typeof(Wrapper), new Wrapper.Handler()); - InterpolatedSqlBuilderOptions.DefaultOptions.ReuseIdenticalParameters = true; - InterpolatedSqlBuilderOptions.DefaultOptions.AutoFixSingleQuotes = false; - } - /// public void Configure(IServiceCollection services) { @@ -96,10 +52,16 @@ public class PostgresModule(IConfiguration configuration, IWebHostEnvironment en ["TIMEOUT"] = "30" }; + NpgsqlDataSourceBuilder dsBuilder = new(builder.ConnectionString); + dsBuilder.MapEnum(); + dsBuilder.MapEnum(); + dsBuilder.MapEnum(); + var dataSource = dsBuilder.Build(); + services.AddDbContext( x => { - x.UseNpgsql(builder.ConnectionString).UseProjectables(); + x.UseNpgsql(dataSource).UseProjectables(); if (environment.IsDevelopment()) x.EnableDetailedErrors().EnableSensitiveDataLogging(); },