user search

This commit is contained in:
Robin Appelman 2022-08-21 15:23:24 +02:00
commit a90a20c622
2 changed files with 68 additions and 0 deletions

View file

@ -1,5 +1,6 @@
use crate::{ChatMessage, Demo, Error, ListParams, User};
use reqwest::{multipart, Client, IntoUrl, Response, StatusCode, Url};
use std::borrow::Borrow;
use std::fmt::{self, Debug, Formatter};
use std::str::FromStr;
use std::time::Duration;
@ -92,6 +93,22 @@ impl ApiClient {
.map_err(|_| Error::InvalidBaseUrl)
}
fn url_with_params<P, I, K, V>(&self, path: P, iter: I) -> Result<Url, Error>
where
P: AsRef<str>,
I: IntoIterator,
I::Item: Borrow<(K, V)>,
K: AsRef<str>,
V: AsRef<str>,
{
let mut url = self
.base_url
.join(path.as_ref())
.map_err(|_| Error::InvalidBaseUrl)?;
url.query_pairs_mut().extend_pairs(iter);
Ok(url)
}
/// List demos with the provided options
///
/// note that the pages start counting at 1
@ -243,6 +260,36 @@ impl ApiClient {
Ok(response.error_for_status()?.json().await?)
}
/// Search for players by name
///
/// # Example
///
/// ```rust
/// # use demostf_client::ApiClient;
/// #
/// # #[tokio::main]
/// # async fn main() -> Result<(), demostf_client::Error> {
/// let client = ApiClient::default();
/// #
/// let users = client.search_users("icewind").await?;
///
/// for user in users {
/// println!("{} ({})", user.name, user.steam_id.steam3());
/// }
/// # Ok(())
/// # }
/// ```
#[instrument]
pub async fn search_users(&self, name: &str) -> Result<Vec<User>, Error> {
let response = self
.client
.get(self.url_with_params("/users/search", [("query", name)])?)
.send()
.await?;
Ok(response.error_for_status()?.json().await?)
}
/// List demos with the provided options
///
/// # Example

View file

@ -59,6 +59,18 @@ async fn setup() {
let client = ApiClient::with_base_url(&api_root).unwrap();
upload(&client, "./tests/data/gully.dem", "test.dem", "R", "B").await;
let mut transaction = pool.begin().await.unwrap();
let views = ["map_list", "name_list", "users_named"];
for view in views {
sqlx::query(&format!("REFRESH MATERIALIZED VIEW {}", view))
.execute(&mut transaction)
.await
.unwrap();
}
transaction.commit().await.unwrap();
}
async fn test_client() -> ApiClient {
@ -328,6 +340,15 @@ async fn test_list_players() {
assert_eq!(demos.len(), 0);
}
#[tokio::test]
async fn test_search_players() {
let client = test_client().await;
let user = client.search_users("freak").await.unwrap();
assert_eq!(user.len(), 1);
assert_eq!(user[0].steam_id, SteamID::from(76561198010628997));
}
#[tokio::test]
async fn test_download_demo() {
let client = test_client().await;