From f6b336def7b05c3ef202f6c6b5e77dcaa0c498fa Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Wed, 24 Jul 2019 18:31:24 -0400 Subject: store DateTimeOffset values in date fields instead of the default array (#651) --- .../Caching/UtcDateTimeOffsetSerializer.cs | 40 ++++++++++++++++++++++ src/SMAPI.Web/Startup.cs | 8 ++++- 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/SMAPI.Web/Framework/Caching/UtcDateTimeOffsetSerializer.cs (limited to 'src') diff --git a/src/SMAPI.Web/Framework/Caching/UtcDateTimeOffsetSerializer.cs b/src/SMAPI.Web/Framework/Caching/UtcDateTimeOffsetSerializer.cs new file mode 100644 index 00000000..ad95a975 --- /dev/null +++ b/src/SMAPI.Web/Framework/Caching/UtcDateTimeOffsetSerializer.cs @@ -0,0 +1,40 @@ +using System; +using MongoDB.Bson; +using MongoDB.Bson.Serialization; +using MongoDB.Bson.Serialization.Serializers; + +namespace StardewModdingAPI.Web.Framework.Caching +{ + /// Serialises to a UTC date field instead of the default array. + public class UtcDateTimeOffsetSerializer : StructSerializerBase + { + /********* + ** Fields + *********/ + /// The underlying date serializer. + private static readonly DateTimeSerializer DateTimeSerializer = new DateTimeSerializer(DateTimeKind.Utc, BsonType.DateTime); + + + /********* + ** Public methods + *********/ + /// Deserializes a value. + /// The deserialization context. + /// The deserialization args. + /// A deserialized value. + public override DateTimeOffset Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) + { + DateTime date = UtcDateTimeOffsetSerializer.DateTimeSerializer.Deserialize(context, args); + return new DateTimeOffset(date, TimeSpan.Zero); + } + + /// Serializes a value. + /// The serialization context. + /// The serialization args. + /// The object. + public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, DateTimeOffset value) + { + UtcDateTimeOffsetSerializer.DateTimeSerializer.Serialize(context, args, value.UtcDateTime); + } + } +} diff --git a/src/SMAPI.Web/Startup.cs b/src/SMAPI.Web/Startup.cs index d0456df3..caa7b056 100644 --- a/src/SMAPI.Web/Startup.cs +++ b/src/SMAPI.Web/Startup.cs @@ -7,10 +7,12 @@ using Microsoft.AspNetCore.Rewrite; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using MongoDB.Bson.Serialization; using MongoDB.Driver; using Newtonsoft.Json; using StardewModdingAPI.Toolkit.Serialisation; using StardewModdingAPI.Web.Framework; +using StardewModdingAPI.Web.Framework.Caching; using StardewModdingAPI.Web.Framework.Caching.Wiki; using StardewModdingAPI.Web.Framework.Clients.Chucklefish; using StardewModdingAPI.Web.Framework.Clients.GitHub; @@ -81,7 +83,11 @@ namespace StardewModdingAPI.Web } // init MongoDB - services.AddSingleton(serv => new MongoClient(mongoConfig.GetConnectionString()).GetDatabase(mongoConfig.Database)); + services.AddSingleton(serv => + { + BsonSerializer.RegisterSerializer(new UtcDateTimeOffsetSerializer()); + return new MongoClient(mongoConfig.GetConnectionString()).GetDatabase(mongoConfig.Database); + }); services.AddSingleton(serv => new WikiCacheRepository(serv.GetRequiredService())); // init Hangfire -- cgit