128 lines
3.1 KiB
Rust
Raw Normal View History

2021-12-22 21:13:52 +08:00
use crate::{
entities::revision::{RepeatedRevision, Revision},
2021-12-26 23:59:45 +08:00
errors::{internal_error, CollaborateError},
2021-12-22 21:13:52 +08:00
};
2021-07-22 21:43:01 +08:00
use flowy_derive::ProtoBuf;
2021-12-26 23:59:45 +08:00
use lib_ot::{core::OperationTransformable, errors::OTError, rich_text::RichTextDelta};
2021-07-22 21:43:01 +08:00
2021-09-11 14:26:30 +08:00
#[derive(ProtoBuf, Default, Debug, Clone)]
pub struct CreateDocParams {
2021-07-22 21:43:01 +08:00
#[pb(index = 1)]
pub id: String,
2021-07-22 21:43:01 +08:00
#[pb(index = 2)]
pub revisions: RepeatedRevision,
2021-09-11 14:26:30 +08:00
}
#[derive(ProtoBuf, Default, Debug, Clone, Eq, PartialEq)]
2021-12-23 23:17:57 +08:00
pub struct DocumentInfo {
#[pb(index = 1)]
2021-12-26 23:59:45 +08:00
pub doc_id: String,
#[pb(index = 2)]
pub text: String,
#[pb(index = 3)]
pub rev_id: i64,
2021-10-06 15:23:38 +08:00
#[pb(index = 4)]
pub base_rev_id: i64,
}
2021-12-23 23:17:57 +08:00
impl DocumentInfo {
2021-12-07 10:39:01 +08:00
pub fn delta(&self) -> Result<RichTextDelta, OTError> {
let delta = RichTextDelta::from_bytes(&self.text)?;
2021-10-06 15:23:38 +08:00
Ok(delta)
}
2021-12-26 23:59:45 +08:00
pub fn from_revisions(doc_id: &str, revisions: Vec<Revision>) -> Result<Self, CollaborateError> {
let mut document_delta = RichTextDelta::new();
let mut base_rev_id = 0;
let mut rev_id = 0;
for revision in revisions {
base_rev_id = revision.base_rev_id;
rev_id = revision.rev_id;
let delta = RichTextDelta::from_bytes(revision.delta_data).map_err(internal_error)?;
document_delta = document_delta.compose(&delta).map_err(internal_error)?;
}
let text = document_delta.to_json();
Ok(DocumentInfo {
doc_id: doc_id.to_string(),
text,
rev_id,
base_rev_id,
})
}
2021-07-22 21:43:01 +08:00
}
2021-12-23 23:17:57 +08:00
impl std::convert::TryFrom<Revision> for DocumentInfo {
2021-12-13 22:46:35 +08:00
type Error = CollaborateError;
fn try_from(revision: Revision) -> Result<Self, Self::Error> {
if !revision.is_initial() {
2021-12-21 11:13:38 +08:00
return Err(CollaborateError::revision_conflict()
.context("Revision's rev_id should be 0 when creating the document"));
2021-12-13 22:46:35 +08:00
}
let delta = RichTextDelta::from_bytes(&revision.delta_data)?;
let doc_json = delta.to_json();
2021-12-23 23:17:57 +08:00
Ok(DocumentInfo {
2021-12-26 23:59:45 +08:00
doc_id: revision.doc_id,
text: doc_json,
2021-12-13 22:46:35 +08:00
rev_id: revision.rev_id,
base_rev_id: revision.base_rev_id,
})
}
}
2021-09-11 14:26:30 +08:00
#[derive(ProtoBuf, Default, Debug, Clone)]
pub struct ResetDocumentParams {
2021-09-11 14:26:30 +08:00
#[pb(index = 1)]
2021-09-23 13:15:35 +08:00
pub doc_id: String,
2021-07-22 21:43:01 +08:00
2021-09-14 16:22:44 +08:00
#[pb(index = 2)]
pub revisions: RepeatedRevision,
2021-09-14 16:22:44 +08:00
}
#[derive(ProtoBuf, Default, Debug, Clone)]
2021-12-23 23:17:57 +08:00
pub struct DocumentDelta {
2021-09-14 16:22:44 +08:00
#[pb(index = 1)]
2021-09-23 13:15:35 +08:00
pub doc_id: String,
2021-09-14 16:22:44 +08:00
#[pb(index = 2)]
2021-12-23 23:17:57 +08:00
pub text: String, // RichTextDelta
2021-07-22 21:43:01 +08:00
}
2021-07-22 22:26:38 +08:00
#[derive(ProtoBuf, Default, Debug, Clone)]
pub struct NewDocUser {
#[pb(index = 1)]
pub user_id: String,
#[pb(index = 2)]
pub rev_id: i64,
#[pb(index = 3)]
pub doc_id: String,
}
#[derive(ProtoBuf, Default, Debug, Clone)]
pub struct DocIdentifier {
2021-07-22 22:26:38 +08:00
#[pb(index = 1)]
2021-09-11 14:26:30 +08:00
pub doc_id: String,
2021-07-22 22:26:38 +08:00
}
2021-10-15 13:42:52 +08:00
impl std::convert::From<String> for DocIdentifier {
fn from(doc_id: String) -> Self { DocIdentifier { doc_id } }
2021-10-15 13:42:52 +08:00
}
impl std::convert::From<&String> for DocIdentifier {
fn from(doc_id: &String) -> Self {
DocIdentifier {
doc_id: doc_id.to_owned(),
}
}
}