diff --git a/src/callers/metadata.rs b/src/callers/metadata.rs new file mode 100644 index 0000000..d317bd0 --- /dev/null +++ b/src/callers/metadata.rs @@ -0,0 +1,103 @@ +pub mod request { + use serde::{Deserialize, Serialize}; + + #[derive(Default, Deserialize, Serialize)] + pub struct Request { + pub id: uuid::Uuid, + pub album: String, + pub album_artist: String, + pub artist: String, + pub disc: i32, + pub disc_count: i32, + pub duration: i64, + pub genre: String, + pub title: String, + pub track: i32, + pub track_count: i32, + pub year: i32, + } +} + +pub mod response { + use serde::{Deserialize, Serialize}; + + #[derive(Default, Deserialize, Serialize)] + pub struct Response { + pub message: String, + pub data: Vec, + } +} + +mod metadata_queue { + use sqlx::Row; + + #[derive(Debug, serde::Serialize, sqlx::FromRow)] + pub struct InsertedData { + pub id: uuid::Uuid, + } + + pub async fn insert( + pool: &sqlx::PgPool, + metadata: &String, + song_queue_id: &uuid::Uuid, + ) -> Result { + let result = sqlx::query( + r#" + INSERT INTO "metadataQueue" (metadata, song_queue_id) VALUES($1, $2) RETURNING id; + "#, + ) + .bind(metadata) + .bind(song_queue_id) + .fetch_one(pool) + .await + .map_err(|e| { + eprintln!("Error inserting: {}", e); + }); + + match result { + Ok(row) => { + let id: uuid::Uuid = row + .try_get("id") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(); + Ok(id) + } + Err(_err) => Err(sqlx::Error::RowNotFound), + } + } +} + +pub mod endpoint { + use axum::{Json, http::StatusCode}; + + pub async fn queue_metadata( + axum::Extension(pool): axum::Extension, + Json(payload): Json, + ) -> (StatusCode, Json) { + let mut results: Vec = Vec::new(); + let mut response = super::response::Response::default(); + match serde_json::to_string_pretty(&payload) { + Ok(meta) => match super::metadata_queue::insert(&pool, &meta, &payload.id).await { + Ok(id) => { + results.push(id); + response.data = results; + response.message = if response.data.is_empty() { + String::from("Error") + } else { + String::from("Success") + }; + + (StatusCode::OK, Json(response)) + } + Err(err) => { + response.message = err.to_string(); + (StatusCode::BAD_REQUEST, Json(response)) + } + }, + Err(err) => { + response.message = err.to_string(); + (StatusCode::BAD_REQUEST, Json(response)) + } + } + } +}