From 50bc1f4eb577237f77656bbb94acb2e66d7843dd Mon Sep 17 00:00:00 2001 From: Chris Jean-Marie Date: Mon, 23 Jun 2025 17:54:14 +0000 Subject: [PATCH] Add admin changes to calendar requests --- backend/src/calendar.rs | 63 +++++++++++++++++++++++++++++++++ backend/src/main.rs | 3 +- backend/templates/calendar.html | 61 ++++++++++++++++++++++++++++--- 3 files changed, 122 insertions(+), 5 deletions(-) diff --git a/backend/src/calendar.rs b/backend/src/calendar.rs index 52a55bf..7ec74ab 100644 --- a/backend/src/calendar.rs +++ b/backend/src/calendar.rs @@ -525,6 +525,69 @@ pub async fn update_event( eventstring } +pub async fn calendar_update_event_state( + State(db_pool): State, + Extension(user_data): Extension>, + Extension(rbac): Extension, + request: axum::http::Request, +) -> impl IntoResponse { + // Is the user logged in? + let logged_in = user_data.is_some(); + + // Set default events + let mut eventstring: String = "[]".to_string(); + + if logged_in { + // Extract the user data. + let _user = user_data.as_ref().unwrap().clone(); + let userid = user_data.as_ref().map(|s| s.id.clone()).unwrap_or_default(); + let personid = user_data + .as_ref() + .map(|s| s.person_id.clone()) + .unwrap_or_default(); + + if rbac.has_permission(userid, "calendar:*:*").await { + let (_parts, body) = request.into_parts(); + let bytes = axum::body::to_bytes(body, usize::MAX).await.unwrap(); + let body_str = String::from_utf8(bytes.to_vec()).unwrap(); + + let v: Value = serde_json::from_str(&body_str).unwrap(); + + // Convert calendar id to UUID + let calendar_event_id = Uuid::parse_str(v["id"].as_str().unwrap()).unwrap(); + + let event = sqlx::query_scalar::<_, uuid::Uuid>( + r#"with cet as (select id from calendar_event_types where name = $1 and state = $2) + update calendar_events + set updated_by = $3, + updated_at = now(), + event_type_id = cet.id + from cet + where calendar_events.id = $4 + returning calendar_events.id"# + ) + .bind(v["eventType"].as_str().unwrap()) + .bind(v["state"].as_str().unwrap()) + .bind(personid) + .bind(calendar_event_id) + .fetch_one(&db_pool) + .await + .map_err(|e| { + ( + StatusCode::INTERNAL_SERVER_ERROR, + format!("Error creating event: {}", e), + ) + }); + + let event_id = event.clone(); + + eventstring = get_event(event_id.unwrap(), &db_pool).await; + } + } + + eventstring +} + #[derive(Template)] #[template(path = "newevent.html")] struct EventTemplate { diff --git a/backend/src/main.rs b/backend/src/main.rs index 3f1db7e..8b20959 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -34,7 +34,7 @@ use wishlist::{ user_wishlist_returned_item, user_wishlist_save_item, wishlists, }; -use crate::calendar::update_event; +use crate::calendar::{calendar_update_event_state, update_event}; //use email::send_emails; @@ -98,6 +98,7 @@ async fn main() { .route("/calendar/newevent", get(new_event)) .route("/calendar/newrequest", post(new_request)) .route("/calendar/updaterequest", post(update_event)) + .route("/calendar/updateeventstate", post(calendar_update_event_state)) // Wishlist .route("/wishlists", get(wishlists)) .route("/userwishlist/{user_id}", get(user_wishlist)) diff --git a/backend/templates/calendar.html b/backend/templates/calendar.html index f6b8feb..1a63cc5 100644 --- a/backend/templates/calendar.html +++ b/backend/templates/calendar.html @@ -19,7 +19,11 @@