Initial commit
This commit is contained in:
70
src/routes/search.rs
Normal file
70
src/routes/search.rs
Normal file
@@ -0,0 +1,70 @@
|
||||
use actix_web::{web, HttpResponse};
|
||||
use serde::Deserialize;
|
||||
|
||||
use shanty_search::SearchProvider;
|
||||
|
||||
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 { 10 }
|
||||
|
||||
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>,
|
||||
query: web::Query<ArtistSearchParams>,
|
||||
) -> Result<HttpResponse, ApiError> {
|
||||
let results = state.search.search_artist(&query.q, query.limit).await?;
|
||||
Ok(HttpResponse::Ok().json(results))
|
||||
}
|
||||
|
||||
async fn search_album(
|
||||
state: web::Data<AppState>,
|
||||
query: web::Query<AlbumTrackSearchParams>,
|
||||
) -> Result<HttpResponse, ApiError> {
|
||||
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>,
|
||||
query: web::Query<AlbumTrackSearchParams>,
|
||||
) -> Result<HttpResponse, ApiError> {
|
||||
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>,
|
||||
path: web::Path<String>,
|
||||
) -> Result<HttpResponse, ApiError> {
|
||||
let artist_id = path.into_inner();
|
||||
let disco = state.search.get_discography(&artist_id).await?;
|
||||
Ok(HttpResponse::Ok().json(disco))
|
||||
}
|
||||
Reference in New Issue
Block a user