From cfce631a0546b73fdeefa18e4ef49f83e2d8a857 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Mon, 18 Aug 2025 19:21:01 -0400 Subject: [PATCH 1/9] tsk-176: Added function to retrieve all songs --- src/callers/song.rs | 120 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/src/callers/song.rs b/src/callers/song.rs index fcdcfd6..71f44eb 100644 --- a/src/callers/song.rs +++ b/src/callers/song.rs @@ -351,6 +351,109 @@ pub mod song_db { } } + pub async fn get_all_songs(pool: &sqlx::PgPool) -> Result, sqlx::Error> { + let result = sqlx::query( + r#" + SELECT * FROM "song"; + "# + ) + .fetch_all(pool) + .await + .map_err(|e| { + eprintln!("Error querying data: {e:?}"); + }); + + match result { + Ok(rows) => { + let mut songs: Vec = Vec::new(); + + for row in rows { + + let date_created_time: time::OffsetDateTime = row + .try_get("date_created") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(); + + let song = icarus_models::song::Song { + id: row + .try_get("id") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + title: row + .try_get("title") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + artist: row + .try_get("artist") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + album_artist: row + .try_get("album_artist") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + album: row + .try_get("album") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + genre: row + .try_get("genre") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + year: row + .try_get("year") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + track: row + .try_get("track") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + disc: row + .try_get("disc") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + track_count: row + .try_get("track_count") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + disc_count: row + .try_get("disc_count") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + duration: row + .try_get("duration") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + audio_type: row + .try_get("audio_type") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + filename: row + .try_get("filename") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + directory: row + .try_get("directory") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + date_created: date_created_time.to_string(), + user_id: row + .try_get("user_id") + .map_err(|_e| sqlx::Error::RowNotFound) + .unwrap(), + data: Vec::new(), + }; + + songs.push(song); + } + + Ok(songs) + } + Err(_err) => { + Err(sqlx::Error::RowNotFound) + } + } + } + pub async fn delete_song( pool: &sqlx::PgPool, id: &uuid::Uuid, @@ -1126,6 +1229,23 @@ pub mod endpoint { } } + pub async fn get_all_songs(axum::Extension(pool): axum::Extension, + ) -> (axum::http::StatusCode, axum::Json) { + let mut response = super::response::get_songs::Response::default(); + + match super::song_db::get_all_songs(&pool).await { + Ok(songs) => { + response.message = String::from(super::super::response::SUCCESSFUL); + response.data = songs; + (axum::http::StatusCode::OK, axum::Json(response)) + } + Err(err) => { + response.message = err.to_string(); + (axum::http::StatusCode::NOT_FOUND, axum::Json(response)) + } + } + } + pub async fn stream_song( axum::Extension(pool): axum::Extension, axum::extract::Path(id): axum::extract::Path, -- 2.47.3 From 9cdc16f7fb246667bcd5a49e2d101364ed952579 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Mon, 18 Aug 2025 19:24:11 -0400 Subject: [PATCH 2/9] tsk-176: Depdendency version bump icarus_envy, icarus_meta, and icarus_models --- Cargo.lock | 10 +++++----- Cargo.toml | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2c870c7..de9690f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -849,8 +849,8 @@ dependencies = [ [[package]] name = "icarus_envy" -version = "0.3.0" -source = "git+ssh://git@git.kundeng.us/phoenix/icarus_envy.git?tag=v0.3.0-devel-d73fba9899-006#d73fba9899372b0655a90cb426645930135152da" +version = "0.3.2" +source = "git+ssh://git@git.kundeng.us/phoenix/icarus_envy.git?tag=v0.3.2#d84a8144aedf02e1b459d67c4023a7e0833f89fd" dependencies = [ "const_format", "dotenvy", @@ -859,15 +859,15 @@ dependencies = [ [[package]] name = "icarus_meta" version = "0.3.0" -source = "git+ssh://git@git.kundeng.us/phoenix/icarus_meta.git?tag=v0.3.0-devel-f4b71de969-680#f4b71de9692029a706b1ce82c39f6715c560158e" +source = "git+ssh://git@git.kundeng.us/phoenix/icarus_meta.git?tag=v0.3.0#f87c049ab3139995230485b33038a0425f2e7430" dependencies = [ "lofty", ] [[package]] name = "icarus_models" -version = "0.5.2" -source = "git+ssh://git@git.kundeng.us/phoenix/icarus_models.git?tag=v0.5.2-devel-d3251f935e-111#d3251f935e76caa110727203d910ee0683a668a0" +version = "0.5.5" +source = "git+ssh://git@git.kundeng.us/phoenix/icarus_models.git?tag=v0.5.5#f43bcaa314694c25cea65dbfcfbabc8fc7bf395a" dependencies = [ "josekit", "rand 0.9.1", diff --git a/Cargo.toml b/Cargo.toml index d4f288e..00bc4b3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,9 +23,9 @@ thiserror = "1.0" base64 = "0.21" jsonwebtoken = { version = "9.3.1" } josekit = { version = "0.10.1" } -icarus_meta = { git = "ssh://git@git.kundeng.us/phoenix/icarus_meta.git", tag = "v0.3.0-devel-f4b71de969-680" } -icarus_models = { git = "ssh://git@git.kundeng.us/phoenix/icarus_models.git", tag = "v0.5.2-devel-d3251f935e-111" } -icarus_envy = { git = "ssh://git@git.kundeng.us/phoenix/icarus_envy.git", tag = "v0.3.0-devel-d73fba9899-006" } +icarus_meta = { git = "ssh://git@git.kundeng.us/phoenix/icarus_meta.git", tag = "v0.3.0" } +icarus_models = { git = "ssh://git@git.kundeng.us/phoenix/icarus_models.git", tag = "v0.5.5" } +icarus_envy = { git = "ssh://git@git.kundeng.us/phoenix/icarus_envy.git", tag = "v0.3.2" } [dev-dependencies] common-multipart-rfc7578 = { version = "0.7.0" } -- 2.47.3 From 8a49b23dc4cabaaefbd55e0913ad8f749fb39e31 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Mon, 18 Aug 2025 19:43:34 -0400 Subject: [PATCH 3/9] tsk-176: Fix after icarus_models change --- src/callers/mod.rs | 1 + src/main.rs | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/callers/mod.rs b/src/callers/mod.rs index cadc8ac..f19362a 100644 --- a/src/callers/mod.rs +++ b/src/callers/mod.rs @@ -17,6 +17,7 @@ pub mod endpoints { pub const CREATESONG: &str = "/api/v2/song"; pub const GETSONGS: &str = "/api/v2/song"; + pub const GETALLSONGS: &str = "/api/v2/song/all"; pub const STREAMSONG: &str = "/api/v2/song/stream/{id}"; pub const DOWNLOADSONG: &str = "/api/v2/song/download/{id}"; pub const DELETESONG: &str = "/api/v2/song/{id}"; diff --git a/src/main.rs b/src/main.rs index 8207964..8ee1a81 100644 --- a/src/main.rs +++ b/src/main.rs @@ -341,10 +341,24 @@ mod tests { ) } + /* + pub fn test_user_id() -> uuid::Uuid { + uuid::Uuid::new_v4() + } + */ + pub const TEST_USER_ID: uuid::Uuid = uuid::uuid!("cc938368-615a-4694-b2ca-6e122fa31c52"); + pub async fn test_token() -> Result { let key: String = icarus_envy::environment::get_secret_main_key().await; let (message, issuer, audience) = token_fields(); + let token_resource = icarus_models::token::TokenResource { + message: message, + issuer: issuer, + audiences: vec![audience], + id: TEST_USER_ID, + }; + match icarus_models::token::create_token(&key, &message, &issuer, &audience) { Ok((access_token, _some_time)) => Ok(access_token), Err(err) => Err(err), @@ -607,9 +621,8 @@ mod tests { let song_queue_id = resp.data[0]; assert_eq!(false, song_queue_id.is_nil(), "Should not be empty"); - let user_id = uuid::Uuid::new_v4(); + let user_id = TEST_USER_ID; - // match super::get_resp_data::(response).await { match super::song_queue_link_req(&app, &song_queue_id, &user_id).await { Ok(response) => { @@ -876,7 +889,7 @@ mod tests { 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(); + let user_id = TEST_USER_ID; println!("User Id: {user_id:?}"); match song_queue_link_req(&app, &song_queue_id, &user_id).await { -- 2.47.3 From ed28b7303d5c8b2a6905b5056b3b94eefb3a1c36 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Mon, 18 Aug 2025 19:49:06 -0400 Subject: [PATCH 4/9] tsk-176: Test fix --- src/main.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index 8ee1a81..abb803b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -359,7 +359,7 @@ mod tests { id: TEST_USER_ID, }; - match icarus_models::token::create_token(&key, &message, &issuer, &audience) { + match icarus_models::token::create_token(&key, &token_resource, time::Duration::hours(1)) { Ok((access_token, _some_time)) => Ok(access_token), Err(err) => Err(err), } @@ -621,8 +621,7 @@ mod tests { let song_queue_id = resp.data[0]; assert_eq!(false, song_queue_id.is_nil(), "Should not be empty"); - let user_id = TEST_USER_ID; - + let user_id = super::TEST_USER_ID; match super::song_queue_link_req(&app, &song_queue_id, &user_id).await { Ok(response) => { -- 2.47.3 From 14014c35f894cbff0a96be184b258fd0c7f24e13 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Mon, 18 Aug 2025 19:49:15 -0400 Subject: [PATCH 5/9] tsk-176: Formatting --- src/callers/song.rs | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/callers/song.rs b/src/callers/song.rs index 71f44eb..2bfc552 100644 --- a/src/callers/song.rs +++ b/src/callers/song.rs @@ -351,24 +351,25 @@ pub mod song_db { } } - pub async fn get_all_songs(pool: &sqlx::PgPool) -> Result, sqlx::Error> { + pub async fn get_all_songs( + pool: &sqlx::PgPool, + ) -> Result, sqlx::Error> { let result = sqlx::query( r#" SELECT * FROM "song"; - "# - ) - .fetch_all(pool) - .await - .map_err(|e| { - eprintln!("Error querying data: {e:?}"); - }); + "#, + ) + .fetch_all(pool) + .await + .map_err(|e| { + eprintln!("Error querying data: {e:?}"); + }); match result { Ok(rows) => { let mut songs: Vec = Vec::new(); for row in rows { - let date_created_time: time::OffsetDateTime = row .try_get("date_created") .map_err(|_e| sqlx::Error::RowNotFound) @@ -448,9 +449,7 @@ pub mod song_db { Ok(songs) } - Err(_err) => { - Err(sqlx::Error::RowNotFound) - } + Err(_err) => Err(sqlx::Error::RowNotFound), } } @@ -1229,8 +1228,12 @@ pub mod endpoint { } } - pub async fn get_all_songs(axum::Extension(pool): axum::Extension, - ) -> (axum::http::StatusCode, axum::Json) { + pub async fn get_all_songs( + axum::Extension(pool): axum::Extension, + ) -> ( + axum::http::StatusCode, + axum::Json, + ) { let mut response = super::response::get_songs::Response::default(); match super::song_db::get_all_songs(&pool).await { -- 2.47.3 From b8ec22a9f553d2b872716c157e1b56384c096fc4 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Tue, 19 Aug 2025 11:51:42 -0400 Subject: [PATCH 6/9] tsk-176: Endpoint is now available --- src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.rs b/src/main.rs index abb803b..d6971ba 100644 --- a/src/main.rs +++ b/src/main.rs @@ -190,6 +190,7 @@ pub mod init { axum::middleware::from_fn(crate::auth::auth::), ), ) + .route(crate::callers::endpoints::GETALLSONGS, get(crate::callers::song::endpoint::get_all_songs)) } pub async fn app() -> axum::Router { -- 2.47.3 From 9f72ea33db409ffa466a20c7e92864cb8448f80f Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Tue, 19 Aug 2025 12:02:36 -0400 Subject: [PATCH 7/9] tsk-176: Added test --- src/main.rs | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/main.rs b/src/main.rs index d6971ba..ad32b83 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2448,5 +2448,58 @@ mod tests { let _ = super::db_mgr::drop_database(&tm_pool, &db_name).await; } + + #[tokio::test] + async fn test_get_all_songs() { + let tm_pool = super::db_mgr::get_pool().await.unwrap(); + let db_name = super::db_mgr::generate_db_name().await; + + match super::db_mgr::create_database(&tm_pool, &db_name).await { + Ok(_) => { + println!("Success"); + } + Err(err) => { + assert!(false, "Error: {:?}", err); + } + } + + let pool = super::db_mgr::connect_to_db(&db_name).await.unwrap(); + super::db_mgr::migrations(&pool).await; + + let app = super::init::app(pool).await; + + match app + .clone() + .oneshot( + axum::http::Request::builder() + .method(axum::http::Method::GET) + .uri(crate::callers::endpoints::GETALLSONGS) + .header(axum::http::header::CONTENT_TYPE, "application/json") + .header( + axum::http::header::AUTHORIZATION, + super::bearer_auth().await, + ) + .body(axum::body::Body::empty()) + .unwrap(), + ) + .await + { + Ok(response) => { + let resp = super::get_resp_data::< + crate::callers::song::response::get_songs::Response, + >(response) + .await; + assert_eq!(false, resp.data.is_empty(), "Should not be empty"); + + let songs = &resp.data; + assert_eq!(2, songs.len(), "Returned song count does not match. Returned song count {:?} song count {}", songs.len(), 2); + } + Err(err) => { + assert!(false, "Error: {err:?}"); + } + } + + let _ = super::db_mgr::drop_database(&tm_pool, &db_name).await; + } } } -- 2.47.3 From 5c066989df295e7ca700c95cb8734f735e4ec9ea Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Tue, 19 Aug 2025 12:07:34 -0400 Subject: [PATCH 8/9] tsk-176: Cleanup --- src/main.rs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main.rs b/src/main.rs index ad32b83..f016dbf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -190,7 +190,10 @@ pub mod init { axum::middleware::from_fn(crate::auth::auth::), ), ) - .route(crate::callers::endpoints::GETALLSONGS, get(crate::callers::song::endpoint::get_all_songs)) + .route( + crate::callers::endpoints::GETALLSONGS, + get(crate::callers::song::endpoint::get_all_songs), + ) } pub async fn app() -> axum::Router { @@ -342,11 +345,6 @@ mod tests { ) } - /* - pub fn test_user_id() -> uuid::Uuid { - uuid::Uuid::new_v4() - } - */ pub const TEST_USER_ID: uuid::Uuid = uuid::uuid!("cc938368-615a-4694-b2ca-6e122fa31c52"); pub async fn test_token() -> Result { @@ -2492,7 +2490,13 @@ mod tests { assert_eq!(false, resp.data.is_empty(), "Should not be empty"); let songs = &resp.data; - assert_eq!(2, songs.len(), "Returned song count does not match. Returned song count {:?} song count {}", songs.len(), 2); + assert_eq!( + 2, + songs.len(), + "Returned song count does not match. Returned song count {:?} song count {}", + songs.len(), + 2 + ); } Err(err) => { assert!(false, "Error: {err:?}"); -- 2.47.3 From 0d5cd5e9c86a56d1ddd5e22cae273b77b917a1c0 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Tue, 19 Aug 2025 12:07:46 -0400 Subject: [PATCH 9/9] tsk-176: Version bump --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index de9690f..7524b89 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -819,7 +819,7 @@ dependencies = [ [[package]] name = "icarus" -version = "0.1.101" +version = "0.1.102" dependencies = [ "axum", "axum-extra", diff --git a/Cargo.toml b/Cargo.toml index 00bc4b3..74ef755 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "icarus" -version = "0.1.101" +version = "0.1.102" edition = "2024" rust-version = "1.88" -- 2.47.3