From b710dd9df68edd1b98a4d113491d4cd33d590233 Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Fri, 4 Oct 2024 20:02:14 +0200 Subject: [PATCH] Reorganise resource methods --- crates/caldav/src/calendar/resource.rs | 14 ++++++++ crates/caldav/src/calendar_object/methods.rs | 6 ++++ crates/caldav/src/calendar_object/resource.rs | 7 ++++ crates/caldav/src/lib.rs | 32 ++----------------- crates/dav/src/resource.rs | 20 +++++++++--- 5 files changed, 44 insertions(+), 35 deletions(-) diff --git a/crates/caldav/src/calendar/resource.rs b/crates/caldav/src/calendar/resource.rs index 9be4347..5b86f5c 100644 --- a/crates/caldav/src/calendar/resource.rs +++ b/crates/caldav/src/calendar/resource.rs @@ -1,3 +1,5 @@ +use super::methods::mkcalendar::route_mkcalendar; +use super::methods::report::route_report_calendar; use super::prop::{ Resourcetype, SupportedCalendarComponent, SupportedCalendarComponentSet, SupportedCalendarData, SupportedReportSet, UserPrivilegeSet, @@ -6,6 +8,8 @@ use crate::calendar_object::resource::CalendarObjectResource; use crate::principal::PrincipalResource; use crate::Error; use actix_web::dev::ResourceMap; +use actix_web::http::Method; +use actix_web::web; use actix_web::{web::Data, HttpRequest}; use async_trait::async_trait; use derive_more::derive::{From, Into}; @@ -14,6 +18,7 @@ use rustical_dav::xml::HrefElement; use rustical_store::model::Calendar; use rustical_store::CalendarStore; use serde::{Deserialize, Serialize}; +use std::str::FromStr; use std::sync::Arc; use strum::{EnumString, VariantNames}; use tokio::sync::RwLock; @@ -316,4 +321,13 @@ impl ResourceService for CalendarResourceService { .await?; Ok(()) } + + #[inline] + fn actix_additional_routes(res: actix_web::Resource) -> actix_web::Resource { + let report_method = || web::method(Method::from_str("REPORT").unwrap()); + let mkcalendar_method = || web::method(Method::from_str("MKCALENDAR").unwrap()); + + res.route(report_method().to(route_report_calendar::)) + .route(mkcalendar_method().to(route_mkcalendar::)) + } } diff --git a/crates/caldav/src/calendar_object/methods.rs b/crates/caldav/src/calendar_object/methods.rs index 0dcba1c..be8fa7f 100644 --- a/crates/caldav/src/calendar_object/methods.rs +++ b/crates/caldav/src/calendar_object/methods.rs @@ -8,11 +8,15 @@ use actix_web::HttpResponse; use rustical_store::auth::User; use rustical_store::model::CalendarObject; use rustical_store::CalendarStore; +use tracing::instrument; +use tracing_actix_web::RootSpan; +#[instrument(parent = root_span.id(), skip(context, path, root_span))] pub async fn get_event( context: Data>, path: Path<(String, String, String)>, user: User, + root_span: RootSpan, ) -> Result { let (principal, cid, mut uid) = path.into_inner(); @@ -46,12 +50,14 @@ pub async fn get_event( .body(event.get_ics().to_owned())) } +#[instrument(parent = root_span.id(), skip(context, path, req, root_span))] pub async fn put_event( context: Data>, path: Path<(String, String, String)>, body: String, user: User, req: HttpRequest, + root_span: RootSpan, ) -> Result { let (principal, cid, mut uid) = path.into_inner(); if user.id != principal { diff --git a/crates/caldav/src/calendar_object/resource.rs b/crates/caldav/src/calendar_object/resource.rs index 1707fe2..687a0b2 100644 --- a/crates/caldav/src/calendar_object/resource.rs +++ b/crates/caldav/src/calendar_object/resource.rs @@ -10,6 +10,8 @@ use std::sync::Arc; use strum::{EnumString, VariantNames}; use tokio::sync::RwLock; +use super::methods::{get_event, put_event}; + pub struct CalendarObjectResourceService { pub cal_store: Arc>, pub path: String, @@ -130,4 +132,9 @@ impl ResourceService for CalendarObjectResourceServic .await?; Ok(()) } + + #[inline] + fn actix_additional_routes(res: actix_web::Resource) -> actix_web::Resource { + res.get(get_event::).put(put_event::) + } } diff --git a/crates/caldav/src/lib.rs b/crates/caldav/src/lib.rs index c1ed180..9602e21 100644 --- a/crates/caldav/src/lib.rs +++ b/crates/caldav/src/lib.rs @@ -5,11 +5,9 @@ use calendar::resource::CalendarResourceService; use calendar_object::resource::CalendarObjectResourceService; use principal::PrincipalResourceService; use root::RootResourceService; -use rustical_dav::methods::route_delete; use rustical_dav::resource::ResourceService; use rustical_store::auth::{AuthenticationMiddleware, AuthenticationProvider}; use rustical_store::CalendarStore; -use std::str::FromStr; use std::sync::Arc; use tokio::sync::RwLock; @@ -34,9 +32,6 @@ pub fn configure_dav( auth_provider: Arc, store: Arc>, ) { - let report_method = || web::method(Method::from_str("REPORT").unwrap()); - let mkcalendar_method = || web::method(Method::from_str("MKCALENDAR").unwrap()); - cfg.service( web::scope("") .wrap(AuthenticationMiddleware::new(auth_provider)) @@ -57,33 +52,10 @@ pub fn configure_dav( .service(PrincipalResourceService::::actix_resource()) .service( web::scope("/{calendar}") - .service( - CalendarResourceService::::actix_resource() - .route(report_method().to( - calendar::methods::report::route_report_calendar::, - )) - .route( - web::method(Method::DELETE) - .to(route_delete::>), - ) - .route(mkcalendar_method().to( - calendar::methods::mkcalendar::route_mkcalendar::, - )), - ) + .service(CalendarResourceService::::actix_resource()) .service( web::scope("/{object}").service( - CalendarObjectResourceService::::actix_resource() - .route(web::method(Method::DELETE).to(route_delete::< - CalendarObjectResourceService, - >)) - .route( - web::method(Method::GET) - .to(calendar_object::methods::get_event::), - ) - .route( - web::method(Method::PUT) - .to(calendar_object::methods::put_event::), - ), + CalendarObjectResourceService::::actix_resource(), ), ), ), diff --git a/crates/dav/src/resource.rs b/crates/dav/src/resource.rs index 3fc3b01..879798d 100644 --- a/crates/dav/src/resource.rs +++ b/crates/dav/src/resource.rs @@ -1,4 +1,4 @@ -use crate::methods::{route_propfind, route_proppatch}; +use crate::methods::{route_delete, route_propfind, route_proppatch}; use crate::xml::multistatus::{PropTagWrapper, PropstatElement, PropstatWrapper}; use crate::xml::{multistatus::ResponseElement, TagList}; use crate::Error; @@ -164,17 +164,27 @@ pub trait ResourceService: Sized + 'static { Err(crate::Error::Unauthorized.into()) } + #[inline] fn resource_name() -> &'static str { Self::Resource::resource_name() } + #[inline] fn actix_resource() -> actix_web::Resource { let propfind_method = || web::method(Method::from_str("PROPFIND").unwrap()); let proppatch_method = || web::method(Method::from_str("PROPPATCH").unwrap()); - web::resource("") - .name(Self::resource_name()) - .route(propfind_method().to(route_propfind::)) - .route(proppatch_method().to(route_proppatch::)) + Self::actix_additional_routes( + web::resource("") + .name(Self::resource_name()) + .route(propfind_method().to(route_propfind::)) + .route(proppatch_method().to(route_proppatch::)) + .delete(route_delete::), + ) + } + + #[inline] + fn actix_additional_routes(res: actix_web::Resource) -> actix_web::Resource { + res } }