|
@@ -1,7 +1,8 @@
|
|
|
|
+use crate::entities::revision::{RepeatedRevision, Revision};
|
|
use crate::{
|
|
use crate::{
|
|
entities::{text_block::DocumentPB, ws_data::ServerRevisionWSDataBuilder},
|
|
entities::{text_block::DocumentPB, ws_data::ServerRevisionWSDataBuilder},
|
|
errors::{internal_error, CollaborateError, CollaborateResult},
|
|
errors::{internal_error, CollaborateError, CollaborateResult},
|
|
- protobuf::{ClientRevisionWSData, RepeatedRevision as RepeatedRevisionPB, Revision as RevisionPB},
|
|
|
|
|
|
+ protobuf::ClientRevisionWSData,
|
|
server_document::document_pad::ServerDocument,
|
|
server_document::document_pad::ServerDocument,
|
|
synchronizer::{RevisionSyncPersistence, RevisionSyncResponse, RevisionSynchronizer, RevisionUser},
|
|
synchronizer::{RevisionSyncPersistence, RevisionSyncResponse, RevisionSynchronizer, RevisionUser},
|
|
util::rev_id_from_str,
|
|
util::rev_id_from_str,
|
|
@@ -23,22 +24,21 @@ pub trait TextBlockCloudPersistence: Send + Sync + Debug {
|
|
fn create_text_block(
|
|
fn create_text_block(
|
|
&self,
|
|
&self,
|
|
doc_id: &str,
|
|
doc_id: &str,
|
|
- repeated_revision: RepeatedRevisionPB,
|
|
|
|
|
|
+ repeated_revision: RepeatedRevision,
|
|
) -> BoxResultFuture<Option<DocumentPB>, CollaborateError>;
|
|
) -> BoxResultFuture<Option<DocumentPB>, CollaborateError>;
|
|
|
|
|
|
fn read_text_block_revisions(
|
|
fn read_text_block_revisions(
|
|
&self,
|
|
&self,
|
|
doc_id: &str,
|
|
doc_id: &str,
|
|
rev_ids: Option<Vec<i64>>,
|
|
rev_ids: Option<Vec<i64>>,
|
|
- ) -> BoxResultFuture<Vec<RevisionPB>, CollaborateError>;
|
|
|
|
|
|
+ ) -> BoxResultFuture<Vec<Revision>, CollaborateError>;
|
|
|
|
|
|
- fn save_text_block_revisions(&self, repeated_revision: RepeatedRevisionPB)
|
|
|
|
- -> BoxResultFuture<(), CollaborateError>;
|
|
|
|
|
|
+ fn save_text_block_revisions(&self, repeated_revision: RepeatedRevision) -> BoxResultFuture<(), CollaborateError>;
|
|
|
|
|
|
fn reset_text_block(
|
|
fn reset_text_block(
|
|
&self,
|
|
&self,
|
|
doc_id: &str,
|
|
doc_id: &str,
|
|
- repeated_revision: RepeatedRevisionPB,
|
|
|
|
|
|
+ repeated_revision: RepeatedRevision,
|
|
) -> BoxResultFuture<(), CollaborateError>;
|
|
) -> BoxResultFuture<(), CollaborateError>;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -47,18 +47,18 @@ impl RevisionSyncPersistence for Arc<dyn TextBlockCloudPersistence> {
|
|
&self,
|
|
&self,
|
|
object_id: &str,
|
|
object_id: &str,
|
|
rev_ids: Option<Vec<i64>>,
|
|
rev_ids: Option<Vec<i64>>,
|
|
- ) -> BoxResultFuture<Vec<RevisionPB>, CollaborateError> {
|
|
|
|
|
|
+ ) -> BoxResultFuture<Vec<Revision>, CollaborateError> {
|
|
(**self).read_text_block_revisions(object_id, rev_ids)
|
|
(**self).read_text_block_revisions(object_id, rev_ids)
|
|
}
|
|
}
|
|
|
|
|
|
- fn save_revisions(&self, repeated_revision: RepeatedRevisionPB) -> BoxResultFuture<(), CollaborateError> {
|
|
|
|
|
|
+ fn save_revisions(&self, repeated_revision: RepeatedRevision) -> BoxResultFuture<(), CollaborateError> {
|
|
(**self).save_text_block_revisions(repeated_revision)
|
|
(**self).save_text_block_revisions(repeated_revision)
|
|
}
|
|
}
|
|
|
|
|
|
fn reset_object(
|
|
fn reset_object(
|
|
&self,
|
|
&self,
|
|
object_id: &str,
|
|
object_id: &str,
|
|
- repeated_revision: RepeatedRevisionPB,
|
|
|
|
|
|
+ repeated_revision: RepeatedRevision,
|
|
) -> BoxResultFuture<(), CollaborateError> {
|
|
) -> BoxResultFuture<(), CollaborateError> {
|
|
(**self).reset_text_block(object_id, repeated_revision)
|
|
(**self).reset_text_block(object_id, repeated_revision)
|
|
}
|
|
}
|
|
@@ -82,7 +82,7 @@ impl ServerDocumentManager {
|
|
user: Arc<dyn RevisionUser>,
|
|
user: Arc<dyn RevisionUser>,
|
|
mut client_data: ClientRevisionWSData,
|
|
mut client_data: ClientRevisionWSData,
|
|
) -> Result<(), CollaborateError> {
|
|
) -> Result<(), CollaborateError> {
|
|
- let repeated_revision = client_data.take_revisions();
|
|
|
|
|
|
+ let repeated_revision: RepeatedRevision = client_data.take_revisions().into();
|
|
let cloned_user = user.clone();
|
|
let cloned_user = user.clone();
|
|
let ack_id = rev_id_from_str(&client_data.data_id)?;
|
|
let ack_id = rev_id_from_str(&client_data.data_id)?;
|
|
let object_id = client_data.object_id;
|
|
let object_id = client_data.object_id;
|
|
@@ -131,9 +131,10 @@ impl ServerDocumentManager {
|
|
pub async fn handle_document_reset(
|
|
pub async fn handle_document_reset(
|
|
&self,
|
|
&self,
|
|
doc_id: &str,
|
|
doc_id: &str,
|
|
- mut repeated_revision: RepeatedRevisionPB,
|
|
|
|
|
|
+ mut repeated_revision: RepeatedRevision,
|
|
) -> Result<(), CollaborateError> {
|
|
) -> Result<(), CollaborateError> {
|
|
- repeated_revision.mut_items().sort_by(|a, b| a.rev_id.cmp(&b.rev_id));
|
|
|
|
|
|
+ repeated_revision.sort_by(|a, b| a.rev_id.cmp(&b.rev_id));
|
|
|
|
+
|
|
match self.get_document_handler(doc_id).await {
|
|
match self.get_document_handler(doc_id).await {
|
|
None => {
|
|
None => {
|
|
tracing::warn!("Document:{} doesn't exist, ignore document reset", doc_id);
|
|
tracing::warn!("Document:{} doesn't exist, ignore document reset", doc_id);
|
|
@@ -166,7 +167,7 @@ impl ServerDocumentManager {
|
|
async fn create_document(
|
|
async fn create_document(
|
|
&self,
|
|
&self,
|
|
doc_id: &str,
|
|
doc_id: &str,
|
|
- repeated_revision: RepeatedRevisionPB,
|
|
|
|
|
|
+ repeated_revision: RepeatedRevision,
|
|
) -> Result<Arc<OpenDocumentHandler>, CollaborateError> {
|
|
) -> Result<Arc<OpenDocumentHandler>, CollaborateError> {
|
|
match self.persistence.create_text_block(doc_id, repeated_revision).await? {
|
|
match self.persistence.create_text_block(doc_id, repeated_revision).await? {
|
|
None => Err(CollaborateError::internal().context("Create document info from revisions failed")),
|
|
None => Err(CollaborateError::internal().context("Create document info from revisions failed")),
|
|
@@ -229,7 +230,7 @@ impl OpenDocumentHandler {
|
|
async fn apply_revisions(
|
|
async fn apply_revisions(
|
|
&self,
|
|
&self,
|
|
user: Arc<dyn RevisionUser>,
|
|
user: Arc<dyn RevisionUser>,
|
|
- repeated_revision: RepeatedRevisionPB,
|
|
|
|
|
|
+ repeated_revision: RepeatedRevision,
|
|
) -> Result<(), CollaborateError> {
|
|
) -> Result<(), CollaborateError> {
|
|
let (ret, rx) = oneshot::channel();
|
|
let (ret, rx) = oneshot::channel();
|
|
self.users.insert(user.user_id(), user.clone());
|
|
self.users.insert(user.user_id(), user.clone());
|
|
@@ -252,7 +253,7 @@ impl OpenDocumentHandler {
|
|
}
|
|
}
|
|
|
|
|
|
#[tracing::instrument(level = "debug", skip(self, repeated_revision), err)]
|
|
#[tracing::instrument(level = "debug", skip(self, repeated_revision), err)]
|
|
- async fn apply_document_reset(&self, repeated_revision: RepeatedRevisionPB) -> Result<(), CollaborateError> {
|
|
|
|
|
|
+ async fn apply_document_reset(&self, repeated_revision: RepeatedRevision) -> Result<(), CollaborateError> {
|
|
let (ret, rx) = oneshot::channel();
|
|
let (ret, rx) = oneshot::channel();
|
|
let msg = DocumentCommand::Reset { repeated_revision, ret };
|
|
let msg = DocumentCommand::Reset { repeated_revision, ret };
|
|
let result = self.send(msg, rx).await?;
|
|
let result = self.send(msg, rx).await?;
|
|
@@ -279,7 +280,7 @@ impl std::ops::Drop for OpenDocumentHandler {
|
|
enum DocumentCommand {
|
|
enum DocumentCommand {
|
|
ApplyRevisions {
|
|
ApplyRevisions {
|
|
user: Arc<dyn RevisionUser>,
|
|
user: Arc<dyn RevisionUser>,
|
|
- repeated_revision: RepeatedRevisionPB,
|
|
|
|
|
|
+ repeated_revision: RepeatedRevision,
|
|
ret: oneshot::Sender<CollaborateResult<()>>,
|
|
ret: oneshot::Sender<CollaborateResult<()>>,
|
|
},
|
|
},
|
|
Ping {
|
|
Ping {
|
|
@@ -288,7 +289,7 @@ enum DocumentCommand {
|
|
ret: oneshot::Sender<CollaborateResult<()>>,
|
|
ret: oneshot::Sender<CollaborateResult<()>>,
|
|
},
|
|
},
|
|
Reset {
|
|
Reset {
|
|
- repeated_revision: RepeatedRevisionPB,
|
|
|
|
|
|
+ repeated_revision: RepeatedRevision,
|
|
ret: oneshot::Sender<CollaborateResult<()>>,
|
|
ret: oneshot::Sender<CollaborateResult<()>>,
|
|
},
|
|
},
|
|
}
|
|
}
|