Merge pull request #108 from polyphony-chat/feature/relationships
Feature/relationships
This commit is contained in:
commit
b5116c6547
|
@ -5,7 +5,7 @@ use crate::{
|
||||||
api::{deserialize_response, handle_request_as_option},
|
api::{deserialize_response, handle_request_as_option},
|
||||||
errors::ChorusLibError,
|
errors::ChorusLibError,
|
||||||
instance::UserMeta,
|
instance::UserMeta,
|
||||||
types,
|
types::{self, CreateUserRelationshipSchema, RelationshipType},
|
||||||
};
|
};
|
||||||
|
|
||||||
impl UserMeta {
|
impl UserMeta {
|
||||||
|
@ -16,11 +16,11 @@ impl UserMeta {
|
||||||
/// * `user_id` - A string slice that holds the ID of the user to retrieve the mutual relationships with.
|
/// * `user_id` - A string slice that holds the ID of the user to retrieve the mutual relationships with.
|
||||||
///
|
///
|
||||||
/// # Returns
|
/// # Returns
|
||||||
/// This function returns a [`Option<Vec<Result<PublicUser, ChorusLibError>>>`].
|
/// This function returns a [`Result<Vec<PublicUser>, ChorusLibError>`].
|
||||||
pub async fn get_mutual_relationships(
|
pub async fn get_mutual_relationships(
|
||||||
&mut self,
|
&mut self,
|
||||||
user_id: &str,
|
user_id: &str,
|
||||||
) -> Result<Option<Vec<types::PublicUser>>, ChorusLibError> {
|
) -> Result<Vec<types::PublicUser>, ChorusLibError> {
|
||||||
let belongs_to = self.belongs_to.borrow();
|
let belongs_to = self.belongs_to.borrow();
|
||||||
let url = format!(
|
let url = format!(
|
||||||
"{}/users/{}/relationships/",
|
"{}/users/{}/relationships/",
|
||||||
|
@ -29,7 +29,24 @@ impl UserMeta {
|
||||||
);
|
);
|
||||||
drop(belongs_to);
|
drop(belongs_to);
|
||||||
let request = Client::new().get(url).bearer_auth(self.token());
|
let request = Client::new().get(url).bearer_auth(self.token());
|
||||||
deserialize_response::<Option<Vec<types::PublicUser>>>(
|
deserialize_response::<Vec<types::PublicUser>>(
|
||||||
|
request,
|
||||||
|
self,
|
||||||
|
crate::api::limits::LimitType::Global,
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Retrieves the authenticated user's relationships.
|
||||||
|
///
|
||||||
|
/// # Returns
|
||||||
|
/// This function returns a [`Result<Vec<types::Relationship>, ChorusLibError>`].
|
||||||
|
pub async fn get_relationships(&mut self) -> Result<Vec<types::Relationship>, ChorusLibError> {
|
||||||
|
let belongs_to = self.belongs_to.borrow();
|
||||||
|
let url = format!("{}/users/@me/relationships/", belongs_to.urls.get_api(),);
|
||||||
|
drop(belongs_to);
|
||||||
|
let request = Client::new().get(url).bearer_auth(self.token());
|
||||||
|
deserialize_response::<Vec<types::Relationship>>(
|
||||||
request,
|
request,
|
||||||
self,
|
self,
|
||||||
crate::api::limits::LimitType::Global,
|
crate::api::limits::LimitType::Global,
|
||||||
|
@ -56,4 +73,81 @@ impl UserMeta {
|
||||||
let request = Client::new().post(url).bearer_auth(self.token()).body(body);
|
let request = Client::new().post(url).bearer_auth(self.token()).body(body);
|
||||||
handle_request_as_option(request, self, crate::api::limits::LimitType::Global).await
|
handle_request_as_option(request, self, crate::api::limits::LimitType::Global).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Modifies the relationship between the authenticated user and the specified user.
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `user_id` - A string slice that holds the ID of the user to modify the relationship with.
|
||||||
|
/// * `relationship_type` - A [`RelationshipType`] enum that specifies the type of relationship to modify.
|
||||||
|
/// * [`RelationshipType::None`]: Removes the relationship between the two users.
|
||||||
|
/// * [`RelationshipType::Friends`] | [`RelationshipType::Incoming`] | [`RelationshipType::Outgoing`]:
|
||||||
|
/// Either accepts an incoming friend request, or sends a new friend request, if there is no
|
||||||
|
/// incoming friend request from the specified `user_id`.
|
||||||
|
/// * [`RelationshipType::Blocked`]: Blocks the specified user_id.
|
||||||
|
///
|
||||||
|
/// # Returns
|
||||||
|
/// This function returns an [`Option`] that holds a [`ChorusLibError`] if the request fails.
|
||||||
|
pub async fn modify_user_relationship(
|
||||||
|
&mut self,
|
||||||
|
user_id: &str,
|
||||||
|
relationship_type: RelationshipType,
|
||||||
|
) -> Option<ChorusLibError> {
|
||||||
|
let belongs_to = self.belongs_to.borrow();
|
||||||
|
let api_url = belongs_to.urls.api.clone();
|
||||||
|
drop(belongs_to);
|
||||||
|
match relationship_type {
|
||||||
|
RelationshipType::None => {
|
||||||
|
let request = Client::new()
|
||||||
|
.delete(format!("{}/users/@me/relationships/{}/", api_url, user_id))
|
||||||
|
.bearer_auth(self.token());
|
||||||
|
handle_request_as_option(request, self, crate::api::limits::LimitType::Global).await
|
||||||
|
}
|
||||||
|
RelationshipType::Friends | RelationshipType::Incoming | RelationshipType::Outgoing => {
|
||||||
|
let body = CreateUserRelationshipSchema {
|
||||||
|
relationship_type: None, // Selecting 'None' here will accept an incoming FR or send a new FR.
|
||||||
|
from_friend_suggestion: None,
|
||||||
|
friend_token: None,
|
||||||
|
};
|
||||||
|
let request = Client::new()
|
||||||
|
.put(format!("{}/users/@me/relationships/{}/", api_url, user_id))
|
||||||
|
.bearer_auth(self.token())
|
||||||
|
.body(to_string(&body).unwrap());
|
||||||
|
handle_request_as_option(request, self, crate::api::limits::LimitType::Global).await
|
||||||
|
}
|
||||||
|
RelationshipType::Blocked => {
|
||||||
|
let body = CreateUserRelationshipSchema {
|
||||||
|
relationship_type: Some(RelationshipType::Blocked),
|
||||||
|
from_friend_suggestion: None,
|
||||||
|
friend_token: None,
|
||||||
|
};
|
||||||
|
let request = Client::new()
|
||||||
|
.put(format!("{}/users/@me/relationships/{}/", api_url, user_id))
|
||||||
|
.bearer_auth(self.token())
|
||||||
|
.body(to_string(&body).unwrap());
|
||||||
|
handle_request_as_option(request, self, crate::api::limits::LimitType::Global).await
|
||||||
|
}
|
||||||
|
RelationshipType::Suggestion | RelationshipType::Implicit => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Removes the relationship between the authenticated user and the specified user.
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * `user_id` - A string slice that holds the ID of the user to remove the relationship with.
|
||||||
|
///
|
||||||
|
/// # Returns
|
||||||
|
/// This function returns an [`Option`] that holds a [`ChorusLibError`] if the request fails.
|
||||||
|
pub async fn remove_relationship(&mut self, user_id: &str) -> Option<ChorusLibError> {
|
||||||
|
let belongs_to = self.belongs_to.borrow();
|
||||||
|
let url = format!(
|
||||||
|
"{}/users/@me/relationships/{}/",
|
||||||
|
belongs_to.urls.get_api(),
|
||||||
|
user_id
|
||||||
|
);
|
||||||
|
drop(belongs_to);
|
||||||
|
let request = Client::new().post(url).bearer_auth(self.token());
|
||||||
|
handle_request_as_option(request, self, crate::api::limits::LimitType::Global).await
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,13 +18,14 @@ custom_error! {
|
||||||
CantGetInfoError{error:String} = "Something seems to be wrong with the instance. Cannot get information about the instance: {error}",
|
CantGetInfoError{error:String} = "Something seems to be wrong with the instance. Cannot get information about the instance: {error}",
|
||||||
InvalidFormBodyError{error_type: String, error:String} = "The server responded with: {error_type}: {error}",
|
InvalidFormBodyError{error_type: String, error:String} = "The server responded with: {error_type}: {error}",
|
||||||
RateLimited{bucket:String} = "Ratelimited on Bucket {bucket}",
|
RateLimited{bucket:String} = "Ratelimited on Bucket {bucket}",
|
||||||
MultipartCreationError{error: String} = "Got an error whilst creating the form: {}",
|
MultipartCreationError{error: String} = "Got an error whilst creating the form: {error}",
|
||||||
FormCreationError{error: String} = "Got an error whilst creating the form: {}",
|
FormCreationError{error: String} = "Got an error whilst creating the form: {error}",
|
||||||
TokenExpired = "Token expired, invalid or not found.",
|
TokenExpired = "Token expired, invalid or not found.",
|
||||||
NoPermission = "You do not have the permissions needed to perform this action.",
|
NoPermission = "You do not have the permissions needed to perform this action.",
|
||||||
NotFound{error: String} = "The provided resource hasn't been found: {}",
|
NotFound{error: String} = "The provided resource hasn't been found: {error}",
|
||||||
PasswordRequiredError = "You need to provide your current password to authenticate for this action.",
|
PasswordRequiredError = "You need to provide your current password to authenticate for this action.",
|
||||||
InvalidResponseError{error: String} = "The response is malformed and cannot be processed. Error: {}",
|
InvalidResponseError{error: String} = "The response is malformed and cannot be processed. Error: {error}",
|
||||||
|
InvalidArgumentsError{error: String} = "Invalid arguments were provided. Error: {error}"
|
||||||
}
|
}
|
||||||
|
|
||||||
custom_error! {
|
custom_error! {
|
||||||
|
|
|
@ -30,9 +30,3 @@ pub enum RelationshipType {
|
||||||
Friends = 1,
|
Friends = 1,
|
||||||
None = 0,
|
None = 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug)]
|
|
||||||
pub struct FriendRequestSendSchema {
|
|
||||||
pub username: String,
|
|
||||||
pub discriminator: Option<String>,
|
|
||||||
}
|
|
||||||
|
|
|
@ -1 +1,25 @@
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use crate::types::RelationshipType;
|
||||||
|
|
||||||
|
#[derive(Deserialize, Serialize, Debug, Clone)]
|
||||||
|
pub struct FriendRequestSendSchema {
|
||||||
|
pub username: String,
|
||||||
|
pub discriminator: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Represents the schema for the Create User Relationship route.
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// * relationship_type: The [`RelationshipType`] to create (defaults to -1, which accepts an existing or creates a new friend request)
|
||||||
|
/// * from_friend_suggestion: Whether the relationship was created from a friend suggestion (default false)
|
||||||
|
/// * friend_token: The friend token of the user to add a direct friend relationship to
|
||||||
|
///
|
||||||
|
/// See: [https://discord-userdoccers.vercel.app/resources/user#create-user-relationship](https://discord-userdoccers.vercel.app/resources/user#create-user-relationship)
|
||||||
|
#[derive(Deserialize, Serialize, Debug, Clone)]
|
||||||
|
pub struct CreateUserRelationshipSchema {
|
||||||
|
#[serde(rename = "type")]
|
||||||
|
pub relationship_type: Option<RelationshipType>,
|
||||||
|
pub from_friend_suggestion: Option<bool>,
|
||||||
|
pub friend_token: Option<String>,
|
||||||
|
}
|
||||||
|
|
|
@ -18,13 +18,49 @@ async fn test_get_mutual_relationships() {
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let bundle = common::setup().await;
|
let mut bundle = common::setup().await;
|
||||||
let mut belongs_to = bundle.instance;
|
let belongs_to = &mut bundle.instance;
|
||||||
let mut user = bundle.user;
|
let user = &mut bundle.user;
|
||||||
let other_user = belongs_to.register_account(®ister_schema).await.unwrap();
|
let mut other_user = belongs_to.register_account(®ister_schema).await.unwrap();
|
||||||
|
let friend_request_schema = types::FriendRequestSendSchema {
|
||||||
|
username: user.object.username.clone(),
|
||||||
|
discriminator: Some(user.object.discriminator.clone()),
|
||||||
|
};
|
||||||
|
other_user.send_friend_request(friend_request_schema).await;
|
||||||
let relationships = user
|
let relationships = user
|
||||||
.get_mutual_relationships(&other_user.object.id.to_string())
|
.get_mutual_relationships(&other_user.object.id.to_string())
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
println!("{:?}", relationships.unwrap());
|
println!("{:?}", relationships);
|
||||||
|
common::teardown(bundle).await
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn test_get_relationships() {
|
||||||
|
let register_schema = types::RegisterSchema::new(
|
||||||
|
"integrationtestuser2".to_string(),
|
||||||
|
None,
|
||||||
|
true,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
Some("2000-01-01".to_string()),
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let mut bundle = common::setup().await;
|
||||||
|
let belongs_to = &mut bundle.instance;
|
||||||
|
let user = &mut bundle.user;
|
||||||
|
let mut other_user = belongs_to.register_account(®ister_schema).await.unwrap();
|
||||||
|
let friend_request_schema = types::FriendRequestSendSchema {
|
||||||
|
username: user.object.username.clone(),
|
||||||
|
discriminator: Some(user.object.discriminator.clone()),
|
||||||
|
};
|
||||||
|
other_user.send_friend_request(friend_request_schema).await;
|
||||||
|
let relationships = user.get_relationships().await.unwrap();
|
||||||
|
println!("{:?}", relationships);
|
||||||
|
common::teardown(bundle).await
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue