63 lines
2.4 KiB
Rust
63 lines
2.4 KiB
Rust
use crate::{spotify_auth, spotify_tracks, spotify_types::*, spotify_users};
|
|
use actix_web::{get, web, HttpResponse, Responder};
|
|
use sqlx::MySqlPool;
|
|
|
|
|
|
|
|
use crate::joint_err::JointErr;
|
|
|
|
#[get("/status")]
|
|
pub async fn status_manager(state: web::Data<crate::state::AppState>) -> impl Responder {
|
|
let pool = &state.pool;
|
|
|
|
// Not doing this in an if let because either this works or we exit early
|
|
let token = spotify_auth::get_client_credentials().await;
|
|
if token.is_err() {
|
|
log::error!("Couldn't get a token:\n{:?}", token.unwrap_err());
|
|
return HttpResponse::InternalServerError().body("i don't have a token???");
|
|
}
|
|
let token = token.unwrap();
|
|
|
|
if let Ok(entries) = get_current_tracks(pool).await {
|
|
let tracks: Vec<&Uri> = entries
|
|
.iter()
|
|
.map(|tuple| &tuple.0) // I only want the track Uri here
|
|
.collect();
|
|
let users: Vec<&SpotifyId> = entries.iter().map(|tuple| &tuple.1).collect();
|
|
|
|
let track_objects = spotify_tracks::get_tracks(&token, &tracks).await;
|
|
let user_objects = spotify_users::get_users(&token, &users).await;
|
|
if track_objects.is_err() {
|
|
log::error!(
|
|
"Failed to get tracks with:\n{:?}",
|
|
track_objects.unwrap_err()
|
|
);
|
|
return HttpResponse::InternalServerError()
|
|
.body("Spotify did not like my request for track info");
|
|
}
|
|
if user_objects.is_err() {
|
|
log::error!("Failed to get users with:\n{:?}", user_objects.unwrap_err());
|
|
return HttpResponse::InternalServerError()
|
|
.body("Spotify did not like my request for user info");
|
|
}
|
|
|
|
let track_objects = track_objects.unwrap();
|
|
let user_objects = user_objects.unwrap();
|
|
let combined: Vec<(TrackObject, UserProfile)> =
|
|
std::iter::zip(track_objects, user_objects).collect();
|
|
HttpResponse::Ok().json(combined)
|
|
} else {
|
|
HttpResponse::InternalServerError().body("I couldn't find the tracks, sorry")
|
|
}
|
|
}
|
|
|
|
#[allow(non_snake_case)]
|
|
async fn get_current_tracks(pool: &MySqlPool) -> Result<Vec<(Uri, SpotifyId)>, JointErr> {
|
|
Ok(sqlx::query!("SELECT Uri, SpotifyId FROM CurrentPlaylist")
|
|
.fetch_all(pool)
|
|
.await?
|
|
.iter()
|
|
.map(|row| (Uri(row.Uri.clone()), SpotifyId(row.SpotifyId.clone())))
|
|
.collect())
|
|
}
|