use super::*;
#[derive(Deserialize, AsChangeset)]
#[diesel(table_name = schema::user)]
pub struct Request {
pub email: Option<String>,
pub password: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "::serde_with::rust::double_option"
)]
pub first_name: Option<Option<String>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "::serde_with::rust::double_option"
)]
pub last_name: Option<Option<String>>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
with = "::serde_with::rust::double_option"
)]
pub birthday: Option<Option<time::Date>>,
}
#[put("")]
pub async fn route(
db: web::Data<Database>,
info: web::Path<Info>,
req: web::Json<Request>,
) -> impl Responder {
let mut req = req.into_inner();
if !valid(&req) {
return Err(ErrorCode::BadRequest);
}
if let Some(password) = req.password {
let hashed_password = hashing::generate(&password);
req.password = Some(hashed_password);
}
let response: Result<usize, diesel::result::Error> = web::block(move || {
use diesel::dsl::*;
use schema::user::dsl::*;
let mut conn = db.get_conn();
conn.transaction(|conn| {
update(user.filter(id.eq(info.user_id)))
.set(req)
.execute(conn)
})
})
.await
.unwrap();
match response {
Err(_) => Err(ErrorCode::Conflict),
Ok(_) => Ok(HttpResponse::Ok()),
}
}
fn valid(req: &Request) -> bool {
if req.email.is_some() {
if !user_client::validate::email(req.email.as_ref().unwrap()) {
return false;
}
}
if req.password.is_some() {
if !user_client::validate::password(req.password.as_ref().unwrap()) {
return false;
}
}
if req.first_name.is_some() {
if req.first_name.as_ref().unwrap().is_some() {
if !user_client::validate::first_name(
req.first_name.as_ref().unwrap().as_ref().unwrap(),
) {
return false;
}
}
}
if req.last_name.is_some() {
if req.last_name.as_ref().unwrap().is_some() {
if !user_client::validate::last_name(req.last_name.as_ref().unwrap().as_ref().unwrap())
{
return false;
}
}
}
if req.birthday.is_some() {
if req.birthday.unwrap().is_some() {
if !user_client::validate::birthday(&req.birthday.unwrap().unwrap()) {
return false;
}
}
}
true
}