chorus/src/api/auth/register.rs

127 lines
4.6 KiB
Rust
Raw Normal View History

2023-04-16 23:03:24 +02:00
pub mod register {
2023-04-20 00:14:11 +02:00
use reqwest::Client;
use serde_json::json;
2023-04-20 00:14:11 +02:00
2023-04-21 18:20:57 +02:00
use crate::{
2023-04-22 11:32:44 +02:00
api::{
limits::LimitType,
2023-04-22 22:12:56 +02:00
schemas::schemas::{ErrorResponse, RegisterSchema},
2023-04-22 11:32:44 +02:00
},
2023-04-21 18:20:57 +02:00
errors::InstanceServerError,
instance::{Instance, Token},
};
2023-04-16 23:03:24 +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.
*/
pub async fn register_account(
2023-04-21 18:20:57 +02:00
&mut self,
register_schema: &RegisterSchema,
) -> Result<Token, 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-21 18:20:57 +02:00
let response = limited_requester
.send_request(request_builder, LimitType::AuthRegister)
.await;
if response.is_none() {
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
}
return Ok(Token {
token: response_text_string,
});
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-23 13:45:52 +02:00
use crate::api::schemas::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(),
);
let limited_requester = LimitedRequester::new(urls.get_api().to_string()).await;
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()
},
test_instance.register_account(&reg).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(),
);
let limited_requester = LimitedRequester::new(urls.get_api().to_string()).await;
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-04-23 13:45:52 +02:00
Some(AuthEmail::new("flori@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();
let token = test_instance.register_account(&reg).await.unwrap().token;
2023-04-22 22:12:56 +02:00
println!("{}", token);
2023-04-21 23:20:23 +02:00
}
}