use std::collections::HashMap; use actix_web::{ HttpResponse, post, web }; use serde::Deserialize; use serde_json::Value; use serde_json::json; use crate::api::JsonResponse; use crate::AppState; use crate::errors::AppError; use crate::service::dialog_info::Query; use crate::service::dialog_info::Mutation; #[derive(Debug, Deserialize)] pub struct ListParams { pub uid: i64, pub dialog_id: Option, } #[post("/v1.0/dialogs")] async fn list( params: web::Json, data: web::Data ) -> Result { let mut result = HashMap::new(); if let Some(dia_id) = params.dialog_id { let dia = Query::find_dialog_info_by_id(&data.conn, dia_id).await?.unwrap(); let kb = crate::service::kb_info::Query ::find_kb_info_by_id(&data.conn, dia.kb_id).await? .unwrap(); print!("{:?}", dia.history); let hist: Value = serde_json::from_str(&dia.history)?; let detail = json!({ "dialog_id": dia_id, "dialog_name": dia.dialog_name.to_owned(), "created_at": dia.created_at.to_string().to_owned(), "updated_at": dia.updated_at.to_string().to_owned(), "history": hist, "kb_info": kb }); result.insert("dialogs", vec![detail]); } else { let mut dias = Vec::::new(); for dia in Query::find_dialog_infos_by_uid(&data.conn, params.uid).await? { let kb = crate::service::kb_info::Query ::find_kb_info_by_id(&data.conn, dia.kb_id).await? .unwrap(); let hist: Value = serde_json::from_str(&dia.history)?; dias.push( json!({ "dialog_id": dia.dialog_id, "dialog_name": dia.dialog_name.to_owned(), "created_at": dia.created_at.to_string().to_owned(), "updated_at": dia.updated_at.to_string().to_owned(), "history": hist, "kb_info": kb }) ); } result.insert("dialogs", dias); } 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)?) ) } #[derive(Debug, Deserialize)] pub struct RmParams { pub uid: i64, pub dialog_id: i64, } #[post("/v1.0/delete_dialog")] async fn delete( params: web::Json, data: web::Data ) -> Result { let _ = Mutation::delete_dialog_info(&data.conn, params.dialog_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(Debug, Deserialize)] pub struct CreateParams { pub uid: i64, pub dialog_id: Option, pub kb_id: i64, pub name: String, } #[post("/v1.0/create_dialog")] async fn create( param: web::Json, data: web::Data ) -> Result { let mut result = HashMap::new(); if let Some(dia_id) = param.dialog_id { result.insert("dialog_id", dia_id); let dia = Query::find_dialog_info_by_id(&data.conn, dia_id).await?; let _ = Mutation::update_dialog_info_by_id( &data.conn, dia_id, ¶m.name, &dia.unwrap().history ).await?; } else { let dia = Mutation::create_dialog_info( &data.conn, param.uid, param.kb_id, ¶m.name ).await?; result.insert("dialog_id", dia.dialog_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)?) ) } #[derive(Debug, Deserialize)] pub struct UpdateHistoryParams { pub uid: i64, pub dialog_id: i64, pub history: Value, } #[post("/v1.0/update_history")] async fn update_history( param: web::Json, data: web::Data ) -> Result { let mut json_response = JsonResponse { code: 200, err: "".to_owned(), data: (), }; if let Some(dia) = Query::find_dialog_info_by_id(&data.conn, param.dialog_id).await? { let _ = Mutation::update_dialog_info_by_id( &data.conn, param.dialog_id, &dia.dialog_name, ¶m.history.to_string() ).await?; } else { json_response.code = 500; json_response.err = "Can't find dialog data!".to_owned(); } Ok( HttpResponse::Ok() .content_type("application/json") .body(serde_json::to_string(&json_response)?) ) }