From 0049fa8167e9d0761da04bc5b04a61407e0572d2 Mon Sep 17 00:00:00 2001 From: Tilo-K Date: Wed, 31 Dec 2025 00:54:23 +0100 Subject: [PATCH] feat: job events --- ...10f35731444a700acd9b5d6ab016e1fa2aa14.json | 12 +++++ ...66bf41056eeac67fa550bf126c762e25ecfaa.json | 12 +++++ Cargo.lock | 7 +++ Cargo.toml | 1 + src/auth.rs | 2 +- src/helper.rs | 2 +- src/jobs.rs | 54 ++++++++++++++++--- 7 files changed, 82 insertions(+), 8 deletions(-) create mode 100644 .sqlx/query-2f483d054029e2d69baa929756510f35731444a700acd9b5d6ab016e1fa2aa14.json create mode 100644 .sqlx/query-bc16f766f022e5062c43080f65e66bf41056eeac67fa550bf126c762e25ecfaa.json diff --git a/.sqlx/query-2f483d054029e2d69baa929756510f35731444a700acd9b5d6ab016e1fa2aa14.json b/.sqlx/query-2f483d054029e2d69baa929756510f35731444a700acd9b5d6ab016e1fa2aa14.json new file mode 100644 index 0000000..5e88e34 --- /dev/null +++ b/.sqlx/query-2f483d054029e2d69baa929756510f35731444a700acd9b5d6ab016e1fa2aa14.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "INSERT INTO job_events (job_name, event_type, created_at) VALUES (?, ?, ?)", + "describe": { + "columns": [], + "parameters": { + "Right": 3 + }, + "nullable": [] + }, + "hash": "2f483d054029e2d69baa929756510f35731444a700acd9b5d6ab016e1fa2aa14" +} diff --git a/.sqlx/query-bc16f766f022e5062c43080f65e66bf41056eeac67fa550bf126c762e25ecfaa.json b/.sqlx/query-bc16f766f022e5062c43080f65e66bf41056eeac67fa550bf126c762e25ecfaa.json new file mode 100644 index 0000000..e86feb0 --- /dev/null +++ b/.sqlx/query-bc16f766f022e5062c43080f65e66bf41056eeac67fa550bf126c762e25ecfaa.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "INSERT INTO job_events (job_name, event_type, event_data, created_at) VALUES (?, ?, ?, ?)", + "describe": { + "columns": [], + "parameters": { + "Right": 4 + }, + "nullable": [] + }, + "hash": "bc16f766f022e5062c43080f65e66bf41056eeac67fa550bf126c762e25ecfaa" +} diff --git a/Cargo.lock b/Cargo.lock index feb4b1f..b84eb17 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -268,6 +268,12 @@ dependencies = [ "libc", ] +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + [[package]] name = "atoi" version = "2.0.0" @@ -514,6 +520,7 @@ dependencies = [ "actix-files", "actix-web", "actix-web-httpauth", + "anyhow", "chrono", "dotenv", "futures-util", diff --git a/Cargo.toml b/Cargo.toml index eada969..224ca1d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ edition = "2024" actix-files = "0.6.9" actix-web = "4.12.1" actix-web-httpauth = "0.8.2" +anyhow = "1.0.100" chrono = "0.4.42" dotenv = "0.15.0" futures-util = "0.3.31" diff --git a/src/auth.rs b/src/auth.rs index 2a91bfd..bcb81be 100644 --- a/src/auth.rs +++ b/src/auth.rs @@ -114,7 +114,7 @@ fn start_polling_thread(openid_response: auth::OpenidResponse) -> JoinHandle<()> thread } -pub async fn create_new_access_token() -> Result<(), Box> { +pub async fn create_new_access_token() -> Result<(), anyhow::Error> { let client = reqwest::Client::new(); let url = "https://www.servercontrolpanel.de/realms/scp/protocol/openid-connect/token"; let refresh_token = helper::get_refresh_token().await?; diff --git a/src/helper.rs b/src/helper.rs index dfc8d07..f4bfe74 100644 --- a/src/helper.rs +++ b/src/helper.rs @@ -5,7 +5,7 @@ use sqlx::query; use crate::db; -pub async fn get_refresh_token() -> Result> { +pub async fn get_refresh_token() -> Result { let pool = db::get_pool().await?; let tok = query!("SELECT * FROM tokens WHERE is_refresh = 1 ORDER BY expires_at DESC LIMIT 1") .fetch_one(&pool) diff --git a/src/jobs.rs b/src/jobs.rs index 8789039..9fd4002 100644 --- a/src/jobs.rs +++ b/src/jobs.rs @@ -1,9 +1,35 @@ -use std::{error::Error, time::Duration}; +use std::{error::Error, option, time::Duration}; use quartz::{Job, Scheduler, Trigger}; use sqlx::query; use tokio::runtime::Handle; +async fn log_job_event(job_name: &str, event: &str, event_data: Option<&str>) { + let pool = db::get_pool().await.unwrap(); + let now = chrono::Utc::now(); + let now = now.to_rfc3339(); + if let Some(data) = event_data { + let _ = query!( + "INSERT INTO job_events (job_name, event_type, event_data, created_at) VALUES (?, ?, ?, ?)", + job_name, + event, + data, + now + ) + .execute(&pool) + .await; + } else { + let _ = query!( + "INSERT INTO job_events (job_name, event_type, created_at) VALUES (?, ?, ?)", + job_name, + event, + now + ) + .execute(&pool) + .await; + } +} + use crate::{auth, db}; pub fn init_scheduler(rt: Handle) -> Scheduler { let scheduler = Scheduler::new(); @@ -39,17 +65,33 @@ pub fn init_scheduler(rt: Handle) -> Scheduler { scheduler } -pub async fn cleanup_old_tokens() -> Result<(), Box> { +pub async fn cleanup_old_tokens() -> Result<(), anyhow::Error> { + log_job_event("CLEANUP_OLD_TOKENS", "START", None).await; let pool = db::get_pool().await?; let now = chrono::Utc::now(); let now = now.to_rfc3339(); - query!("DELETE FROM tokens WHERE expires_at < ?", now) + let res = query!("DELETE FROM tokens WHERE expires_at < ?", now) .execute(&pool) - .await?; + .await; + if let Err(e) = res { + log_job_event("CLEANUP_OLD_TOKENS", "ERROR", Some(&e.to_string())).await; + } + log_job_event("CLEANUP_OLD_TOKENS", "FINISHED", None).await; Ok(()) } -pub async fn refresh_access_token() -> Result<(), Box> { - auth::create_new_access_token().await?; +pub async fn refresh_access_token() -> Result<(), anyhow::Error> { + log_job_event("REFRESH_ACCESS_TOKEN", "START", None).await; + let res = auth::create_new_access_token().await; + if let Err(e) = res { + let clone_err = e.to_string().clone(); + let _ = log_job_event( + "REFRESH_ACCESS_TOKEN", + "ERROR", + Some(&clone_err.to_string()), + ) + .await; + } + log_job_event("REFRESH_ACCESS_TOKEN", "FINISHED", None).await; Ok(()) }