Some refactoring work

This commit is contained in:
Lennart
2025-05-02 19:53:02 +02:00
parent 32e1ce85f1
commit c9683580eb
8 changed files with 94 additions and 109 deletions

View File

@@ -10,7 +10,7 @@ use actix_web::{
};
use rustical_dav::{
resource::Resource,
xml::{MultistatusElement, PropElement, PropfindType, multistatus::ResponseElement},
xml::{MultistatusElement, PropfindType, multistatus::ResponseElement},
};
use rustical_store::{CalendarObject, CalendarStore, auth::User};
use rustical_xml::XmlDeserialize;
@@ -56,7 +56,8 @@ pub async fn get_objects_calendar_multiget<C: CalendarStore>(
}
pub async fn handle_calendar_multiget<C: CalendarStore>(
cal_multiget: CalendarMultigetRequest,
cal_multiget: &CalendarMultigetRequest,
props: &[&str],
req: HttpRequest,
user: &User,
principal: &str,
@@ -64,26 +65,9 @@ pub async fn handle_calendar_multiget<C: CalendarStore>(
cal_store: &C,
) -> Result<MultistatusElement<CalendarObjectPropWrapper, String>, Error> {
let (objects, not_found) =
get_objects_calendar_multiget(&cal_multiget, req.path(), principal, cal_id, cal_store)
get_objects_calendar_multiget(cal_multiget, req.path(), principal, cal_id, cal_store)
.await?;
let props = match cal_multiget.prop {
PropfindType::Allprop => {
vec!["allprop".to_owned()]
}
PropfindType::Propname => {
vec!["propname".to_owned()]
}
PropfindType::Prop(PropElement(prop_tags)) => prop_tags
.into_iter()
.map(|propname| match propname {
ReportPropName::Propname(propname) => propname.0,
ReportPropName::CalendarData(_) => "calendar-data".to_owned(),
})
.collect(),
};
let props: Vec<&str> = props.iter().map(String::as_str).collect();
let mut responses = Vec::new();
for object in objects {
let path = format!("{}/{}.ics", req.path(), object.get_id());
@@ -92,7 +76,7 @@ pub async fn handle_calendar_multiget<C: CalendarStore>(
object,
principal: principal.to_owned(),
}
.propfind(&path, &props, user, req.resource_map())?,
.propfind(&path, props, user, req.resource_map())?,
);
}

View File

@@ -1,7 +1,7 @@
use actix_web::HttpRequest;
use rustical_dav::{
resource::Resource,
xml::{MultistatusElement, PropElement, PropfindType},
xml::{MultistatusElement, PropfindType},
};
use rustical_store::{
CalendarObject, CalendarStore, auth::User, calendar::UtcDateTime, calendar_store::CalendarQuery,
@@ -216,31 +216,15 @@ pub async fn get_objects_calendar_query<C: CalendarStore>(
}
pub async fn handle_calendar_query<C: CalendarStore>(
cal_query: CalendarQueryRequest,
cal_query: &CalendarQueryRequest,
props: &[&str],
req: HttpRequest,
user: &User,
principal: &str,
cal_id: &str,
cal_store: &C,
) -> Result<MultistatusElement<CalendarObjectPropWrapper, String>, Error> {
let objects = get_objects_calendar_query(&cal_query, principal, cal_id, cal_store).await?;
let props = match cal_query.prop {
PropfindType::Allprop => {
vec!["allprop".to_owned()]
}
PropfindType::Propname => {
vec!["propname".to_owned()]
}
PropfindType::Prop(PropElement(prop_tags)) => prop_tags
.into_iter()
.map(|propname| match propname {
ReportPropName::Propname(propname) => propname.0,
ReportPropName::CalendarData(_) => "calendar-data".to_owned(),
})
.collect(),
};
let props: Vec<&str> = props.iter().map(String::as_str).collect();
let objects = get_objects_calendar_query(cal_query, principal, cal_id, cal_store).await?;
let mut responses = Vec::new();
for object in objects {
@@ -254,7 +238,7 @@ pub async fn handle_calendar_query<C: CalendarStore>(
object,
principal: principal.to_owned(),
}
.propfind(&path, &props, user, req.resource_map())?,
.propfind(&path, props, user, req.resource_map())?,
);
}

View File

@@ -5,7 +5,9 @@ use actix_web::{
};
use calendar_multiget::{CalendarMultigetRequest, handle_calendar_multiget};
use calendar_query::{CalendarQueryRequest, handle_calendar_query};
use rustical_dav::xml::{Propname, sync_collection::SyncCollectionRequest};
use rustical_dav::xml::{
PropElement, PropfindType, Propname, sync_collection::SyncCollectionRequest,
};
use rustical_store::{CalendarStore, auth::User};
use rustical_xml::{XmlDeserialize, XmlDocument};
use sync_collection::handle_sync_collection;
@@ -53,6 +55,34 @@ pub(crate) enum ReportRequest {
SyncCollection(SyncCollectionRequest<ReportPropName>),
}
impl ReportRequest {
fn props(&self) -> Vec<&str> {
let prop_element = match self {
ReportRequest::CalendarMultiget(CalendarMultigetRequest { prop, .. }) => prop,
ReportRequest::CalendarQuery(CalendarQueryRequest { prop, .. }) => prop,
ReportRequest::SyncCollection(SyncCollectionRequest { prop, .. }) => prop,
};
let props = match prop_element {
PropfindType::Allprop => {
vec!["allprop"]
}
PropfindType::Propname => {
vec!["propname"]
}
PropfindType::Prop(PropElement(prop_tags)) => prop_tags
.iter()
.map(|propname| match propname {
ReportPropName::Propname(propname) => propname.0.as_str(),
ReportPropName::CalendarData(_) => "calendar-data",
})
.collect(),
};
// let props: Vec<&str> = props.iter().map(String::as_str).collect();
props
}
}
#[instrument(skip(req, cal_store))]
pub async fn route_report_calendar<C: CalendarStore>(
path: Path<(String, String)>,
@@ -67,11 +97,13 @@ pub async fn route_report_calendar<C: CalendarStore>(
}
let request = ReportRequest::parse_str(&body)?;
let props = request.props();
Ok(match request.clone() {
Ok(match &request {
ReportRequest::CalendarQuery(cal_query) => {
handle_calendar_query(
cal_query,
&props,
req,
&user,
&principal,
@@ -83,6 +115,7 @@ pub async fn route_report_calendar<C: CalendarStore>(
ReportRequest::CalendarMultiget(cal_multiget) => {
handle_calendar_multiget(
cal_multiget,
&props,
req,
&user,
&principal,
@@ -94,6 +127,7 @@ pub async fn route_report_calendar<C: CalendarStore>(
ReportRequest::SyncCollection(sync_collection) => {
handle_sync_collection(
sync_collection,
&props,
req,
&user,
&principal,

View File

@@ -7,8 +7,7 @@ use actix_web::{HttpRequest, http::StatusCode};
use rustical_dav::{
resource::Resource,
xml::{
MultistatusElement, PropElement, PropfindType, multistatus::ResponseElement,
sync_collection::SyncCollectionRequest,
MultistatusElement, multistatus::ResponseElement, sync_collection::SyncCollectionRequest,
},
};
use rustical_store::{
@@ -18,30 +17,14 @@ use rustical_store::{
};
pub async fn handle_sync_collection<C: CalendarStore>(
sync_collection: SyncCollectionRequest<ReportPropName>,
sync_collection: &SyncCollectionRequest<ReportPropName>,
props: &[&str],
req: HttpRequest,
user: &User,
principal: &str,
cal_id: &str,
cal_store: &C,
) -> Result<MultistatusElement<CalendarObjectPropWrapper, String>, Error> {
let props = match sync_collection.prop {
PropfindType::Allprop => {
vec!["allprop".to_owned()]
}
PropfindType::Propname => {
vec!["propname".to_owned()]
}
PropfindType::Prop(PropElement(prop_tags)) => prop_tags
.into_iter()
.map(|propname| match propname {
ReportPropName::Propname(propname) => propname.0,
ReportPropName::CalendarData(_) => "calendar-data".to_owned(),
})
.collect(),
};
let props: Vec<&str> = props.iter().map(String::as_str).collect();
let old_synctoken = parse_synctoken(&sync_collection.sync_token).unwrap_or(0);
let (new_objects, deleted_objects, new_synctoken) = cal_store
.sync_changes(principal, cal_id, old_synctoken)
@@ -59,7 +42,7 @@ pub async fn handle_sync_collection<C: CalendarStore>(
object,
principal: principal.to_owned(),
}
.propfind(&path, &props, user, req.resource_map())?,
.propfind(&path, props, user, req.resource_map())?,
);
}