use actix_web::{web, HttpResponse}; use serde::Deserialize; use shanty_db::queries; use crate::error::ApiError; use crate::state::AppState; fn default_limit() -> u64 { 50 } #[derive(Deserialize)] pub struct SearchParams { q: Option, #[serde(default = "default_limit")] limit: u64, #[serde(default)] offset: u64, } pub fn configure(cfg: &mut web::ServiceConfig) { cfg.service( web::resource("/tracks") .route(web::get().to(list_tracks)), ) .service( web::resource("/tracks/{id}") .route(web::get().to(get_track)), ); } async fn list_tracks( state: web::Data, query: web::Query, ) -> Result { let tracks = if let Some(ref q) = query.q { queries::tracks::search(state.db.conn(), q).await? } else { queries::tracks::list(state.db.conn(), query.limit, query.offset).await? }; Ok(HttpResponse::Ok().json(tracks)) } async fn get_track( state: web::Data, path: web::Path, ) -> Result { let id = path.into_inner(); let track = queries::tracks::get_by_id(state.db.conn(), id).await?; Ok(HttpResponse::Ok().json(track)) }