Files
rustical/crates/carddav/src/address_object/resource.rs
2025-06-19 20:59:59 +02:00

87 lines
2.5 KiB
Rust

use crate::{
Error,
address_object::{
AddressObjectProp, AddressObjectPropName, AddressObjectPropWrapper,
AddressObjectPropWrapperName,
},
};
use derive_more::derive::{From, Into};
use rustical_dav::{
extensions::CommonPropertiesExtension,
privileges::UserPrivilegeSet,
resource::{PrincipalUri, Resource, ResourceName},
xml::Resourcetype,
};
use rustical_ical::AddressObject;
use rustical_store::auth::Principal;
#[derive(Clone, From, Into)]
pub struct AddressObjectResource {
pub object: AddressObject,
pub principal: String,
}
impl ResourceName for AddressObjectResource {
fn get_name(&self) -> String {
format!("{}.vcf", self.object.get_id())
}
}
impl Resource for AddressObjectResource {
type Prop = AddressObjectPropWrapper;
type Error = Error;
type Principal = Principal;
fn is_collection(&self) -> bool {
false
}
fn get_resourcetype(&self) -> Resourcetype {
Resourcetype(&[])
}
fn get_prop(
&self,
puri: &impl PrincipalUri,
user: &Principal,
prop: &AddressObjectPropWrapperName,
) -> Result<Self::Prop, Self::Error> {
Ok(match prop {
AddressObjectPropWrapperName::AddressObject(prop) => {
AddressObjectPropWrapper::AddressObject(match prop {
AddressObjectPropName::Getetag => {
AddressObjectProp::Getetag(self.object.get_etag())
}
AddressObjectPropName::AddressData => {
AddressObjectProp::AddressData(self.object.get_vcf().to_owned())
}
AddressObjectPropName::Getcontenttype => {
AddressObjectProp::Getcontenttype("text/vcard;charset=utf-8")
}
})
}
AddressObjectPropWrapperName::Common(prop) => AddressObjectPropWrapper::Common(
CommonPropertiesExtension::get_prop(self, puri, user, prop)?,
),
})
}
fn get_displayname(&self) -> Option<&str> {
self.object.get_full_name()
}
fn get_owner(&self) -> Option<&str> {
Some(&self.principal)
}
fn get_etag(&self) -> Option<String> {
Some(self.object.get_etag())
}
fn get_user_privileges(&self, user: &Principal) -> Result<UserPrivilegeSet, Self::Error> {
Ok(UserPrivilegeSet::owner_only(
user.is_principal(&self.principal),
))
}
}