cool-spotify-blend/server/src/status.rs

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())
}