From 3dbef199aaa0fe66e7f7976cf1fa52c55ad2c065 Mon Sep 17 00:00:00 2001 From: Drewster727 Date: Thu, 31 Mar 2016 22:23:38 -0500 Subject: [PATCH] #122 store utc time in the databse + obtain timezone offset of the client upon login + offset times returned to client based on session offset --- PlexRequests.Helpers/DateTimeHelper.cs | 14 ++++++++++++++ PlexRequests.Helpers/PlexRequests.Helpers.csproj | 1 + PlexRequests.UI/Models/SessionKeys.cs | 1 + PlexRequests.UI/Modules/BaseModule.cs | 15 +++++++++++++++ PlexRequests.UI/Modules/LoginModule.cs | 3 ++- PlexRequests.UI/Modules/RequestsModule.cs | 10 +++++----- PlexRequests.UI/Modules/SearchModule.cs | 4 ++-- PlexRequests.UI/Modules/UserLoginModule.cs | 7 +++++++ PlexRequests.UI/Views/Login/Index.cshtml | 7 +++++++ PlexRequests.UI/Views/Login/Register.cshtml | 4 ++-- PlexRequests.UI/Views/UserLogin/Index.cshtml | 6 +++++- 11 files changed, 61 insertions(+), 11 deletions(-) create mode 100644 PlexRequests.Helpers/DateTimeHelper.cs diff --git a/PlexRequests.Helpers/DateTimeHelper.cs b/PlexRequests.Helpers/DateTimeHelper.cs new file mode 100644 index 000000000..5cc3857e4 --- /dev/null +++ b/PlexRequests.Helpers/DateTimeHelper.cs @@ -0,0 +1,14 @@ +using System; + +namespace PlexRequests.Helpers +{ + public static class DateTimeHelper + { + public static DateTimeOffset OffsetUTCDateTime(DateTime utcDateTime, int minuteOffset) + { + TimeSpan ts = TimeSpan.FromMinutes(-minuteOffset); + return new DateTimeOffset(utcDateTime).ToOffset(ts); + } + + } +} diff --git a/PlexRequests.Helpers/PlexRequests.Helpers.csproj b/PlexRequests.Helpers/PlexRequests.Helpers.csproj index ec3c70a8d..b2bf29a0a 100644 --- a/PlexRequests.Helpers/PlexRequests.Helpers.csproj +++ b/PlexRequests.Helpers/PlexRequests.Helpers.csproj @@ -52,6 +52,7 @@ + diff --git a/PlexRequests.UI/Models/SessionKeys.cs b/PlexRequests.UI/Models/SessionKeys.cs index 66c766039..949441650 100644 --- a/PlexRequests.UI/Models/SessionKeys.cs +++ b/PlexRequests.UI/Models/SessionKeys.cs @@ -29,5 +29,6 @@ namespace PlexRequests.UI.Models public class SessionKeys { public const string UsernameKey = "Username"; + public const string ClientDateTimeOffsetKey = "ClientDateTimeOffset"; } } diff --git a/PlexRequests.UI/Modules/BaseModule.cs b/PlexRequests.UI/Modules/BaseModule.cs index f34c46f17..a75766775 100644 --- a/PlexRequests.UI/Modules/BaseModule.cs +++ b/PlexRequests.UI/Modules/BaseModule.cs @@ -28,12 +28,14 @@ using Nancy; using Nancy.Extensions; using PlexRequests.UI.Models; +using System; namespace PlexRequests.UI.Modules { public class BaseModule : NancyModule { private string _username; + private int _dateTimeOffset = -1; protected string Username { @@ -47,6 +49,19 @@ namespace PlexRequests.UI.Modules } } + protected int DateTimeOffset + { + get + { + if (_dateTimeOffset == -1) + { + _dateTimeOffset = Session[SessionKeys.ClientDateTimeOffsetKey] != null ? + (int)Session[SessionKeys.ClientDateTimeOffsetKey] : (new DateTimeOffset().Offset).Minutes; + } + return _dateTimeOffset; + } + } + public BaseModule() { Before += (ctx) => CheckAuth(); diff --git a/PlexRequests.UI/Modules/LoginModule.cs b/PlexRequests.UI/Modules/LoginModule.cs index 578b9cf7f..71a6ebb0a 100644 --- a/PlexRequests.UI/Modules/LoginModule.cs +++ b/PlexRequests.UI/Modules/LoginModule.cs @@ -60,6 +60,7 @@ namespace PlexRequests.UI.Modules { var username = (string)Request.Form.Username; var password = (string)Request.Form.Password; + var dtOffset = (int)Request.Form.DateTimeOffset; var userId = UserMapper.ValidateUser(username, password); @@ -72,7 +73,7 @@ namespace PlexRequests.UI.Modules { expiry = DateTime.Now.AddDays(7); } - Session[SessionKeys.UsernameKey] = username; + Session[SessionKeys.ClientDateTimeOffsetKey] = dtOffset; return this.LoginAndRedirect(userId.Value, expiry); }; diff --git a/PlexRequests.UI/Modules/RequestsModule.cs b/PlexRequests.UI/Modules/RequestsModule.cs index 193729ab8..2d12ab4a1 100644 --- a/PlexRequests.UI/Modules/RequestsModule.cs +++ b/PlexRequests.UI/Modules/RequestsModule.cs @@ -40,12 +40,12 @@ using PlexRequests.Services.Interfaces; using PlexRequests.Services.Notification; using PlexRequests.Store; using PlexRequests.UI.Models; +using PlexRequests.Helpers; namespace PlexRequests.UI.Modules { public class RequestsModule : BaseModule { - public RequestsModule(IRequestService service, ISettingsService prSettings, ISettingsService plex, INotificationService notify) : base("requests") { Service = service; @@ -98,8 +98,8 @@ namespace PlexRequests.UI.Modules PosterPath = movie.PosterPath, ReleaseDate = movie.ReleaseDate.Humanize(), ReleaseDateTicks = movie.ReleaseDate.Ticks, - RequestedDate = movie.RequestedDate.Humanize(), - RequestedDateTicks = movie.RequestedDate.Ticks, + RequestedDate = DateTimeHelper.OffsetUTCDateTime(movie.RequestedDate, DateTimeOffset).Humanize(), + RequestedDateTicks = DateTimeHelper.OffsetUTCDateTime(movie.RequestedDate, DateTimeOffset).Ticks, Approved = movie.Available || movie.Approved, Title = movie.Title, Overview = movie.Overview, @@ -137,8 +137,8 @@ namespace PlexRequests.UI.Modules PosterPath = tv.PosterPath, ReleaseDate = tv.ReleaseDate.Humanize(), ReleaseDateTicks = tv.ReleaseDate.Ticks, - RequestedDate = tv.RequestedDate.Humanize(), - RequestedDateTicks = tv.RequestedDate.Ticks, + RequestedDate = DateTimeHelper.OffsetUTCDateTime(tv.RequestedDate, DateTimeOffset).Humanize(), + RequestedDateTicks = DateTimeHelper.OffsetUTCDateTime(tv.RequestedDate, DateTimeOffset).Ticks, Approved = tv.Available || tv.Approved, Title = tv.Title, Overview = tv.Overview, diff --git a/PlexRequests.UI/Modules/SearchModule.cs b/PlexRequests.UI/Modules/SearchModule.cs index 3dbc24118..066223d8f 100644 --- a/PlexRequests.UI/Modules/SearchModule.cs +++ b/PlexRequests.UI/Modules/SearchModule.cs @@ -220,7 +220,7 @@ namespace PlexRequests.UI.Modules Title = movieInfo.Title, ReleaseDate = movieInfo.ReleaseDate ?? DateTime.MinValue, Status = movieInfo.Status, - RequestedDate = DateTime.Now, + RequestedDate = DateTime.UtcNow, Approved = false, RequestedUsers = new List() { Username }, Issues = IssueState.None, @@ -356,7 +356,7 @@ namespace PlexRequests.UI.Modules Title = showInfo.name, ReleaseDate = firstAir, Status = showInfo.status, - RequestedDate = DateTime.Now, + RequestedDate = DateTime.UtcNow, Approved = false, RequestedUsers = new List() { Username }, Issues = IssueState.None, diff --git a/PlexRequests.UI/Modules/UserLoginModule.cs b/PlexRequests.UI/Modules/UserLoginModule.cs index bd6643071..148888b11 100644 --- a/PlexRequests.UI/Modules/UserLoginModule.cs +++ b/PlexRequests.UI/Modules/UserLoginModule.cs @@ -68,6 +68,7 @@ namespace PlexRequests.UI.Modules private Response LoginUser() { + var dateTimeOffset = Request.Form.DateTimeOffset; var username = Request.Form.username.Value; Log.Debug("Username \"{0}\" attempting to login",username); if (string.IsNullOrWhiteSpace(username)) @@ -138,6 +139,12 @@ namespace PlexRequests.UI.Modules Session[SessionKeys.UsernameKey] = (string)username; } + Session[SessionKeys.ClientDateTimeOffsetKey] = (int)dateTimeOffset; + + int z = 240; + + + return Response.AsJson(authenticated ? new JsonResponseModel { Result = true } : new JsonResponseModel { Result = false, Message = "Incorrect User or Password"}); diff --git a/PlexRequests.UI/Views/Login/Index.cshtml b/PlexRequests.UI/Views/Login/Index.cshtml index 85597f544..0662e2cb2 100644 --- a/PlexRequests.UI/Views/Login/Index.cshtml +++ b/PlexRequests.UI/Views/Login/Index.cshtml @@ -6,6 +6,7 @@ Remember Me

+ @if (!Model.AdminExists) { @@ -19,3 +20,9 @@ } + diff --git a/PlexRequests.UI/Views/Login/Register.cshtml b/PlexRequests.UI/Views/Login/Register.cshtml index d8e8564e5..c53fa0193 100644 --- a/PlexRequests.UI/Views/Login/Register.cshtml +++ b/PlexRequests.UI/Views/Login/Register.cshtml @@ -1,7 +1,7 @@ 
- Username + Username
- Password + Password

diff --git a/PlexRequests.UI/Views/UserLogin/Index.cshtml b/PlexRequests.UI/Views/UserLogin/Index.cshtml index 414083139..cc9bf9c5d 100644 --- a/PlexRequests.UI/Views/UserLogin/Index.cshtml +++ b/PlexRequests.UI/Views/UserLogin/Index.cshtml @@ -38,10 +38,14 @@ $('#loginBtn').click(function (e) { e.preventDefault(); var $form = $("#loginForm"); + var formData = $form.serialize(); + var dtOffset = new Date().getTimezoneOffset(); + formData += ('&DateTimeOffset=' + dtOffset) + $.ajax({ type: $form.prop("method"), url: $form.prop("action"), - data: $form.serialize(), + data: formData, dataType: "json", success: function (response) { console.log(response);