use crate::{
client::client::Client,
model::groups::{
Group, GroupAddUserRequest, GroupAddUserResponse, GroupCreateRequest, GroupDeleteResponse,
GroupRemoveUserRequest, GroupRemoveUserResponse, GroupRestoreResponse, GroupUser,
GroupWrapper, GroupsWrapper,
},
};
#[derive(Debug)]
pub struct GroupsSvc<'c> {
client: &'c Client,
}
impl<'c> GroupsSvc<'c> {
pub fn new(client: &'c Client) -> Self {
Self { client }
}
pub async fn list_groups(&self) -> Result<Vec<Group>, anyhow::Error> {
let url = self.client.base_url.join("get_groups")?;
let response: GroupsWrapper = self.client.get(url).await?;
Ok(response.groups)
}
pub async fn get_group(&self, id: i64) -> Result<Group, anyhow::Error> {
let url = self.client.base_url.join(&format!("get_group/{}", id))?;
let response: GroupWrapper = self.client.get(url).await?;
Ok(response.group)
}
pub async fn create_group(&self, request: GroupCreateRequest) -> Result<Group, anyhow::Error> {
let url = self.client.base_url.join("create_group")?;
let response: GroupWrapper = self.client.post(url, &request).await?;
Ok(response.group)
}
pub async fn delete_group(&self, id: i64) -> Result<GroupDeleteResponse, anyhow::Error> {
let url = self.client.base_url.join(&format!("delete_group/{}", id))?;
let response: GroupDeleteResponse = self.client.post_no_body(url).await?;
Ok(response)
}
pub async fn restore_group(&self, id: i64) -> Result<GroupRestoreResponse, anyhow::Error> {
let url = self
.client
.base_url
.join(&format!("undelete_group/{}", id))?;
let response: GroupRestoreResponse = self.client.post_no_body(url).await?;
Ok(response)
}
pub async fn add_user_to_group(
&self,
group_id: i64,
user: GroupUser,
) -> Result<GroupAddUserResponse, anyhow::Error> {
let url = self.client.base_url.join("add_user_to_group")?;
let request = GroupAddUserRequest {
group_id,
user_id: user.user_id,
first_name: user.first_name,
last_name: user.last_name,
email: user.email,
};
let response: GroupAddUserResponse = self.client.post(url, &request).await?;
Ok(response)
}
pub async fn remove_user_from_group(
&self,
group_id: i64,
user_id: i64,
) -> Result<GroupRemoveUserResponse, anyhow::Error> {
let url = self.client.base_url.join("remove_user_from_group")?;
let request = GroupRemoveUserRequest { user_id, group_id };
let response: GroupRemoveUserResponse = self.client.post(url, &request).await?;
Ok(response)
}
}
#[cfg(test)]
mod integration_tests {
use log::debug;
use test_log::test;
use super::*;
#[test(tokio::test)]
async fn list_get_group_works() {
let client = Client::default();
let list = client.groups().list_groups().await.unwrap();
debug!("list: {:?}", list);
let id = list.first().unwrap().id.unwrap();
let get = client.groups().get_group(id).await.unwrap();
debug!("get: {:?}", get);
assert_eq!(id, get.id.unwrap());
}
#[test(tokio::test)]
async fn create_delete_restore_group_works() {
let client = Client::default();
let name = "fake-group-1".to_string();
let create = client
.groups()
.create_group(GroupCreateRequest {
name: name.clone(),
group_type: Some("apartment".to_string()),
simplify_by_default: Some(true),
users: None,
})
.await
.unwrap();
debug!("create: {:?}", create);
assert_eq!(create.name.unwrap(), name);
let id = create.id.unwrap();
let delete = client.groups().delete_group(id).await.unwrap();
debug!("delete: {:?}", delete);
assert!(delete.success);
let restore = client.groups().restore_group(id).await.unwrap();
debug!("restore: {:?}", restore);
assert!(restore.success);
let delete = client.groups().delete_group(id).await.unwrap();
debug!("delete: {:?}", delete);
assert!(delete.success);
}
}