AppFlowy-Cloud/src/api/search.rs

44 lines
1.3 KiB
Rust

use access_control::act::Action;
use actix_web::web::{Data, Query};
use actix_web::{web, Scope};
use uuid::Uuid;
use authentication::jwt::Authorization;
use shared_entity::dto::search_dto::{SearchDocumentRequest, SearchDocumentResponseItem};
use shared_entity::response::{AppResponse, JsonAppResponse};
use crate::biz::search::search_document;
use crate::state::AppState;
pub fn search_scope() -> Scope {
web::scope("/api/search/{workspace_id}")
.service(web::resource("").route(web::get().to(document_search)))
}
#[tracing::instrument(skip(state, auth, payload), err)]
async fn document_search(
auth: Authorization,
path: web::Path<Uuid>,
payload: Query<SearchDocumentRequest>,
state: Data<AppState>,
) -> actix_web::Result<JsonAppResponse<Vec<SearchDocumentResponseItem>>> {
let workspace_id = path.into_inner();
let request = payload.into_inner();
let user_uuid = auth.uuid()?;
let uid = state.user_cache.get_user_uid(&user_uuid).await?;
state
.workspace_access_control
.enforce_action(&uid, &workspace_id.to_string(), Action::Read)
.await?;
let metrics = &*state.metrics.request_metrics;
let resp = search_document(
&state.pg_pool,
&state.ai_client,
uid,
workspace_id,
request,
metrics,
)
.await?;
Ok(AppResponse::Ok().with_data(resp).into())
}