46 lines
1.2 KiB
Rust
46 lines
1.2 KiB
Rust
use std::collections::HashMap;
|
|
|
|
use crate::spotify_auth::Token;
|
|
use crate::{spotify_types::*, BASE_URL};
|
|
|
|
pub async fn get_users(
|
|
token: &Token,
|
|
users: &[&SpotifyId],
|
|
) -> Result<Vec<UserProfile>, reqwest::Error> {
|
|
let unique_users = {
|
|
let mut unique_users: Vec<_> = users.into();
|
|
unique_users.dedup();
|
|
unique_users
|
|
};
|
|
let user_map = get_users_helper(token, &unique_users).await?;
|
|
let out: Vec<UserProfile> = users
|
|
.iter()
|
|
.filter_map(|spotify_id| user_map.get(spotify_id))
|
|
.cloned()
|
|
.collect();
|
|
|
|
Ok(out)
|
|
}
|
|
|
|
async fn get_users_helper(
|
|
token: &Token,
|
|
unique_users: &[&SpotifyId],
|
|
) -> Result<HashMap<SpotifyId, UserProfile>, reqwest::Error> {
|
|
let client = reqwest::Client::new();
|
|
|
|
let mut map: HashMap<SpotifyId, UserProfile> = HashMap::new();
|
|
for user in unique_users {
|
|
let res = client
|
|
.get(BASE_URL.to_string() + "/users/" + &user.0)
|
|
.bearer_auth(token.0.clone())
|
|
.query(&[("user_id", user.0.clone())])
|
|
.send()
|
|
.await?
|
|
.json::<UserProfile>()
|
|
.await?;
|
|
map.insert(SpotifyId(user.0.clone()), res);
|
|
}
|
|
|
|
Ok(map)
|
|
}
|