user-service 0.4.1

A user management microservice.
Documentation
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
}