From bdc35d9135598644d27d7e83d2dec681d9503eca Mon Sep 17 00:00:00 2001
From: philipp <philipp@hofer.link>
Date: Thu, 8 Jun 2023 15:53:20 +0200
Subject: [PATCH 1/2] update todos

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 14894aa..dd6bb26 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
 - [] after an hour(?) of inactivity -> show large popup w/ "maybe old data (ignore) (reload page)" (ignore bc maybe use is actively doing something -> don't throw input away!)
 
 ## Backend
-- [] add `always_show` to `planned_trips` (e.g. for wanderfahrten)
+- [] Don't show events if time > 1h(?) ago
 
 # Nice to have
 ## Frontend

From 52f1c3c0261073cf7ba13371a25312eb79a9b35c Mon Sep 17 00:00:00 2001
From: philipp <philipp@hofer.link>
Date: Thu, 8 Jun 2023 17:23:23 +0200
Subject: [PATCH 2/2] push

---
 src/model/user.rs | 43 +++++++++++++++++++++++++++++++++++++++++++
 src/rest/mod.rs   | 40 +---------------------------------------
 2 files changed, 44 insertions(+), 39 deletions(-)

diff --git a/src/model/user.rs b/src/model/user.rs
index 86355f5..2fd2f8e 100644
--- a/src/model/user.rs
+++ b/src/model/user.rs
@@ -1,6 +1,7 @@
 use std::ops::Deref;
 
 use argon2::{password_hash::SaltString, Argon2, PasswordHasher};
+use chrono::{Datelike, Local, NaiveDate};
 use rocket::{
     async_trait,
     http::{Cookie, Status},
@@ -12,6 +13,8 @@ use serde::{Deserialize, Serialize};
 use serde_json::json;
 use sqlx::{FromRow, SqlitePool};
 
+use super::{planned_event::PlannedEvent, Day};
+
 #[derive(FromRow, Debug, Serialize, Deserialize)]
 pub struct User {
     pub id: i64,
@@ -168,6 +171,46 @@ ORDER BY last_access DESC
             .await
             .unwrap(); //Okay, because we can only create a User of a valid id
     }
+
+    pub async fn get_days(&self, db: &SqlitePool) -> Vec<Day> {
+        let mut days = Vec::new();
+        for i in 0..self.amount_days_to_show() {
+            let date = (Local::now() + chrono::Duration::days(i)).date_naive();
+
+            if self.is_guest {
+                days.push(Day::new_guest(db, date, false).await);
+            } else {
+                days.push(Day::new(db, date, false).await);
+            }
+        }
+
+        for date in PlannedEvent::pinned_days(db, self.amount_days_to_show()).await {
+            if self.is_guest {
+                let day = Day::new_guest(db, date, true).await;
+                if !day.planned_events.is_empty() {
+                    days.push(day);
+                }
+            } else {
+                days.push(Day::new(db, date, true).await);
+            }
+        }
+        days
+    }
+
+    fn amount_days_to_show(&self) -> i64 {
+        if self.is_cox {
+            let end_of_year = NaiveDate::from_ymd_opt(Local::now().year(), 12, 31).unwrap(); //Ok,
+                                                                                             //december
+                                                                                             //has 31
+                                                                                             //days
+            end_of_year
+                .signed_duration_since(Local::now().date_naive())
+                .num_days()
+                + 1
+        } else {
+            6
+        }
+    }
 }
 
 #[async_trait]
diff --git a/src/rest/mod.rs b/src/rest/mod.rs
index d61b780..4df1f31 100644
--- a/src/rest/mod.rs
+++ b/src/rest/mod.rs
@@ -1,4 +1,3 @@
-use chrono::{Datelike, Duration, Local, NaiveDate};
 use rocket::{
     catch, catchers,
     fairing::AdHoc,
@@ -14,12 +13,10 @@ use sqlx::SqlitePool;
 
 use crate::model::{
     log::Log,
-    planned_event::PlannedEvent,
     tripdetails::TripDetails,
     triptype::TripType,
     user::User,
     usertrip::{UserTrip, UserTripError},
-    Day,
 };
 
 mod admin;
@@ -27,25 +24,8 @@ mod auth;
 mod cox;
 mod misc;
 
-fn amount_days_to_show(is_cox: bool) -> i64 {
-    if is_cox {
-        let end_of_year = NaiveDate::from_ymd_opt(Local::now().year(), 12, 31).unwrap(); //Ok,
-                                                                                         //december
-                                                                                         //has 31
-                                                                                         //days
-        end_of_year
-            .signed_duration_since(Local::now().date_naive())
-            .num_days()
-            + 1
-    } else {
-        6
-    }
-}
-
 #[get("/")]
 async fn index(db: &State<SqlitePool>, user: User, flash: Option<FlashMessage<'_>>) -> Template {
-    let mut days = Vec::new();
-
     let mut context = Context::new();
 
     if user.is_cox || user.is_admin {
@@ -53,25 +33,7 @@ async fn index(db: &State<SqlitePool>, user: User, flash: Option<FlashMessage<'_
         context.insert("trip_types", &triptypes);
     }
 
-    let show_next_n_days = amount_days_to_show(user.is_cox);
-    for i in 0..show_next_n_days {
-        let date = (Local::now() + Duration::days(i)).date_naive();
-
-        if user.is_guest {
-            days.push(Day::new_guest(db, date, false).await);
-        } else {
-            days.push(Day::new(db, date, false).await);
-        }
-    }
-
-    for date in PlannedEvent::pinned_days(db, show_next_n_days).await {
-        //TODO: extract the 2 if's (this block + prev. one) after the 2 for's
-        if user.is_guest {
-            days.push(Day::new_guest(db, date, true).await);
-        } else {
-            days.push(Day::new(db, date, true).await);
-        }
-    }
+    let days = user.get_days(db).await;
 
     if let Some(msg) = flash {
         context.insert("flash", &msg.into_inner());