diff --git a/src/logs.rs b/src/logs.rs index 864a9a9..1546992 100644 --- a/src/logs.rs +++ b/src/logs.rs @@ -1,10 +1,11 @@ -use std::fmt::Display; - use serde::{Deserialize, Serialize}; -use strum::{AsRefStr, IntoStaticStr}; +use strum::IntoStaticStr; use uuid::Uuid; -use crate::{database, users::User}; +use crate::{ + database::{self, DatabaseError}, + users::User, +}; #[derive(Debug)] pub struct LogEntry { @@ -14,21 +15,45 @@ pub struct LogEntry { } impl LogEntry { - pub fn new(actor: User, data: LogAction) -> Result { + pub fn new(actor: User, data: LogAction) -> Result { let log = LogEntry { id: Uuid::now_v7(), actor, data, }; let conn = database::conn()?; + let actiontype: &'static str = (&log.data).into(); + let payload = serde_json::to_string(&log.data).unwrap(); conn.prepare( "INSERT INTO logs(id, actor, target, actiontype, payload) VALUES (?1,?2,?3,?4,?5)", )? - .execute((&log.id, &log.actor.id, log.data.get_target_id(), "a", "b"))?; + .execute(( + &log.id, + &log.actor.id, + log.data.get_target_id(), + actiontype, + payload, + ))?; Ok(log) } + pub fn get_all() -> Result, DatabaseError> { + Ok(database::conn()? + .prepare("SELECT id, actor, target, actiontype, payload FROM logs ORDER BY id DESC")? + .query_map((), |r| { + let payload: String = r.get(4)?; + Ok(LogEntry { + id: r.get(0)?, + actor: User::get_by_id(r.get(1)?).unwrap(), + data: serde_json::from_str(&payload).unwrap(), + }) + })? + .collect::, _>>()?) + } } +// #[derive(Debug, thiserror::Error)] +// pub enum LogError {} + #[derive(Debug, IntoStaticStr, Serialize, Deserialize)] pub enum LogAction { Initialize, @@ -42,10 +67,10 @@ impl LogAction { pub fn get_target_id(&self) -> Option { match self { Self::Initialize | Self::RegenInfradmin => None, - Self::CreateUser { id, .. } => Some(*id), - Self::CreateTag { id, .. } => Some(*id), - Self::CreatePerson { id, .. } => Some(*id), - Self::ChangeUserHandle { id, .. } => Some(*id), + Self::CreateUser { id, .. } + | Self::CreateTag { id, .. } + | Self::CreatePerson { id, .. } + | Self::ChangeUserHandle { id, .. } => Some(*id), } } pub fn get_humanreadable_payload(&self) -> String { diff --git a/src/users/setup.rs b/src/users/setup.rs index b5f28d0..0271246 100644 --- a/src/users/setup.rs +++ b/src/users/setup.rs @@ -3,6 +3,7 @@ use uuid::Uuid; use crate::{ database, + logs::{LogAction, LogEntry}, users::{User, UserError}, }; @@ -15,7 +16,8 @@ pub fn initialise_reserved_users_if_needed() -> Result<(), UserError> { .optional()? .is_none() { - User::create_systemuser()?; + let u = User::create_systemuser()?; + LogEntry::new(u, LogAction::Initialize)?; } if conn @@ -25,6 +27,7 @@ pub fn initialise_reserved_users_if_needed() -> Result<(), UserError> { .is_none() { User::create_infradmin()?; + LogEntry::new(User::get_by_id(Uuid::nil())?, LogAction::RegenInfradmin)?; } Ok(()) diff --git a/src/web/pages/logs.rs b/src/web/pages/logs.rs index f0aec8f..fa3a5e3 100644 --- a/src/web/pages/logs.rs +++ b/src/web/pages/logs.rs @@ -3,11 +3,10 @@ use axum::{ response::{IntoResponse, Redirect, Response}, }; use maud::{PreEscaped, html}; -use uuid::Uuid; use crate::{ api::CompositeError, - logs::{LogAction, LogEntry}, + logs::LogEntry, users::{User, auth::UserAuthenticate, permissions::Permission}, web::{RedirectViaError, components::nav::nav, icons, pages::base}, }; @@ -15,21 +14,7 @@ use crate::{ pub async fn page(req: Request) -> Result { let u = User::authenticate(req.headers())? .ok_or(RedirectViaError(Redirect::to("/login?re=/logs")))?; - let logs: Vec = vec![ - LogEntry { - id: Uuid::now_v7(), - actor: User::get_by_id(Uuid::nil()).unwrap(), - data: LogAction::Initialize, - }, - LogEntry { - id: Uuid::now_v7(), - actor: User::get_by_id(Uuid::nil()).unwrap(), - data: LogAction::RegenInfradmin, - }, - ] - .into_iter() - .rev() - .collect(); + let logs = LogEntry::get_all()?; Ok(base( "Persons | Mnemosyne",