mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
feat: support publish document (#5576)
* feat: support a event for getting encoded collab of document * feat: support publish view and unpublish views * feat: publish page to the web * chore: refacotor share bloc * feat: call the publish event * feat: support publish view and unpublish views * feat: integrate publish api * feat: integrate unpublish api * feat: fetch the publish info to show the publish status * feat: support publish interfaces * fix: lint error * fix: modified web server * fix: some style * fix: some style * fix: some style * fix: some style * fix: some style * fix: some style * fix: some style * fix: some style * fix: some style * fix: update codes * fix: update codes * fix: update codes * fix: update codes * fix: update codes * chore: refactor publish bloc * fix: some style * fix: some style * fix: some style * fix: some style * fix: some style * fix: some style * fix: the name is too long to publish * chore: change color * fix: some style * fix: some style * feat: refacotor share menu UI * fix: some style * fix: lint * fix: some style * feat: refacotor export-as * fix: some style * chore: refactor share menu colors * fix: rust ci * fix: some style * fix: some style * fix: deploy * fix: deploy * fix: deploy * fix: deploy * fix: deploy * fix: deploy * fix: deploy * fix: deploy * fix: deploy * fix: deploy * fix: deploy * fix: deploy * fix: bugs * fix: bugs * fix: bugs * fix: bugs * fix: bugs * fix: bugs * fix: bugs * fix: bugs * fix: bugs * fix: bugs * fix: bugs * fix: bugs * fix: bugs * fix: bugs * fix: bugs * fix: bugs * fix: rerelease * fix: deploy * fix: deploy * fix: deploy * fix: deploy * fix: deploy * fix: deploy * fix: deploy * fix: og image * fix: support copy button * fix: support copy button * fix: support copy button * chore: add a params * feat: use default publish name * chore: update copy * feat: show a confirm deletion dialog if the deleted page contains published page * feat: add copy toast in publish tab * fix: to 404 fix: to 404 fix: to 404 fix: the error to 404 * feat: unpublish the page auto when moving it to another space * feat: improve confirm deletion dialog * feat: show unpublish error * chore: use beta.appflowy.com * feat: disable publish in non-apppflowy-cloud user mode * fix: modified bullted icon style * fix: the dark mode color * fix: save the dark mode in local storage * fix: text color * chore: make bash script more portable (#5679) * fix: title longer * chore: move the files and modified the en * chore: update deploy.sh * chore: modified Dockerfile * chore: modified server.cjs to server.js * chore: modifed server.js to server.ts * chore: replace publish url * chore: remove todo list hover * chore: show confirm dialog before deleting page * fix: unpublish the pages before deleting * fix: table cell bg color * fix: callout icon * fix: list number * fix: emoji * fix: number icon * fix: callout icon position * fix: add margin bottom * fix: code block * fix: support scroll for breadcrumbs * fix: the breadcrumb doesn't update after moving page * fix: 0705 issues * fix: update publish status afer deleting page * chore: add hover effect for visit site button * fix: remove puiblish url text field enable border color * chore: update delete page copy * chore: enable debug category * fix: only render sidebar if the spaces are ready * fix: the breadcrumb doesn't update after moving page * fix: auto code * fix: add emoji * fix: add emoji * fix: favicon * fix: cypress test * fix: remove deploy ci * fix: default url * chore: revert launch.json * fix: docker ci * fix: change favicon * fix: flutter integration test * feat: add hover effect to share menu * chore: add a checkmark if the page has been published * chore: revert space deletion --------- Co-authored-by: Lucas.Xu <lucas.xu@appflowy.io> Co-authored-by: Zack <speed2exe@live.com.sg>
This commit is contained in:
@ -3,3 +3,4 @@ mod import_test;
|
||||
mod script;
|
||||
mod subscription_test;
|
||||
mod test;
|
||||
mod view_publish_test;
|
||||
|
@ -0,0 +1,192 @@
|
||||
use collab_folder::ViewLayout;
|
||||
use event_integration_test::EventIntegrationTest;
|
||||
use flowy_folder::entities::{ViewLayoutPB, ViewPB};
|
||||
use flowy_folder::publish_util::generate_publish_name;
|
||||
use flowy_folder_pub::entities::{
|
||||
PublishViewInfo, PublishViewMeta, PublishViewMetaData, PublishViewPayload,
|
||||
};
|
||||
|
||||
async fn mock_single_document_view_publish_payload(
|
||||
test: &EventIntegrationTest,
|
||||
view: &ViewPB,
|
||||
publish_name: String,
|
||||
) -> Vec<PublishViewPayload> {
|
||||
let view_id = &view.id;
|
||||
let layout: ViewLayout = view.layout.clone().into();
|
||||
let view_encoded_collab = test.encoded_collab_v1(view_id, layout).await;
|
||||
let publish_view_info = PublishViewInfo {
|
||||
view_id: view_id.to_string(),
|
||||
name: view.name.to_string(),
|
||||
icon: None,
|
||||
layout: ViewLayout::Document,
|
||||
extra: None,
|
||||
created_by: view.created_by,
|
||||
last_edited_by: view.last_edited_by,
|
||||
last_edited_time: view.last_edited,
|
||||
created_at: view.create_time,
|
||||
child_views: None,
|
||||
};
|
||||
|
||||
vec![PublishViewPayload {
|
||||
meta: PublishViewMeta {
|
||||
metadata: PublishViewMetaData {
|
||||
view: publish_view_info.clone(),
|
||||
child_views: vec![],
|
||||
ancestor_views: vec![publish_view_info],
|
||||
},
|
||||
view_id: view_id.to_string(),
|
||||
publish_name,
|
||||
},
|
||||
data: Vec::from(view_encoded_collab.doc_state),
|
||||
}]
|
||||
}
|
||||
|
||||
async fn mock_nested_document_view_publish_payload(
|
||||
test: &EventIntegrationTest,
|
||||
view: &ViewPB,
|
||||
publish_name: String,
|
||||
) -> Vec<PublishViewPayload> {
|
||||
let view_id = &view.id;
|
||||
let layout: ViewLayout = view.layout.clone().into();
|
||||
let view_encoded_collab = test.encoded_collab_v1(view_id, layout).await;
|
||||
let publish_view_info = PublishViewInfo {
|
||||
view_id: view_id.to_string(),
|
||||
name: view.name.to_string(),
|
||||
icon: None,
|
||||
layout: ViewLayout::Document,
|
||||
extra: None,
|
||||
created_by: view.created_by,
|
||||
last_edited_by: view.last_edited_by,
|
||||
last_edited_time: view.last_edited,
|
||||
created_at: view.create_time,
|
||||
child_views: None,
|
||||
};
|
||||
|
||||
let child_view_id = &view.child_views[0].id;
|
||||
let child_view = test.get_view(child_view_id).await;
|
||||
let child_layout: ViewLayout = child_view.layout.clone().into();
|
||||
let child_view_encoded_collab = test.encoded_collab_v1(child_view_id, child_layout).await;
|
||||
let child_publish_view_info = PublishViewInfo {
|
||||
view_id: child_view_id.to_string(),
|
||||
name: child_view.name.to_string(),
|
||||
icon: None,
|
||||
layout: ViewLayout::Document,
|
||||
extra: None,
|
||||
created_by: child_view.created_by,
|
||||
last_edited_by: child_view.last_edited_by,
|
||||
last_edited_time: child_view.last_edited,
|
||||
created_at: child_view.create_time,
|
||||
child_views: None,
|
||||
};
|
||||
let child_publish_name = generate_publish_name(&child_view.id, &child_view.name);
|
||||
|
||||
vec![
|
||||
PublishViewPayload {
|
||||
meta: PublishViewMeta {
|
||||
metadata: PublishViewMetaData {
|
||||
view: publish_view_info.clone(),
|
||||
child_views: vec![child_publish_view_info.clone()],
|
||||
ancestor_views: vec![publish_view_info.clone()],
|
||||
},
|
||||
view_id: view_id.to_string(),
|
||||
publish_name,
|
||||
},
|
||||
data: Vec::from(view_encoded_collab.doc_state),
|
||||
},
|
||||
PublishViewPayload {
|
||||
meta: PublishViewMeta {
|
||||
metadata: PublishViewMetaData {
|
||||
view: child_publish_view_info.clone(),
|
||||
child_views: vec![],
|
||||
ancestor_views: vec![publish_view_info.clone(), child_publish_view_info.clone()],
|
||||
},
|
||||
view_id: child_view_id.to_string(),
|
||||
publish_name: child_publish_name,
|
||||
},
|
||||
data: Vec::from(child_view_encoded_collab.doc_state),
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
async fn create_single_document(test: &EventIntegrationTest, view_id: &str, name: &str) {
|
||||
test
|
||||
.create_orphan_view(name, view_id, ViewLayoutPB::Document)
|
||||
.await;
|
||||
}
|
||||
|
||||
async fn create_nested_document(test: &EventIntegrationTest, view_id: &str, name: &str) {
|
||||
create_single_document(test, view_id, name).await;
|
||||
let child_name = "Child View";
|
||||
test.create_view(view_id, child_name.to_string()).await;
|
||||
}
|
||||
#[tokio::test]
|
||||
async fn single_document_get_publish_view_payload_test() {
|
||||
let test = EventIntegrationTest::new_anon().await;
|
||||
let view_id = "20240521";
|
||||
let name = "Orphan View";
|
||||
create_single_document(&test, view_id, name).await;
|
||||
let view = test.get_view(view_id).await;
|
||||
let payload = test.get_publish_payload(view_id, Some(true)).await;
|
||||
|
||||
let expect_payload = mock_single_document_view_publish_payload(
|
||||
&test,
|
||||
&view,
|
||||
format!("{}-{}", "Orphan-View", view_id),
|
||||
)
|
||||
.await;
|
||||
|
||||
assert_eq!(payload, expect_payload);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn nested_document_get_publish_view_payload_test() {
|
||||
let test = EventIntegrationTest::new_anon().await;
|
||||
let name = "Orphan View";
|
||||
let view_id = "20240521";
|
||||
create_nested_document(&test, view_id, name).await;
|
||||
let view = test.get_view(view_id).await;
|
||||
let payload = test.get_publish_payload(view_id, Some(true)).await;
|
||||
|
||||
let expect_payload = mock_nested_document_view_publish_payload(
|
||||
&test,
|
||||
&view,
|
||||
format!("{}-{}", "Orphan-View", view_id),
|
||||
)
|
||||
.await;
|
||||
|
||||
assert_eq!(payload.len(), 2);
|
||||
assert_eq!(payload, expect_payload);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn no_children_publish_view_payload_test() {
|
||||
let test = EventIntegrationTest::new_anon().await;
|
||||
let name = "Orphan View";
|
||||
let view_id = "20240521";
|
||||
create_nested_document(&test, view_id, name).await;
|
||||
let view = test.get_view(view_id).await;
|
||||
let payload = test.get_publish_payload(view_id, Some(false)).await;
|
||||
|
||||
let data = mock_single_document_view_publish_payload(
|
||||
&test,
|
||||
&view,
|
||||
format!("{}-{}", "Orphan-View", view_id),
|
||||
)
|
||||
.await
|
||||
.iter()
|
||||
.map(|p| p.data.clone())
|
||||
.collect::<Vec<_>>();
|
||||
let meta = mock_nested_document_view_publish_payload(
|
||||
&test,
|
||||
&view,
|
||||
format!("{}-{}", "Orphan-View", view_id),
|
||||
)
|
||||
.await
|
||||
.iter()
|
||||
.map(|p| p.meta.clone())
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
assert_eq!(payload.len(), 1);
|
||||
assert_eq!(&payload[0].data, &data[0]);
|
||||
assert_eq!(&payload[0].meta, &meta[0]);
|
||||
}
|
Reference in New Issue
Block a user