tsk-170: Saving changes

This commit is contained in:
kdeng00
2025-08-22 15:53:29 -04:00
parent 922a6b9a35
commit 594410cb12
4 changed files with 302 additions and 17 deletions
+104
View File
@@ -465,6 +465,19 @@ pub mod endpoint {
use axum::response::IntoResponse; use axum::response::IntoResponse;
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn queue( pub async fn queue(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
mut multipart: axum::extract::Multipart, mut multipart: axum::extract::Multipart,
@@ -510,6 +523,19 @@ pub mod endpoint {
} }
} }
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn link( pub async fn link(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::Json(payload): axum::Json<super::request::link::Request>, axum::Json(payload): axum::Json<super::request::link::Request>,
@@ -537,6 +563,19 @@ pub mod endpoint {
} }
} }
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn fetch_coverart_no_data( pub async fn fetch_coverart_no_data(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::extract::Query(params): axum::extract::Query< axum::extract::Query(params): axum::extract::Query<
@@ -584,6 +623,19 @@ pub mod endpoint {
} }
} }
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn fetch_coverart_with_data( pub async fn fetch_coverart_with_data(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::extract::Path(id): axum::extract::Path<uuid::Uuid>, axum::extract::Path(id): axum::extract::Path<uuid::Uuid>,
@@ -612,6 +664,19 @@ pub mod endpoint {
} }
} }
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn create_coverart( pub async fn create_coverart(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::Json(payload): axum::Json<super::request::create_coverart::Request>, axum::Json(payload): axum::Json<super::request::create_coverart::Request>,
@@ -672,6 +737,19 @@ pub mod endpoint {
} }
} }
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn wipe_data_from_coverart_queue( pub async fn wipe_data_from_coverart_queue(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::Json(payload): axum::Json<super::request::wipe_data_from_coverart_queue::Request>, axum::Json(payload): axum::Json<super::request::wipe_data_from_coverart_queue::Request>,
@@ -701,6 +779,19 @@ pub mod endpoint {
} }
} }
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn get_coverart( pub async fn get_coverart(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::extract::Query(params): axum::extract::Query<super::request::get_coverart::Params>, axum::extract::Query(params): axum::extract::Query<super::request::get_coverart::Params>,
@@ -729,6 +820,19 @@ pub mod endpoint {
} }
} }
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn download_coverart( pub async fn download_coverart(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::extract::Path(id): axum::extract::Path<uuid::Uuid>, axum::extract::Path(id): axum::extract::Path<uuid::Uuid>,
+26
View File
@@ -207,6 +207,19 @@ pub mod metadata_queue {
pub mod endpoint { pub mod endpoint {
use axum::{Json, http::StatusCode}; use axum::{Json, http::StatusCode};
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn queue_metadata( pub async fn queue_metadata(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
Json(payload): Json<super::request::queue_metadata::Request>, Json(payload): Json<super::request::queue_metadata::Request>,
@@ -233,6 +246,19 @@ pub mod endpoint {
} }
} }
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn fetch_metadata( pub async fn fetch_metadata(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::extract::Query(params): axum::extract::Query<super::request::fetch_metadata::Params>, axum::extract::Query(params): axum::extract::Query<super::request::fetch_metadata::Params>,
+168 -15
View File
@@ -21,7 +21,7 @@ pub mod request {
} }
pub mod update_status { pub mod update_status {
#[derive(Default, serde::Deserialize, serde::Serialize)] #[derive(Default, serde::Deserialize, serde::Serialize, utoipa::ToSchema)]
pub struct Request { pub struct Request {
pub id: uuid::Uuid, pub id: uuid::Uuid,
pub status: String, pub status: String,
@@ -29,7 +29,7 @@ pub mod request {
} }
pub mod create_metadata { pub mod create_metadata {
#[derive(Debug, serde::Deserialize, serde::Serialize)] #[derive(Debug, serde::Deserialize, serde::Serialize, utoipa::ToSchema)]
pub struct Request { pub struct Request {
pub title: String, pub title: String,
pub artist: String, pub artist: String,
@@ -92,14 +92,14 @@ pub mod request {
} }
pub mod wipe_data_from_song_queue { pub mod wipe_data_from_song_queue {
#[derive(Debug, serde::Deserialize, serde::Serialize)] #[derive(Debug, serde::Deserialize, serde::Serialize, utoipa::ToSchema)]
pub struct Request { pub struct Request {
pub song_queue_id: uuid::Uuid, pub song_queue_id: uuid::Uuid,
} }
} }
pub mod link_user_id { pub mod link_user_id {
#[derive(Debug, serde::Deserialize, serde::Serialize)] #[derive(Debug, serde::Deserialize, serde::Serialize, utoipa::ToSchema)]
pub struct Request { pub struct Request {
pub song_queue_id: uuid::Uuid, pub song_queue_id: uuid::Uuid,
pub user_id: uuid::Uuid, pub user_id: uuid::Uuid,
@@ -107,7 +107,7 @@ pub mod request {
} }
pub mod get_songs { pub mod get_songs {
#[derive(Debug, Default, serde::Deserialize, serde::Serialize)] #[derive(Debug, Default, serde::Deserialize, serde::Serialize, utoipa::ToSchema)]
pub struct Params { pub struct Params {
pub id: Option<uuid::Uuid>, pub id: Option<uuid::Uuid>,
} }
@@ -128,7 +128,7 @@ pub mod response {
pub mod fetch_queue_song { pub mod fetch_queue_song {
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(Default, Deserialize, Serialize)] #[derive(Default, Deserialize, Serialize, utoipa::ToSchema)]
pub struct Response { pub struct Response {
pub message: String, pub message: String,
pub data: Vec<crate::callers::song::song_queue::SongQueue>, pub data: Vec<crate::callers::song::song_queue::SongQueue>,
@@ -136,7 +136,7 @@ pub mod response {
} }
pub mod update_status { pub mod update_status {
#[derive(serde::Deserialize, serde::Serialize)] #[derive(serde::Deserialize, serde::Serialize, utoipa::ToSchema)]
pub struct ChangedStatus { pub struct ChangedStatus {
pub old_status: String, pub old_status: String,
pub new_status: String, pub new_status: String,
@@ -150,7 +150,7 @@ pub mod response {
} }
pub mod update_song_queue { pub mod update_song_queue {
#[derive(Default, serde::Deserialize, serde::Serialize)] #[derive(Default, serde::Deserialize, serde::Serialize, utoipa::ToSchema)]
pub struct Response { pub struct Response {
pub message: String, pub message: String,
pub data: Vec<uuid::Uuid>, pub data: Vec<uuid::Uuid>,
@@ -158,7 +158,7 @@ pub mod response {
} }
pub mod create_metadata { pub mod create_metadata {
#[derive(Debug, Default, serde::Deserialize, serde::Serialize)] #[derive(Debug, Default, serde::Deserialize, serde::Serialize, utoipa::ToSchema)]
pub struct Response { pub struct Response {
pub message: String, pub message: String,
pub data: Vec<icarus_models::song::Song>, pub data: Vec<icarus_models::song::Song>,
@@ -166,7 +166,7 @@ pub mod response {
} }
pub mod wipe_data_from_song_queue { pub mod wipe_data_from_song_queue {
#[derive(Debug, Default, serde::Deserialize, serde::Serialize)] #[derive(Debug, Default, serde::Deserialize, serde::Serialize, utoipa::ToSchema)]
pub struct Response { pub struct Response {
pub message: String, pub message: String,
pub data: Vec<uuid::Uuid>, pub data: Vec<uuid::Uuid>,
@@ -174,7 +174,7 @@ pub mod response {
} }
pub mod link_user_id { pub mod link_user_id {
#[derive(Debug, Default, serde::Deserialize, serde::Serialize)] #[derive(Debug, Default, serde::Deserialize, serde::Serialize, utoipa::ToSchema)]
pub struct Response { pub struct Response {
pub message: String, pub message: String,
pub data: Vec<uuid::Uuid>, pub data: Vec<uuid::Uuid>,
@@ -182,7 +182,7 @@ pub mod response {
} }
pub mod get_songs { pub mod get_songs {
#[derive(Debug, Default, serde::Deserialize, serde::Serialize)] #[derive(Debug, Default, serde::Deserialize, serde::Serialize, utoipa::ToSchema)]
pub struct Response { pub struct Response {
pub message: String, pub message: String,
pub data: Vec<icarus_models::song::Song>, pub data: Vec<icarus_models::song::Song>,
@@ -190,7 +190,7 @@ pub mod response {
} }
pub mod delete_song { pub mod delete_song {
#[derive(Debug, Default, serde::Deserialize, serde::Serialize)] #[derive(Debug, Default, serde::Deserialize, serde::Serialize, utoipa::ToSchema)]
pub struct SongAndCoverArt { pub struct SongAndCoverArt {
pub song: icarus_models::song::Song, pub song: icarus_models::song::Song,
pub coverart: icarus_models::coverart::CoverArt, pub coverart: icarus_models::coverart::CoverArt,
@@ -576,7 +576,8 @@ mod song_queue {
pub id: uuid::Uuid, pub id: uuid::Uuid,
} }
#[derive(Debug, serde::Deserialize, serde::Serialize, sqlx::FromRow)] // TODO: Move this somewhere else at some point
#[derive(Debug, serde::Deserialize, serde::Serialize, sqlx::FromRow, utoipa::ToSchema)]
pub struct SongQueue { pub struct SongQueue {
pub id: uuid::Uuid, pub id: uuid::Uuid,
pub filename: String, pub filename: String,
@@ -880,7 +881,7 @@ pub mod endpoint {
/// Endpoint to queue a song. Starts the process and places the song in a queue /// Endpoint to queue a song. Starts the process and places the song in a queue
#[utoipa::path( #[utoipa::path(
post, post,
path = "/song/queue", path = "/api/v2/song/queue",
request_body( request_body(
content = super::request::song_queue::SongQueueRequest, content = super::request::song_queue::SongQueueRequest,
description = "Multipart form data for uploading song", description = "Multipart form data for uploading song",
@@ -938,6 +939,20 @@ pub mod endpoint {
(StatusCode::OK, Json(response)) (StatusCode::OK, Json(response))
} }
/// Endpoint to link a user id to a queued song
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn link_user_id( pub async fn link_user_id(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::Json(payload): axum::Json<super::request::link_user_id::Request>, axum::Json(payload): axum::Json<super::request::link_user_id::Request>,
@@ -969,6 +984,14 @@ pub mod endpoint {
} }
} }
#[utoipa::path(
post,
path = super::super::endpoints::NEXTQUEUESONG,
responses(
(status = 200, description = "Queued song is present and available", body = super::response::fetch_queue_song::Response),
(status = 400, description = "Linkage failed", body = super::response::fetch_queue_song::Response)
)
)]
pub async fn fetch_queue_song( pub async fn fetch_queue_song(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
) -> ( ) -> (
@@ -991,6 +1014,19 @@ pub mod endpoint {
} }
// TODO: Rename // TODO: Rename
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn download_flac( pub async fn download_flac(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::extract::Path(id): axum::extract::Path<uuid::Uuid>, axum::extract::Path(id): axum::extract::Path<uuid::Uuid>,
@@ -1019,6 +1055,19 @@ pub mod endpoint {
} }
} }
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn update_song_queue_status( pub async fn update_song_queue_status(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::Json(payload): axum::Json<super::request::update_status::Request>, axum::Json(payload): axum::Json<super::request::update_status::Request>,
@@ -1071,6 +1120,19 @@ pub mod endpoint {
} }
} }
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn update_song_queue( pub async fn update_song_queue(
axum::extract::Path(id): axum::extract::Path<uuid::Uuid>, axum::extract::Path(id): axum::extract::Path<uuid::Uuid>,
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
@@ -1117,6 +1179,19 @@ pub mod endpoint {
} }
} }
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn create_metadata( pub async fn create_metadata(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::Json(payload): axum::Json<super::request::create_metadata::Request>, axum::Json(payload): axum::Json<super::request::create_metadata::Request>,
@@ -1200,6 +1275,19 @@ pub mod endpoint {
} }
} }
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn wipe_data_from_song_queue( pub async fn wipe_data_from_song_queue(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::Json(payload): axum::Json<super::request::wipe_data_from_song_queue::Request>, axum::Json(payload): axum::Json<super::request::wipe_data_from_song_queue::Request>,
@@ -1230,6 +1318,19 @@ pub mod endpoint {
} }
} }
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn get_songs( pub async fn get_songs(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::extract::Query(params): axum::extract::Query<super::request::get_songs::Params>, axum::extract::Query(params): axum::extract::Query<super::request::get_songs::Params>,
@@ -1258,6 +1359,19 @@ pub mod endpoint {
} }
} }
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn get_all_songs( pub async fn get_all_songs(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
) -> ( ) -> (
@@ -1279,6 +1393,19 @@ pub mod endpoint {
} }
} }
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn stream_song( pub async fn stream_song(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::extract::Path(id): axum::extract::Path<uuid::Uuid>, axum::extract::Path(id): axum::extract::Path<uuid::Uuid>,
@@ -1326,6 +1453,19 @@ pub mod endpoint {
} }
} }
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn download_song( pub async fn download_song(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::extract::Path(id): axum::extract::Path<uuid::Uuid>, axum::extract::Path(id): axum::extract::Path<uuid::Uuid>,
@@ -1361,6 +1501,19 @@ pub mod endpoint {
} }
} }
#[utoipa::path(
post,
path = "/api/v2/song/queue/link",
request_body(
content = super::request::link_user_id::Request,
description = "User Id and queued song id",
content_type = "application/json"
),
responses(
(status = 200, description = "Queued song linked", body = super::response::link_user_id::Response),
(status = 400, description = "Linkage failed", body = super::response::link_user_id::Response)
)
)]
pub async fn delete_song( pub async fn delete_song(
axum::Extension(pool): axum::Extension<sqlx::PgPool>, axum::Extension(pool): axum::Extension<sqlx::PgPool>,
axum::extract::Path(id): axum::extract::Path<uuid::Uuid>, axum::extract::Path(id): axum::extract::Path<uuid::Uuid>,
+4 -2
View File
@@ -55,10 +55,12 @@ pub mod init {
header::{ACCEPT, AUTHORIZATION, CONTENT_TYPE}, header::{ACCEPT, AUTHORIZATION, CONTENT_TYPE},
}; };
use crate::callers::song as song_caller;
#[derive(utoipa::OpenApi)] #[derive(utoipa::OpenApi)]
#[openapi( #[openapi(
paths(crate::callers::song::endpoint::queue_song), paths(song_caller::endpoint::queue_song, song_caller::endpoint::link_user_id),
components(schemas(crate::callers::song::response::Response)), components(schemas(song_caller::response::Response, song_caller::response::link_user_id::Response)),
tags( tags(
(name = "queue song", description = "Start process to upload song by queueing the song") (name = "queue song", description = "Start process to upload song by queueing the song")
) )