Selaa lähdekoodia

Fix efcore not returning a UTC DateTime

crobibero 4 vuotta sitten
vanhempi
sitoutus
6c0188c42b

+ 2 - 0
Jellyfin.Server.Implementations/JellyfinDb.cs

@@ -1,5 +1,6 @@
 #pragma warning disable CS1591
 
+using System;
 using System.Linq;
 using Jellyfin.Data.Entities;
 using Jellyfin.Data.Interfaces;
@@ -140,6 +141,7 @@ namespace Jellyfin.Server.Implementations
         /// <inheritdoc />
         protected override void OnModelCreating(ModelBuilder modelBuilder)
         {
+            modelBuilder.SetDefaultDateTimeKind(DateTimeKind.Utc);
             base.OnModelCreating(modelBuilder);
 
             modelBuilder.HasDefaultSchema("jellyfin");

+ 48 - 0
Jellyfin.Server.Implementations/ModelBuilderExtensions.cs

@@ -0,0 +1,48 @@
+using System;
+using Jellyfin.Server.Implementations.ValueConverters;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+namespace Jellyfin.Server.Implementations
+{
+    /// <summary>
+    /// Model builder extensions.
+    /// </summary>
+    public static class ModelBuilderExtensions
+    {
+        /// <summary>
+        /// Specify value converter for the object type.
+        /// </summary>
+        /// <param name="modelBuilder">The model builder.</param>
+        /// <param name="converter">The <see cref="ValueConverter{TModel,TProvider}"/>.</param>
+        /// <typeparam name="T">The type to convert.</typeparam>
+        /// <returns>The modified <see cref="ModelBuilder"/>.</returns>
+        public static ModelBuilder UseValueConverterForType<T>(this ModelBuilder modelBuilder, ValueConverter converter)
+        {
+            var type = typeof(T);
+            foreach (var entityType in modelBuilder.Model.GetEntityTypes())
+            {
+                foreach (var property in entityType.GetProperties())
+                {
+                    if (property.ClrType == type)
+                    {
+                        property.SetValueConverter(converter);
+                    }
+                }
+            }
+
+            return modelBuilder;
+        }
+
+        /// <summary>
+        /// Specify the default <see cref="DateTimeKind"/>.
+        /// </summary>
+        /// <param name="modelBuilder">The model builder to extend.</param>
+        /// <param name="kind">The <see cref="DateTimeKind"/> to specify.</param>
+        public static void SetDefaultDateTimeKind(this ModelBuilder modelBuilder, DateTimeKind kind)
+        {
+            modelBuilder.UseValueConverterForType<DateTime>(new DateTimeKindValueConverter(kind));
+            modelBuilder.UseValueConverterForType<DateTime?>(new DateTimeKindValueConverter(kind));
+        }
+    }
+}

+ 21 - 0
Jellyfin.Server.Implementations/ValueConverters/DateTimeKindValueConverter.cs

@@ -0,0 +1,21 @@
+using System;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+namespace Jellyfin.Server.Implementations.ValueConverters
+{
+    /// <summary>
+    /// ValueConverter to specify kind.
+    /// </summary>
+    public class DateTimeKindValueConverter : ValueConverter<DateTime, DateTime>
+    {
+        /// <summary>
+        /// Initializes a new instance of the <see cref="DateTimeKindValueConverter"/> class.
+        /// </summary>
+        /// <param name="kind">The kind to specify.</param>
+        /// <param name="mappingHints">The mapping hints.</param>
+        public DateTimeKindValueConverter(DateTimeKind kind, ConverterMappingHints mappingHints = null)
+            : base(v => v.ToUniversalTime(), v => DateTime.SpecifyKind(v, kind), mappingHints)
+        {
+        }
+    }
+}

+ 0 - 24
MediaBrowser.Common/Json/Converters/JsonDateTimeIso8601Converter.cs

@@ -1,24 +0,0 @@
-using System;
-using System.Globalization;
-using System.Text.Json;
-using System.Text.Json.Serialization;
-
-namespace MediaBrowser.Common.Json.Converters
-{
-    /// <summary>
-    /// Returns an ISO8601 formatted datetime.
-    /// </summary>
-    /// <remarks>
-    /// Used for legacy compatibility.
-    /// </remarks>
-    public class JsonDateTimeIso8601Converter : JsonConverter<DateTime>
-    {
-        /// <inheritdoc />
-        public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
-            => reader.GetDateTime();
-
-        /// <inheritdoc />
-        public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
-            => writer.WriteStringValue(value.ToString("O", CultureInfo.InvariantCulture));
-    }
-}

+ 0 - 1
MediaBrowser.Common/Json/JsonDefaults.cs

@@ -43,7 +43,6 @@ namespace MediaBrowser.Common.Json
             options.Converters.Add(new JsonVersionConverter());
             options.Converters.Add(new JsonStringEnumConverter());
             options.Converters.Add(new JsonNullableStructConverterFactory());
-            options.Converters.Add(new JsonDateTimeIso8601Converter());
 
             return options;
         }