Skip to content

Commit

Permalink
Merge pull request #1224 from AppFlowy-IO/support-create-chat
Browse files Browse the repository at this point in the history
feat: support chat page creation
  • Loading branch information
khorshuheng authored Feb 10, 2025
2 parents 49ebebd + e3d458d commit 1df5a18
Show file tree
Hide file tree
Showing 2 changed files with 136 additions and 4 deletions.
90 changes: 86 additions & 4 deletions src/biz/workspace/page_view.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use crate::api::metrics::AppFlowyWebMetrics;
use crate::api::ws::RealtimeServerAddr;
use crate::biz::chat::ops::create_chat;
use crate::biz::collab::folder_view::{
check_if_view_is_space, parse_extra_field_as_json, to_dto_view_icon, to_dto_view_layout,
to_folder_view_icon, to_space_permission,
Expand Down Expand Up @@ -49,6 +50,7 @@ use fancy_regex::Regex;
use itertools::Itertools;
use rayon::iter::{IntoParallelIterator, ParallelIterator};
use serde_json::json;
use shared_entity::dto::chat_dto::CreateChatParams;
use shared_entity::dto::publish_dto::{PublishDatabaseData, PublishViewInfo, PublishViewMetaData};
use shared_entity::dto::workspace_dto::{
FolderView, Page, PageCollab, PageCollabData, Space, SpacePermission, ViewIcon, ViewLayout,
Expand Down Expand Up @@ -218,10 +220,19 @@ pub async fn create_page(
)
.await
},
layout => Err(AppError::InvalidRequest(format!(
"The layout type {} is not supported for page creation",
layout
))),
ViewLayout::Chat => {
create_chat_page(
appflowy_web_metrics,
server,
user,
pg_pool,
collab_storage,
workspace_id,
parent_view_id,
name,
)
.await
},
}
}

Expand Down Expand Up @@ -884,6 +895,77 @@ async fn create_database_page(
})
}

async fn get_rag_ids(folder: &Folder, parent_view_id: &str) -> Vec<String> {
if let Some(view) = folder.get_view(parent_view_id) {
if view.space_info().is_some() {
return vec![];
}
};
let trash_ids: HashSet<String> = folder
.get_all_trash_sections()
.iter()
.map(|s| s.id.clone())
.collect();
let mut rag_ids: Vec<String> = folder
.get_views_belong_to(parent_view_id)
.iter()
.filter(|v| v.layout.is_document() && !trash_ids.contains(&v.id))
.map(|v| v.id.clone())
.collect();
rag_ids.push(parent_view_id.to_string());
rag_ids
}

#[allow(clippy::too_many_arguments)]
async fn create_chat_page(
appflowy_web_metrics: &AppFlowyWebMetrics,
server: Data<RealtimeServerAddr>,
user: RealtimeUser,
pg_pool: &PgPool,
collab_storage: &CollabAccessControlStorage,
workspace_id: Uuid,
parent_view_id: &str,
name: Option<&str>,
) -> Result<Page, AppError> {
let view_id = Uuid::new_v4().to_string();
let collab_origin = GetCollabOrigin::User { uid: user.uid };
let mut folder = get_latest_collab_folder(
collab_storage,
collab_origin.clone(),
&workspace_id.to_string(),
)
.await?;
let rag_ids = get_rag_ids(&folder, parent_view_id).await;
create_chat(
pg_pool,
CreateChatParams {
chat_id: view_id.clone(),
name: name.unwrap_or_default().to_string(),
rag_ids,
},
&workspace_id.to_string(),
)
.await?;
let folder_update = add_new_view_to_folder(
user.uid,
parent_view_id,
&view_id,
&mut folder,
name,
collab_folder::ViewLayout::Chat,
)
.await?;
update_workspace_folder_data(
appflowy_web_metrics,
server.clone(),
user.clone(),
workspace_id,
folder_update,
)
.await?;
Ok(Page { view_id })
}

#[allow(clippy::too_many_arguments)]
pub async fn move_page(
appflowy_web_metrics: &AppFlowyWebMetrics,
Expand Down
50 changes: 50 additions & 0 deletions tests/workspace/page_view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,56 @@ async fn create_new_document_page() {
.unwrap();
}

#[tokio::test]
async fn create_new_chat_page() {
let (c, _user) = generate_unique_registered_user_client().await;
let workspaces = c.get_workspaces().await.unwrap();
assert_eq!(workspaces.len(), 1);
let workspace_id = workspaces[0].workspace_id;
let folder_view = c
.get_workspace_folder(&workspace_id.to_string(), Some(2), None)
.await
.unwrap();
let general_space = &folder_view
.children
.into_iter()
.find(|v| v.name == "General")
.unwrap();
let page = c
.create_workspace_page_view(
workspace_id,
&CreatePageParams {
parent_view_id: general_space.view_id.clone(),
layout: ViewLayout::Chat,
name: Some("New chat".to_string()),
},
)
.await
.unwrap();
sleep(Duration::from_secs(1)).await;
let folder_view = c
.get_workspace_folder(&workspace_id.to_string(), Some(2), None)
.await
.unwrap();
let general_space = &folder_view
.children
.into_iter()
.find(|v| v.name == "General")
.unwrap();
general_space
.children
.iter()
.find(|v| v.view_id == page.view_id)
.unwrap();
assert_eq!(
c.get_chat_settings(&workspace_id.to_string(), &page.view_id)
.await
.unwrap()
.name,
"New chat"
);
}

#[tokio::test]
async fn move_page_to_another_space() {
let registered_user = generate_unique_registered_user().await;
Expand Down

0 comments on commit 1df5a18

Please sign in to comment.