fix: use correct id for duplicating doc in db row

This commit is contained in:
Zack Fu Zi Xiang 2024-09-09 19:22:36 +08:00
parent 572e18e88a
commit 3e9e865bfc
No known key found for this signature in database
1 changed files with 21 additions and 19 deletions

View File

@ -378,12 +378,12 @@ impl PublishCollabDuplicator {
async fn deep_copy_doc<'a>(
&mut self,
pub_view_id: &str,
new_view_id: String,
dup_view_id: String,
doc: Document,
metadata: PublishViewMetaData,
) -> Result<View, AppError> {
let mut ret_view =
self.new_folder_view(new_view_id.clone(), &metadata.view, ViewLayout::Document);
self.new_folder_view(dup_view_id.clone(), &metadata.view, ViewLayout::Document);
let mut doc_data = doc
.get_document_data()
@ -402,7 +402,7 @@ impl PublishCollabDuplicator {
{
// write modified doc_data back to storage
let empty_collab = collab_from_doc_state(vec![], &new_view_id)?;
let empty_collab = collab_from_doc_state(vec![], &dup_view_id)?;
let new_doc = tokio::task::spawn_blocking(move || {
Document::open_with(empty_collab, Some(doc_data))
.map_err(|e| AppError::Unhandled(e.to_string()))
@ -732,8 +732,8 @@ impl PublishCollabDuplicator {
// duplicate db collab rows
for (pub_row_id, row_bin_data) in &published_db.database_row_collabs {
// assign a new id for the row
let new_row_id = gen_view_id();
let mut db_row_collab = collab_from_doc_state(row_bin_data.clone(), &new_row_id)?;
let dup_row_id = gen_view_id();
let mut db_row_collab = collab_from_doc_state(row_bin_data.clone(), &dup_row_id)?;
{
// update database_id and row_id in data
@ -746,7 +746,7 @@ impl PublishCollabDuplicator {
})?
.cast::<MapRef>()
.map_err(|err| AppError::Unhandled(format!("data not map: {:?}", err)))?;
data.insert(&mut txn, "id", new_row_id.clone());
data.insert(&mut txn, "id", dup_row_id.clone());
data.insert(&mut txn, "database_id", new_db_id.clone());
{
@ -810,9 +810,6 @@ impl PublishCollabDuplicator {
.cast()
.map_err(|err| AppError::Unhandled(format!("not a map: {:?}", err)))?;
// document_id
let pub_row_doc_id = meta_id_from_row_id(&pub_row_id.parse()?, RowMetaKey::DocumentId);
// is document empty
let pub_is_doc_empty_key =
meta_id_from_row_id(&pub_row_id.parse()?, RowMetaKey::IsDocumentEmpty);
@ -837,6 +834,10 @@ impl PublishCollabDuplicator {
// if doc exists, duplicate it!
if let Some(Out::Any(any::Any::Bool(is_doc_empty))) = pub_is_doc_empty {
if !is_doc_empty {
let pub_row_doc_id =
meta_id_from_row_id(&pub_row_id.parse()?, RowMetaKey::DocumentId);
let dup_row_doc_id =
meta_id_from_row_id(&dup_row_id.parse()?, RowMetaKey::DocumentId);
let row_doc_doc_state = published_db
.database_row_document_collabs
.get(&pub_row_doc_id)
@ -848,28 +849,29 @@ impl PublishCollabDuplicator {
let doc =
Document::open(doc_collab).map_err(|e| AppError::Unhandled(e.to_string()))?;
let mut new_doc_view = Box::pin(self.deep_copy_doc(
publish_view_id,
new_view_id.clone(),
&pub_row_doc_id,
dup_row_doc_id.clone(),
doc,
PublishViewMetaData::default(),
))
.await?;
let dup_doc_id = meta_id_from_row_id(&new_row_id.parse()?, RowMetaKey::DocumentId);
new_doc_view.parent_view_id.clone_from(&dup_doc_id); // orphan folder view
self.views_to_add.insert(dup_doc_id.clone(), new_doc_view);
row_meta.insert(&mut txn, dup_doc_id, any::Any::Bool(false));
new_doc_view.parent_view_id.clone_from(&dup_row_doc_id); // orphan folder view
self
.views_to_add
.insert(dup_row_doc_id.clone(), new_doc_view);
row_meta.insert(&mut txn, dup_row_doc_id, any::Any::Bool(false));
}
}
// if pub_icon_id exists, duplicate it!
if let Some(Out::Any(any::Any::String(icon_id))) = pub_icon_id {
let dup_icon_id_key = meta_id_from_row_id(&new_row_id.parse()?, RowMetaKey::IconId);
let dup_icon_id_key = meta_id_from_row_id(&dup_row_id.parse()?, RowMetaKey::IconId);
row_meta.insert(&mut txn, dup_icon_id_key, icon_id);
}
// if pub_cover_id exists, duplicate it!
if let Some(Out::Any(any::Any::String(cover_id))) = pub_cover_id {
let dup_cover_id_key = meta_id_from_row_id(&new_row_id.parse()?, RowMetaKey::IconId);
let dup_cover_id_key = meta_id_from_row_id(&dup_row_id.parse()?, RowMetaKey::IconId);
row_meta.insert(&mut txn, dup_cover_id_key, cover_id);
}
@ -887,12 +889,12 @@ impl PublishCollabDuplicator {
tokio::task::spawn_blocking(move || collab_to_bin(&db_row_collab, CollabType::DatabaseRow))
.await?;
self.collabs_to_insert.insert(
new_row_id.clone(),
dup_row_id.clone(),
(CollabType::DatabaseRow, db_row_ec_bytes?),
);
self
.duplicated_db_row
.insert(pub_row_id.clone(), new_row_id.clone());
.insert(pub_row_id.clone(), dup_row_id.clone());
}
// accumulate list of database views (Board, Cal, ...) to be linked to the database