From 863bc90c6f353707f1005e47a6611119c3036bf0 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Tue, 9 Sep 2025 02:28:00 +0200 Subject: [PATCH] feat: add endpoint to retrieve a public list of all users --- thoughts-backend/api/src/routers/user.rs | 20 +++++++++++++++++- thoughts-backend/app/src/persistence/user.rs | 7 +++++++ thoughts-backend/tests/api/user.rs | 22 ++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/thoughts-backend/api/src/routers/user.rs b/thoughts-backend/api/src/routers/user.rs index 0cf9e44..58ef599 100644 --- a/thoughts-backend/api/src/routers/user.rs +++ b/thoughts-backend/api/src/routers/user.rs @@ -11,7 +11,9 @@ use serde_json::{json, Value}; use app::persistence::{ follow, thought::get_thoughts_by_user, - user::{get_followers, get_following, get_user, search_users, update_user_profile}, + user::{ + get_all_users, get_followers, get_following, get_user, search_users, update_user_profile, + }, }; use app::state::AppState; use app::{error::UserError, persistence::user::get_user_by_username}; @@ -413,9 +415,25 @@ async fn get_user_followers( Ok(Json(UserListSchema::from(followers_list))) } +#[utoipa::path( + get, + path = "/all", + responses( + (status = 200, description = "A public list of all users", body = UserListSchema) + ), + tag = "user" +)] +async fn get_all_users_public( + State(state): State, +) -> Result { + let users = get_all_users(&state.conn).await?; + Ok(Json(UserListSchema::from(users))) +} + pub fn create_user_router() -> Router { Router::new() .route("/", get(users_get)) + .route("/all", get(get_all_users_public)) .route("/me", get(get_me).put(update_me)) .nest("/me/api-keys", create_api_key_router()) .route("/{param}", get(get_user_by_param)) diff --git a/thoughts-backend/app/src/persistence/user.rs b/thoughts-backend/app/src/persistence/user.rs index 80a36b7..0bc678f 100644 --- a/thoughts-backend/app/src/persistence/user.rs +++ b/thoughts-backend/app/src/persistence/user.rs @@ -165,3 +165,10 @@ pub async fn get_followers(db: &DbConn, user_id: Uuid) -> Result Result, DbErr> { + user::Entity::find() + .order_by_desc(user::Column::CreatedAt) + .all(db) + .await +} diff --git a/thoughts-backend/tests/api/user.rs b/thoughts-backend/tests/api/user.rs index 66ae055..db94bf8 100644 --- a/thoughts-backend/tests/api/user.rs +++ b/thoughts-backend/tests/api/user.rs @@ -245,3 +245,25 @@ async fn test_update_me_css_and_images() { assert_eq!(v["headerUrl"], "https://example.com/new-header.jpg"); assert_eq!(v["customCss"], "body { color: blue; }"); } + +#[tokio::test] +async fn test_get_all_users_public() { + let app = setup().await; + + create_user_with_password(&app.db, "userA", "password123", "a@example.com").await; + create_user_with_password(&app.db, "userB", "password123", "b@example.com").await; + create_user_with_password(&app.db, "userC", "password123", "c@example.com").await; + + let response = make_get_request(app.router.clone(), "/users/all", None).await; + assert_eq!(response.status(), StatusCode::OK); + + let body = response.into_body().collect().await.unwrap().to_bytes(); + let v: Value = serde_json::from_slice(&body).unwrap(); + let users_list = v["users"].as_array().unwrap(); + + assert_eq!( + users_list.len(), + 3, + "Should return a list of all 3 registered users" + ); +}