use std::collections::HashMap; use actix_web::{ get, HttpResponse, post, web }; use serde::Serialize; use crate::api::JsonResponse; use crate::AppState; use crate::entity::kb_info; use crate::errors::AppError; use crate::service::kb_info::Mutation; use crate::service::kb_info::Query; use serde::Deserialize; #[derive(Clone, Debug, Serialize, Deserialize)] pub struct AddDocs2KbParams { pub uid: i64, pub dids: Vec, pub kb_id: i64, } #[post("/v1.0/create_kb")] async fn create( model: web::Json, data: web::Data ) -> Result { let mut docs = Query::find_kb_infos_by_name( &data.conn, model.kb_name.to_owned() ).await.unwrap(); if docs.len() > 0 { let json_response = JsonResponse { code: 201, err: "Duplicated name.".to_owned(), data: (), }; Ok( HttpResponse::Ok() .content_type("application/json") .body(serde_json::to_string(&json_response)?) ) } else { let model = Mutation::create_kb_info(&data.conn, model.into_inner()).await?; let mut result = HashMap::new(); result.insert("kb_id", model.kb_id.unwrap()); let json_response = JsonResponse { code: 200, err: "".to_owned(), data: result, }; Ok( HttpResponse::Ok() .content_type("application/json") .body(serde_json::to_string(&json_response)?) ) } } #[post("/v1.0/add_docs_to_kb")] async fn add_docs_to_kb( param: web::Json, data: web::Data ) -> Result { let _ = Mutation::add_docs(&data.conn, param.kb_id, param.dids.to_owned()).await?; let json_response = JsonResponse { code: 200, err: "".to_owned(), data: (), }; Ok( HttpResponse::Ok() .content_type("application/json") .body(serde_json::to_string(&json_response)?) ) } #[post("/v1.0/anti_kb_docs")] async fn anti_kb_docs( param: web::Json, data: web::Data ) -> Result { let _ = Mutation::remove_docs(&data.conn, param.dids.to_owned(), Some(param.kb_id)).await?; let json_response = JsonResponse { code: 200, err: "".to_owned(), data: (), }; Ok( HttpResponse::Ok() .content_type("application/json") .body(serde_json::to_string(&json_response)?) ) } #[get("/v1.0/kbs")] async fn list( model: web::Json, data: web::Data ) -> Result { let kbs = Query::find_kb_infos_by_uid(&data.conn, model.uid).await?; let mut result = HashMap::new(); result.insert("kbs", kbs); let json_response = JsonResponse { code: 200, err: "".to_owned(), data: result, }; Ok( HttpResponse::Ok() .content_type("application/json") .body(serde_json::to_string(&json_response)?) ) } #[post("/v1.0/delete_kb")] async fn delete( model: web::Json, data: web::Data ) -> Result { let _ = Mutation::delete_kb_info(&data.conn, model.kb_id).await?; let json_response = JsonResponse { code: 200, err: "".to_owned(), data: (), }; Ok( HttpResponse::Ok() .content_type("application/json") .body(serde_json::to_string(&json_response)?) ) } #[derive(Clone, Debug, Serialize, Deserialize)] pub struct DocIdsParams { pub uid: i64, pub dids: Vec, } #[post("/v1.0/all_relevents")] async fn all_relevents( params: web::Json, data: web::Data ) -> Result { let dids = crate::service::doc_info::Query::all_descendent_ids(&data.conn, ¶ms.dids).await?; let mut result = HashMap::new(); let kbs = Query::find_kb_by_docs(&data.conn, dids).await?; result.insert("kbs", kbs); let json_response = JsonResponse { code: 200, err: "".to_owned(), data: result, }; Ok( HttpResponse::Ok() .content_type("application/json") .body(serde_json::to_string(&json_response)?) ) }