pub mod api; use std::sync::Arc; use axum::{Router, routing::{delete, get, post, put}}; use sqlx::PgPool; use crate::config::Args; #[derive(Clone)] pub struct AppState { pub pool: PgPool, pub config: Arc, pub system_prompt: Arc, pub merge_prompt: Arc, } pub fn build_router(state: Arc) -> Router { let api = Router::new() .route("/stats", get(api::stats)) .route("/queue", get(api::list_queue)) .route("/queue/:id", get(api::get_queue_item).delete(api::delete_queue_item)) .route("/queue/:id/approve", post(api::approve_queue_item)) .route("/queue/:id/reject", post(api::reject_queue_item)) .route("/queue/:id/retry", post(api::retry_queue_item)) .route("/queue/:id/update", put(api::update_queue_item)) .route("/queue/batch/approve", post(api::batch_approve)) .route("/queue/batch/reject", post(api::batch_reject)) .route("/queue/batch/retry", post(api::batch_retry)) .route("/queue/batch/delete", post(api::batch_delete)) .route("/artists/search", get(api::search_artists)) .route("/artists", get(api::list_artists)) .route("/artists/:id", put(api::update_artist)) .route("/artists/:id/albums", get(api::list_albums)) .route("/artists/:id/full", get(api::get_artist_full)) .route("/artists/:id/hidden", put(api::set_artist_hidden)) .route("/artists/:id/rename", put(api::rename_artist_api)) .route("/artists/:id/appearances", post(api::add_appearance)) .route("/artists/:id/appearances/:track_id", delete(api::remove_appearance)) .route("/tracks/search", get(api::search_tracks_feat)) .route("/tracks/:id", get(api::get_track).put(api::update_track)) .route("/tracks/:id/hidden", put(api::set_track_hidden)) .route("/albums/search", get(api::search_albums_for_artist)) .route("/albums/cover-by-name", get(api::album_cover_by_name)) .route("/albums/:id/cover", get(api::album_cover)) .route("/albums/:id/full", get(api::get_album_full)) .route("/albums/:id/reorder", put(api::reorder_album_tracks)) .route("/albums/:id/edit", put(api::update_album_full)) .route("/albums/:id/genre", put(api::set_album_tracks_genre)) .route("/albums/:id/hidden", put(api::set_album_hidden)) .route("/albums/:id/release_type", put(api::set_album_release_type)) .route("/albums/:id", put(api::update_album)) .route("/merges", get(api::list_merges).post(api::create_merge)) .route("/merges/:id", get(api::get_merge).put(api::update_merge)) .route("/merges/:id/approve", post(api::approve_merge)) .route("/merges/:id/reject", post(api::reject_merge)) .route("/merges/:id/retry", post(api::retry_merge)) .route("/library/tracks", get(api::library_tracks)) .route("/library/albums", get(api::library_albums)) .route("/library/artists", get(api::library_artists)); Router::new() .route("/", get(admin_html)) .nest("/api", api) .with_state(state) } async fn admin_html() -> axum::response::Html<&'static str> { axum::response::Html(include_str!("admin.html")) }