From b99805fd58bf36175e5298c06b3484a7a0b21db9 Mon Sep 17 00:00:00 2001
From: Timothy Baldridge <tbaldridge@gmail.com>
Date: Tue, 12 May 2020 17:19:54 -0600
Subject: [PATCH] Fix how we handle UTC dates with SQL

---
 Wabbajack.Server/Controllers/NexusCache.cs |  6 ++++--
 Wabbajack.Server/DataLayer/Mappers.cs      | 17 +++++++++++++++++
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/Wabbajack.Server/Controllers/NexusCache.cs b/Wabbajack.Server/Controllers/NexusCache.cs
index c1320fc3..b5ed0414 100644
--- a/Wabbajack.Server/Controllers/NexusCache.cs
+++ b/Wabbajack.Server/Controllers/NexusCache.cs
@@ -54,7 +54,7 @@ namespace Wabbajack.BuildServer.Controllers
             {
                 var api = await NexusApiClient.Get(Request.Headers["apikey"].FirstOrDefault());
                 result = await api.GetModInfo(game, ModId, false);
-                await _sql.AddNexusModInfo(game, ModId, DateTime.UtcNow, result);
+                await _sql.AddNexusModInfo(game, ModId, result.updated_time, result);
 
                 
                 method = "NOT_CACHED";
@@ -82,7 +82,9 @@ namespace Wabbajack.BuildServer.Controllers
             {
                 var api = await NexusApiClient.Get(Request.Headers["apikey"].FirstOrDefault());
                 result = await api.GetModFiles(game, ModId, false);
-                await _sql.AddNexusModFiles(game, ModId, DateTime.UtcNow, result);
+                var date = result.files.Select(f => f.uploaded_time).OrderByDescending(o => o).FirstOrDefault();
+                date = date == default ? DateTime.UtcNow : date;
+                await _sql.AddNexusModFiles(game, ModId, date, result);
 
                 method = "NOT_CACHED";
                 Interlocked.Increment(ref ForwardCount);
diff --git a/Wabbajack.Server/DataLayer/Mappers.cs b/Wabbajack.Server/DataLayer/Mappers.cs
index 0de6dc9b..95312b18 100644
--- a/Wabbajack.Server/DataLayer/Mappers.cs
+++ b/Wabbajack.Server/DataLayer/Mappers.cs
@@ -17,6 +17,23 @@ namespace Wabbajack.Server.DataLayer
             SqlMapper.AddTypeHandler(new JsonMapper<CDNFileDefinition>());
             SqlMapper.AddTypeHandler(new VersionMapper());
             SqlMapper.AddTypeHandler(new GameMapper());
+            SqlMapper.AddTypeHandler(new DateTimeHandler());
+        }
+        
+        /// <summary>
+        /// Needed to make sure dates are all in UTC format
+        /// </summary>
+        private class DateTimeHandler : SqlMapper.TypeHandler<DateTime>
+        {
+            public override void SetValue(IDbDataParameter parameter, DateTime value)
+            {
+                parameter.Value = value;
+            }
+
+            public override DateTime Parse(object value)
+            {
+                return DateTime.SpecifyKind((DateTime)value, DateTimeKind.Utc);
+            }
         }
 
         class JsonMapper<T> : SqlMapper.TypeHandler<T>