From d2d7274925d12522e85d38fc448dc354fdded1b2 Mon Sep 17 00:00:00 2001
From: Valentin Tolmer <valentin@tolmer.fr>
Date: Mon, 30 Aug 2021 08:48:06 +0200
Subject: [PATCH] Migrate datetimes to UTC

---
 app/src/graphql.rs         | 1 +
 app/src/lib.rs             | 1 +
 app/src/user_table.rs      | 4 ++--
 model/src/lib.rs           | 4 ++--
 schema.graphql             | 8 ++++----
 src/domain/sql_tables.rs   | 6 +++---
 src/infra/graphql/query.rs | 2 +-
 src/infra/ldap_handler.rs  | 5 ++---
 8 files changed, 16 insertions(+), 15 deletions(-)
 create mode 100644 app/src/graphql.rs

diff --git a/app/src/graphql.rs b/app/src/graphql.rs
new file mode 100644
index 0000000..5556110
--- /dev/null
+++ b/app/src/graphql.rs
@@ -0,0 +1 @@
+pub type DateTimeUtc = chrono::DateTime<chrono::Utc>;
diff --git a/app/src/lib.rs b/app/src/lib.rs
index b8fee89..6fa442f 100644
--- a/app/src/lib.rs
+++ b/app/src/lib.rs
@@ -4,6 +4,7 @@ mod api;
 mod app;
 mod cookies;
 mod create_user;
+mod graphql;
 mod login;
 mod logout;
 mod user_details;
diff --git a/app/src/user_table.rs b/app/src/user_table.rs
index 6299059..c1b9207 100644
--- a/app/src/user_table.rs
+++ b/app/src/user_table.rs
@@ -10,7 +10,7 @@ use yew::services::{fetch::FetchTask, ConsoleService};
     schema_path = "../schema.graphql",
     query_path = "queries/list_users.graphql",
     response_derives = "Debug",
-    custom_scalars_module = "chrono"
+    custom_scalars_module = "crate::graphql"
 )]
 pub struct ListUsersQuery;
 
@@ -89,7 +89,7 @@ impl Component for UserTable {
                                 <td>{&u.display_name.as_ref().unwrap_or(&String::new())}</td>
                                 <td>{&u.first_name.as_ref().unwrap_or(&String::new())}</td>
                                 <td>{&u.last_name.as_ref().unwrap_or(&String::new())}</td>
-                                <td>{&u.creation_date}</td>
+                                <td>{&u.creation_date.with_timezone(&chrono::Local)}</td>
                             </tr>
                         }
                     })
diff --git a/model/src/lib.rs b/model/src/lib.rs
index 89a1a9a..fe1b067 100644
--- a/model/src/lib.rs
+++ b/model/src/lib.rs
@@ -100,7 +100,7 @@ pub struct User {
     pub first_name: Option<String>,
     pub last_name: Option<String>,
     // pub avatar: ?,
-    pub creation_date: chrono::NaiveDateTime,
+    pub creation_date: chrono::DateTime<chrono::Utc>,
 }
 
 impl Default for User {
@@ -111,7 +111,7 @@ impl Default for User {
             display_name: None,
             first_name: None,
             last_name: None,
-            creation_date: chrono::NaiveDateTime::from_timestamp(0, 0),
+            creation_date: Utc.timestamp(0, 0),
         }
     }
 }
diff --git a/schema.graphql b/schema.graphql
index d8ff210..eea8f9f 100644
--- a/schema.graphql
+++ b/schema.graphql
@@ -20,22 +20,22 @@ input RequestFilter {
   eq: EqualityConstraint
 }
 
+"DateTime"
+scalar DateTimeUtc
+
 type Query {
   apiVersion: String!
   user(userId: String!): User!
   users(filters: RequestFilter): [User!]!
 }
 
-"NaiveDateTime"
-scalar NaiveDateTime
-
 type User {
   id: String!
   email: String!
   displayName: String
   firstName: String
   lastName: String
-  creationDate: NaiveDateTime!
+  creationDate: DateTimeUtc!
   "The groups to which this user belongs."
   groups: [Group!]!
 }
diff --git a/src/domain/sql_tables.rs b/src/domain/sql_tables.rs
index 70b3dd8..6e17938 100644
--- a/src/domain/sql_tables.rs
+++ b/src/domain/sql_tables.rs
@@ -120,7 +120,7 @@ pub async fn init_table(pool: &Pool) -> sqlx::Result<()> {
 #[cfg(test)]
 mod tests {
     use super::*;
-    use chrono::NaiveDateTime;
+    use chrono::prelude::*;
     use sqlx::{Column, Row};
 
     #[actix_rt::test]
@@ -138,8 +138,8 @@ mod tests {
         assert_eq!(row.column(0).name(), "display_name");
         assert_eq!(row.get::<String, _>("display_name"), "Bob Bobbersön");
         assert_eq!(
-            row.get::<NaiveDateTime, _>("creation_date"),
-            NaiveDateTime::from_timestamp(0, 0)
+            row.get::<DateTime<Utc>, _>("creation_date"),
+            Utc.timestamp(0, 0),
         );
     }
 
diff --git a/src/infra/graphql/query.rs b/src/infra/graphql/query.rs
index 0fb55ea..5ea5c78 100644
--- a/src/infra/graphql/query.rs
+++ b/src/infra/graphql/query.rs
@@ -157,7 +157,7 @@ impl<Handler: BackendHandler + Sync> User<Handler> {
         self.user.last_name.as_ref()
     }
 
-    fn creation_date(&self) -> chrono::NaiveDateTime {
+    fn creation_date(&self) -> chrono::DateTime<chrono::Utc> {
         self.user.creation_date
     }
 
diff --git a/src/infra/ldap_handler.rs b/src/infra/ldap_handler.rs
index 438dfdf..4cebc8e 100644
--- a/src/infra/ldap_handler.rs
+++ b/src/infra/ldap_handler.rs
@@ -277,7 +277,6 @@ mod tests {
     use super::*;
     use crate::domain::handler::BindRequest;
     use crate::domain::handler::MockTestBackendHandler;
-    use chrono::NaiveDateTime;
     use mockall::predicate::eq;
     use tokio;
 
@@ -487,7 +486,7 @@ mod tests {
                     display_name: Some("Bôb Böbberson".to_string()),
                     first_name: Some("Bôb".to_string()),
                     last_name: Some("Böbberson".to_string()),
-                    creation_date: NaiveDateTime::from_timestamp(1_000_000, 0),
+                    ..Default::default()
                 },
                 User {
                     user_id: "jim".to_string(),
@@ -495,7 +494,7 @@ mod tests {
                     display_name: Some("Jimminy Cricket".to_string()),
                     first_name: Some("Jim".to_string()),
                     last_name: Some("Cricket".to_string()),
-                    creation_date: NaiveDateTime::from_timestamp(1_500_000, 0),
+                    ..Default::default()
                 },
             ])
         });