Massive refactoring how DAV resources and routes work

This commit is contained in:
Lennart
2024-10-03 23:02:13 +02:00
parent 9c8c05eaca
commit a47d056df0
15 changed files with 218 additions and 162 deletions

View File

@@ -8,7 +8,7 @@ use actix_web::{
};
use rustical_dav::{
methods::propfind::{PropElement, PropfindType},
resource::HandlePropfind,
resource::Resource,
xml::{multistatus::PropstatWrapper, MultistatusElement},
};
use rustical_store::{model::object::CalendarObject, CalendarStore};
@@ -88,7 +88,7 @@ pub async fn handle_calendar_multiget<C: CalendarStore + ?Sized>(
let path = format!("{}/{}", req.path(), object.get_uid());
responses.push(
CalendarObjectResource::from(object)
.propfind(prefix, &path, props.clone())
.propfind(&path, props.clone(), req.resource_map())
.await?,
);
}

View File

@@ -1,7 +1,7 @@
use actix_web::HttpRequest;
use rustical_dav::{
methods::propfind::{PropElement, PropfindType},
resource::HandlePropfind,
resource::Resource,
xml::{multistatus::PropstatWrapper, MultistatusElement},
};
use rustical_store::{model::object::CalendarObject, CalendarStore};
@@ -176,7 +176,6 @@ pub async fn get_objects_calendar_query<C: CalendarStore + ?Sized>(
pub async fn handle_calendar_query<C: CalendarStore + ?Sized>(
cal_query: CalendarQueryRequest,
req: HttpRequest,
prefix: &str,
principal: &str,
cid: &str,
cal_store: &RwLock<C>,
@@ -197,10 +196,14 @@ pub async fn handle_calendar_query<C: CalendarStore + ?Sized>(
let mut responses = Vec::new();
for object in objects {
let path = format!("{}/{}", req.path(), object.get_uid());
let path = CalendarObjectResource::get_url(
req.resource_map(),
vec![principal, cid, object.get_uid()],
)
.unwrap();
responses.push(
CalendarObjectResource::from(object)
.propfind(prefix, &path, props.clone())
.propfind(&path, props.clone(), req.resource_map())
.await?,
);
}

View File

@@ -51,22 +51,14 @@ pub async fn route_report_calendar<C: CalendarStore + ?Sized>(
Ok(match request.clone() {
ReportRequest::CalendarQuery(cal_query) => {
handle_calendar_query(cal_query, req, &prefix, &principal, &cid, &cal_store).await?
handle_calendar_query(cal_query, req, &principal, &cid, &cal_store).await?
}
ReportRequest::CalendarMultiget(cal_multiget) => {
handle_calendar_multiget(cal_multiget, req, &prefix, &principal, &cid, &cal_store)
.await?
}
ReportRequest::SyncCollection(sync_collection) => {
handle_sync_collection(
sync_collection,
req,
&prefix.0,
&principal,
&cid,
&cal_store,
)
.await?
handle_sync_collection(sync_collection, req, &principal, &cid, &cal_store).await?
}
})
}

View File

@@ -1,7 +1,7 @@
use actix_web::{http::StatusCode, HttpRequest};
use rustical_dav::{
methods::propfind::{PropElement, PropfindType},
resource::HandlePropfind,
resource::Resource,
xml::{
multistatus::{PropstatWrapper, ResponseElement},
MultistatusElement,
@@ -45,7 +45,6 @@ pub struct SyncCollectionRequest {
pub async fn handle_sync_collection<C: CalendarStore + ?Sized>(
sync_collection: SyncCollectionRequest,
req: HttpRequest,
prefix: &str,
principal: &str,
cid: &str,
cal_store: &RwLock<C>,
@@ -71,16 +70,22 @@ pub async fn handle_sync_collection<C: CalendarStore + ?Sized>(
let mut responses = Vec::new();
for object in new_objects {
let path = format!("{}/{}", req.path(), object.get_uid());
let path = CalendarObjectResource::get_url(
req.resource_map(),
vec![principal, cid, &object.get_uid()],
)
.unwrap();
responses.push(
CalendarObjectResource::from(object)
.propfind(prefix, &path, props.clone())
.propfind(&path, props.clone(), req.resource_map())
.await?,
);
}
for object_uid in deleted_objects {
let path = format!("{}/{}", req.path(), object_uid);
let path =
CalendarObjectResource::get_url(req.resource_map(), vec![principal, cid, &object_uid])
.unwrap();
responses.push(ResponseElement {
href: path,
status: Some(format!("HTTP/1.1 {}", StatusCode::NOT_FOUND)),