Files
web/src/routes/search.rs
Connor Johnstone 421ec3199b Added auth
2026-03-19 14:02:33 -04:00

83 lines
2.3 KiB
Rust

use actix_session::Session;
use actix_web::{HttpResponse, web};
use serde::Deserialize;
use shanty_search::SearchProvider;
use crate::auth;
use crate::error::ApiError;
use crate::state::AppState;
#[derive(Deserialize)]
pub struct ArtistSearchParams {
q: String,
#[serde(default = "default_limit")]
limit: u32,
}
#[derive(Deserialize)]
pub struct AlbumTrackSearchParams {
q: String,
artist: Option<String>,
#[serde(default = "default_limit")]
limit: u32,
}
fn default_limit() -> u32 {
25
}
pub fn configure(cfg: &mut web::ServiceConfig) {
cfg.service(web::resource("/search/artist").route(web::get().to(search_artist)))
.service(web::resource("/search/album").route(web::get().to(search_album)))
.service(web::resource("/search/track").route(web::get().to(search_track)))
.service(web::resource("/search/discography/{id}").route(web::get().to(get_discography)));
}
async fn search_artist(
state: web::Data<AppState>,
session: Session,
query: web::Query<ArtistSearchParams>,
) -> Result<HttpResponse, ApiError> {
auth::require_auth(&session)?;
let results = state.search.search_artist(&query.q, query.limit).await?;
Ok(HttpResponse::Ok().json(results))
}
async fn search_album(
state: web::Data<AppState>,
session: Session,
query: web::Query<AlbumTrackSearchParams>,
) -> Result<HttpResponse, ApiError> {
auth::require_auth(&session)?;
let results = state
.search
.search_album(&query.q, query.artist.as_deref(), query.limit)
.await?;
Ok(HttpResponse::Ok().json(results))
}
async fn search_track(
state: web::Data<AppState>,
session: Session,
query: web::Query<AlbumTrackSearchParams>,
) -> Result<HttpResponse, ApiError> {
auth::require_auth(&session)?;
let results = state
.search
.search_track(&query.q, query.artist.as_deref(), query.limit)
.await?;
Ok(HttpResponse::Ok().json(results))
}
async fn get_discography(
state: web::Data<AppState>,
session: Session,
path: web::Path<String>,
) -> Result<HttpResponse, ApiError> {
auth::require_auth(&session)?;
let artist_id = path.into_inner();
let disco = state.search.get_discography(&artist_id).await?;
Ok(HttpResponse::Ok().json(disco))
}