Implemented add_item for remote calendars

This commit is contained in:
daladim 2021-04-13 23:33:38 +02:00
parent e39cdc7cd5
commit e24fab2ccb

View file

@ -3,7 +3,7 @@ use std::error::Error;
use std::sync::Mutex; use std::sync::Mutex;
use async_trait::async_trait; use async_trait::async_trait;
use reqwest::header::CONTENT_TYPE; use reqwest::{header::CONTENT_TYPE, header::CONTENT_LENGTH};
use crate::traits::BaseCalendar; use crate::traits::BaseCalendar;
use crate::traits::DavCalendar; use crate::traits::DavCalendar;
@ -49,8 +49,28 @@ impl BaseCalendar for RemoteCalendar {
} }
/// Add an item into this calendar /// Add an item into this calendar
async fn add_item(&mut self, _item: Item) -> Result<SyncStatus, Box<dyn Error>> { async fn add_item(&mut self, item: Item) -> Result<SyncStatus, Box<dyn Error>> {
todo!() let ical_text = crate::ical::build_from(&item)?;
let request = reqwest::Client::new()
.put(item.id().as_url().clone())
.header("If-None-Match", "*")
.header(CONTENT_TYPE, "text/calendar")
.header(CONTENT_LENGTH, ical_text.len())
.basic_auth(self.resource.username(), Some(self.resource.password()))
.body(ical_text)
.send()
.await?;
let reply_hdrs = request.headers();
match reply_hdrs.get("ETag") {
None => Err(format!("No ETag in these response headers: {:?} (request was {:?})", reply_hdrs, item.id()).into()),
Some(etag) => {
let vtag_str = etag.to_str()?;
let vtag = VersionTag::from(String::from(vtag_str));
Ok(SyncStatus::Synced(vtag))
}
}
} }
} }