2023-04-16 23:03:24 +02:00
|
|
|
pub mod register {
|
2023-04-20 00:14:11 +02:00
|
|
|
use reqwest::Client;
|
2023-04-23 11:58:45 +02:00
|
|
|
use serde_json::json;
|
2023-04-20 00:14:11 +02:00
|
|
|
|
2023-04-21 18:20:57 +02:00
|
|
|
use crate::{
|
2023-04-25 17:32:30 +02:00
|
|
|
api::{limits::LimitType, schemas::RegisterSchema, types::ErrorResponse},
|
2023-04-21 18:20:57 +02:00
|
|
|
errors::InstanceServerError,
|
2023-05-09 14:05:03 +02:00
|
|
|
instance::Instance,
|
2023-04-21 18:20:57 +02:00
|
|
|
};
|
2023-04-16 23:03:24 +02:00
|
|
|
|
2023-05-07 12:39:04 +02:00
|
|
|
impl Instance {
|
2023-04-21 18:20:57 +02:00
|
|
|
/**
|
|
|
|
Registers a new user on the Spacebar server.
|
|
|
|
# Arguments
|
|
|
|
* `register_schema` - The [`RegisterSchema`] that contains all the information that is needed to register a new user.
|
|
|
|
# Errors
|
|
|
|
* [`InstanceServerError`] - If the server does not respond.
|
|
|
|
*/
|
2023-04-23 11:58:45 +02:00
|
|
|
pub async fn register_account(
|
2023-04-21 18:20:57 +02:00
|
|
|
&mut self,
|
|
|
|
register_schema: &RegisterSchema,
|
2023-05-09 14:05:03 +02:00
|
|
|
) -> Result<crate::api::types::User, InstanceServerError> {
|
2023-04-21 14:27:56 +02:00
|
|
|
let json_schema = json!(register_schema);
|
2023-04-21 18:20:57 +02:00
|
|
|
let limited_requester = &mut self.requester;
|
2023-04-20 00:14:11 +02:00
|
|
|
let client = Client::new();
|
2023-04-21 14:27:56 +02:00
|
|
|
let endpoint_url = self.urls.get_api().to_string() + "/auth/register";
|
|
|
|
let request_builder = client.post(endpoint_url).body(json_schema.to_string());
|
2023-04-24 20:58:45 +02:00
|
|
|
// We do not have a user yet, and the UserRateLimits will not be affected by a login
|
|
|
|
// request (since register is an instance wide limit), which is why we are just cloning
|
|
|
|
// the instances' limits to pass them on as user_rate_limits later.
|
|
|
|
let mut cloned_limits = self.limits.clone();
|
2023-04-21 18:20:57 +02:00
|
|
|
let response = limited_requester
|
2023-04-24 20:58:45 +02:00
|
|
|
.send_request(
|
|
|
|
request_builder,
|
|
|
|
LimitType::AuthRegister,
|
|
|
|
&mut self.limits,
|
|
|
|
&mut cloned_limits,
|
|
|
|
)
|
2023-04-21 18:20:57 +02:00
|
|
|
.await;
|
2023-04-25 17:33:35 +02:00
|
|
|
if response.is_err() {
|
2023-04-21 18:20:57 +02:00
|
|
|
return Err(InstanceServerError::NoResponse);
|
2023-04-22 11:32:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
let response_unwrap = response.unwrap();
|
|
|
|
let status = response_unwrap.status();
|
|
|
|
let response_text_string = response_unwrap.text().await.unwrap();
|
|
|
|
if status.is_client_error() {
|
2023-04-22 22:12:56 +02:00
|
|
|
let json: ErrorResponse = serde_json::from_str(&response_text_string).unwrap();
|
|
|
|
let error_type = json.errors.errors.iter().next().unwrap().0.to_owned();
|
|
|
|
let mut error = "".to_string();
|
|
|
|
for (_, value) in json.errors.errors.iter() {
|
|
|
|
for error_item in value._errors.iter() {
|
|
|
|
error += &(error_item.message.to_string() + " (" + &error_item.code + ")");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return Err(InstanceServerError::InvalidFormBodyError { error_type, error });
|
2023-04-22 11:32:44 +02:00
|
|
|
}
|
2023-05-09 14:05:03 +02:00
|
|
|
let user_object = self
|
|
|
|
.get_user(response_text_string.clone(), None)
|
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
let settings = crate::api::types::User::get_settings(
|
|
|
|
&response_text_string,
|
|
|
|
&self.urls.get_api().to_string(),
|
|
|
|
&mut self.limits,
|
|
|
|
)
|
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
let user: crate::api::types::User = crate::api::types::User::new(
|
|
|
|
self,
|
|
|
|
response_text_string.clone(),
|
|
|
|
cloned_limits,
|
|
|
|
settings,
|
|
|
|
Some(user_object),
|
|
|
|
);
|
|
|
|
Ok(user)
|
2023-04-20 00:14:11 +02:00
|
|
|
}
|
2023-04-16 23:03:24 +02:00
|
|
|
}
|
|
|
|
}
|
2023-04-21 23:20:23 +02:00
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod test {
|
2023-04-25 17:32:30 +02:00
|
|
|
use crate::api::schemas::{AuthEmail, AuthPassword, AuthUsername, RegisterSchema};
|
2023-04-22 22:12:56 +02:00
|
|
|
use crate::errors::InstanceServerError;
|
2023-04-21 23:20:23 +02:00
|
|
|
use crate::instance::Instance;
|
|
|
|
use crate::limit::LimitedRequester;
|
|
|
|
use crate::URLBundle;
|
|
|
|
#[tokio::test]
|
2023-04-22 22:12:56 +02:00
|
|
|
async fn test_incomplete_registration() {
|
2023-04-21 23:20:23 +02:00
|
|
|
let urls = URLBundle::new(
|
|
|
|
"http://localhost:3001/api".to_string(),
|
|
|
|
"http://localhost:3001".to_string(),
|
|
|
|
"http://localhost:3001".to_string(),
|
|
|
|
);
|
2023-04-25 17:41:14 +02:00
|
|
|
let limited_requester = LimitedRequester::new().await;
|
2023-04-21 23:20:23 +02:00
|
|
|
let mut test_instance = Instance::new(urls.clone(), limited_requester)
|
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
let reg = RegisterSchema::new(
|
2023-04-23 13:45:52 +02:00
|
|
|
AuthUsername::new("hiiii".to_string()).unwrap(),
|
2023-04-21 23:20:23 +02:00
|
|
|
None,
|
|
|
|
true,
|
2023-04-23 13:45:52 +02:00
|
|
|
Some(AuthEmail::new("me@mail.xy".to_string()).unwrap()),
|
2023-04-21 23:20:23 +02:00
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
)
|
|
|
|
.unwrap();
|
2023-04-22 22:12:56 +02:00
|
|
|
assert_eq!(
|
|
|
|
InstanceServerError::InvalidFormBodyError {
|
|
|
|
error_type: "date_of_birth".to_string(),
|
|
|
|
error: "This field is required (BASE_TYPE_REQUIRED)".to_string()
|
|
|
|
},
|
2023-04-23 11:58:45 +02:00
|
|
|
test_instance.register_account(®).await.err().unwrap()
|
2023-04-22 22:12:56 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
async fn test_registration() {
|
|
|
|
let urls = URLBundle::new(
|
|
|
|
"http://localhost:3001/api".to_string(),
|
|
|
|
"http://localhost:3001".to_string(),
|
|
|
|
"http://localhost:3001".to_string(),
|
|
|
|
);
|
2023-04-25 17:41:14 +02:00
|
|
|
let limited_requester = LimitedRequester::new().await;
|
2023-04-22 22:12:56 +02:00
|
|
|
let mut test_instance = Instance::new(urls.clone(), limited_requester)
|
|
|
|
.await
|
|
|
|
.unwrap();
|
|
|
|
let reg = RegisterSchema::new(
|
2023-04-23 13:45:52 +02:00
|
|
|
AuthUsername::new("Hiiii".to_string()).unwrap(),
|
|
|
|
Some(AuthPassword::new("mysupersecurepass123!".to_string()).unwrap()),
|
2023-04-22 22:12:56 +02:00
|
|
|
true,
|
2023-05-09 14:05:03 +02:00
|
|
|
Some(AuthEmail::new("three12@aaaa.xyz".to_string()).unwrap()),
|
2023-04-22 22:12:56 +02:00
|
|
|
None,
|
|
|
|
None,
|
|
|
|
Some("2000-01-01".to_string()),
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
None,
|
|
|
|
)
|
|
|
|
.unwrap();
|
2023-04-23 11:58:45 +02:00
|
|
|
let token = test_instance.register_account(®).await.unwrap().token;
|
2023-04-22 22:12:56 +02:00
|
|
|
println!("{}", token);
|
2023-04-21 23:20:23 +02:00
|
|
|
}
|
|
|
|
}
|