changeset 61:51ea67f319e3

Improve recent sessions formatting and fix time bug
author Lewin Bormann <lbo@spheniscida.de>
date Sat, 23 Jul 2022 07:56:46 -0700
parents 5b91865546cf
children 569284182390
files src/logsdb.rs src/main.rs src/template_types.rs
diffstat 3 files changed, 66 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- a/src/logsdb.rs	Fri Jul 22 21:39:26 2022 -0700
+++ b/src/logsdb.rs	Sat Jul 23 07:56:46 2022 -0700
@@ -1,17 +1,16 @@
 use crate::db::{DBType, PoolType};
 
 use anyhow::{Context, Error};
-use log::{debug, error, info, warn, Level};
-use time::{Duration, OffsetDateTime};
+use log::error;
+use time::OffsetDateTime;
 
 use rocket::futures::{future::ready, StreamExt};
 use rocket::http::hyper::uri::Uri;
 use rocket::serde::Serialize;
-use rocket_db_pools::sqlx::{Executor, Row, Sqlite, SqlitePool};
-use rocket_db_pools::{Connection, Database, Pool};
+use rocket_db_pools::sqlx::{Row, Sqlite};
+use rocket_db_pools::Database;
 use sqlx::prelude::FromRow;
 
-use std::collections::BTreeSet;
 use std::collections::HashMap;
 
 #[derive(Database)]
@@ -31,49 +30,14 @@
 #[derive(sqlx::FromRow, Serialize)]
 #[serde(crate = "rocket::serde")]
 pub struct RecentSessionsRow {
-    start: i64,
-    duration: i64,
-    count: i64,
-    refer: Option<String>,
-    origin_country: Option<String>,
-    origin_city: Option<String>,
-    ua: String,
-    alltags: String,
-}
-
-#[derive(Serialize)]
-#[serde(crate = "rocket::serde")]
-pub struct RecentSessionsTableRow {
-    start: String,
-    duration: String,
-    count: i64,
-    refer: Option<String>,
-    origin_country: Option<String>,
-    origin_city: Option<String>,
-    ua: String,
-    alltags: String,
-}
-
-impl RecentSessionsTableRow {
-    pub fn from_row(r: RecentSessionsRow, off: time::UtcOffset) -> RecentSessionsTableRow {
-        RecentSessionsTableRow {
-            start: time::OffsetDateTime::from_unix_timestamp(r.start)
-                .unwrap_or(time::OffsetDateTime::UNIX_EPOCH)
-                .to_offset(off)
-                .format(&time::format_description::well_known::Iso8601::DEFAULT)
-                .unwrap_or(String::new()),
-            duration: format!("{:.0}", time::Duration::seconds(r.duration)),
-            count: r.count,
-            refer: r.refer,
-            origin_country: r.origin_country,
-            origin_city: r.origin_city,
-            ua: r.ua,
-            alltags: BTreeSet::from_iter(r.alltags.split(","))
-                .into_iter()
-                .collect::<Vec<&str>>()
-                .join(","),
-        }
-    }
+    pub start: i64,
+    pub duration: i64,
+    pub count: i64,
+    pub refer: Option<String>,
+    pub origin_country: Option<String>,
+    pub origin_city: Option<String>,
+    pub ua: String,
+    pub alltags: String,
 }
 
 impl<'p> LogsDBSession<'p, Sqlite> {
--- a/src/main.rs	Fri Jul 22 21:39:26 2022 -0700
+++ b/src/main.rs	Sat Jul 23 07:56:46 2022 -0700
@@ -5,6 +5,7 @@
 mod geoip;
 mod guards;
 mod logsdb;
+mod template_types;
 
 use crate::configdb::{ConfigDB, ConfigDBSession};
 use crate::geoip::GeoIP;
@@ -207,7 +208,7 @@
     // Parameter treatment
     let duration = duration
         .map(|d| i64::from_str_radix(d, 10).unwrap_or(30))
-        .map(|d| Duration::new(84600 * d, 0))
+        .map(|d| Duration::new(86400 * d, 0))
         .unwrap_or(Duration::days(30));
     let from = from
         .map(|p| {
@@ -219,8 +220,14 @@
                 .unwrap_or(OffsetDateTime::now_utc() - duration)
         })
         .unwrap_or(OffsetDateTime::now_utc() - duration);
+
     let begin = from;
     let end = begin + duration;
+    let ymd_format = time::format_description::parse("[year]-[month]-[day]").unwrap();
+    let ymdhms_format = time::format_description::parse(
+        "[year]-[month]-[day] [hour]:[minute]:[second] UTC[offset_hour sign:mandatory]",
+    )
+    .unwrap();
 
     // Chart rendering
 
@@ -344,13 +351,14 @@
         Ok(rs) => Some(
             rs.into_iter()
                 .map(|r| {
-                    logsdb::RecentSessionsTableRow::from_row(
+                    template_types::RecentSessionsTableRow::from_row(
                         r,
                         time::UtcOffset::from_whole_seconds(tz_offset as i32)
                             .unwrap_or(time::UtcOffset::UTC),
+                        &ymdhms_format,
                     )
                 })
-                .collect::<Vec<logsdb::RecentSessionsTableRow>>(),
+                .collect::<Vec<template_types::RecentSessionsTableRow>>(),
         ),
         Err(e) => {
             error!("Couldn't query recent sessions: {}", e);
@@ -358,9 +366,8 @@
         }
     };
 
-    let ymd_format = time::format_description::parse("[year]-[month]-[day]").unwrap();
     let tmpl_today = begin.date().format(&ymd_format).unwrap();
-    let tmpl_duration = duration.whole_days().to_string();
+    let tmpl_duration = (duration + Duration::seconds(1)).whole_days().to_string();
 
     Template::render(
         "index_dashboard",
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/template_types.rs	Sat Jul 23 07:56:46 2022 -0700
@@ -0,0 +1,42 @@
+use crate::logsdb::RecentSessionsRow;
+use rocket::serde::Serialize;
+use std::collections::BTreeSet;
+
+#[derive(Serialize)]
+#[serde(crate = "rocket::serde")]
+pub struct RecentSessionsTableRow {
+    start: String,
+    duration: String,
+    count: i64,
+    refer: Option<String>,
+    origin_country: Option<String>,
+    origin_city: Option<String>,
+    ua: String,
+    alltags: String,
+}
+
+impl RecentSessionsTableRow {
+    pub fn from_row<F: time::formatting::Formattable>(
+        r: RecentSessionsRow,
+        off: time::UtcOffset,
+        timeformat: &F,
+    ) -> RecentSessionsTableRow {
+        RecentSessionsTableRow {
+            start: time::OffsetDateTime::from_unix_timestamp(r.start)
+                .unwrap_or(time::OffsetDateTime::UNIX_EPOCH)
+                .to_offset(off)
+                .format(&timeformat)
+                .unwrap_or(String::new()),
+            duration: format!("{:.0}", time::Duration::seconds(r.duration)),
+            count: r.count,
+            refer: r.refer,
+            origin_country: r.origin_country,
+            origin_city: r.origin_city,
+            ua: r.ua,
+            alltags: BTreeSet::from_iter(r.alltags.split(","))
+                .into_iter()
+                .collect::<Vec<&str>>()
+                .join(", "),
+        }
+    }
+}