use actix_session::Session; use actix_web::{HttpResponse, web}; use serde::Deserialize; use shanty_db::queries; use crate::auth; 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, session: Session, query: web::Query, ) -> Result { auth::require_auth(&session)?; 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, session: Session, path: web::Path, ) -> Result { auth::require_auth(&session)?; let id = path.into_inner(); let track = queries::tracks::get_by_id(state.db.conn(), id).await?; Ok(HttpResponse::Ok().json(track)) }