Skip to main content

tdm_server_rust/web/
search_controller.rs

1//! 全局搜索接口。
2//!
3//! 提供跨漫画、话数、组员、术语、评价、问卷、奖励的统一模糊搜索入口。
4
5use crate::{
6    app::AppState,
7    common::result::ResultBody,
8    entity::search::{GlobalSearchQuery, GlobalSearchResponse},
9    error::ApiResult,
10    middleware::AuthMember,
11    service::search_service::SearchService,
12};
13use axum::{
14    extract::{Extension, Query, State},
15    routing::get,
16    Router,
17};
18
19/// 搜索路由(挂载于 `/api/search`)。
20pub fn routes() -> Router<AppState> {
21    Router::new().route("/", get(global_search))
22}
23
24/// 全局搜索。
25#[tracing::instrument(skip_all, level = "info")]
26pub async fn global_search(
27    State(state): State<AppState>,
28    Extension(AuthMember(member)): Extension<AuthMember>,
29    Query(query): Query<GlobalSearchQuery>,
30) -> ApiResult<ResultBody<GlobalSearchResponse>> {
31    let member = member.ok_or_else(|| crate::error::AppError::login_expired("请先登录再搜索喵"))?;
32    let data = SearchService::search(&state, query, Some(member)).await?;
33    Ok(ResultBody::success_data(data))
34}