diff options
author | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2019-07-24 18:31:24 -0400 |
---|---|---|
committer | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2019-09-14 18:58:45 -0400 |
commit | f6b336def7b05c3ef202f6c6b5e77dcaa0c498fa (patch) | |
tree | 5e4bce986557611ee67ae076736c2b05ed430c29 /src | |
parent | e856d5efebe12b3aa65d5868ea7baa59cc54863d (diff) | |
download | SMAPI-f6b336def7b05c3ef202f6c6b5e77dcaa0c498fa.tar.gz SMAPI-f6b336def7b05c3ef202f6c6b5e77dcaa0c498fa.tar.bz2 SMAPI-f6b336def7b05c3ef202f6c6b5e77dcaa0c498fa.zip |
store DateTimeOffset values in date fields instead of the default array (#651)
Diffstat (limited to 'src')
-rw-r--r-- | src/SMAPI.Web/Framework/Caching/UtcDateTimeOffsetSerializer.cs | 40 | ||||
-rw-r--r-- | src/SMAPI.Web/Startup.cs | 8 |
2 files changed, 47 insertions, 1 deletions
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 +{ + /// <summary>Serialises <see cref="DateTimeOffset"/> to a UTC date field instead of the default array.</summary> + public class UtcDateTimeOffsetSerializer : StructSerializerBase<DateTimeOffset> + { + /********* + ** Fields + *********/ + /// <summary>The underlying date serializer.</summary> + private static readonly DateTimeSerializer DateTimeSerializer = new DateTimeSerializer(DateTimeKind.Utc, BsonType.DateTime); + + + /********* + ** Public methods + *********/ + /// <summary>Deserializes a value.</summary> + /// <param name="context">The deserialization context.</param> + /// <param name="args">The deserialization args.</param> + /// <returns>A deserialized value.</returns> + public override DateTimeOffset Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) + { + DateTime date = UtcDateTimeOffsetSerializer.DateTimeSerializer.Deserialize(context, args); + return new DateTimeOffset(date, TimeSpan.Zero); + } + + /// <summary>Serializes a value.</summary> + /// <param name="context">The serialization context.</param> + /// <param name="args">The serialization args.</param> + /// <param name="value">The object.</param> + 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<IMongoDatabase>(serv => new MongoClient(mongoConfig.GetConnectionString()).GetDatabase(mongoConfig.Database)); + services.AddSingleton<IMongoDatabase>(serv => + { + BsonSerializer.RegisterSerializer(new UtcDateTimeOffsetSerializer()); + return new MongoClient(mongoConfig.GetConnectionString()).GetDatabase(mongoConfig.Database); + }); services.AddSingleton<IWikiCacheRepository>(serv => new WikiCacheRepository(serv.GetRequiredService<IMongoDatabase>())); // init Hangfire |