Mercurial > lbo > hg > analyrics
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(", "), + } + } +}