use std::sync::{Arc, RwLock};
use reqwest::Client;
use serde_json::to_string;
use crate::errors::ChorusResult;
use crate::gateway::Gateway;
use crate::instance::{ChorusUser, Instance};
use crate::ratelimiter::ChorusRequest;
use crate::types::{
ClientProperties, GatewayIdentifyPayload, LimitType, LoginResult, LoginSchema,
MfaAuthenticationType, SendMfaSmsResponse, SendMfaSmsSchema, Shared, User,
VerifyMFALoginResponse, VerifyMFALoginSchema,
};
impl Instance {
pub async fn login_account(
instance: Shared<Instance>,
login_schema: LoginSchema,
) -> ChorusResult<ChorusUser> {
let endpoint_url = instance.read().unwrap().urls.api.clone() + "/auth/login";
let chorus_request = ChorusRequest {
request: Client::new().post(endpoint_url).json(&login_schema),
limit_type: LimitType::AuthLogin,
}
.with_client_properties(&ClientProperties::default());
let mut user = ChorusUser::shell(instance, "None").await;
let login_result = chorus_request
.send_and_deserialize_response::<LoginResult>(&mut user)
.await?;
user.update_with_login_data(login_result.token, Some(login_result.settings))
.await?;
Ok(user)
}
pub async fn verify_mfa_login(
instance: Shared<Instance>,
authenticator: MfaAuthenticationType,
schema: VerifyMFALoginSchema,
) -> ChorusResult<ChorusUser> {
let endpoint_url =
instance.read().unwrap().urls.api.clone() + "/auth/mfa/" + &authenticator.to_string();
let chorus_request = ChorusRequest {
request: Client::new().post(endpoint_url).json(&schema),
limit_type: LimitType::AuthLogin,
}
.with_client_properties(&ClientProperties::default());
let mut user = ChorusUser::shell(instance, "None").await;
match chorus_request
.send_and_deserialize_response::<VerifyMFALoginResponse>(&mut user)
.await?
{
VerifyMFALoginResponse::Success {
token,
user_settings,
} => {
user.update_with_login_data(token, Some(user_settings))
.await?;
}
VerifyMFALoginResponse::UserSuspended {
suspended_user_token,
} => {
return Err(crate::errors::ChorusError::SuspendUser {
token: suspended_user_token,
})
}
}
Ok(user)
}
pub async fn send_mfa_sms(
&mut self,
schema: SendMfaSmsSchema,
) -> ChorusResult<SendMfaSmsResponse> {
let endpoint_url = self.urls.api.clone() + "/auth/mfa/sms/send";
let chorus_request = ChorusRequest {
request: Client::new()
.post(endpoint_url)
.header("Content-Type", "application/json")
.json(&schema),
limit_type: LimitType::Ip,
};
let send_mfa_sms_response = chorus_request
.send_anonymous_and_deserialize_response::<SendMfaSmsResponse>(self)
.await?;
Ok(send_mfa_sms_response)
}
}