diff --git a/src/api/admin.rs b/src/api/admin.rs index badfaa3a..351e0fda 100644 --- a/src/api/admin.rs +++ b/src/api/admin.rs @@ -347,56 +347,47 @@ fn logout(cookies: &CookieJar<'_>) -> Redirect { Redirect::to(admin_path()) } -#[get("/users")] -async fn get_users_json(_token: AdminToken, conn: DbConn) -> Json { - let users = User::get_all(&conn).await; +async fn enrich_users_json(users: Vec<(User, Option)>, conn: &DbConn) -> Vec { let mut users_json = Vec::with_capacity(users.len()); - for (u, _) in users { - let mut usr = u.to_json(&conn).await; + for (u, sso_u) in users { + let mut usr = u.to_json(conn).await; + usr["cipherCount"] = json!(Cipher::count_owned_by_user(&u.uuid, conn).await); + usr["attachmentCount"] = json!(Attachment::count_by_user(&u.uuid, conn).await); + usr["attachmentSize"] = json!(get_display_size(Attachment::size_by_user(&u.uuid, conn).await)); usr["userEnabled"] = json!(u.enabled); usr["createdAt"] = json!(format_naive_datetime_local(&u.created_at, DT_FMT)); - usr["lastActive"] = match u.last_active(&conn).await { + usr["lastActive"] = match u.last_active(conn).await { Some(dt) => json!(format_naive_datetime_local(&dt, DT_FMT)), None => json!(None::), }; + + usr["ssoIdentifier"] = json!(sso_u.map(|u| u.identifier.to_string()).unwrap_or(String::new())); + users_json.push(usr); } + users_json +} +#[get("/users")] +async fn get_users_json(_token: AdminToken, conn: DbConn) -> Json { + let users = User::get_all(&conn).await; + let users_json = enrich_users_json(users, &conn).await; Json(Value::Array(users_json)) } #[get("/users/overview")] async fn users_overview(_token: AdminToken, conn: DbConn) -> ApiResult> { let users = User::get_all(&conn).await; - let mut users_json = Vec::with_capacity(users.len()); - for (u, sso_u) in users { - let mut usr = u.to_json(&conn).await; - usr["cipher_count"] = json!(Cipher::count_owned_by_user(&u.uuid, &conn).await); - usr["attachment_count"] = json!(Attachment::count_by_user(&u.uuid, &conn).await); - usr["attachment_size"] = json!(get_display_size(Attachment::size_by_user(&u.uuid, &conn).await)); - usr["user_enabled"] = json!(u.enabled); - usr["created_at"] = json!(format_naive_datetime_local(&u.created_at, DT_FMT)); - usr["last_active"] = match u.last_active(&conn).await { - Some(dt) => json!(format_naive_datetime_local(&dt, DT_FMT)), - None => json!("Never"), - }; - - usr["sso_identifier"] = json!(sso_u.map(|u| u.identifier.to_string()).unwrap_or(String::new())); - - users_json.push(usr); - } - + let users_json = enrich_users_json(users, &conn).await; let text = AdminTemplateData::new("admin/users", json!(users_json)).render()?; Ok(Html(text)) } #[get("/users/by-mail/")] async fn get_user_by_mail_json(mail: &str, _token: AdminToken, conn: DbConn) -> JsonResult { - if let Some(u) = User::find_by_mail(mail, &conn).await { - let mut usr = u.to_json(&conn).await; - usr["userEnabled"] = json!(u.enabled); - usr["createdAt"] = json!(format_naive_datetime_local(&u.created_at, DT_FMT)); - Ok(Json(usr)) + if let Some((u, sso)) = SsoUser::find_by_mail(mail, &conn).await { + let user_json = enrich_users_json(vec![(u, sso)], &conn).await[0].clone(); + Ok(Json(user_json)) } else { err_code!("User doesn't exist", Status::NotFound.code); } @@ -404,11 +395,11 @@ async fn get_user_by_mail_json(mail: &str, _token: AdminToken, conn: DbConn) -> #[get("/users/")] async fn get_user_json(user_id: UserId, _token: AdminToken, conn: DbConn) -> JsonResult { - let u = get_user_or_404(&user_id, &conn).await?; - let mut usr = u.to_json(&conn).await; - usr["userEnabled"] = json!(u.enabled); - usr["createdAt"] = json!(format_naive_datetime_local(&u.created_at, DT_FMT)); - Ok(Json(usr)) + let user = get_user_or_404(&user_id, &conn).await?; + let sso_user = SsoUser::find_by_uuid(&user_id, &conn).await; + let user_json = enrich_users_json(vec![(user, sso_user)], &conn).await[0].clone(); + + Ok(Json(user_json)) } #[post("/users//delete", format = "application/json")] diff --git a/src/db/models/user.rs b/src/db/models/user.rs index e88c7296..a480ad73 100644 --- a/src/db/models/user.rs +++ b/src/db/models/user.rs @@ -550,6 +550,15 @@ impl SsoUser { }} } + pub async fn find_by_uuid(uuid: &UserId, conn: &DbConn) -> Option { + db_run! { conn: { + sso_users::table + .filter(sso_users::user_uuid.eq(uuid)) + .first::(conn) + .ok() + }} + } + pub async fn delete(user_uuid: &UserId, conn: &DbConn) -> EmptyResult { db_run! { conn: { diesel::delete(sso_users::table.filter(sso_users::user_uuid.eq(user_uuid))) diff --git a/src/static/templates/admin/users.hbs b/src/static/templates/admin/users.hbs index 73f0cbc8..336b965a 100644 --- a/src/static/templates/admin/users.hbs +++ b/src/static/templates/admin/users.hbs @@ -26,7 +26,7 @@ {{name}} {{email}} - {{#unless user_enabled}} + {{#unless userEnabled}} Disabled {{/unless}} {{#if twoFactorEnabled}} @@ -43,22 +43,28 @@ {{#if ../sso_enabled}} - {{sso_identifier}} + {{ssoIdentifier}} {{/if}} - {{created_at}} + {{createdAt}} - {{last_active}} + + {{#if lastActive}} + {{lastActive}} + {{else}} + Never + {{/if}} + - {{cipher_count}} + {{cipherCount}} - Amount: {{attachment_count}} + Amount: {{attachmentCount}} {{#if attachment_count}} - Size: {{attachment_size}} + Size: {{attachmentSize}} {{/if}} @@ -78,7 +84,7 @@ {{#if ../sso_enabled}}
{{/if}} - {{#if user_enabled}} + {{#if userEnabled}}
{{else}}