use nextcloud_ocs::{OcsClient, OcsFormat, Query};
use nextcloud_sdk_core::{ApiPath, AuthProvider, Error, Transport};
use crate::capabilities::Capabilities;
use crate::user::User;
#[derive(Clone, Copy, Debug)]
pub struct UserClient<'a, T: Transport, A: AuthProvider> {
ocs: &'a OcsClient<T, A>,
}
impl<'a, T: Transport, A: AuthProvider> UserClient<'a, T, A> {
pub const fn new(ocs: &'a OcsClient<T, A>) -> Self {
Self { ocs }
}
pub const fn ocs(&self) -> &'a OcsClient<T, A> {
self.ocs
}
pub async fn capabilities(&self) -> Result<Capabilities, Error> {
tracing::debug!("Fetching Nextcloud server capabilities");
let path = ApiPath::ocs("cloud/capabilities")?;
self.ocs
.get(path, Query::new().format(OcsFormat::Json))
.await
}
pub async fn current_user(&self) -> Result<User, Error> {
tracing::debug!("Fetching current authenticated user metadata");
let path = ApiPath::ocs("cloud/user")?;
self.ocs
.get(path, Query::new().format(OcsFormat::Json))
.await
}
pub async fn get_user(&self, user_id: &str) -> Result<User, Error> {
tracing::debug!(user_id, "Fetching user profile metadata");
let path = ApiPath::ocs(format!("cloud/users/{user_id}"))?;
self.ocs
.get(path, Query::new().format(OcsFormat::Json))
.await
}
}
impl<T: Transport, A: AuthProvider> std::fmt::Display for UserClient<'_, T, A> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str("UserClient")
}
}