diff --git a/src/api/dialog_info.rs b/src/api/dialog_info.rs new file mode 100644 index 000000000..2d54bed5f --- /dev/null +++ b/src/api/dialog_info.rs @@ -0,0 +1,77 @@ +use std::collections::HashMap; +use actix_web::{get, HttpResponse, post, web}; +use actix_web::http::Error; +use crate::api::JsonResponse; +use crate::AppState; +use crate::entity::{dialog_info, dialog_info}; +use crate::service::dialog_info::Query; +use crate::service::dialog_info::Mutation; + +#[get("/v1.0/dialogs")] +async fn list(model: web::Json, data: web::Data) -> Result { + let dialogs = Query::find_dialog_infos_by_uid(&data.conn, model.uid).await.unwrap(); + + let mut result = HashMap::new(); + result.insert("dialogs", dialogs); + + 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).unwrap())) +} + +#[get("/v1.0/dialog")] +async fn detail(model: web::Json, data: web::Data) -> Result { + let dialogs = Query::find_dialog_info_by_id(&data.conn, model.dialog_id).await.unwrap(); + + let mut result = HashMap::new(); + result.insert("dialogs", dialogs); + + 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).unwrap())) +} + +#[post("/v1.0/delete_dialog")] +async fn delete(model: web::Json, data: web::Data) -> Result { + let _ = Mutation::delete_dialog_info(&data.conn, model.dialog_id).await.unwrap(); + + let json_response = JsonResponse { + code: 200, + err: "".to_owned(), + data: (), + }; + + Ok(HttpResponse::Ok() + .content_type("application/json") + .body(serde_json::to_string(&json_response).unwrap())) +} + +#[post("/v1.0/create_kb")] +async fn create(model: web::Json, data: web::Data) -> Result { + let model = Mutation::create_dialog_info(&data.conn, model.into_inner()).await.unwrap(); + + let mut result = HashMap::new(); + result.insert("dialog_id", model.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).unwrap())) +} \ No newline at end of file diff --git a/src/api/kb_info.rs b/src/api/kb_info.rs new file mode 100644 index 000000000..d6867957e --- /dev/null +++ b/src/api/kb_info.rs @@ -0,0 +1,59 @@ +use std::collections::HashMap; +use actix_web::{get, HttpResponse, post, web}; +use actix_web::http::Error; +use crate::api::JsonResponse; +use crate::AppState; +use crate::entity::kb_info; +use crate::service::kb_info::Mutation; +use crate::service::kb_info::Query; + +#[post("/v1.0/create_kb")] +async fn create(model: web::Json, data: web::Data) -> Result { + let model = Mutation::create_kb_info(&data.conn, model.into_inner()).await.unwrap(); + + 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).unwrap())) +} + +#[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.unwrap(); + + 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).unwrap())) +} + +#[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.unwrap(); + + let json_response = JsonResponse { + code: 200, + err: "".to_owned(), + data: (), + }; + + Ok(HttpResponse::Ok() + .content_type("application/json") + .body(serde_json::to_string(&json_response).unwrap())) +} \ No newline at end of file diff --git a/src/api/mod.rs b/src/api/mod.rs index f8cf91d9e..e13b4e9ce 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -1,6 +1,8 @@ use serde::{Deserialize, Serialize}; pub(crate) mod tag; +mod kb_info; +mod dialog_info; #[derive(Debug, Deserialize, Serialize)] struct JsonResponse { diff --git a/src/service/dialog_info.rs b/src/service/dialog_info.rs index b2f9f9d30..424506fc5 100644 --- a/src/service/dialog_info.rs +++ b/src/service/dialog_info.rs @@ -1,12 +1,25 @@ -use sea_orm::{DbConn, DbErr, EntityTrait, PaginatorTrait, QueryOrder}; -use crate::entity::dialog_info; +use chrono::Local; +use sea_orm::{ActiveModelTrait, DbConn, DbErr, DeleteResult, EntityTrait, PaginatorTrait, QueryOrder}; +use sea_orm::ActiveValue::Set; +use crate::entity::{dialog_info, kb_info}; use crate::entity::dialog_info::Entity; pub struct Query; impl Query { pub async fn find_dialog_info_by_id(db: &DbConn, id: i64) -> Result, DbErr> { - Entity::find_by_id(id).one(db).await + Entity::find_by_id(id).find_with_related(kb_info::Entity).one(db).await + } + + pub async fn find_dialog_infos(db: &DbConn) -> Result, DbErr> { + Entity::find().all(db).await + } + + pub async fn find_dialog_infos_by_uid(db: &DbConn, uid: i64) -> Result, DbErr> { + Entity::find() + .filter(dialog_info::Column::Uid.eq(uid)) + .all(db) + .await } pub async fn find_dialog_infos_in_page( @@ -23,4 +36,61 @@ impl Query { // Fetch paginated posts paginator.fetch_page(page - 1).await.map(|p| (p, num_pages)) } +} + +pub struct Mutation; + +impl Mutation { + pub async fn create_dialog_info( + db: &DbConn, + form_data: dialog_info::Model, + ) -> Result { + dialog_info::ActiveModel { + dialog_id: Default::default(), + uid: Set(form_data.uid.to_owned()), + dialog_name: Set(form_data.dialog_name.to_owned()), + history: Set(form_data.history.to_owned()), + created_at: Set(Local::now().date_naive()), + updated_at: Set(Local::now().date_naive()), + } + .save(db) + .await + } + + pub async fn update_dialog_info_by_id( + db: &DbConn, + id: i64, + form_data: dialog_info::Model, + ) -> Result { + let dialog_info: dialog_info::ActiveModel = Entity::find_by_id(id) + .one(db) + .await? + .ok_or(DbErr::Custom("Cannot find.".to_owned())) + .map(Into::into)?; + + dialog_info::ActiveModel { + dialog_id: dialog_info.dialog_id, + uid: dialog_info.uid, + dialog_name: Set(form_data.dialog_name.to_owned()), + history: Set(form_data.history.to_owned()), + created_at: Default::default(), + updated_at: Set(Local::now().date_naive()), + } + .update(db) + .await + } + + pub async fn delete_dialog_info(db: &DbConn, kb_id: i64) -> Result { + let tag: dialog_info::ActiveModel = Entity::find_by_id(kb_id) + .one(db) + .await? + .ok_or(DbErr::Custom("Cannot find.".to_owned())) + .map(Into::into)?; + + tag.delete(db).await + } + + pub async fn delete_all_dialog_infos(db: &DbConn) -> Result { + Entity::delete_many().exec(db).await + } } \ No newline at end of file diff --git a/src/service/kb_info.rs b/src/service/kb_info.rs new file mode 100644 index 000000000..999335454 --- /dev/null +++ b/src/service/kb_info.rs @@ -0,0 +1,96 @@ +use chrono::{Local, NaiveDate}; +use sea_orm::{ActiveModelTrait, ColumnTrait, DbConn, DbErr, DeleteResult, EntityTrait, PaginatorTrait, QueryFilter, QueryOrder}; +use sea_orm::ActiveValue::Set; +use crate::entity::kb_info; +use crate::entity::kb_info::Entity; + +pub struct Query; + +impl Query { + pub async fn find_kb_info_by_id(db: &DbConn, id: i64) -> Result, DbErr> { + Entity::find_by_id(id).one(db).await + } + + pub async fn find_kb_infos(db: &DbConn) -> Result, DbErr> { + Entity::find().all(db).await + } + + pub async fn find_kb_infos_by_uid(db: &DbConn, uid: i64) -> Result, DbErr> { + Entity::find() + .filter(kb_info::Column::Uid.eq(uid)) + .all(db) + .await + } + + pub async fn find_kb_infos_in_page( + db: &DbConn, + page: u64, + posts_per_page: u64, + ) -> Result<(Vec, u64), DbErr> { + // Setup paginator + let paginator = Entity::find() + .order_by_asc(kb_info::Column::KbId) + .paginate(db, posts_per_page); + let num_pages = paginator.num_pages().await?; + + // Fetch paginated posts + paginator.fetch_page(page - 1).await.map(|p| (p, num_pages)) + } +} + +pub struct Mutation; + +impl Mutation { + pub async fn create_kb_info( + db: &DbConn, + form_data: kb_info::Model, + ) -> Result { + kb_info::ActiveModel { + kb_id: Default::default(), + uid: Set(form_data.uid.to_owned()), + kn_name: Set(form_data.kn_name.to_owned()), + icon: Set(form_data.icon.to_owned()), + created_at: Set(Local::now().date_naive()), + updated_at: Set(Local::now().date_naive()), + } + .save(db) + .await + } + + pub async fn update_kb_info_by_id( + db: &DbConn, + id: i64, + form_data: kb_info::Model, + ) -> Result { + let kb_info: kb_info::ActiveModel = Entity::find_by_id(id) + .one(db) + .await? + .ok_or(DbErr::Custom("Cannot find.".to_owned())) + .map(Into::into)?; + + kb_info::ActiveModel { + kb_id: kb_info.kb_id, + uid: kb_info.uid, + kn_name: Set(form_data.kn_name.to_owned()), + icon: Set(form_data.icon.to_owned()), + created_at: Default::default(), + updated_at: Set(Local::now().date_naive()), + } + .update(db) + .await + } + + pub async fn delete_kb_info(db: &DbConn, kb_id: i64) -> Result { + let tag: kb_info::ActiveModel = Entity::find_by_id(kb_id) + .one(db) + .await? + .ok_or(DbErr::Custom("Cannot find.".to_owned())) + .map(Into::into)?; + + tag.delete(db).await + } + + pub async fn delete_all_kb_infos(db: &DbConn) -> Result { + Entity::delete_many().exec(db).await + } +} \ No newline at end of file diff --git a/src/service/mod.rs b/src/service/mod.rs index ceecbc1b9..85bf4bf24 100644 --- a/src/service/mod.rs +++ b/src/service/mod.rs @@ -1,2 +1,3 @@ pub(crate) mod dialog_info; -pub(crate) mod tag_info; \ No newline at end of file +pub(crate) mod tag_info; +pub(crate) mod kb_info; \ No newline at end of file diff --git a/src/service/tag_info.rs b/src/service/tag_info.rs index 656eb2c94..f7d3f5ba5 100644 --- a/src/service/tag_info.rs +++ b/src/service/tag_info.rs @@ -22,7 +22,7 @@ impl Query { ) -> Result<(Vec, u64), DbErr> { // Setup paginator let paginator = Entity::find() - .order_by_asc(tag_info::Column::Uid) + .order_by_asc(tag_info::Column::Tid) .paginate(db, posts_per_page); let num_pages = paginator.num_pages().await?;