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>