forked from Ruderverein-Donau-Linz/rowt
		
	Merge pull request 'prepare to remove old log, in favor of activities' (#1012) from acitvities-adaption into staging
Reviewed-on: Ruderverein-Donau-Linz/rowt#1012
This commit is contained in:
		| @@ -1,7 +1,7 @@ | |||||||
| use std::ops::DerefMut; | use std::ops::DerefMut; | ||||||
|  |  | ||||||
| use super::{role::Role, user::User}; | use super::{role::Role, user::User}; | ||||||
| use chrono::{DateTime, Local, NaiveDateTime, TimeZone, Utc}; | use chrono::{DateTime, Duration, Local, NaiveDateTime, TimeZone, Utc}; | ||||||
| use serde::{Deserialize, Serialize}; | use serde::{Deserialize, Serialize}; | ||||||
| use sqlx::{FromRow, Sqlite, SqlitePool, Transaction}; | use sqlx::{FromRow, Sqlite, SqlitePool, Transaction}; | ||||||
|  |  | ||||||
| @@ -46,6 +46,15 @@ impl ActivityBuilder { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     #[must_use] | ||||||
|  |     pub fn keep_until_days(self, days: i64) -> Self { | ||||||
|  |         let now = Utc::now().naive_utc(); | ||||||
|  |         Self { | ||||||
|  |             keep_until: Some(now + Duration::days(days)), | ||||||
|  |             ..self | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pub async fn save(self, db: &SqlitePool) { |     pub async fn save(self, db: &SqlitePool) { | ||||||
|         Activity::create(db, &self.text, &self.relevant_for, self.keep_until).await; |         Activity::create(db, &self.text, &self.relevant_for, self.keep_until).await; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,74 +1,16 @@ | |||||||
| use std::ops::DerefMut; | use super::activity::ActivityBuilder; | ||||||
|  | use sqlx::{Sqlite, SqlitePool, Transaction}; | ||||||
|  |  | ||||||
| use chrono::{DateTime, Local, NaiveDateTime, TimeZone, Utc}; | pub struct Log {} | ||||||
| use serde::{Deserialize, Serialize}; |  | ||||||
| use sqlx::{FromRow, Sqlite, SqlitePool, Transaction}; |  | ||||||
|  |  | ||||||
| #[derive(FromRow, Debug, Serialize, Deserialize)] |  | ||||||
| pub struct Log { |  | ||||||
|     pub msg: String, |  | ||||||
|     pub created_at: NaiveDateTime, |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  | // TODO: remove and convert to proper acitvities | ||||||
| impl Log { | impl Log { | ||||||
|     pub async fn create(db: &SqlitePool, msg: String) -> bool { |     pub async fn create(db: &SqlitePool, msg: String) -> bool { | ||||||
|         sqlx::query!("INSERT INTO log(msg) VALUES (?)", msg,) |         ActivityBuilder::new(&msg).save(db).await; | ||||||
|             .execute(db) |         true | ||||||
|             .await |  | ||||||
|             .is_ok() |  | ||||||
|     } |     } | ||||||
|     pub async fn create_with_tx(db: &mut Transaction<'_, Sqlite>, msg: String) -> bool { |     pub async fn create_with_tx(db: &mut Transaction<'_, Sqlite>, msg: String) -> bool { | ||||||
|         sqlx::query!("INSERT INTO log(msg) VALUES (?)", msg,) |         ActivityBuilder::new(&msg).save_tx(db).await; | ||||||
|             .execute(db.deref_mut()) |         true | ||||||
|             .await |  | ||||||
|             .is_ok() |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     async fn last(db: &SqlitePool) -> Vec<Log> { |  | ||||||
|         sqlx::query_as!( |  | ||||||
|             Log, |  | ||||||
|             " |  | ||||||
| SELECT msg, created_at |  | ||||||
| FROM log  |  | ||||||
| ORDER BY id DESC |  | ||||||
| LIMIT 1000 |  | ||||||
|     " |  | ||||||
|         ) |  | ||||||
|         .fetch_all(db) |  | ||||||
|         .await |  | ||||||
|         .unwrap() |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     pub async fn generate_feed(db: &SqlitePool) -> String { |  | ||||||
|         let mut ret = String::from( |  | ||||||
|             r#"<?xml version="1.0" encoding="utf-8"?> |  | ||||||
| <rss version="2.0"> |  | ||||||
| <channel> |  | ||||||
| <title>Ruder App Admin Feed</title> |  | ||||||
| <link>app.rudernlinz.at</link> |  | ||||||
| <description>An RSS feed with activities from app.rudernlinz.at</description>"#, |  | ||||||
|         ); |  | ||||||
|         for log in Self::last(db).await { |  | ||||||
|             let utc_time: DateTime<Utc> = Utc::from_utc_datetime(&Utc, &log.created_at); |  | ||||||
|             let local_time = utc_time.with_timezone(&Local); |  | ||||||
|             ret.push_str("<item><title>"); |  | ||||||
|             ret.push_str(&format!("({}) {}", local_time, log.msg)); |  | ||||||
|             ret.push_str("</title></item>"); |  | ||||||
|         } |  | ||||||
|         ret.push_str("</channel>"); |  | ||||||
|         ret.push_str("</rss>"); |  | ||||||
|         ret.replace('\n', "") |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     pub async fn show(db: &SqlitePool) -> String { |  | ||||||
|         let mut ret = String::new(); |  | ||||||
|  |  | ||||||
|         for log in Self::last(db).await { |  | ||||||
|             let utc_time: DateTime<Utc> = Utc::from_utc_datetime(&Utc, &log.created_at); |  | ||||||
|             let local_time = utc_time.with_timezone(&Local); |  | ||||||
|             ret.push_str(&format!("- {} - {}\n", local_time, log.msg)); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         ret |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -3,10 +3,7 @@ use rocket::{form::Form, get, post, routes, FromForm, Route, State}; | |||||||
| use rocket_dyn_templates::{context, Template}; | use rocket_dyn_templates::{context, Template}; | ||||||
| use sqlx::SqlitePool; | use sqlx::SqlitePool; | ||||||
|  |  | ||||||
| use crate::{ | use crate::model::{activity::Activity, role::Role, user::AdminUser}; | ||||||
|     model::{activity::Activity, log::Log, role::Role, user::AdminUser}, |  | ||||||
|     tera::Config, |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| pub mod boat; | pub mod boat; | ||||||
| pub mod event; | pub mod event; | ||||||
| @@ -16,20 +13,6 @@ pub mod role; | |||||||
| pub mod schnupper; | pub mod schnupper; | ||||||
| pub mod user; | pub mod user; | ||||||
|  |  | ||||||
| #[get("/rss?<key>")] |  | ||||||
| async fn rss(db: &State<SqlitePool>, key: &str, config: &State<Config>) -> String { |  | ||||||
|     if key.eq(&config.rss_key) { |  | ||||||
|         Log::generate_feed(db).await |  | ||||||
|     } else { |  | ||||||
|         "Not allowed".into() |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #[get("/rss/old", rank = 2)] |  | ||||||
| async fn show_rss(db: &State<SqlitePool>, _admin: AdminUser) -> String { |  | ||||||
|     Log::show(db).await |  | ||||||
| } |  | ||||||
|  |  | ||||||
| #[get("/rss", rank = 2)] | #[get("/rss", rank = 2)] | ||||||
| async fn show_activities(db: &State<SqlitePool>, _admin: AdminUser) -> String { | async fn show_activities(db: &State<SqlitePool>, _admin: AdminUser) -> String { | ||||||
|     Activity::show(db).await |     Activity::show(db).await | ||||||
| @@ -88,12 +71,6 @@ pub fn routes() -> Vec<Route> { | |||||||
|     ret.append(&mut mail::routes()); |     ret.append(&mut mail::routes()); | ||||||
|     ret.append(&mut event::routes()); |     ret.append(&mut event::routes()); | ||||||
|     ret.append(&mut role::routes()); |     ret.append(&mut role::routes()); | ||||||
|     ret.append(&mut routes![ |     ret.append(&mut routes![show_activities, show_list, list]); | ||||||
|         rss, |  | ||||||
|         show_rss, |  | ||||||
|         show_activities, |  | ||||||
|         show_list, |  | ||||||
|         list |  | ||||||
|     ]); |  | ||||||
|     ret |     ret | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user