From c5f0d5fae878d3c3d44169a244dfd8d1c7841dfc Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Fri, 18 Jul 2025 19:01:53 -0400 Subject: [PATCH 01/24] Added initial code for endpoint to link user id with song queue #156 --- src/callers/song.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/callers/song.rs b/src/callers/song.rs index f8ee210..a4c4856 100644 --- a/src/callers/song.rs +++ b/src/callers/song.rs @@ -84,6 +84,14 @@ pub mod request { pub song_queue_id: uuid::Uuid, } } + + pub mod link_user_id { + #[derive(Debug, serde::Deserialize, serde::Serialize)] + pub struct Request { + pub song_queue_id: uuid::Uuid, + pub user_id: uuid::Uuid, + } + } } pub mod response { @@ -142,6 +150,14 @@ pub mod response { pub data: Vec, } } + + pub mod link_user_id { + #[derive(Debug, Default, serde::Deserialize, serde::Serialize)] + pub struct Response { + pub message: String, + pub data: Vec, + } + } } // TODO: Might make a distinction between year and date in a song's tag at some point @@ -616,6 +632,20 @@ pub mod endpoint { (StatusCode::OK, Json(response)) } + pub async fn link_user_id(axum::Extension(pool): axum::Extension, axum::Json(payload): axum::Json) -> (axum::http::StatusCode, axum::Json) { + let mut response = super::response::link_user_id::Response::default(); + + match super::song_queue::get_song_queue(&pool, &payload.song_queue_id).await { + Ok(song_queue) => { + (axum::http::StatusCode::OK, axum::Json(response)) + } + Err(err) => { + response.message = err.to_string(); + (axum::http::StatusCode::BAD_REQUEST, axum::Json(response)) + } + } + } + pub async fn fetch_queue_song( axum::Extension(pool): axum::Extension, ) -> ( -- 2.47.3 From 381162b1155fb623e206ba89837cc384af4478d8 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Fri, 18 Jul 2025 19:03:04 -0400 Subject: [PATCH 02/24] Updated songQueue to have a user_id field #156 --- migrations/20250420185217_init_migration.sql | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/migrations/20250420185217_init_migration.sql b/migrations/20250420185217_init_migration.sql index 68cdfea..09e10b5 100644 --- a/migrations/20250420185217_init_migration.sql +++ b/migrations/20250420185217_init_migration.sql @@ -6,7 +6,8 @@ CREATE TABLE IF NOT EXISTS "songQueue" ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), filename TEXT NOT NULL, status TEXT CHECK (status IN ('pending', 'ready', 'processing', 'done')), - data BYTEA NULL + data BYTEA NULL, + user_id UUID NULL ); -- Table to store queued metadata -- 2.47.3 From 162a333ecdfb6e9a76141eadc863aed056f2953b Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Fri, 18 Jul 2025 19:06:00 -0400 Subject: [PATCH 03/24] Added function to link user_id with songQueue record #156 --- src/callers/song.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/callers/song.rs b/src/callers/song.rs index a4c4856..a0bfea7 100644 --- a/src/callers/song.rs +++ b/src/callers/song.rs @@ -491,6 +491,33 @@ mod song_queue { } } + pub async fn link_user_id( + pool: &sqlx::PgPool, + id: &uuid::Uuid, + user_id: &uuid::Uuid, + ) -> Result { + let result = sqlx::query( + r#" + UPDATE "songQueue" SET user_id = $1 WHERE id = $2 RETURNING user_id; + "#, + ) + .bind(user_id) + .bind(id) + .fetch_one(pool) + .await + .map_err(|e| { + eprintln!("Error updating record {e}"); + }); + + match result { + Ok(row) => Ok(row + .try_get("user_id") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap()), + Err(_) => Err(sqlx::Error::RowNotFound), + } + } + pub async fn get_song_queue( pool: &sqlx::PgPool, id: &uuid::Uuid, -- 2.47.3 From 8de2773a7a3dd31db29bfb06776d0dc1913ea16b Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Fri, 18 Jul 2025 19:13:15 -0400 Subject: [PATCH 04/24] Added useful constant #156 --- src/callers/mod.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/callers/mod.rs b/src/callers/mod.rs index dd81a85..7aa7b6f 100644 --- a/src/callers/mod.rs +++ b/src/callers/mod.rs @@ -17,3 +17,8 @@ pub mod endpoints { pub const CREATESONG: &str = "/api/v2/song"; pub const CREATECOVERART: &str = "/api/v2/coverart"; } + + +pub mod response { + pub const SUCCESSFUL: &str = "SUCCESSFUL"; +} -- 2.47.3 From 4af06e7facb0533b762c4c6f46a93a703d12af87 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Fri, 18 Jul 2025 19:14:22 -0400 Subject: [PATCH 05/24] Finished adding code #156 Need to make the endpoint available and then write a test. Might have to modify existing tests --- src/callers/song.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/callers/song.rs b/src/callers/song.rs index a0bfea7..1414508 100644 --- a/src/callers/song.rs +++ b/src/callers/song.rs @@ -664,7 +664,17 @@ pub mod endpoint { match super::song_queue::get_song_queue(&pool, &payload.song_queue_id).await { Ok(song_queue) => { - (axum::http::StatusCode::OK, axum::Json(response)) + match super::song_queue::link_user_id(&pool, &song_queue.id, &payload.user_id).await { + Ok(user_id) => { + response.message = String::from(crate::callers::response::SUCCESSFUL); + response.data.push(user_id); + (axum::http::StatusCode::OK, axum::Json(response)) + } + Err(err) => { + response.message = err.to_string(); + (axum::http::StatusCode::BAD_REQUEST, axum::Json(response)) + } + } } Err(err) => { response.message = err.to_string(); -- 2.47.3 From 19e27c42f4f52668de9fcc23490d1519cdf30259 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Fri, 18 Jul 2025 19:19:57 -0400 Subject: [PATCH 06/24] Made link user id endpoint available #156 --- src/callers/mod.rs | 1 + src/main.rs | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/callers/mod.rs b/src/callers/mod.rs index 7aa7b6f..04a3e74 100644 --- a/src/callers/mod.rs +++ b/src/callers/mod.rs @@ -4,6 +4,7 @@ pub mod song; pub mod endpoints { pub const QUEUESONG: &str = "/api/v2/song/queue"; + pub const QUEUESONGLINKUSERID: &str = "/api/v2/song/queue/link"; pub const QUEUESONGDATA: &str = "/api/v2/song/queue/{id}"; pub const QUEUESONGUPDATE: &str = "/api/v2/song/queue/{id}"; pub const NEXTQUEUESONG: &str = "/api/v2/song/queue/next"; diff --git a/src/main.rs b/src/main.rs index 39b8000..f1ddddd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -59,6 +59,10 @@ pub mod init { crate::callers::endpoints::QUEUESONG, patch(crate::callers::song::endpoint::update_song_queue_status), ) + .route( + crate::callers::endpoints::QUEUESONGLINKUSERID, + patch(crate::callers::song::endpoint::link_user_id) + ) .route( crate::callers::endpoints::QUEUESONGDATA, get(crate::callers::song::endpoint::download_flac), -- 2.47.3 From 0d50013ae122cefd10caf7744f7381109a64e457 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Fri, 18 Jul 2025 19:25:01 -0400 Subject: [PATCH 07/24] Added TODOs for later --- src/main.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main.rs b/src/main.rs index f1ddddd..8253020 100644 --- a/src/main.rs +++ b/src/main.rs @@ -241,6 +241,7 @@ mod tests { } } + // TODO: Put the *_req() functions in their own module async fn song_queue_req( app: &axum::Router, ) -> Result { @@ -590,12 +591,14 @@ mod tests { } } + // TODO: Put this in a util module pub async fn resp_to_bytes( response: axum::response::Response, ) -> Result { axum::body::to_bytes(response.into_body(), usize::MAX).await } + // TODO: Put this in a util module pub async fn get_resp_data(response: axum::response::Response) -> Data where Data: for<'a> serde::Deserialize<'a>, @@ -604,6 +607,7 @@ mod tests { serde_json::from_slice(&body).unwrap() } + // TODO: Change the name of the function to be more expressive and put into it's own module pub mod payload_data { pub async fn queue_metadata_payload_data(song_queue_id: &uuid::Uuid) -> serde_json::Value { serde_json::json!( -- 2.47.3 From cfabbfc1225e337583d9f052711b4c8c1c7054ee Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Fri, 18 Jul 2025 19:26:38 -0400 Subject: [PATCH 08/24] Changing location of test code --- src/main.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main.rs b/src/main.rs index 8253020..9ac95fd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -663,11 +663,6 @@ mod tests { let _ = db_mgr::drop_database(&tm_pool, &db_name).await; } - mod special_area { - - use super::*; - - use std::io::Write; #[tokio::test] async fn test_song_fetch_queue_item() { @@ -976,7 +971,6 @@ mod tests { let _ = db_mgr::drop_database(&tm_pool, &db_name).await; } - } #[tokio::test] async fn test_song_metadata_queue() { -- 2.47.3 From 169a69060449d5ca2d5739d046ce1239908788ef Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Fri, 18 Jul 2025 19:26:56 -0400 Subject: [PATCH 09/24] Code formatting --- src/callers/mod.rs | 1 - src/callers/song.rs | 11 +- src/main.rs | 509 +++++++++++++++++++++----------------------- 3 files changed, 252 insertions(+), 269 deletions(-) diff --git a/src/callers/mod.rs b/src/callers/mod.rs index 04a3e74..ab4be4e 100644 --- a/src/callers/mod.rs +++ b/src/callers/mod.rs @@ -19,7 +19,6 @@ pub mod endpoints { pub const CREATECOVERART: &str = "/api/v2/coverart"; } - pub mod response { pub const SUCCESSFUL: &str = "SUCCESSFUL"; } diff --git a/src/callers/song.rs b/src/callers/song.rs index 1414508..aca6c69 100644 --- a/src/callers/song.rs +++ b/src/callers/song.rs @@ -659,12 +659,19 @@ pub mod endpoint { (StatusCode::OK, Json(response)) } - pub async fn link_user_id(axum::Extension(pool): axum::Extension, axum::Json(payload): axum::Json) -> (axum::http::StatusCode, axum::Json) { + pub async fn link_user_id( + axum::Extension(pool): axum::Extension, + axum::Json(payload): axum::Json, + ) -> ( + axum::http::StatusCode, + axum::Json, + ) { let mut response = super::response::link_user_id::Response::default(); match super::song_queue::get_song_queue(&pool, &payload.song_queue_id).await { Ok(song_queue) => { - match super::song_queue::link_user_id(&pool, &song_queue.id, &payload.user_id).await { + match super::song_queue::link_user_id(&pool, &song_queue.id, &payload.user_id).await + { Ok(user_id) => { response.message = String::from(crate::callers::response::SUCCESSFUL); response.data.push(user_id); diff --git a/src/main.rs b/src/main.rs index 9ac95fd..8b507e3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -61,8 +61,8 @@ pub mod init { ) .route( crate::callers::endpoints::QUEUESONGLINKUSERID, - patch(crate::callers::song::endpoint::link_user_id) - ) + patch(crate::callers::song::endpoint::link_user_id), + ) .route( crate::callers::endpoints::QUEUESONGDATA, get(crate::callers::song::endpoint::download_flac), @@ -663,64 +663,162 @@ mod tests { let _ = db_mgr::drop_database(&tm_pool, &db_name).await; } + #[tokio::test] + async fn test_song_fetch_queue_item() { + let tm_pool = db_mgr::get_pool().await.unwrap(); + let db_name = db_mgr::generate_db_name().await; - #[tokio::test] - async fn test_song_fetch_queue_item() { - let tm_pool = db_mgr::get_pool().await.unwrap(); - let db_name = db_mgr::generate_db_name().await; + match db_mgr::create_database(&tm_pool, &db_name).await { + Ok(_) => { + println!("Success"); + } + Err(err) => { + assert!(false, "Error: {:?}", err); + } + } - match db_mgr::create_database(&tm_pool, &db_name).await { - Ok(_) => { - println!("Success"); - } - Err(err) => { - assert!(false, "Error: {:?}", err); + let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); + db::migrations(&pool).await; + + let app = init::app(pool).await; + + match sequence_flow::queue_song_and_coverart_flow(&app).await { + Ok((resp_one, song_queue_id)) => { + let resp = get_resp_data::< + crate::callers::coverart::response::fetch_coverart_no_data::Response, + >(resp_one) + .await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + + let _resp_coverart_queue_id = resp.data[0].id; + + let old = crate::callers::song::status::PENDING; + let target_status = crate::callers::song::status::READY; + + match update_song_queue_status_req(&app, &song_queue_id).await { + Ok(response) => { + let resp = get_resp_data::< + crate::callers::song::response::update_status::Response, + >(response) + .await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + let changed_status = &resp.data[0]; + + assert_eq!(*old, changed_status.old_status, "Old status does not match"); + assert_eq!( + target_status, changed_status.new_status, + "New status does not match" + ); + + match fetch_queue_req(&app).await { + Ok(response) => { + let resp = get_resp_data::< + crate::callers::song::response::fetch_queue_song::Response, + >(response) + .await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + } + Err(err) => { + assert!(false, "Error: {:?}", err); + } + } + } + Err(err) => { + assert!(false, "Error: {:?}", err); + } } } + Err(err) => { + assert!(false, "Error: {:?}", err); + } + }; - let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); - db::migrations(&pool).await; + let _ = db_mgr::drop_database(&tm_pool, &db_name).await; + } - let app = init::app(pool).await; + #[tokio::test] + async fn test_update_song_from_queue() { + let tm_pool = db_mgr::get_pool().await.unwrap(); + let db_name = db_mgr::generate_db_name().await; - match sequence_flow::queue_song_and_coverart_flow(&app).await { - Ok((resp_one, song_queue_id)) => { - let resp = get_resp_data::< - crate::callers::coverart::response::fetch_coverart_no_data::Response, - >(resp_one) - .await; - assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + match db_mgr::create_database(&tm_pool, &db_name).await { + Ok(_) => { + println!("Success"); + } + Err(err) => { + assert!(false, "Error: {:?}", err); + } + } - let _resp_coverart_queue_id = resp.data[0].id; + let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); + db::migrations(&pool).await; - let old = crate::callers::song::status::PENDING; - let target_status = crate::callers::song::status::READY; + let app = init::app(pool).await; - match update_song_queue_status_req(&app, &song_queue_id).await { - Ok(response) => { - let resp = get_resp_data::< - crate::callers::song::response::update_status::Response, - >(response) - .await; - assert_eq!(false, resp.data.is_empty(), "Should not be empty"); - let changed_status = &resp.data[0]; + // Send request + match song_queue_req(&app).await { + Ok(response) => { + let resp = + get_resp_data::(response).await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + assert_eq!(false, resp.data[0].is_nil(), "Should not be empty"); - assert_eq!( - *old, changed_status.old_status, - "Old status does not match" - ); - assert_eq!( - target_status, changed_status.new_status, - "New status does not match" + let id = &resp.data[0]; + + match fetch_queue_data_req(&app, &id).await { + Ok(response) => match resp_to_bytes(response).await { + Ok(bytes) => { + assert_eq!(false, bytes.is_empty(), "Queued data should not be empty"); + + let temp_file = + tempfile::tempdir().expect("Could not create test directory"); + let test_dir = String::from(temp_file.path().to_str().unwrap()); + let new_file = format!("{}/new_file.flac", test_dir); + + let mut file = std::fs::File::create(&new_file).unwrap(); + file.write_all(&bytes).unwrap(); + + let mut form = MultipartForm::default(); + let _ = form.add_file("flac", new_file); + + // Create request + let content_type = form.content_type(); + let body = MultipartBody::from(form); + + let raw_uri = String::from(crate::callers::endpoints::QUEUESONGUPDATE); + let end_index = raw_uri.len() - 5; + + let uri = format!( + "{}/{}", + (&raw_uri[..end_index]).to_string(), + id.to_string() ); - match fetch_queue_req(&app).await { + match app + .clone() + .oneshot( + axum::http::Request::builder() + .method(axum::http::Method::PATCH) + .uri(uri) + .header(axum::http::header::CONTENT_TYPE, content_type) + .body(axum::body::Body::from_stream(body)) + .unwrap(), + ) + .await + { Ok(response) => { let resp = get_resp_data::< - crate::callers::song::response::fetch_queue_song::Response, + crate::callers::song::response::update_song_queue::Response, >(response) .await; assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + + let updated_song_queued_id = resp.data[0]; + assert_eq!( + updated_song_queued_id, *id, + "Song queue Id should match, but they don't. {:?} {:?}", + updated_song_queued_id, id + ); } Err(err) => { assert!(false, "Error: {:?}", err); @@ -730,248 +828,127 @@ mod tests { Err(err) => { assert!(false, "Error: {:?}", err); } + }, + Err(err) => { + assert!(false, "Error: {:?}", err); } } - Err(err) => { - assert!(false, "Error: {:?}", err); - } - }; + } + Err(err) => { + assert!(false, "Error: {:?}", err); + } + }; - let _ = db_mgr::drop_database(&tm_pool, &db_name).await; + let _ = db_mgr::drop_database(&tm_pool, &db_name).await; + } + + #[tokio::test] + async fn test_song_fetch_queue_data() { + let tm_pool = db_mgr::get_pool().await.unwrap(); + let db_name = db_mgr::generate_db_name().await; + + match db_mgr::create_database(&tm_pool, &db_name).await { + Ok(_) => { + println!("Success"); + } + Err(err) => { + assert!(false, "Error: {:?}", err); + } } - #[tokio::test] - async fn test_update_song_from_queue() { - let tm_pool = db_mgr::get_pool().await.unwrap(); - let db_name = db_mgr::generate_db_name().await; + let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); + db::migrations(&pool).await; - match db_mgr::create_database(&tm_pool, &db_name).await { - Ok(_) => { - println!("Success"); - } - Err(err) => { - assert!(false, "Error: {:?}", err); - } - } + let app = init::app(pool).await; - let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); - db::migrations(&pool).await; + // Send request + match song_queue_req(&app).await { + Ok(response) => { + let resp = + get_resp_data::(response).await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + assert_eq!(false, resp.data[0].is_nil(), "Should not be empty"); + let id = resp.data[0]; - let app = init::app(pool).await; - - // Send request - match song_queue_req(&app).await { - Ok(response) => { - let resp = - get_resp_data::(response).await; - assert_eq!(false, resp.data.is_empty(), "Should not be empty"); - assert_eq!(false, resp.data[0].is_nil(), "Should not be empty"); - - let id = &resp.data[0]; - - match fetch_queue_data_req(&app, &id).await { - Ok(response) => match resp_to_bytes(response).await { - Ok(bytes) => { - assert_eq!( - false, - bytes.is_empty(), - "Queued data should not be empty" - ); - - let temp_file = - tempfile::tempdir().expect("Could not create test directory"); - let test_dir = String::from(temp_file.path().to_str().unwrap()); - let new_file = format!("{}/new_file.flac", test_dir); - - let mut file = std::fs::File::create(&new_file).unwrap(); - file.write_all(&bytes).unwrap(); - - let mut form = MultipartForm::default(); - let _ = form.add_file("flac", new_file); - - // Create request - let content_type = form.content_type(); - let body = MultipartBody::from(form); - - let raw_uri = - String::from(crate::callers::endpoints::QUEUESONGUPDATE); - let end_index = raw_uri.len() - 5; - - let uri = format!( - "{}/{}", - (&raw_uri[..end_index]).to_string(), - id.to_string() - ); - - match app - .clone() - .oneshot( - axum::http::Request::builder() - .method(axum::http::Method::PATCH) - .uri(uri) - .header(axum::http::header::CONTENT_TYPE, content_type) - .body(axum::body::Body::from_stream(body)) - .unwrap(), - ) - .await - { - Ok(response) => { - let resp = get_resp_data::< - crate::callers::song::response::update_song_queue::Response, - >(response) - .await; - assert_eq!( - false, - resp.data.is_empty(), - "Should not be empty" - ); - - let updated_song_queued_id = resp.data[0]; - assert_eq!( - updated_song_queued_id, *id, - "Song queue Id should match, but they don't. {:?} {:?}", - updated_song_queued_id, id - ); - } - Err(err) => { - assert!(false, "Error: {:?}", err); - } - } - } - Err(err) => { - assert!(false, "Error: {:?}", err); - } - }, - Err(err) => { - assert!(false, "Error: {:?}", err); - } - } - } - Err(err) => { - assert!(false, "Error: {:?}", err); - } - }; - - let _ = db_mgr::drop_database(&tm_pool, &db_name).await; - } - - #[tokio::test] - async fn test_song_fetch_queue_data() { - let tm_pool = db_mgr::get_pool().await.unwrap(); - let db_name = db_mgr::generate_db_name().await; - - match db_mgr::create_database(&tm_pool, &db_name).await { - Ok(_) => { - println!("Success"); - } - Err(err) => { - assert!(false, "Error: {:?}", err); - } - } - - let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); - db::migrations(&pool).await; - - let app = init::app(pool).await; - - // Send request - match song_queue_req(&app).await { - Ok(response) => { - let resp = - get_resp_data::(response).await; - assert_eq!(false, resp.data.is_empty(), "Should not be empty"); - assert_eq!(false, resp.data[0].is_nil(), "Should not be empty"); - let id = resp.data[0]; - - match fetch_queue_data_req(&app, &id).await { - Ok(response) => match resp_to_bytes(response).await { - Ok(bytes) => { - assert_eq!( - false, - bytes.is_empty(), - "Queued data should not be empty" - ); - } - Err(err) => { - assert!(false, "Error: {:?}", err); - } - }, - Err(err) => { - assert!(false, "Error: {:?}", err); - } - } - } - Err(err) => { - assert!(false, "Error: {:?}", err); - } - }; - - let _ = db_mgr::drop_database(&tm_pool, &db_name).await; - } - - #[tokio::test] - async fn test_song_queue_update_status() { - let tm_pool = db_mgr::get_pool().await.unwrap(); - let db_name = db_mgr::generate_db_name().await; - - match db_mgr::create_database(&tm_pool, &db_name).await { - Ok(_) => { - println!("Success"); - } - Err(err) => { - assert!(false, "Error: {:?}", err); - } - } - - let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); - db::migrations(&pool).await; - - let app = init::app(pool).await; - - match sequence_flow::queue_song_and_coverart_flow(&app).await { - Ok((resp_one, song_queue_id)) => { - let resp = get_resp_data::< - crate::callers::coverart::response::fetch_coverart_no_data::Response, - >(resp_one) - .await; - assert_eq!(false, resp.data.is_empty(), "Should not be empty"); - - let _resp_coverart_queue_id = resp.data[0].id; - - let old = crate::callers::song::status::PENDING; - let done = crate::callers::song::status::READY; - - match update_song_queue_status_req(&app, &song_queue_id).await { - Ok(response) => { - let resp = get_resp_data::< - crate::callers::song::response::update_status::Response, - >(response) - .await; - assert_eq!(false, resp.data.is_empty(), "Should not be empty"); - let changed_status = &resp.data[0]; - - assert_eq!( - *old, changed_status.old_status, - "Old status does not match" - ); - assert_eq!( - done, changed_status.new_status, - "New status does not match" - ); + match fetch_queue_data_req(&app, &id).await { + Ok(response) => match resp_to_bytes(response).await { + Ok(bytes) => { + assert_eq!(false, bytes.is_empty(), "Queued data should not be empty"); } Err(err) => { assert!(false, "Error: {:?}", err); } + }, + Err(err) => { + assert!(false, "Error: {:?}", err); } } - Err(err) => { - assert!(false, "Error: {:?}", err); + } + Err(err) => { + assert!(false, "Error: {:?}", err); + } + }; + + let _ = db_mgr::drop_database(&tm_pool, &db_name).await; + } + + #[tokio::test] + async fn test_song_queue_update_status() { + let tm_pool = db_mgr::get_pool().await.unwrap(); + let db_name = db_mgr::generate_db_name().await; + + match db_mgr::create_database(&tm_pool, &db_name).await { + Ok(_) => { + println!("Success"); + } + Err(err) => { + assert!(false, "Error: {:?}", err); + } + } + + let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); + db::migrations(&pool).await; + + let app = init::app(pool).await; + + match sequence_flow::queue_song_and_coverart_flow(&app).await { + Ok((resp_one, song_queue_id)) => { + let resp = get_resp_data::< + crate::callers::coverart::response::fetch_coverart_no_data::Response, + >(resp_one) + .await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + + let _resp_coverart_queue_id = resp.data[0].id; + + let old = crate::callers::song::status::PENDING; + let done = crate::callers::song::status::READY; + + match update_song_queue_status_req(&app, &song_queue_id).await { + Ok(response) => { + let resp = get_resp_data::< + crate::callers::song::response::update_status::Response, + >(response) + .await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + let changed_status = &resp.data[0]; + + assert_eq!(*old, changed_status.old_status, "Old status does not match"); + assert_eq!(done, changed_status.new_status, "New status does not match"); + } + Err(err) => { + assert!(false, "Error: {:?}", err); + } } } - - let _ = db_mgr::drop_database(&tm_pool, &db_name).await; + Err(err) => { + assert!(false, "Error: {:?}", err); + } } + let _ = db_mgr::drop_database(&tm_pool, &db_name).await; + } + #[tokio::test] async fn test_song_metadata_queue() { let tm_pool = db_mgr::get_pool().await.unwrap(); -- 2.47.3 From 6fa154ecf4ae538a85a769e8791ea74ae4ce0010 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Fri, 18 Jul 2025 19:47:01 -0400 Subject: [PATCH 10/24] Added test #156 --- src/main.rs | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/main.rs b/src/main.rs index 8b507e3..80c4c51 100644 --- a/src/main.rs +++ b/src/main.rs @@ -261,6 +261,22 @@ mod tests { app.clone().oneshot(req).await } + async fn song_queue_link_req(app: &axum::Router, song_queue_id: &uuid::Uuid, user_id: &uuid::Uuid) -> Result { + let payload = serde_json::json!({ + "song_queue_id": song_queue_id, + "user_id": user_id + }); + + let req = axum::http::Request::builder() + .method(axum::http::Method::PATCH) + .uri(crate::callers::endpoints::QUEUESONGLINKUSERID) + .header(axum::http::header::CONTENT_TYPE, "application/json") + .body(axum::body::Body::from(payload.to_string())) + .unwrap(); + + app.clone().oneshot(req).await + } + async fn fetch_queue_req( app: &axum::Router, ) -> Result { @@ -663,6 +679,57 @@ mod tests { let _ = db_mgr::drop_database(&tm_pool, &db_name).await; } + #[tokio::test] + async fn test_song_queue_link_user_id() { + let tm_pool = db_mgr::get_pool().await.unwrap(); + let db_name = db_mgr::generate_db_name().await; + + match db_mgr::create_database(&tm_pool, &db_name).await { + Ok(_) => { + println!("Success"); + } + Err(err) => { + assert!(false, "Error: {:?}", err); + } + } + + let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); + db::migrations(&pool).await; + + let app = init::app(pool).await; + + match song_queue_req(&app).await { + Ok(response) => { + let resp = + get_resp_data::(response).await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + assert_eq!(false, resp.data[0].is_nil(), "Should not be empty"); + + let song_queue_id = &resp.data[0]; + let user_id = uuid::Uuid::new_v4(); + println!("User Id: {user_id:?}"); + + match song_queue_link_req(&app, &song_queue_id, &user_id).await { + Ok(response) => { + let resp = get_resp_data::(response).await; + let collected_user_id = &resp.data[0]; + + assert!(!collected_user_id.is_nil(), "Collected user id should not be nil {collected_user_id:?}"); + assert_eq!(user_id, *collected_user_id, "User Id is different. First {user_id:?} Second {collected_user_id:?}"); + } + Err(err) => { + assert!(false, "Error: {err:?} songQueue Id {song_queue_id:?} user id {user_id:?}"); + } + } + } + Err(err) => { + assert!(false, "Error: {:?}", err); + } + }; + + let _ = db_mgr::drop_database(&tm_pool, &db_name).await; + } + #[tokio::test] async fn test_song_fetch_queue_item() { let tm_pool = db_mgr::get_pool().await.unwrap(); -- 2.47.3 From b6d409d39aef3f680d97aed8d92f2d2747e0dc17 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Mon, 21 Jul 2025 19:31:44 -0400 Subject: [PATCH 11/24] Formatted code --- src/main.rs | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index 80c4c51..f93bded 100644 --- a/src/main.rs +++ b/src/main.rs @@ -261,7 +261,11 @@ mod tests { app.clone().oneshot(req).await } - async fn song_queue_link_req(app: &axum::Router, song_queue_id: &uuid::Uuid, user_id: &uuid::Uuid) -> Result { + async fn song_queue_link_req( + app: &axum::Router, + song_queue_id: &uuid::Uuid, + user_id: &uuid::Uuid, + ) -> Result { let payload = serde_json::json!({ "song_queue_id": song_queue_id, "user_id": user_id @@ -711,14 +715,26 @@ mod tests { match song_queue_link_req(&app, &song_queue_id, &user_id).await { Ok(response) => { - let resp = get_resp_data::(response).await; + let resp = get_resp_data::< + crate::callers::song::response::link_user_id::Response, + >(response) + .await; let collected_user_id = &resp.data[0]; - assert!(!collected_user_id.is_nil(), "Collected user id should not be nil {collected_user_id:?}"); - assert_eq!(user_id, *collected_user_id, "User Id is different. First {user_id:?} Second {collected_user_id:?}"); + assert!( + !collected_user_id.is_nil(), + "Collected user id should not be nil {collected_user_id:?}" + ); + assert_eq!( + user_id, *collected_user_id, + "User Id is different. First {user_id:?} Second {collected_user_id:?}" + ); } Err(err) => { - assert!(false, "Error: {err:?} songQueue Id {song_queue_id:?} user id {user_id:?}"); + assert!( + false, + "Error: {err:?} songQueue Id {song_queue_id:?} user id {user_id:?}" + ); } } } -- 2.47.3 From 56520eb47ef38c356f13b31e418f54d323a8e84c Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Mon, 21 Jul 2025 19:39:00 -0400 Subject: [PATCH 12/24] Added user_id to SongQueue and added more related code --- src/callers/song.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/callers/song.rs b/src/callers/song.rs index aca6c69..3bdb91f 100644 --- a/src/callers/song.rs +++ b/src/callers/song.rs @@ -336,6 +336,7 @@ mod song_queue { pub id: uuid::Uuid, pub filename: String, pub status: String, + pub user_id: uuid::Uuid } pub async fn insert( @@ -409,7 +410,7 @@ mod song_queue { FOR UPDATE SKIP LOCKED LIMIT 1 ) - RETURNING id, filename, status; + RETURNING id, filename, status, user_id; "#, ) .bind(super::status::PROCESSING) @@ -434,6 +435,7 @@ mod song_queue { .try_get("status") .map_err(|_e| sqlx::Error::RowNotFound) .unwrap(), + user_id: row.try_get("user_id").map_err(|_e| sqlx::Error::RowNotFound).unwrap() }), Err(_err) => Err(sqlx::Error::RowNotFound), } @@ -524,7 +526,7 @@ mod song_queue { ) -> Result { let result = sqlx::query( r#" - SELECT id, filename, status FROM "songQueue" WHERE id = $1 + SELECT id, filename, status, user_id FROM "songQueue" WHERE id = $1 "#, ) .bind(id) @@ -548,6 +550,7 @@ mod song_queue { .try_get("status") .map_err(|_e| sqlx::Error::RowNotFound) .unwrap(), + user_id: row.try_get("user_id").map_err(|_e| sqlx::Error::RowNotFound).unwrap() }), Err(_err) => Err(sqlx::Error::RowNotFound), } -- 2.47.3 From 0eeacd2ed428ff09743b4f931554277c3fe14cf5 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Mon, 21 Jul 2025 19:39:30 -0400 Subject: [PATCH 13/24] Code formatting --- src/callers/song.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/callers/song.rs b/src/callers/song.rs index 3bdb91f..a9cce1c 100644 --- a/src/callers/song.rs +++ b/src/callers/song.rs @@ -336,7 +336,7 @@ mod song_queue { pub id: uuid::Uuid, pub filename: String, pub status: String, - pub user_id: uuid::Uuid + pub user_id: uuid::Uuid, } pub async fn insert( @@ -435,7 +435,10 @@ mod song_queue { .try_get("status") .map_err(|_e| sqlx::Error::RowNotFound) .unwrap(), - user_id: row.try_get("user_id").map_err(|_e| sqlx::Error::RowNotFound).unwrap() + user_id: row + .try_get("user_id") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), }), Err(_err) => Err(sqlx::Error::RowNotFound), } @@ -550,7 +553,10 @@ mod song_queue { .try_get("status") .map_err(|_e| sqlx::Error::RowNotFound) .unwrap(), - user_id: row.try_get("user_id").map_err(|_e| sqlx::Error::RowNotFound).unwrap() + user_id: row + .try_get("user_id") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), }), Err(_err) => Err(sqlx::Error::RowNotFound), } -- 2.47.3 From 3118cff274a3a65c5d873d7317fce8e658603904 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Mon, 21 Jul 2025 19:44:48 -0400 Subject: [PATCH 14/24] Fixing possible nil user_id field in SongQueue when calling a function --- src/callers/song.rs | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/src/callers/song.rs b/src/callers/song.rs index a9cce1c..e58c486 100644 --- a/src/callers/song.rs +++ b/src/callers/song.rs @@ -422,24 +422,33 @@ mod song_queue { }); match result { - Ok(row) => Ok(SongQueue { - id: row - .try_get("id") - .map_err(|_e| sqlx::Error::RowNotFound) - .unwrap(), - filename: row - .try_get("filename") - .map_err(|_e| sqlx::Error::RowNotFound) - .unwrap(), - status: row - .try_get("status") - .map_err(|_e| sqlx::Error::RowNotFound) - .unwrap(), - user_id: row - .try_get("user_id") - .map_err(|_e| sqlx::Error::RowNotFound) - .unwrap(), - }), + Ok(row) => { + let user_id_result = row.try_get("user_id"); + let song_queue = SongQueue { + id: row + .try_get("id") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + filename: row + .try_get("filename") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + status: row + .try_get("status") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + user_id: match user_id_result { + Ok(id) => { + id + } + Err(_) => { + uuid::Uuid::nil() + } + } + }; + + Ok(song_queue) + } Err(_err) => Err(sqlx::Error::RowNotFound), } } -- 2.47.3 From 507a6a875946dd7a741a7b088c0d3749ae2d0f4c Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Mon, 21 Jul 2025 19:47:33 -0400 Subject: [PATCH 15/24] Fixed another issue --- src/callers/song.rs | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/src/callers/song.rs b/src/callers/song.rs index e58c486..724cd8a 100644 --- a/src/callers/song.rs +++ b/src/callers/song.rs @@ -549,24 +549,33 @@ mod song_queue { }); match result { - Ok(row) => Ok(SongQueue { - id: row - .try_get("id") - .map_err(|_e| sqlx::Error::RowNotFound) - .unwrap(), - filename: row - .try_get("filename") - .map_err(|_e| sqlx::Error::RowNotFound) - .unwrap(), - status: row - .try_get("status") - .map_err(|_e| sqlx::Error::RowNotFound) - .unwrap(), - user_id: row - .try_get("user_id") - .map_err(|_e| sqlx::Error::RowNotFound) - .unwrap(), - }), + Ok(row) => { + let user_id_result = row.try_get("user_id"); + let song_queue = SongQueue { + id: row + .try_get("id") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + filename: row + .try_get("filename") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + status: row + .try_get("status") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + user_id: match user_id_result { + Ok(id) => { + id + } + Err(_) => { + uuid::Uuid::nil() + } + } + }; + + Ok(song_queue) + } Err(_err) => Err(sqlx::Error::RowNotFound), } } -- 2.47.3 From 647151732be651740f332bbfb64436696cd2f1d0 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Mon, 21 Jul 2025 20:16:19 -0400 Subject: [PATCH 16/24] Made changes to function to also return user_id --- src/main.rs | 51 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/src/main.rs b/src/main.rs index f93bded..5223e0f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -476,7 +476,7 @@ mod tests { // Flow for queueing song pub async fn queue_song_flow( app: &axum::Router, - ) -> Result { + ) -> Result<(axum::response::Response, uuid::Uuid), std::convert::Infallible> { match super::song_queue_req(&app).await { Ok(response) => { let resp = @@ -487,22 +487,35 @@ mod tests { let song_queue_id = resp.data[0]; assert_eq!(false, song_queue_id.is_nil(), "Should not be empty"); - match super::queue_metadata_req(&app, &resp.data[0]).await { - Ok(response) => { - let resp = super::get_resp_data::< - crate::callers::song::response::Response, - >(response) - .await; - assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + let user_id = uuid::Uuid::new_v4(); - let id = resp.data[0]; + // match super::get_resp_data::(response).await { - match super::fetch_metadata_queue_req(&app, &id).await { - Ok(response) => Ok(response), - Err(err) => Err(err), - } + match super::song_queue_link_req(&app, &song_queue_id, &user_id).await { + Ok(response) => { + let resp = super::get_resp_data::(response).await; + assert_eq!(false, resp.data.is_empty(), "The response should not be empty"); + + match super::queue_metadata_req(&app, &song_queue_id).await { + Ok(response) => { + let resp = super::get_resp_data::< + crate::callers::song::response::Response, + >(response) + .await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + + let id = resp.data[0]; + + match super::fetch_metadata_queue_req(&app, &id).await { + Ok(response) => Ok((response, user_id)), + Err(err) => Err(err), + } + } + } } + Err(err) => Err(err) } + } Err(err) => Err(err), } @@ -558,7 +571,7 @@ mod tests { app: &axum::Router, ) -> Result<(axum::response::Response, uuid::Uuid), std::convert::Infallible> { match queue_song_flow(&app).await { - Ok(song_response) => { + Ok((song_response, user_id)) => { let resp = super::get_resp_data::< crate::callers::metadata::response::fetch_metadata::Response, >(song_response) @@ -1100,7 +1113,7 @@ mod tests { // Send request match sequence_flow::queue_song_flow(&app).await { - Ok(response) => { + Ok((response, user_id)) => { let resp = get_resp_data::< crate::callers::metadata::response::fetch_metadata::Response, >(response) @@ -1416,7 +1429,7 @@ mod tests { // Send request match sequence_flow::queue_song_flow(&app).await { - Ok(response) => { + Ok((response, user_id)) => { let resp = get_resp_data::< crate::callers::metadata::response::fetch_metadata::Response, >(response) @@ -1479,7 +1492,7 @@ mod tests { // Send request match sequence_flow::queue_song_flow(&app).await { - Ok(response) => { + Ok((response, user_id)) => { let resp = get_resp_data::< crate::callers::metadata::response::fetch_metadata::Response, >(response) @@ -1574,7 +1587,7 @@ mod tests { // Send request match sequence_flow::queue_song_flow(&app).await { - Ok(response) => { + Ok((response, user_id)) => { let resp = get_resp_data::< crate::callers::metadata::response::fetch_metadata::Response, >(response) @@ -1679,7 +1692,7 @@ mod tests { let app = init::app(pool).await; match sequence_flow::queue_song_flow(&app).await { - Ok(response) => { + Ok((response, user_id)) => { let resp = get_resp_data::< crate::callers::metadata::response::fetch_metadata::Response, >(response) -- 2.47.3 From fd1142b66ef16c61dd04317f7db06e23d4190390 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Mon, 21 Jul 2025 20:21:11 -0400 Subject: [PATCH 17/24] Making use of user_id in test requests --- src/main.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index 5223e0f..9594e98 100644 --- a/src/main.rs +++ b/src/main.rs @@ -405,6 +405,7 @@ mod tests { async fn create_song_req( app: &axum::Router, song_queue_id: &uuid::Uuid, + user_id: &uuid::Uuid, ) -> Result { let payload = serde_json::json!({ "title": "Power of Soul", @@ -419,7 +420,7 @@ mod tests { "disc_count": 1, "duration": 330, "audio_type": "flac", - "user_id": "d6e159c1-9648-4c85-81e5-52f502ff53e4", + "user_id": user_id, "song_queue_id": song_queue_id }); @@ -579,7 +580,7 @@ mod tests { assert_eq!(false, resp.data.is_empty(), "Data should not be empty"); let song_queue_id = resp.data[0].song_queue_id; - match super::create_song_req(&app, &song_queue_id).await { + match super::create_song_req(&app, &song_queue_id, &user_id).await { Ok(response) => { let resp = super::get_resp_data::< crate::callers::song::response::create_metadata::Response, @@ -1113,7 +1114,7 @@ mod tests { // Send request match sequence_flow::queue_song_flow(&app).await { - Ok((response, user_id)) => { + Ok((response, _user_id)) => { let resp = get_resp_data::< crate::callers::metadata::response::fetch_metadata::Response, >(response) @@ -1437,7 +1438,7 @@ mod tests { assert_eq!(false, resp.data.is_empty(), "Data should not be empty"); let song_q_id = resp.data[0].song_queue_id; - match create_song_req(&app, &song_q_id).await { + match create_song_req(&app, &song_q_id, &user_id).await { Ok(response) => { let resp = get_resp_data::< crate::callers::song::response::create_metadata::Response, @@ -1500,7 +1501,7 @@ mod tests { assert_eq!(false, resp.data.is_empty(), "Data should not be empty"); let song_queue_id = resp.data[0].song_queue_id; - match create_song_req(&app, &song_queue_id).await { + match create_song_req(&app, &song_queue_id, &user_id).await { Ok(response) => { let resp = get_resp_data::< crate::callers::song::response::create_metadata::Response, @@ -1595,7 +1596,7 @@ mod tests { assert_eq!(false, resp.data.is_empty(), "Data should not be empty"); let song_q_id = resp.data[0].song_queue_id; - match create_song_req(&app, &song_q_id).await { + match create_song_req(&app, &song_q_id, &user_id).await { Ok(response) => { let resp = get_resp_data::< crate::callers::song::response::create_metadata::Response, @@ -1700,7 +1701,7 @@ mod tests { assert_eq!(false, resp.data.is_empty(), "Data should not be empty"); let song_queue_id = resp.data[0].song_queue_id; - match create_song_req(&app, &song_queue_id).await { + match create_song_req(&app, &song_queue_id, &user_id).await { Ok(response) => { let resp = get_resp_data::< crate::callers::song::response::create_metadata::Response, -- 2.47.3 From 3e82d7e3d6ebdbb6f6f2df04a9d9ffe226ce194c Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Mon, 21 Jul 2025 20:21:43 -0400 Subject: [PATCH 18/24] Code formatting --- src/callers/song.rs | 20 ++++++-------------- src/main.rs | 40 +++++++++++++++++++++++----------------- 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/src/callers/song.rs b/src/callers/song.rs index 724cd8a..7d23857 100644 --- a/src/callers/song.rs +++ b/src/callers/song.rs @@ -438,13 +438,9 @@ mod song_queue { .map_err(|_e| sqlx::Error::RowNotFound) .unwrap(), user_id: match user_id_result { - Ok(id) => { - id - } - Err(_) => { - uuid::Uuid::nil() - } - } + Ok(id) => id, + Err(_) => uuid::Uuid::nil(), + }, }; Ok(song_queue) @@ -565,13 +561,9 @@ mod song_queue { .map_err(|_e| sqlx::Error::RowNotFound) .unwrap(), user_id: match user_id_result { - Ok(id) => { - id - } - Err(_) => { - uuid::Uuid::nil() - } - } + Ok(id) => id, + Err(_) => uuid::Uuid::nil(), + }, }; Ok(song_queue) diff --git a/src/main.rs b/src/main.rs index 9594e98..90645e5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -493,30 +493,36 @@ mod tests { // match super::get_resp_data::(response).await { match super::song_queue_link_req(&app, &song_queue_id, &user_id).await { - Ok(response) => { - let resp = super::get_resp_data::(response).await; - assert_eq!(false, resp.data.is_empty(), "The response should not be empty"); + Ok(response) => { + let resp = super::get_resp_data::< + crate::callers::song::response::link_user_id::Response, + >(response) + .await; + assert_eq!( + false, + resp.data.is_empty(), + "The response should not be empty" + ); - match super::queue_metadata_req(&app, &song_queue_id).await { - Ok(response) => { - let resp = super::get_resp_data::< - crate::callers::song::response::Response, - >(response) - .await; - assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + match super::queue_metadata_req(&app, &song_queue_id).await { + Ok(response) => { + let resp = super::get_resp_data::< + crate::callers::song::response::Response, + >(response) + .await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); - let id = resp.data[0]; + let id = resp.data[0]; - match super::fetch_metadata_queue_req(&app, &id).await { - Ok(response) => Ok((response, user_id)), - Err(err) => Err(err), - } + match super::fetch_metadata_queue_req(&app, &id).await { + Ok(response) => Ok((response, user_id)), + Err(err) => Err(err), } } + } } - Err(err) => Err(err) + Err(err) => Err(err), } - } Err(err) => Err(err), } -- 2.47.3 From ff6fe3fbbb8a1cd37f24badec159e1956446bb30 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Mon, 21 Jul 2025 20:29:37 -0400 Subject: [PATCH 19/24] Updated workflow --- .github/workflows/workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 74b4171..f1c7633 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -59,7 +59,7 @@ jobs: mkdir -p ~/.ssh echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/gitea_deploy_key chmod 600 ~/.ssh/gitea_deploy_key - ssh-keyscan ${{ vars.MYHOST }} >> ~/.ssh/known_hosts + ssh-keyscan ${{ vars.MYHOST }} -p >> ~/.ssh/known_hosts eval $(ssh-agent -s) ssh-add -v ~/.ssh/gitea_deploy_key cargo build --verbose --release -- 2.47.3 From f80510a564d46112a4a5e33bdc6b3714620bb609 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Mon, 21 Jul 2025 20:35:52 -0400 Subject: [PATCH 20/24] Forgot to include port --- .github/workflows/workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index f1c7633..9bf4c59 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -59,7 +59,7 @@ jobs: mkdir -p ~/.ssh echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/gitea_deploy_key chmod 600 ~/.ssh/gitea_deploy_key - ssh-keyscan ${{ vars.MYHOST }} -p >> ~/.ssh/known_hosts + ssh-keyscan -p 8122 ${{ vars.MYHOST }} >> ~/.ssh/known_hosts eval $(ssh-agent -s) ssh-add -v ~/.ssh/gitea_deploy_key cargo build --verbose --release -- 2.47.3 From 54b5b0d71747ef5faf0ea6ab13f38237b36549f9 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Mon, 21 Jul 2025 21:29:20 -0400 Subject: [PATCH 21/24] Docker changes for port change --- Dockerfile | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 7adcf8e..5470890 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,10 +16,17 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ openssh-client git \ && rm -rf /var/lib/apt/lists/* +# Configure SSH to use the custom port (e.g., 2222) +RUN mkdir -p ~/.ssh && \ + echo "Host git.kundeng.us" >> ~/.ssh/config && \ + echo " Port 8122" >> ~/.ssh/config && \ + echo " User git" >> ~/.ssh/config && \ + chmod 600 ~/.ssh/config + # << --- ADD HOST KEY HERE --- >> # Replace 'yourgithost.com' with the actual hostname (e.g., github.com) RUN mkdir -p -m 0700 ~/.ssh && \ - ssh-keyscan git.kundeng.us >> ~/.ssh/known_hosts + ssh-keyscan -p 8122 git.kundeng.us >> ~/.ssh/known_hosts # Copy Cargo manifests COPY Cargo.toml Cargo.lock ./ -- 2.47.3 From fff81ca105aff8ba05e584463d0ada98764ab8a1 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Mon, 21 Jul 2025 23:13:44 -0400 Subject: [PATCH 22/24] Reverting port changes --- .github/workflows/workflow.yml | 2 +- Dockerfile | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 9bf4c59..74b4171 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -59,7 +59,7 @@ jobs: mkdir -p ~/.ssh echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/gitea_deploy_key chmod 600 ~/.ssh/gitea_deploy_key - ssh-keyscan -p 8122 ${{ vars.MYHOST }} >> ~/.ssh/known_hosts + ssh-keyscan ${{ vars.MYHOST }} >> ~/.ssh/known_hosts eval $(ssh-agent -s) ssh-add -v ~/.ssh/gitea_deploy_key cargo build --verbose --release diff --git a/Dockerfile b/Dockerfile index 5470890..f18a224 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,17 +16,13 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ openssh-client git \ && rm -rf /var/lib/apt/lists/* -# Configure SSH to use the custom port (e.g., 2222) RUN mkdir -p ~/.ssh && \ echo "Host git.kundeng.us" >> ~/.ssh/config && \ - echo " Port 8122" >> ~/.ssh/config && \ echo " User git" >> ~/.ssh/config && \ chmod 600 ~/.ssh/config # << --- ADD HOST KEY HERE --- >> -# Replace 'yourgithost.com' with the actual hostname (e.g., github.com) -RUN mkdir -p -m 0700 ~/.ssh && \ - ssh-keyscan -p 8122 git.kundeng.us >> ~/.ssh/known_hosts +RUN ssh-keyscan git.kundeng.us >> ~/.ssh/known_hosts # Copy Cargo manifests COPY Cargo.toml Cargo.lock ./ -- 2.47.3 From 03b8b26c407e245400806cc28d60808809651e76 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Tue, 22 Jul 2025 21:26:03 -0400 Subject: [PATCH 23/24] Cleaning up Dockerfile --- Dockerfile | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index f18a224..d809e75 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,9 @@ # Stage 1: Build the application -# Use a specific Rust version for reproducibility. Choose one that matches your development environment. -# Using slim variant for smaller base image FROM rust:1.88 as builder # Set the working directory inside the container WORKDIR /usr/src/app -# Install build dependencies if needed (e.g., for certain crates like sqlx with native TLS) -# RUN apt-get update && apt-get install -y pkg-config libssl-dev - # Install build dependencies if needed (e.g., git for cloning) RUN apt-get update && apt-get install -y --no-install-recommends \ pkg-config libssl3 \ @@ -16,7 +11,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ openssh-client git \ && rm -rf /var/lib/apt/lists/* -RUN mkdir -p ~/.ssh && \ +# Create .ssh/ directory for internal dependencies +RUN mkdir -p -m 0700 ~/.ssh && \ echo "Host git.kundeng.us" >> ~/.ssh/config && \ echo " User git" >> ~/.ssh/config && \ chmod 600 ~/.ssh/config -- 2.47.3 From 9041886cf5d706c076367908b0f1093d47c5c0bb Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Tue, 22 Jul 2025 21:28:13 -0400 Subject: [PATCH 24/24] Version bump --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f025459..bc99eb6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -752,7 +752,7 @@ dependencies = [ [[package]] name = "icarus" -version = "0.1.92" +version = "0.1.93" dependencies = [ "axum", "common-multipart-rfc7578", diff --git a/Cargo.toml b/Cargo.toml index bf10ee0..e88cf17 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "icarus" -version = "0.1.92" +version = "0.1.93" edition = "2024" rust-version = "1.88" -- 2.47.3