From 955b99fea96f1c2c028d0275594930cbfa673c92 Mon Sep 17 00:00:00 2001 From: 4cuck <40539855+4cuck@users.noreply.github.com> Date: Mon, 16 Oct 2023 23:31:49 +0200 Subject: [PATCH] format error timestamps --- server/src/lib.rs | 24 ++++++++++++++++++++++-- server/templates/errors_admin.html.j2 | 4 ++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/server/src/lib.rs b/server/src/lib.rs index 012d10e..e9769fc 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -1,5 +1,5 @@ // SPDX-License-Identifier: AGPL-3.0-only -use std::{borrow::Cow, net::SocketAddr, sync::Arc}; +use std::{borrow::Cow, net::SocketAddr, sync::Arc, collections::HashMap}; use axum::{ error_handling::HandleErrorLayer, @@ -9,11 +9,12 @@ use axum::{ routing::{get, get_service}, Router, }; +use chrono::TimeZone; use entities::state::{scanner::ScannerConfig, AppState}; use hyper::{header, StatusCode}; use reqwest::Client; use sea_orm::DatabaseConnection; -use tera::Tera; +use tera::{Tera, from_value, to_value}; use thiserror::Error; use tower::ServiceBuilder; use tower_http::{ @@ -97,6 +98,7 @@ pub async fn start( let config = Arc::new(config); let mut tera = Tera::new("server/templates/*")?; tera.autoescape_on(vec![".html.j2"]); + tera.register_function("fmt_date", fmt_date); let state = WebState { config: config.clone(), db, @@ -203,3 +205,21 @@ impl axum::response::IntoResponse for ServerError { msg.into_response() } } + +/// Tera template function to format unix timestamps +fn fmt_date(args: &HashMap) -> tera::Result { + match args.get("value") { + Some(time_val) => match from_value::(time_val.clone()) { + Ok(time_i64) => { + let format = match args.get("fmt") { + None => "%Y.%m.%d %H:%M:%S", + Some(v) => v.as_str().ok_or_else(||tera::Error::from("fmt has to be a string"))?, + }; + let time = chrono::Utc.timestamp_opt(time_i64,0).single().ok_or_else(||tera::Error::from("Invalid timestamp"))?; + Ok(to_value(time.format(format).to_string()).unwrap()) + }, + Err(_) => Err("timestamp not an i64".into()), + }, + None => Err("no value provided".into()), + } +} diff --git a/server/templates/errors_admin.html.j2 b/server/templates/errors_admin.html.j2 index 1895659..6b0ec6d 100644 --- a/server/templates/errors_admin.html.j2 +++ b/server/templates/errors_admin.html.j2 @@ -19,7 +19,7 @@ - + @@ -28,7 +28,7 @@ {% for error in ERRORS -%} - +
TimeTime UTC Message Http Body Http Status
{{error.time}}{{fmt_date(value=error.time)}} {{error.message}} {{error.http_body}} {{error.http_status}}