Downloading song endpoint #165

Merged
kdeng00 merged 6 commits from download_song into v0.2 2025-07-28 16:40:14 -04:00
2 changed files with 39 additions and 25 deletions
Showing only changes of commit 0a4d1807e1 - Show all commits
+31 -21
View File
@@ -1060,28 +1060,38 @@ pub mod endpoint {
}
}
pub async fn download_song(axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::extract::Path(id): axum::extract::Path<uuid::Uuid>)
-> (axum::http::StatusCode, axum::response::Response) {
match super::song_db::get_song(&pool, &id).await {
Ok(song) => match song.to_data() {
Ok(data) => {
let bytes = axum::body::Bytes::from(data);
let mut response = bytes.into_response();
let headers = response.headers_mut();
headers.insert(axum::http::header::CONTENT_TYPE, "audio/flac".parse().unwrap());
headers.insert(axum::http::header::CONTENT_DISPOSITION, format!("attachment; filename=\"{id}.flac\"").parse().unwrap());
pub async fn download_song(
axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::extract::Path(id): axum::extract::Path<uuid::Uuid>,
) -> (axum::http::StatusCode, axum::response::Response) {
match super::song_db::get_song(&pool, &id).await {
Ok(song) => match song.to_data() {
Ok(data) => {
let bytes = axum::body::Bytes::from(data);
let mut response = bytes.into_response();
let headers = response.headers_mut();
headers.insert(
axum::http::header::CONTENT_TYPE,
"audio/flac".parse().unwrap(),
);
headers.insert(
axum::http::header::CONTENT_DISPOSITION,
format!("attachment; filename=\"{id}.flac\"")
.parse()
.unwrap(),
);
(axum::http::StatusCode::OK, response)
}
Err(_err) => {
(axum::http::StatusCode::INTERNAL_SERVER_ERROR, axum::response::Response::default())
}
(axum::http::StatusCode::OK, response)
}
Err(_err) => {
(axum::http::StatusCode::NOT_FOUND, axum::response::Response::default())
}
}
Err(_err) => (
axum::http::StatusCode::INTERNAL_SERVER_ERROR,
axum::response::Response::default(),
),
},
Err(_err) => (
axum::http::StatusCode::NOT_FOUND,
axum::response::Response::default(),
),
}
}
}
+8 -4
View File
@@ -127,7 +127,10 @@ pub mod init {
crate::callers::endpoints::STREAMSONG,
get(crate::callers::song::endpoint::stream_song),
)
.route(crate::callers::endpoints::DOWNLOADSONG, get(crate::callers::song::endpoint::download_song))
.route(
crate::callers::endpoints::DOWNLOADSONG,
get(crate::callers::song::endpoint::download_song),
)
}
pub async fn app() -> axum::Router {
@@ -656,8 +659,8 @@ mod tests {
}
pub async fn format_url_with_value(endpoint: &str, value: &uuid::Uuid) -> String {
let last = endpoint.len() - 5;
format!("{}/{value}", &endpoint[0..last])
let last = endpoint.len() - 5;
format!("{}/{value}", &endpoint[0..last])
}
// TODO: Change the name of the function to be more expressive and put into it's own module
@@ -2025,7 +2028,8 @@ mod tests {
let id = test_data::song_id().await.unwrap();
let uri = super::format_url_with_value(crate::callers::endpoints::DOWNLOADSONG, &id).await;
let uri =
super::format_url_with_value(crate::callers::endpoints::DOWNLOADSONG, &id).await;
match app
.clone()