diff --git a/apps/labrinth/.sqlx/query-8d0ae0da359ebd33801f2796c841b9b3cc1a59f7cdee756ac5ce1c459e69a531.json b/apps/labrinth/.sqlx/query-d0cabd1c74fa04c77a02e99e201e3f3c54b41e9f606db1f18accee33afdddf49.json similarity index 76% rename from apps/labrinth/.sqlx/query-8d0ae0da359ebd33801f2796c841b9b3cc1a59f7cdee756ac5ce1c459e69a531.json rename to apps/labrinth/.sqlx/query-d0cabd1c74fa04c77a02e99e201e3f3c54b41e9f606db1f18accee33afdddf49.json index 80120ce39..0fea6b35e 100644 --- a/apps/labrinth/.sqlx/query-8d0ae0da359ebd33801f2796c841b9b3cc1a59f7cdee756ac5ce1c459e69a531.json +++ b/apps/labrinth/.sqlx/query-d0cabd1c74fa04c77a02e99e201e3f3c54b41e9f606db1f18accee33afdddf49.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id, username, avatar_url\n FROM users\n WHERE LOWER(username) LIKE $1 ESCAPE ''\n ORDER BY LOWER(username) = $2 DESC, LOWER(username), username\n LIMIT 25\n ", + "query": "\n SELECT id, username, avatar_url\n FROM users\n WHERE LOWER(username) LIKE $1 ESCAPE '\\'\n ORDER BY LOWER(username) = $2 DESC, LOWER(username), username\n LIMIT 25\n ", "describe": { "columns": [ { @@ -31,5 +31,5 @@ true ] }, - "hash": "8d0ae0da359ebd33801f2796c841b9b3cc1a59f7cdee756ac5ce1c459e69a531" + "hash": "d0cabd1c74fa04c77a02e99e201e3f3c54b41e9f606db1f18accee33afdddf49" } diff --git a/apps/labrinth/src/database/models/user_item.rs b/apps/labrinth/src/database/models/user_item.rs index d0df6460d..57653b260 100644 --- a/apps/labrinth/src/database/models/user_item.rs +++ b/apps/labrinth/src/database/models/user_item.rs @@ -286,13 +286,13 @@ impl DBUser { let escaped_query = format!("{}%", escape_like(&lowercase_query)); let users = sqlx::query!( - " + r#" SELECT id, username, avatar_url FROM users WHERE LOWER(username) LIKE $1 ESCAPE '\' ORDER BY LOWER(username) = $2 DESC, LOWER(username), username LIMIT 25 - ", + "#, escaped_query, lowercase_query ) diff --git a/apps/labrinth/tests/user.rs b/apps/labrinth/tests/user.rs index 5be41d577..3bfd4ac78 100644 --- a/apps/labrinth/tests/user.rs +++ b/apps/labrinth/tests/user.rs @@ -79,6 +79,16 @@ pub async fn search_users_escapes_wildcards_and_limits_results() { .unwrap(); } + sqlx::query( + " + INSERT INTO users (id, username, email, role) + VALUES (2100, 'prefix_under_score', 'prefix_under_score@modrinth.com', 'developer') + ", + ) + .execute(&*test_env.db.pool) + .await + .unwrap(); + let req = test::TestRequest::get() .uri("/v3/users/search?query=prefix") .to_request(); @@ -104,6 +114,17 @@ pub async fn search_users_escapes_wildcards_and_limits_results() { test::read_body_json(resp).await; assert!(users.is_empty()); + let req = test::TestRequest::get() + .uri("/v3/users/search?query=prefix_") + .to_request(); + let resp = test_env.call(req).await; + assert_status!(&resp, actix_http::StatusCode::OK); + + let users: Vec = + test::read_body_json(resp).await; + assert_eq!(users.len(), 1); + assert_eq!(users[0]["username"], "prefix_under_score"); + let req = test::TestRequest::get() .uri("/v3/users/search?query=%20%20") .to_request();