use reqwest::Method;
use serde::de::DeserializeOwned;
use serde::Serialize;
use crate::users::User;
use crate::{Auth0Client, Auth0Result};
#[derive(Serialize)]
pub struct UserUpdate<'a, A, U> {
#[serde(skip_serializing)]
client: &'a Auth0Client,
#[serde(skip_serializing)]
user_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
blocked: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
email_verified: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
phone_number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
phone_verified: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
given_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
family_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
nickname: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
picture: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
password: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
connection: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
client_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
verify_email: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
verify_phone_number: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
app_metadata: Option<A>,
#[serde(skip_serializing_if = "Option::is_none")]
user_metadata: Option<U>,
}
impl<'a> UserUpdate<'a, (), ()> {
pub fn new<S: AsRef<str>>(client: &'a Auth0Client, id: S) -> Self {
Self {
client,
user_id: id.as_ref().to_string(),
blocked: None,
email: None,
email_verified: None,
phone_number: None,
phone_verified: None,
given_name: None,
family_name: None,
name: None,
nickname: None,
picture: None,
verify_email: None,
verify_phone_number: None,
password: None,
connection: None,
client_id: None,
app_metadata: None,
user_metadata: None,
}
}
}
impl<'a, A: Clone, U: Clone> UserUpdate<'a, A, U> {
pub fn user_id(&mut self, id: &str) -> &mut Self {
self.user_id = id.to_owned();
self
}
pub fn blocked(&mut self, blocked: bool) -> &mut Self {
self.blocked = Some(blocked);
self
}
pub fn email(&mut self, email: &str) -> &mut Self {
self.email = Some(email.to_owned());
self
}
pub fn email_verified(&mut self, email_verified: bool) -> &mut Self {
self.email_verified = Some(email_verified);
self
}
pub fn phone_number(&mut self, phone_number: &str) -> &mut Self {
self.phone_number = Some(phone_number.to_owned());
self
}
pub fn phone_verified(&mut self, phone_verified: bool) -> &mut Self {
self.phone_verified = Some(phone_verified);
self
}
pub fn given_name(&mut self, given_name: &str) -> &mut Self {
self.given_name = Some(given_name.to_owned());
self
}
pub fn family_name(&mut self, family_name: &str) -> &mut Self {
self.family_name = Some(family_name.to_owned());
self
}
pub fn name(&mut self, name: &str) -> &mut Self {
self.name = Some(name.to_owned());
self
}
pub fn nickname(&mut self, nickname: &str) -> &mut Self {
self.nickname = Some(nickname.to_owned());
self
}
pub fn picture(&mut self, picture: &str) -> &mut Self {
self.picture = Some(picture.to_owned());
self
}
pub fn verify_email(&mut self, verify_email: bool) -> &mut Self {
self.verify_email = Some(verify_email);
self
}
pub fn verify_phone_number(&mut self, verify_phone_number: bool) -> &mut Self {
self.verify_phone_number = Some(verify_phone_number);
self
}
pub fn password(&mut self, password: &str) -> &mut Self {
self.password = Some(password.to_owned());
self
}
pub fn connection(&mut self, connection: &str) -> &mut Self {
self.connection = Some(connection.to_owned());
self
}
pub fn client_id(&mut self, client_id: &str) -> &mut Self {
self.client_id = Some(client_id.to_owned());
self
}
pub fn app_metadata<AppMetadata>(
&self,
app_metadata: AppMetadata,
) -> UserUpdate<'a, AppMetadata, U> {
UserUpdate {
client: self.client,
user_id: self.user_id.clone(),
blocked: self.blocked,
email: self.email.clone(),
email_verified: self.email_verified,
phone_number: self.phone_number.clone(),
phone_verified: self.phone_verified,
given_name: self.given_name.clone(),
family_name: self.family_name.clone(),
name: self.name.clone(),
nickname: self.nickname.clone(),
picture: self.picture.clone(),
password: self.password.clone(),
connection: self.connection.clone(),
client_id: self.client_id.clone(),
verify_email: self.verify_email,
verify_phone_number: self.verify_phone_number,
app_metadata: Some(app_metadata),
user_metadata: self.user_metadata.clone(),
}
}
pub fn user_metadata<UserMetadata>(
&mut self,
user_metadata: UserMetadata,
) -> UserUpdate<'a, A, UserMetadata> {
UserUpdate {
client: self.client,
user_id: self.user_id.clone(),
blocked: self.blocked,
email: self.email.clone(),
email_verified: self.email_verified,
phone_number: self.phone_number.clone(),
phone_verified: self.phone_verified,
given_name: self.given_name.clone(),
family_name: self.family_name.clone(),
name: self.name.clone(),
nickname: self.nickname.clone(),
picture: self.picture.clone(),
password: self.password.clone(),
connection: self.connection.clone(),
client_id: self.client_id.clone(),
verify_email: self.verify_email,
verify_phone_number: self.verify_phone_number,
app_metadata: self.app_metadata.clone(),
user_metadata: Some(user_metadata),
}
}
}
impl<'a, AIn, UIn> UserUpdate<'a, AIn, UIn> {
pub async fn send<AOut, UOut>(&self) -> Auth0Result<User<AOut, UOut>>
where
AIn: Serialize,
UIn: Serialize,
AOut: DeserializeOwned,
UOut: DeserializeOwned,
{
self
.client
.send(
self
.client
.begin(Method::PATCH, &format!("api/v2/users/{}", self.user_id))
.json(self),
)
.await
}
}