forked from Ruderverein-Donau-Linz/rowt
		
	Merge pull request 'start replacing activitybuilder' (#1014) from acitvities-adaption into staging
Reviewed-on: Ruderverein-Donau-Linz/rowt#1014
This commit is contained in:
		| @@ -1,6 +1,9 @@ | |||||||
| use std::ops::DerefMut; | use std::ops::DerefMut; | ||||||
|  |  | ||||||
| use super::{role::Role, user::User}; | use super::{ | ||||||
|  |     role::Role, | ||||||
|  |     user::{ManageUserUser, User}, | ||||||
|  | }; | ||||||
| use chrono::{DateTime, Duration, 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}; | ||||||
| @@ -14,6 +17,29 @@ pub struct Activity { | |||||||
|     pub keep_until: Option<NaiveDateTime>, |     pub keep_until: Option<NaiveDateTime>, | ||||||
| } | } | ||||||
|  |  | ||||||
|  | pub enum Reason<'a> { | ||||||
|  |     // `User` tried to login with `String` as UserAgent | ||||||
|  |     SuccLogin(&'a User, String), | ||||||
|  |     // `User` changed the data of `User`, explanation in `String` | ||||||
|  |     UserDataChange(&'a ManageUserUser, &'a User, String), | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl From<Reason<'_>> for ActivityBuilder { | ||||||
|  |     fn from(value: Reason<'_>) -> Self { | ||||||
|  |         match value { | ||||||
|  |             Reason::SuccLogin(user, agent) => { | ||||||
|  |                 Self::new(&format!("{user} hat sich eingeloggt (User-Agent: {agent})")) | ||||||
|  |                     .relevant_for_user(user) | ||||||
|  |                     .keep_until_days(7) | ||||||
|  |             } | ||||||
|  |             Reason::UserDataChange(changed_by, changed_user, explanation) => Self::new(&format!( | ||||||
|  |                 "{changed_by} hat die Daten von {changed_user} aktualisiert: {explanation}" | ||||||
|  |             )) | ||||||
|  |             .relevant_for_user(changed_user), | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| pub struct ActivityBuilder { | pub struct ActivityBuilder { | ||||||
|     text: String, |     text: String, | ||||||
|     relevant_for: String, |     relevant_for: String, | ||||||
| @@ -21,6 +47,7 @@ pub struct ActivityBuilder { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl ActivityBuilder { | impl ActivityBuilder { | ||||||
|  |     /// TODO: maybe make this private, and only allow specific acitivites defined in `Reason` | ||||||
|     #[must_use] |     #[must_use] | ||||||
|     pub fn new(text: &str) -> Self { |     pub fn new(text: &str) -> Self { | ||||||
|         Self { |         Self { | ||||||
|   | |||||||
| @@ -2,7 +2,10 @@ | |||||||
|  |  | ||||||
| use super::{AllowedToEditPaymentStatusUser, ManageUserUser, User}; | use super::{AllowedToEditPaymentStatusUser, ManageUserUser, User}; | ||||||
| use crate::model::{ | use crate::model::{ | ||||||
|     activity::ActivityBuilder, family::Family, mail::valid_mails, notification::Notification, |     activity::{self, ActivityBuilder}, | ||||||
|  |     family::Family, | ||||||
|  |     mail::valid_mails, | ||||||
|  |     notification::Notification, | ||||||
|     role::Role, |     role::Role, | ||||||
| }; | }; | ||||||
| use chrono::NaiveDate; | use chrono::NaiveDate; | ||||||
| @@ -19,8 +22,11 @@ impl User { | |||||||
|     ) -> Result<(), String> { |     ) -> Result<(), String> { | ||||||
|         let note = note.trim(); |         let note = note.trim(); | ||||||
|  |  | ||||||
|         ActivityBuilder::new(&format!("({updated_by}) {note}")) |         ActivityBuilder::from(activity::Reason::UserDataChange( | ||||||
|             .relevant_for_user(user) |             updated_by, | ||||||
|  |             self, | ||||||
|  |             format!("Neue Notizen: {note}"), | ||||||
|  |         )) | ||||||
|         .save(db) |         .save(db) | ||||||
|         .await; |         .await; | ||||||
|  |  | ||||||
| @@ -47,18 +53,11 @@ impl User { | |||||||
|             .unwrap(); //Okay, because we can only create a User of a valid id |             .unwrap(); //Okay, because we can only create a User of a valid id | ||||||
|  |  | ||||||
|         let msg = match &self.mail { |         let msg = match &self.mail { | ||||||
|             Some(old_mail) => { |             Some(old_mail) => format!("Mail-Adresse von {old_mail} auf {new_mail} geändert."), | ||||||
|                 format!( |             None => format!("Neue Mail-Adresse für: {new_mail}"), | ||||||
|                     "{updated_by} hat die Mail-Adresse von {self} von {old_mail} auf {new_mail} geändert." |  | ||||||
|                 ) |  | ||||||
|             } |  | ||||||
|             None => { |  | ||||||
|                 format!("{updated_by} eine neue Mail-Adresse für {self} hinzugefügt: {new_mail}") |  | ||||||
|             } |  | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
|         ActivityBuilder::new(&msg) |         ActivityBuilder::from(activity::Reason::UserDataChange(updated_by, self, msg)) | ||||||
|             .relevant_for_user(self) |  | ||||||
|             .save(db) |             .save(db) | ||||||
|             .await; |             .await; | ||||||
|  |  | ||||||
| @@ -89,19 +88,16 @@ impl User { | |||||||
|         query.execute(db).await.unwrap(); //Okay, because we can only create a User of a valid id |         query.execute(db).await.unwrap(); //Okay, because we can only create a User of a valid id | ||||||
|  |  | ||||||
|         let msg = match &self.phone { |         let msg = match &self.phone { | ||||||
|             Some(old_phone) if new_phone.is_empty() => format!( |             Some(old_phone) if new_phone.is_empty() => { | ||||||
|                 "{updated_by} hat die Telefonnummer von {self} entfernt (alte Nummer: {old_phone})" |                 format!("Telefonnummer wurde entfernt (alte Nummer: {old_phone})") | ||||||
|             ), |             } | ||||||
|             Some(old_phone) => format!( |             Some(old_phone) => { | ||||||
|                 "{updated_by} hat die Telefonnummer von {self} von {old_phone} auf {new_phone} geändert." |                 format!("Telefonnummer wurde von {old_phone} auf {new_phone} geändert.") | ||||||
|             ), |             } | ||||||
|             None => format!( |             None => format!("Neue Telefonnummer hinzugefügt: {new_phone}"), | ||||||
|                 "{updated_by} hat eine neue Telefonnummer für {self} hinzugefügt: {new_phone}" |  | ||||||
|             ), |  | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
|         ActivityBuilder::new(&msg) |         ActivityBuilder::from(activity::Reason::UserDataChange(updated_by, self, msg)) | ||||||
|             .relevant_for_user(self) |  | ||||||
|             .save(db) |             .save(db) | ||||||
|             .await; |             .await; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| use rocket::{ | use rocket::{ | ||||||
|     FromForm, Request, Route, State, |  | ||||||
|     form::Form, |     form::Form, | ||||||
|     get, |     get, | ||||||
|     http::{Cookie, CookieJar}, |     http::{Cookie, CookieJar}, | ||||||
| @@ -9,12 +8,13 @@ use rocket::{ | |||||||
|     response::{Flash, Redirect}, |     response::{Flash, Redirect}, | ||||||
|     routes, |     routes, | ||||||
|     time::{Duration, OffsetDateTime}, |     time::{Duration, OffsetDateTime}, | ||||||
|  |     FromForm, Request, Route, State, | ||||||
| }; | }; | ||||||
| use rocket_dyn_templates::{Template, context, tera}; | use rocket_dyn_templates::{context, tera, Template}; | ||||||
| use sqlx::SqlitePool; | use sqlx::SqlitePool; | ||||||
|  |  | ||||||
| use crate::model::{ | use crate::model::{ | ||||||
|     activity::ActivityBuilder, |     activity::{self, ActivityBuilder}, | ||||||
|     log::Log, |     log::Log, | ||||||
|     user::{LoginError, User}, |     user::{LoginError, User}, | ||||||
| }; | }; | ||||||
| @@ -83,11 +83,7 @@ async fn login( | |||||||
|  |  | ||||||
|     cookies.add_private(Cookie::new("loggedin_user", format!("{}", user.id))); |     cookies.add_private(Cookie::new("loggedin_user", format!("{}", user.id))); | ||||||
|  |  | ||||||
|     ActivityBuilder::new(&format!( |     ActivityBuilder::from(activity::Reason::SuccLogin(&user, agent.0)) | ||||||
|         "{user} hat sich eingeloggt (User-Agent: {})", |  | ||||||
|         agent.0 |  | ||||||
|     )) |  | ||||||
|     .relevant_for_user(&user) |  | ||||||
|         .save(db) |         .save(db) | ||||||
|         .await; |         .await; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user