From 1899088400879618cda7412df34dfc4f2c1aef04 Mon Sep 17 00:00:00 2001 From: Philipp Hofer Date: Fri, 11 Apr 2025 13:13:37 +0200 Subject: [PATCH] use proper timezone @ login information --- src/admin/mod.rs | 6 +++--- src/admin/route/mod.rs | 2 +- src/admin/route/web.rs | 6 +++--- src/admin/station/mod.rs | 28 ++++++++++++++++++++++++---- src/admin/station/web.rs | 15 +++++++++------ src/admin/team/mod.rs | 2 +- src/admin/team/web.rs | 7 ++++--- src/lib.rs | 2 +- src/station.rs | 8 ++++---- 9 files changed, 50 insertions(+), 26 deletions(-) diff --git a/src/admin/mod.rs b/src/admin/mod.rs index e798457..674951b 100644 --- a/src/admin/mod.rs +++ b/src/admin/mod.rs @@ -1,6 +1,6 @@ -use crate::{page, AppState}; -use axum::{routing::get, Router}; -use maud::{html, Markup}; +use crate::{AppState, page}; +use axum::{Router, routing::get}; +use maud::{Markup, html}; use tower_sessions::Session; pub(crate) mod route; diff --git a/src/admin/route/mod.rs b/src/admin/route/mod.rs index 1280824..0697555 100644 --- a/src/admin/route/mod.rs +++ b/src/admin/route/mod.rs @@ -1,6 +1,6 @@ use crate::{ - admin::{station::Station, team::Team}, AppState, + admin::{station::Station, team::Team}, }; use axum::Router; use serde::{Deserialize, Serialize}; diff --git a/src/admin/route/web.rs b/src/admin/route/web.rs index 606aedc..f838401 100644 --- a/src/admin/route/web.rs +++ b/src/admin/route/web.rs @@ -1,12 +1,12 @@ use super::Route; -use crate::{admin::station::Station, err, page, succ, AppState}; +use crate::{AppState, admin::station::Station, err, page, succ}; use axum::{ + Form, Router, extract::State, response::{IntoResponse, Redirect}, routing::{get, post}, - Form, Router, }; -use maud::{html, Markup, PreEscaped}; +use maud::{Markup, PreEscaped, html}; use serde::Deserialize; use sqlx::SqlitePool; use std::sync::Arc; diff --git a/src/admin/station/mod.rs b/src/admin/station/mod.rs index 0243d3c..7b6c833 100644 --- a/src/admin/station/mod.rs +++ b/src/admin/station/mod.rs @@ -1,6 +1,6 @@ use crate::{admin::route::Route, AppState}; use axum::Router; -use chrono::NaiveDateTime; +use chrono::{DateTime, Local, NaiveDateTime, Utc}; use serde::{Deserialize, Serialize}; use sqlx::{FromRow, SqlitePool}; @@ -39,15 +39,27 @@ impl Station { .ok() } - pub async fn find_by_id_and_code(db: &SqlitePool, id: i64, code: &str) -> Option { - sqlx::query_as!( + pub async fn login(db: &SqlitePool, id: i64, code: &str) -> Option { + let Some(station) = sqlx::query_as!( Self, "SELECT id, name, notes, amount_people, last_login, pw, lat, lng FROM station WHERE id = ? AND pw = ?", id, code ) .fetch_one(db) .await - .ok() + .ok() else { + return None; + }; + + sqlx::query!( + "UPDATE station SET last_login = CURRENT_TIMESTAMP WHERE id = ?", + station.id + ) + .execute(db) + .await + .unwrap(); + + Some(station) } async fn create(db: &SqlitePool, name: &str) -> Result<(), String> { @@ -147,6 +159,14 @@ impl Station { false } + + pub(crate) fn local_last_login(&self) -> Option> { + let Some(last_login) = &self.last_login else { + return None; + }; + let datetime_utc = DateTime::::from_naive_utc_and_offset(last_login.clone(), Utc); + Some(datetime_utc.with_timezone(&Local)) + } } pub(super) fn routes() -> Router { diff --git a/src/admin/station/web.rs b/src/admin/station/web.rs index 493a00a..97a85a8 100644 --- a/src/admin/station/web.rs +++ b/src/admin/station/web.rs @@ -98,7 +98,7 @@ async fn view( th scope="row" { "Notizen" }; td { @match station.notes { - Some(notes) => { + Some(ref notes) => { (notes) details { summary { "✏️" } @@ -119,11 +119,14 @@ async fn view( } } tr { - th scope="row" { "Stations-Code" }; + th scope="row" { "Stations-Link" }; td { - (station.pw) + a href=(format!("/s/{}/{}", station.id, station.pw)) { + "Login-Link" + + } article class="warning" { - (format!("Diesen Code nur Betreuern der Station {} geben! Mit diesem Code erhält man die Berechtigung, Teams zu bewerten.", station.name)) + (format!("Diesen Link nur Betreuern der Station {} geben! Mit diesem Link erhält man die Berechtigung, Teams zu bewerten.", station.name)) } } } @@ -151,9 +154,9 @@ async fn view( } } tr { - th scope="row" { "Letzter Login eines Stationsbetreuers" }; + th scope="row" { "Letzter Zugriff eines Stationsbetreuers" }; td { - @match station.last_login { + @match station.local_last_login() { Some(last_login) => (last_login), None => "noch nicht eingeloggt :-(", } diff --git a/src/admin/team/mod.rs b/src/admin/team/mod.rs index 84435ac..3f6fd01 100644 --- a/src/admin/team/mod.rs +++ b/src/admin/team/mod.rs @@ -1,6 +1,6 @@ use crate::{ - admin::{route::Route, station::Station}, AppState, + admin::{route::Route, station::Station}, }; use axum::Router; use serde::{Deserialize, Serialize}; diff --git a/src/admin/team/web.rs b/src/admin/team/web.rs index c91eb61..17ce89a 100644 --- a/src/admin/team/web.rs +++ b/src/admin/team/web.rs @@ -1,17 +1,18 @@ use super::{CreateError, Team}; use crate::{ + AppState, admin::{route::Route, station::Station}, err, partials::page, - pl, succ, AppState, + pl, succ, }; use axum::{ + Form, Router, extract::State, response::{IntoResponse, Redirect}, routing::{get, post}, - Form, Router, }; -use maud::{html, Markup, PreEscaped}; +use maud::{Markup, PreEscaped, html}; use serde::Deserialize; use sqlx::SqlitePool; use std::sync::Arc; diff --git a/src/lib.rs b/src/lib.rs index 0d64bd1..2437418 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,7 @@ extern crate rust_i18n; i18n!("locales", fallback = "de-AT"); use admin::station::Station; -use axum::{body::Body, extract::FromRef, response::Response, routing::get, Router}; +use axum::{Router, body::Body, extract::FromRef, response::Response, routing::get}; use partials::page; use sqlx::SqlitePool; use std::sync::Arc; diff --git a/src/station.rs b/src/station.rs index 7dc6a3e..91a8a72 100644 --- a/src/station.rs +++ b/src/station.rs @@ -1,6 +1,6 @@ -use crate::{partials, AppState, Station}; -use axum::{extract::State, routing::get, Router}; -use maud::{html, Markup}; +use crate::{AppState, Station, partials}; +use axum::{Router, extract::State, routing::get}; +use maud::{Markup, html}; use sqlx::SqlitePool; use std::sync::Arc; use tower_sessions::Session; @@ -76,7 +76,7 @@ async fn view( session: Session, axum::extract::Path((id, code)): axum::extract::Path<(i64, String)>, ) -> Markup { - let Some(station) = Station::find_by_id_and_code(&db, id, &code).await else { + let Some(station) = Station::login(&db, id, &code).await else { let content = html! { article class="error" { "Falscher Quick-Einlogg-Link. Bitte nochmal scannen oder neu eingeben."