mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
solver conflicts
This commit is contained in:
commit
a9eec5baed
58
backend/Cargo.lock
generated
58
backend/Cargo.lock
generated
@ -1111,6 +1111,12 @@ version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0"
|
||||
|
||||
[[package]]
|
||||
name = "dissimilar"
|
||||
version = "1.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "31ad93652f40969dead8d4bf897a41e9462095152eb21c56e5830537e41179dd"
|
||||
|
||||
[[package]]
|
||||
name = "dotenv"
|
||||
version = "0.15.0"
|
||||
@ -1227,6 +1233,8 @@ dependencies = [
|
||||
"bytes",
|
||||
"chrono",
|
||||
"dashmap",
|
||||
"dissimilar",
|
||||
"flowy-core-data-model",
|
||||
"flowy-derive",
|
||||
"futures",
|
||||
"lib-infra",
|
||||
@ -1236,6 +1244,7 @@ dependencies = [
|
||||
"parking_lot",
|
||||
"protobuf",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"strum",
|
||||
"strum_macros",
|
||||
"tokio",
|
||||
@ -1247,7 +1256,6 @@ dependencies = [
|
||||
name = "flowy-core"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"backend-service",
|
||||
"bincode",
|
||||
"bytes",
|
||||
"chrono",
|
||||
@ -1263,7 +1271,7 @@ dependencies = [
|
||||
"flowy-derive",
|
||||
"flowy-document",
|
||||
"flowy-error",
|
||||
"flowy-net",
|
||||
"flowy-sync",
|
||||
"futures",
|
||||
"futures-core",
|
||||
"lazy_static",
|
||||
@ -1290,10 +1298,11 @@ dependencies = [
|
||||
"chrono",
|
||||
"derive_more",
|
||||
"error-code",
|
||||
"flowy-collaboration",
|
||||
"flowy-derive",
|
||||
"log",
|
||||
"protobuf",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"strum",
|
||||
"strum_macros",
|
||||
"unicode-segmentation",
|
||||
@ -1327,7 +1336,7 @@ name = "flowy-document"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"async-stream",
|
||||
"backend-service",
|
||||
"async-trait",
|
||||
"bytecount",
|
||||
"byteorder",
|
||||
"bytes",
|
||||
@ -1341,10 +1350,9 @@ dependencies = [
|
||||
"flowy-database",
|
||||
"flowy-derive",
|
||||
"flowy-error",
|
||||
"flowy-sync",
|
||||
"futures",
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"lazy_static",
|
||||
"lib-dispatch",
|
||||
"lib-infra",
|
||||
"lib-ot",
|
||||
@ -1386,11 +1394,20 @@ name = "flowy-net"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-stream",
|
||||
"backend-service",
|
||||
"bytes",
|
||||
"dashmap",
|
||||
"flowy-collaboration",
|
||||
"flowy-core",
|
||||
"flowy-core-data-model",
|
||||
"flowy-derive",
|
||||
"flowy-document",
|
||||
"flowy-error",
|
||||
"flowy-user",
|
||||
"flowy-user-data-model",
|
||||
"futures-util",
|
||||
"lazy_static",
|
||||
"lib-dispatch",
|
||||
"lib-infra",
|
||||
"lib-ws",
|
||||
@ -1414,6 +1431,7 @@ dependencies = [
|
||||
"flowy-database",
|
||||
"flowy-document",
|
||||
"flowy-net",
|
||||
"flowy-sync",
|
||||
"flowy-user",
|
||||
"futures-core",
|
||||
"lib-dispatch",
|
||||
@ -1426,6 +1444,32 @@ dependencies = [
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "flowy-sync"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"async-stream",
|
||||
"bytes",
|
||||
"dashmap",
|
||||
"diesel",
|
||||
"diesel_derives",
|
||||
"flowy-collaboration",
|
||||
"flowy-database",
|
||||
"flowy-error",
|
||||
"futures-util",
|
||||
"lib-infra",
|
||||
"lib-ot",
|
||||
"lib-ws",
|
||||
"parking_lot",
|
||||
"protobuf",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"strum",
|
||||
"strum_macros",
|
||||
"tokio",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "flowy-test"
|
||||
version = "0.1.0"
|
||||
@ -1455,7 +1499,6 @@ dependencies = [
|
||||
name = "flowy-user"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"backend-service",
|
||||
"bytes",
|
||||
"dart-notify",
|
||||
"dashmap",
|
||||
@ -1465,7 +1508,6 @@ dependencies = [
|
||||
"flowy-database",
|
||||
"flowy-derive",
|
||||
"flowy-error",
|
||||
"flowy-net",
|
||||
"flowy-user-data-model",
|
||||
"futures-core",
|
||||
"lazy_static",
|
||||
|
@ -12,8 +12,8 @@ use crate::{
|
||||
},
|
||||
context::AppContext,
|
||||
services::{
|
||||
core::{app::router as app, trash::router as trash, view::router as view, workspace::router as workspace},
|
||||
document::router as doc,
|
||||
folder::{app::router as app, trash::router as trash, view::router as view, workspace::router as workspace},
|
||||
user::router as user,
|
||||
web_socket::WSServer,
|
||||
},
|
||||
@ -135,7 +135,7 @@ fn user_scope() -> Scope {
|
||||
}
|
||||
|
||||
pub async fn init_app_context(configuration: &Settings) -> AppContext {
|
||||
let _ = crate::services::core::log::Builder::new("flowy-server")
|
||||
let _ = crate::services::log::Builder::new("flowy-server")
|
||||
.env_filter("Trace")
|
||||
.build();
|
||||
let pg_pool = get_connection_pool(&configuration.database)
|
||||
|
@ -5,12 +5,13 @@ use crate::services::{
|
||||
use actix::Addr;
|
||||
use actix_web::web::Data;
|
||||
|
||||
use crate::services::document::{
|
||||
persistence::DocumentKVPersistence,
|
||||
ws_receiver::{make_document_ws_receiver, DocumentPersistenceImpl},
|
||||
use crate::services::{
|
||||
document::ws_receiver::{make_document_ws_receiver, HttpDocumentCloudPersistence},
|
||||
folder::ws_receiver::{make_folder_ws_receiver, HttpFolderCloudPersistence},
|
||||
kv::revision_kv::RevisionKVPersistence,
|
||||
};
|
||||
use flowy_collaboration::sync::ServerDocumentManager;
|
||||
use lib_ws::WSModule;
|
||||
use flowy_collaboration::{server_document::ServerDocumentManager, server_folder::ServerFolderManager};
|
||||
use lib_ws::WSChannel;
|
||||
use sqlx::PgPool;
|
||||
use std::sync::Arc;
|
||||
|
||||
@ -20,6 +21,7 @@ pub struct AppContext {
|
||||
pub persistence: Data<Arc<FlowyPersistence>>,
|
||||
pub ws_receivers: Data<WebSocketReceivers>,
|
||||
pub document_manager: Data<Arc<ServerDocumentManager>>,
|
||||
pub folder_manager: Data<Arc<ServerFolderManager>>,
|
||||
}
|
||||
|
||||
impl AppContext {
|
||||
@ -27,40 +29,58 @@ impl AppContext {
|
||||
let ws_server = Data::new(ws_server);
|
||||
let mut ws_receivers = WebSocketReceivers::new();
|
||||
|
||||
let kv_store = make_document_kv_store(pg_pool.clone());
|
||||
let persistence = Arc::new(FlowyPersistence { pg_pool, kv_store });
|
||||
let document_store = make_document_kv_store(pg_pool.clone());
|
||||
let folder_store = make_folder_kv_store(pg_pool.clone());
|
||||
let flowy_persistence = Arc::new(FlowyPersistence {
|
||||
pg_pool,
|
||||
document_store,
|
||||
folder_store,
|
||||
});
|
||||
|
||||
let document_persistence = Arc::new(DocumentPersistenceImpl(persistence.clone()));
|
||||
let document_persistence = Arc::new(HttpDocumentCloudPersistence(flowy_persistence.document_kv_store()));
|
||||
let document_manager = Arc::new(ServerDocumentManager::new(document_persistence));
|
||||
let document_ws_receiver = make_document_ws_receiver(flowy_persistence.clone(), document_manager.clone());
|
||||
ws_receivers.set(WSChannel::Document, document_ws_receiver);
|
||||
|
||||
let folder_persistence = Arc::new(HttpFolderCloudPersistence(flowy_persistence.folder_kv_store()));
|
||||
let folder_manager = Arc::new(ServerFolderManager::new(folder_persistence));
|
||||
let folder_ws_receiver = make_folder_ws_receiver(flowy_persistence.clone(), folder_manager.clone());
|
||||
ws_receivers.set(WSChannel::Folder, folder_ws_receiver);
|
||||
|
||||
let document_ws_receiver = make_document_ws_receiver(persistence.clone(), document_manager.clone());
|
||||
ws_receivers.set(WSModule::Doc, document_ws_receiver);
|
||||
AppContext {
|
||||
ws_server,
|
||||
persistence: Data::new(persistence),
|
||||
persistence: Data::new(flowy_persistence),
|
||||
ws_receivers: Data::new(ws_receivers),
|
||||
document_manager: Data::new(document_manager),
|
||||
folder_manager: Data::new(folder_manager),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn make_document_kv_store(pg_pool: PgPool) -> Arc<DocumentKVPersistence> {
|
||||
pub type DocumentRevisionKV = RevisionKVPersistence;
|
||||
pub type FolderRevisionKV = RevisionKVPersistence;
|
||||
|
||||
fn make_document_kv_store(pg_pool: PgPool) -> Arc<DocumentRevisionKV> {
|
||||
let kv_impl = Arc::new(PostgresKV { pg_pool });
|
||||
Arc::new(DocumentKVPersistence::new(kv_impl))
|
||||
Arc::new(DocumentRevisionKV::new(kv_impl))
|
||||
}
|
||||
|
||||
fn make_folder_kv_store(pg_pool: PgPool) -> Arc<FolderRevisionKV> {
|
||||
let kv_impl = Arc::new(PostgresKV { pg_pool });
|
||||
Arc::new(FolderRevisionKV::new(kv_impl))
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct FlowyPersistence {
|
||||
pg_pool: PgPool,
|
||||
kv_store: Arc<DocumentKVPersistence>,
|
||||
document_store: Arc<DocumentRevisionKV>,
|
||||
folder_store: Arc<FolderRevisionKV>,
|
||||
}
|
||||
|
||||
impl FlowyPersistence {
|
||||
pub fn pg_pool(&self) -> PgPool {
|
||||
self.pg_pool.clone()
|
||||
}
|
||||
pub fn pg_pool(&self) -> PgPool { self.pg_pool.clone() }
|
||||
|
||||
pub fn kv_store(&self) -> Arc<DocumentKVPersistence> {
|
||||
self.kv_store.clone()
|
||||
}
|
||||
pub fn document_kv_store(&self) -> Arc<DocumentRevisionKV> { self.document_store.clone() }
|
||||
|
||||
pub fn folder_kv_store(&self) -> Arc<FolderRevisionKV> { self.folder_store.clone() }
|
||||
}
|
||||
|
@ -1,40 +1,38 @@
|
||||
use crate::{
|
||||
services::kv::{KVStore, KeyValue},
|
||||
util::serde_ext::parse_from_bytes,
|
||||
};
|
||||
use anyhow::Context;
|
||||
use backend_service::errors::{internal_error, ServerError};
|
||||
use bytes::Bytes;
|
||||
|
||||
use flowy_collaboration::{
|
||||
protobuf::{
|
||||
CreateDocParams, DocumentId, DocumentInfo, RepeatedRevision as RepeatedRevisionPB, ResetDocumentParams,
|
||||
Revision as RevisionPB,
|
||||
},
|
||||
sync::ServerDocumentManager,
|
||||
protobuf::{CreateDocParams, DocumentId, DocumentInfo, ResetDocumentParams},
|
||||
server_document::ServerDocumentManager,
|
||||
util::make_document_info_pb_from_revisions_pb,
|
||||
};
|
||||
use lib_ot::{core::OperationTransformable, rich_text::RichTextDelta};
|
||||
use protobuf::Message;
|
||||
|
||||
use crate::services::kv::revision_kv::RevisionKVPersistence;
|
||||
use std::sync::Arc;
|
||||
use uuid::Uuid;
|
||||
|
||||
#[tracing::instrument(level = "debug", skip(kv_store, params), err)]
|
||||
#[tracing::instrument(level = "trace", skip(document_store, params), err)]
|
||||
pub(crate) async fn create_document(
|
||||
kv_store: &Arc<DocumentKVPersistence>,
|
||||
document_store: &Arc<RevisionKVPersistence>,
|
||||
mut params: CreateDocParams,
|
||||
) -> Result<(), ServerError> {
|
||||
let revisions = params.take_revisions().take_items();
|
||||
let _ = kv_store.batch_set_revision(revisions.into()).await?;
|
||||
let _ = document_store.set_revision(revisions.into()).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tracing::instrument(level = "debug", skip(kv_store), err)]
|
||||
#[tracing::instrument(level = "trace", skip(document_store), err)]
|
||||
pub async fn read_document(
|
||||
kv_store: &Arc<DocumentKVPersistence>,
|
||||
document_store: &Arc<RevisionKVPersistence>,
|
||||
params: DocumentId,
|
||||
) -> Result<DocumentInfo, ServerError> {
|
||||
let _ = Uuid::parse_str(¶ms.doc_id).context("Parse document id to uuid failed")?;
|
||||
let revisions = kv_store.batch_get_revisions(¶ms.doc_id, None).await?;
|
||||
make_doc_from_revisions(¶ms.doc_id, revisions)
|
||||
let revisions = document_store.get_revisions(¶ms.doc_id, None).await?;
|
||||
match make_document_info_pb_from_revisions_pb(¶ms.doc_id, revisions) {
|
||||
Ok(Some(document_info)) => Ok(document_info),
|
||||
Ok(None) => Err(ServerError::record_not_found().context(format!("{} not exist", params.doc_id))),
|
||||
Err(e) => Err(ServerError::internal().context(e)),
|
||||
}
|
||||
}
|
||||
|
||||
#[tracing::instrument(level = "debug", skip(document_manager, params), fields(delta), err)]
|
||||
@ -54,167 +52,12 @@ pub async fn reset_document(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tracing::instrument(level = "debug", skip(kv_store), err)]
|
||||
pub(crate) async fn delete_document(kv_store: &Arc<DocumentKVPersistence>, doc_id: Uuid) -> Result<(), ServerError> {
|
||||
let _ = kv_store.batch_delete_revisions(&doc_id.to_string(), None).await?;
|
||||
#[tracing::instrument(level = "trace", skip(document_store), err)]
|
||||
pub(crate) async fn delete_document(
|
||||
document_store: &Arc<RevisionKVPersistence>,
|
||||
doc_id: Uuid,
|
||||
) -> Result<(), ServerError> {
|
||||
// TODO: delete revisions may cause time issue. Maybe delete asynchronously?
|
||||
let _ = document_store.delete_revisions(&doc_id.to_string(), None).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub struct DocumentKVPersistence {
|
||||
inner: Arc<KVStore>,
|
||||
}
|
||||
|
||||
impl std::ops::Deref for DocumentKVPersistence {
|
||||
type Target = Arc<KVStore>;
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
&self.inner
|
||||
}
|
||||
}
|
||||
|
||||
impl std::ops::DerefMut for DocumentKVPersistence {
|
||||
fn deref_mut(&mut self) -> &mut Self::Target {
|
||||
&mut self.inner
|
||||
}
|
||||
}
|
||||
|
||||
impl DocumentKVPersistence {
|
||||
pub(crate) fn new(kv_store: Arc<KVStore>) -> Self {
|
||||
DocumentKVPersistence { inner: kv_store }
|
||||
}
|
||||
|
||||
pub(crate) async fn batch_set_revision(&self, revisions: Vec<RevisionPB>) -> Result<(), ServerError> {
|
||||
let items = revisions_to_key_value_items(revisions)?;
|
||||
self.inner
|
||||
.transaction(|mut t| Box::pin(async move { t.batch_set(items).await }))
|
||||
.await
|
||||
}
|
||||
|
||||
pub(crate) async fn get_doc_revisions(&self, doc_id: &str) -> Result<RepeatedRevisionPB, ServerError> {
|
||||
let doc_id = doc_id.to_owned();
|
||||
let items = self
|
||||
.inner
|
||||
.transaction(|mut t| Box::pin(async move { t.batch_get_start_with(&doc_id).await }))
|
||||
.await?;
|
||||
Ok(key_value_items_to_revisions(items))
|
||||
}
|
||||
|
||||
pub(crate) async fn batch_get_revisions<T: Into<Option<Vec<i64>>>>(
|
||||
&self,
|
||||
doc_id: &str,
|
||||
rev_ids: T,
|
||||
) -> Result<RepeatedRevisionPB, ServerError> {
|
||||
let rev_ids = rev_ids.into();
|
||||
let items = match rev_ids {
|
||||
None => {
|
||||
let doc_id = doc_id.to_owned();
|
||||
self.inner
|
||||
.transaction(|mut t| Box::pin(async move { t.batch_get_start_with(&doc_id).await }))
|
||||
.await?
|
||||
}
|
||||
Some(rev_ids) => {
|
||||
let keys = rev_ids
|
||||
.into_iter()
|
||||
.map(|rev_id| make_revision_key(doc_id, rev_id))
|
||||
.collect::<Vec<String>>();
|
||||
|
||||
self.inner
|
||||
.transaction(|mut t| Box::pin(async move { t.batch_get(keys).await }))
|
||||
.await?
|
||||
}
|
||||
};
|
||||
|
||||
Ok(key_value_items_to_revisions(items))
|
||||
}
|
||||
|
||||
pub(crate) async fn batch_delete_revisions<T: Into<Option<Vec<i64>>>>(
|
||||
&self,
|
||||
doc_id: &str,
|
||||
rev_ids: T,
|
||||
) -> Result<(), ServerError> {
|
||||
match rev_ids.into() {
|
||||
None => {
|
||||
let doc_id = doc_id.to_owned();
|
||||
self.inner
|
||||
.transaction(|mut t| Box::pin(async move { t.batch_delete_key_start_with(&doc_id).await }))
|
||||
.await
|
||||
}
|
||||
Some(rev_ids) => {
|
||||
let keys = rev_ids
|
||||
.into_iter()
|
||||
.map(|rev_id| make_revision_key(doc_id, rev_id))
|
||||
.collect::<Vec<String>>();
|
||||
|
||||
self.inner
|
||||
.transaction(|mut t| Box::pin(async move { t.batch_delete(keys).await }))
|
||||
.await
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn revisions_to_key_value_items(revisions: Vec<RevisionPB>) -> Result<Vec<KeyValue>, ServerError> {
|
||||
let mut items = vec![];
|
||||
for revision in revisions {
|
||||
let key = make_revision_key(&revision.doc_id, revision.rev_id);
|
||||
|
||||
if revision.delta_data.is_empty() {
|
||||
return Err(ServerError::internal().context("The delta_data of RevisionPB should not be empty"));
|
||||
}
|
||||
|
||||
let value = Bytes::from(revision.write_to_bytes().unwrap());
|
||||
items.push(KeyValue { key, value });
|
||||
}
|
||||
Ok(items)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn key_value_items_to_revisions(items: Vec<KeyValue>) -> RepeatedRevisionPB {
|
||||
let mut revisions = items
|
||||
.into_iter()
|
||||
.filter_map(|kv| parse_from_bytes::<RevisionPB>(&kv.value).ok())
|
||||
.collect::<Vec<RevisionPB>>();
|
||||
|
||||
revisions.sort_by(|a, b| a.rev_id.cmp(&b.rev_id));
|
||||
let mut repeated_revision = RepeatedRevisionPB::new();
|
||||
repeated_revision.set_items(revisions.into());
|
||||
repeated_revision
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn make_revision_key(doc_id: &str, rev_id: i64) -> String {
|
||||
format!("{}:{}", doc_id, rev_id)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn make_doc_from_revisions(doc_id: &str, mut revisions: RepeatedRevisionPB) -> Result<DocumentInfo, ServerError> {
|
||||
let revisions = revisions.take_items();
|
||||
if revisions.is_empty() {
|
||||
return Err(ServerError::record_not_found().context(format!("{} not exist", doc_id)));
|
||||
}
|
||||
|
||||
let mut document_delta = RichTextDelta::new();
|
||||
let mut base_rev_id = 0;
|
||||
let mut rev_id = 0;
|
||||
// TODO: replace with make_delta_from_revisions
|
||||
for revision in revisions {
|
||||
base_rev_id = revision.base_rev_id;
|
||||
rev_id = revision.rev_id;
|
||||
|
||||
if revision.delta_data.is_empty() {
|
||||
tracing::warn!("revision delta_data is empty");
|
||||
}
|
||||
|
||||
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();
|
||||
let mut document_info = DocumentInfo::new();
|
||||
document_info.set_doc_id(doc_id.to_owned());
|
||||
document_info.set_text(text);
|
||||
document_info.set_base_rev_id(base_rev_id);
|
||||
document_info.set_rev_id(rev_id);
|
||||
Ok(document_info)
|
||||
}
|
||||
|
@ -12,7 +12,7 @@ use flowy_collaboration::{
|
||||
protobuf::{
|
||||
CreateDocParams as CreateDocParamsPB, DocumentId as DocumentIdPB, ResetDocumentParams as ResetDocumentParamsPB,
|
||||
},
|
||||
sync::ServerDocumentManager,
|
||||
server_document::ServerDocumentManager,
|
||||
};
|
||||
use std::sync::Arc;
|
||||
|
||||
@ -21,7 +21,7 @@ pub async fn create_document_handler(
|
||||
persistence: Data<Arc<FlowyPersistence>>,
|
||||
) -> Result<HttpResponse, ServerError> {
|
||||
let params: CreateDocParamsPB = parse_from_payload(payload).await?;
|
||||
let kv_store = persistence.kv_store();
|
||||
let kv_store = persistence.document_kv_store();
|
||||
let _ = create_document(&kv_store, params).await?;
|
||||
Ok(FlowyResponse::success().into())
|
||||
}
|
||||
@ -32,7 +32,7 @@ pub async fn read_document_handler(
|
||||
persistence: Data<Arc<FlowyPersistence>>,
|
||||
) -> Result<HttpResponse, ServerError> {
|
||||
let params: DocumentIdPB = parse_from_payload(payload).await?;
|
||||
let kv_store = persistence.kv_store();
|
||||
let kv_store = persistence.document_kv_store();
|
||||
let doc = read_document(&kv_store, params).await?;
|
||||
let response = FlowyResponse::success().pb(doc)?;
|
||||
Ok(response.into())
|
||||
|
@ -7,18 +7,22 @@ use actix_rt::task::spawn_blocking;
|
||||
use async_stream::stream;
|
||||
use backend_service::errors::{internal_error, Result, ServerError};
|
||||
|
||||
use crate::services::web_socket::revision_data_to_ws_message;
|
||||
use flowy_collaboration::{
|
||||
protobuf::{
|
||||
DocumentClientWSData as DocumentClientWSDataPB, DocumentClientWSDataType as DocumentClientWSDataTypePB,
|
||||
ClientRevisionWSData as ClientRevisionWSDataPB,
|
||||
ClientRevisionWSDataType as ClientRevisionWSDataTypePB,
|
||||
Revision as RevisionPB,
|
||||
},
|
||||
sync::{RevisionUser, ServerDocumentManager, SyncResponse},
|
||||
server_document::ServerDocumentManager,
|
||||
synchronizer::{RevisionSyncResponse, RevisionUser},
|
||||
};
|
||||
use futures::stream::StreamExt;
|
||||
use lib_ws::WSChannel;
|
||||
use std::sync::Arc;
|
||||
use tokio::sync::{mpsc, oneshot};
|
||||
|
||||
pub enum WSActorMessage {
|
||||
pub enum DocumentWSActorMessage {
|
||||
ClientData {
|
||||
client_data: WSClientData,
|
||||
persistence: Arc<FlowyPersistence>,
|
||||
@ -27,27 +31,27 @@ pub enum WSActorMessage {
|
||||
}
|
||||
|
||||
pub struct DocumentWebSocketActor {
|
||||
receiver: Option<mpsc::Receiver<WSActorMessage>>,
|
||||
actor_msg_receiver: Option<mpsc::Receiver<DocumentWSActorMessage>>,
|
||||
doc_manager: Arc<ServerDocumentManager>,
|
||||
}
|
||||
|
||||
impl DocumentWebSocketActor {
|
||||
pub fn new(receiver: mpsc::Receiver<WSActorMessage>, manager: Arc<ServerDocumentManager>) -> Self {
|
||||
pub fn new(receiver: mpsc::Receiver<DocumentWSActorMessage>, manager: Arc<ServerDocumentManager>) -> Self {
|
||||
Self {
|
||||
receiver: Some(receiver),
|
||||
actor_msg_receiver: Some(receiver),
|
||||
doc_manager: manager,
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn run(mut self) {
|
||||
let mut receiver = self
|
||||
.receiver
|
||||
let mut actor_msg_receiver = self
|
||||
.actor_msg_receiver
|
||||
.take()
|
||||
.expect("DocActor's receiver should only take one time");
|
||||
.expect("DocumentWebSocketActor's receiver should only take one time");
|
||||
|
||||
let stream = stream! {
|
||||
loop {
|
||||
match receiver.recv().await {
|
||||
match actor_msg_receiver.recv().await {
|
||||
Some(msg) => yield msg,
|
||||
None => break,
|
||||
}
|
||||
@ -57,52 +61,47 @@ impl DocumentWebSocketActor {
|
||||
stream.for_each(|msg| self.handle_message(msg)).await;
|
||||
}
|
||||
|
||||
async fn handle_message(&self, msg: WSActorMessage) {
|
||||
async fn handle_message(&self, msg: DocumentWSActorMessage) {
|
||||
match msg {
|
||||
WSActorMessage::ClientData {
|
||||
DocumentWSActorMessage::ClientData {
|
||||
client_data,
|
||||
persistence,
|
||||
persistence: _,
|
||||
ret,
|
||||
} => {
|
||||
let _ = ret.send(self.handle_client_data(client_data, persistence).await);
|
||||
}
|
||||
let _ = ret.send(self.handle_document_data(client_data).await);
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
async fn handle_client_data(&self, client_data: WSClientData, persistence: Arc<FlowyPersistence>) -> Result<()> {
|
||||
async fn handle_document_data(&self, client_data: WSClientData) -> Result<()> {
|
||||
let WSClientData { user, socket, data } = client_data;
|
||||
let document_client_data = spawn_blocking(move || parse_from_bytes::<DocumentClientWSDataPB>(&data))
|
||||
let document_client_data = spawn_blocking(move || parse_from_bytes::<ClientRevisionWSDataPB>(&data))
|
||||
.await
|
||||
.map_err(internal_error)??;
|
||||
|
||||
tracing::debug!(
|
||||
tracing::trace!(
|
||||
"[DocumentWebSocketActor]: receive: {}:{}, {:?}",
|
||||
document_client_data.doc_id,
|
||||
document_client_data.id,
|
||||
document_client_data.object_id,
|
||||
document_client_data.data_id,
|
||||
document_client_data.ty
|
||||
);
|
||||
|
||||
let user = Arc::new(ServerDocUser {
|
||||
user,
|
||||
socket,
|
||||
persistence,
|
||||
});
|
||||
|
||||
let user = Arc::new(DocumentRevisionUser { user, socket });
|
||||
match &document_client_data.ty {
|
||||
DocumentClientWSDataTypePB::ClientPushRev => {
|
||||
ClientRevisionWSDataTypePB::ClientPushRev => {
|
||||
let _ = self
|
||||
.doc_manager
|
||||
.handle_client_revisions(user, document_client_data)
|
||||
.await
|
||||
.map_err(internal_error)?;
|
||||
}
|
||||
DocumentClientWSDataTypePB::ClientPing => {
|
||||
},
|
||||
ClientRevisionWSDataTypePB::ClientPing => {
|
||||
let _ = self
|
||||
.doc_manager
|
||||
.handle_client_ping(user, document_client_data)
|
||||
.await
|
||||
.map_err(internal_error)?;
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
Ok(())
|
||||
@ -118,56 +117,42 @@ fn verify_md5(revision: &RevisionPB) -> Result<()> {
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct ServerDocUser {
|
||||
pub struct DocumentRevisionUser {
|
||||
pub user: Arc<WSUser>,
|
||||
pub(crate) socket: Socket,
|
||||
pub persistence: Arc<FlowyPersistence>,
|
||||
}
|
||||
|
||||
impl std::fmt::Debug for ServerDocUser {
|
||||
impl std::fmt::Debug for DocumentRevisionUser {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
f.debug_struct("ServerDocUser")
|
||||
f.debug_struct("DocumentRevisionUser")
|
||||
.field("user", &self.user)
|
||||
.field("socket", &self.socket)
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl RevisionUser for ServerDocUser {
|
||||
fn user_id(&self) -> String {
|
||||
self.user.id().to_string()
|
||||
}
|
||||
impl RevisionUser for DocumentRevisionUser {
|
||||
fn user_id(&self) -> String { self.user.id().to_string() }
|
||||
|
||||
fn receive(&self, resp: SyncResponse) {
|
||||
fn receive(&self, resp: RevisionSyncResponse) {
|
||||
let result = match resp {
|
||||
SyncResponse::Pull(data) => {
|
||||
let msg: WebSocketMessage = data.into();
|
||||
RevisionSyncResponse::Pull(data) => {
|
||||
let msg: WebSocketMessage = revision_data_to_ws_message(data, WSChannel::Document);
|
||||
self.socket.try_send(msg).map_err(internal_error)
|
||||
}
|
||||
SyncResponse::Push(data) => {
|
||||
let msg: WebSocketMessage = data.into();
|
||||
},
|
||||
RevisionSyncResponse::Push(data) => {
|
||||
let msg: WebSocketMessage = revision_data_to_ws_message(data, WSChannel::Document);
|
||||
self.socket.try_send(msg).map_err(internal_error)
|
||||
}
|
||||
SyncResponse::Ack(data) => {
|
||||
let msg: WebSocketMessage = data.into();
|
||||
},
|
||||
RevisionSyncResponse::Ack(data) => {
|
||||
let msg: WebSocketMessage = revision_data_to_ws_message(data, WSChannel::Document);
|
||||
self.socket.try_send(msg).map_err(internal_error)
|
||||
}
|
||||
SyncResponse::NewRevision(mut repeated_revision) => {
|
||||
let kv_store = self.persistence.kv_store();
|
||||
tokio::task::spawn(async move {
|
||||
let revisions = repeated_revision.take_items().into();
|
||||
match kv_store.batch_set_revision(revisions).await {
|
||||
Ok(_) => {}
|
||||
Err(e) => log::error!("{}", e),
|
||||
}
|
||||
});
|
||||
Ok(())
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
match result {
|
||||
Ok(_) => {}
|
||||
Err(e) => log::error!("[ServerDocUser]: {}", e),
|
||||
Ok(_) => {},
|
||||
Err(e) => log::error!("[DocumentRevisionUser]: {}", e),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,23 +1,26 @@
|
||||
use crate::{
|
||||
context::FlowyPersistence,
|
||||
context::{DocumentRevisionKV, FlowyPersistence},
|
||||
services::{
|
||||
document::{
|
||||
persistence::{create_document, read_document, revisions_to_key_value_items},
|
||||
ws_actor::{DocumentWebSocketActor, WSActorMessage},
|
||||
persistence::{create_document, read_document},
|
||||
ws_actor::{DocumentWSActorMessage, DocumentWebSocketActor},
|
||||
},
|
||||
kv::revision_kv::revisions_to_key_value_items,
|
||||
web_socket::{WSClientData, WebSocketReceiver},
|
||||
},
|
||||
};
|
||||
use backend_service::errors::ServerError;
|
||||
use flowy_collaboration::{
|
||||
entities::doc::DocumentInfo,
|
||||
entities::document_info::DocumentInfo,
|
||||
errors::CollaborateError,
|
||||
protobuf::{
|
||||
CreateDocParams as CreateDocParamsPB, DocumentId, RepeatedRevision as RepeatedRevisionPB,
|
||||
CreateDocParams as CreateDocParamsPB,
|
||||
DocumentId,
|
||||
RepeatedRevision as RepeatedRevisionPB,
|
||||
Revision as RevisionPB,
|
||||
},
|
||||
sync::{DocumentPersistence, ServerDocumentManager},
|
||||
util::repeated_revision_from_repeated_revision_pb,
|
||||
server_document::{DocumentCloudPersistence, ServerDocumentManager},
|
||||
util::make_document_info_from_revisions_pb,
|
||||
};
|
||||
use lib_infra::future::BoxResultFuture;
|
||||
use std::{
|
||||
@ -31,67 +34,68 @@ pub fn make_document_ws_receiver(
|
||||
persistence: Arc<FlowyPersistence>,
|
||||
document_manager: Arc<ServerDocumentManager>,
|
||||
) -> Arc<DocumentWebSocketReceiver> {
|
||||
let (ws_sender, rx) = tokio::sync::mpsc::channel(100);
|
||||
let (actor_msg_sender, rx) = tokio::sync::mpsc::channel(1000);
|
||||
let actor = DocumentWebSocketActor::new(rx, document_manager);
|
||||
tokio::task::spawn(actor.run());
|
||||
|
||||
Arc::new(DocumentWebSocketReceiver::new(persistence, ws_sender))
|
||||
Arc::new(DocumentWebSocketReceiver::new(persistence, actor_msg_sender))
|
||||
}
|
||||
|
||||
pub struct DocumentWebSocketReceiver {
|
||||
ws_sender: mpsc::Sender<WSActorMessage>,
|
||||
actor_msg_sender: mpsc::Sender<DocumentWSActorMessage>,
|
||||
persistence: Arc<FlowyPersistence>,
|
||||
}
|
||||
|
||||
impl DocumentWebSocketReceiver {
|
||||
pub fn new(persistence: Arc<FlowyPersistence>, ws_sender: mpsc::Sender<WSActorMessage>) -> Self {
|
||||
Self { ws_sender, persistence }
|
||||
pub fn new(persistence: Arc<FlowyPersistence>, actor_msg_sender: mpsc::Sender<DocumentWSActorMessage>) -> Self {
|
||||
Self {
|
||||
actor_msg_sender,
|
||||
persistence,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl WebSocketReceiver for DocumentWebSocketReceiver {
|
||||
fn receive(&self, data: WSClientData) {
|
||||
let (ret, rx) = oneshot::channel();
|
||||
let sender = self.ws_sender.clone();
|
||||
let actor_msg_sender = self.actor_msg_sender.clone();
|
||||
let persistence = self.persistence.clone();
|
||||
|
||||
actix_rt::spawn(async move {
|
||||
let msg = WSActorMessage::ClientData {
|
||||
let msg = DocumentWSActorMessage::ClientData {
|
||||
client_data: data,
|
||||
persistence,
|
||||
ret,
|
||||
};
|
||||
|
||||
match sender.send(msg).await {
|
||||
Ok(_) => {}
|
||||
Err(e) => log::error!("{}", e),
|
||||
match actor_msg_sender.send(msg).await {
|
||||
Ok(_) => {},
|
||||
Err(e) => log::error!("[DocumentWebSocketReceiver]: send message to actor failed: {}", e),
|
||||
}
|
||||
match rx.await {
|
||||
Ok(_) => {}
|
||||
Err(e) => log::error!("{:?}", e),
|
||||
Ok(_) => {},
|
||||
Err(e) => log::error!("[DocumentWebSocketReceiver]: message ret failed {:?}", e),
|
||||
};
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
pub struct DocumentPersistenceImpl(pub Arc<FlowyPersistence>);
|
||||
impl Debug for DocumentPersistenceImpl {
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
||||
f.write_str("DocumentPersistenceImpl")
|
||||
}
|
||||
pub struct HttpDocumentCloudPersistence(pub Arc<DocumentRevisionKV>);
|
||||
impl Debug for HttpDocumentCloudPersistence {
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { f.write_str("HttpDocumentCloudPersistence") }
|
||||
}
|
||||
|
||||
impl DocumentPersistence for DocumentPersistenceImpl {
|
||||
fn read_doc(&self, doc_id: &str) -> BoxResultFuture<DocumentInfo, CollaborateError> {
|
||||
impl DocumentCloudPersistence for HttpDocumentCloudPersistence {
|
||||
fn read_document(&self, doc_id: &str) -> BoxResultFuture<DocumentInfo, CollaborateError> {
|
||||
let params = DocumentId {
|
||||
doc_id: doc_id.to_string(),
|
||||
..Default::default()
|
||||
};
|
||||
let kv_store = self.0.kv_store();
|
||||
let document_store = self.0.clone();
|
||||
Box::pin(async move {
|
||||
let mut pb_doc = read_document(&kv_store, params)
|
||||
let mut pb_doc = read_document(&document_store, params)
|
||||
.await
|
||||
.map_err(server_error_to_collaborate_error)?;
|
||||
.map_err(|e| e.to_collaborate_error())?;
|
||||
let doc = (&mut pb_doc)
|
||||
.try_into()
|
||||
.map_err(|e| CollaborateError::internal().context(e))?;
|
||||
@ -99,47 +103,53 @@ impl DocumentPersistence for DocumentPersistenceImpl {
|
||||
})
|
||||
}
|
||||
|
||||
fn create_doc(
|
||||
fn create_document(
|
||||
&self,
|
||||
doc_id: &str,
|
||||
repeated_revision: RepeatedRevisionPB,
|
||||
) -> BoxResultFuture<DocumentInfo, CollaborateError> {
|
||||
let kv_store = self.0.kv_store();
|
||||
) -> BoxResultFuture<Option<DocumentInfo>, CollaborateError> {
|
||||
let document_store = self.0.clone();
|
||||
let doc_id = doc_id.to_owned();
|
||||
Box::pin(async move {
|
||||
let revisions = repeated_revision_from_repeated_revision_pb(repeated_revision.clone())?.into_inner();
|
||||
let doc = DocumentInfo::from_revisions(&doc_id, revisions)?;
|
||||
let document_info = make_document_info_from_revisions_pb(&doc_id, repeated_revision.clone())?;
|
||||
let doc_id = doc_id.to_owned();
|
||||
let mut params = CreateDocParamsPB::new();
|
||||
params.set_id(doc_id);
|
||||
params.set_revisions(repeated_revision);
|
||||
let _ = create_document(&kv_store, params)
|
||||
let _ = create_document(&document_store, params)
|
||||
.await
|
||||
.map_err(server_error_to_collaborate_error)?;
|
||||
Ok(doc)
|
||||
.map_err(|e| e.to_collaborate_error())?;
|
||||
Ok(document_info)
|
||||
})
|
||||
}
|
||||
|
||||
fn get_revisions(&self, doc_id: &str, rev_ids: Vec<i64>) -> BoxResultFuture<Vec<RevisionPB>, CollaborateError> {
|
||||
let kv_store = self.0.kv_store();
|
||||
fn read_document_revisions(
|
||||
&self,
|
||||
doc_id: &str,
|
||||
rev_ids: Option<Vec<i64>>,
|
||||
) -> BoxResultFuture<Vec<RevisionPB>, CollaborateError> {
|
||||
let document_store = self.0.clone();
|
||||
let doc_id = doc_id.to_owned();
|
||||
let f = || async move {
|
||||
let mut repeated_revision = kv_store.batch_get_revisions(&doc_id, rev_ids).await?;
|
||||
Ok(repeated_revision.take_items().into())
|
||||
let mut repeated_revision = document_store.get_revisions(&doc_id, rev_ids).await?;
|
||||
Ok::<Vec<RevisionPB>, ServerError>(repeated_revision.take_items().into())
|
||||
};
|
||||
|
||||
Box::pin(async move { f().await.map_err(server_error_to_collaborate_error) })
|
||||
Box::pin(async move { f().await.map_err(|e| e.to_collaborate_error()) })
|
||||
}
|
||||
|
||||
fn get_doc_revisions(&self, doc_id: &str) -> BoxResultFuture<Vec<RevisionPB>, CollaborateError> {
|
||||
let kv_store = self.0.kv_store();
|
||||
let doc_id = doc_id.to_owned();
|
||||
fn save_document_revisions(
|
||||
&self,
|
||||
mut repeated_revision: RepeatedRevisionPB,
|
||||
) -> BoxResultFuture<(), CollaborateError> {
|
||||
let document_store = self.0.clone();
|
||||
let f = || async move {
|
||||
let mut repeated_revision = kv_store.get_doc_revisions(&doc_id).await?;
|
||||
Ok(repeated_revision.take_items().into())
|
||||
let revisions = repeated_revision.take_items().into();
|
||||
let _ = document_store.set_revision(revisions).await?;
|
||||
Ok::<(), ServerError>(())
|
||||
};
|
||||
|
||||
Box::pin(async move { f().await.map_err(server_error_to_collaborate_error) })
|
||||
Box::pin(async move { f().await.map_err(|e| e.to_collaborate_error()) })
|
||||
}
|
||||
|
||||
fn reset_document(
|
||||
@ -147,10 +157,10 @@ impl DocumentPersistence for DocumentPersistenceImpl {
|
||||
doc_id: &str,
|
||||
mut repeated_revision: RepeatedRevisionPB,
|
||||
) -> BoxResultFuture<(), CollaborateError> {
|
||||
let kv_store = self.0.kv_store();
|
||||
let document_store = self.0.clone();
|
||||
let doc_id = doc_id.to_owned();
|
||||
let f = || async move {
|
||||
kv_store
|
||||
document_store
|
||||
.transaction(|mut transaction| {
|
||||
Box::pin(async move {
|
||||
let _ = transaction.batch_delete_key_start_with(&doc_id).await?;
|
||||
@ -161,14 +171,6 @@ impl DocumentPersistence for DocumentPersistenceImpl {
|
||||
})
|
||||
.await
|
||||
};
|
||||
Box::pin(async move { f().await.map_err(server_error_to_collaborate_error) })
|
||||
}
|
||||
}
|
||||
|
||||
fn server_error_to_collaborate_error(error: ServerError) -> CollaborateError {
|
||||
if error.is_record_not_found() {
|
||||
CollaborateError::record_not_found()
|
||||
} else {
|
||||
CollaborateError::internal().context(error)
|
||||
Box::pin(async move { f().await.map_err(|e| e.to_collaborate_error()) })
|
||||
}
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
use crate::services::core::view::read_view_belong_to_id;
|
||||
use crate::services::folder::view::read_view_belong_to_id;
|
||||
|
||||
use crate::{
|
||||
entities::logged_user::LoggedUser,
|
||||
services::core::{app::persistence::*, trash::read_trash_ids},
|
||||
services::folder::{app::persistence::*, trash::read_trash_ids},
|
||||
util::sqlx_ext::{map_sqlx_error, DBTransaction, SqlBuilder},
|
||||
};
|
||||
use backend_service::errors::{invalid_params, ServerError};
|
@ -1,6 +1,6 @@
|
||||
use crate::{
|
||||
entities::logged_user::LoggedUser,
|
||||
services::core::app::{
|
||||
services::folder::app::{
|
||||
controller::{create_app, delete_app, read_app, update_app},
|
||||
persistence::check_app_id,
|
||||
},
|
@ -1,5 +1,6 @@
|
||||
pub mod app;
|
||||
pub(crate) mod log;
|
||||
pub mod trash;
|
||||
pub mod view;
|
||||
pub mod workspace;
|
||||
pub(crate) mod ws_actor;
|
||||
pub(crate) mod ws_receiver;
|
@ -1,4 +1,4 @@
|
||||
use crate::services::core::{app::persistence::AppTable, view::persistence::ViewTable};
|
||||
use crate::services::folder::{app::persistence::AppTable, view::persistence::ViewTable};
|
||||
use flowy_core_data_model::protobuf::{Trash, TrashType};
|
||||
|
||||
pub(crate) const TRASH_TABLE: &str = "trash_table";
|
@ -1,7 +1,7 @@
|
||||
use crate::{
|
||||
context::FlowyPersistence,
|
||||
entities::logged_user::LoggedUser,
|
||||
services::core::trash::{create_trash, delete_all_trash, delete_trash, read_trash},
|
||||
services::folder::trash::{create_trash, delete_all_trash, delete_trash, read_trash},
|
||||
util::serde_ext::parse_from_payload,
|
||||
};
|
||||
use ::protobuf::ProtobufEnum;
|
||||
@ -48,7 +48,7 @@ pub async fn delete_handler(
|
||||
logged_user: LoggedUser,
|
||||
) -> Result<HttpResponse, ServerError> {
|
||||
let pool = persistence.pg_pool();
|
||||
let kv_store = persistence.kv_store();
|
||||
let kv_store = persistence.document_kv_store();
|
||||
let params: RepeatedTrashId = parse_from_payload(payload).await?;
|
||||
let mut transaction = pool
|
||||
.begin()
|
@ -1,12 +1,10 @@
|
||||
use crate::{
|
||||
context::DocumentRevisionKV,
|
||||
entities::logged_user::LoggedUser,
|
||||
services::{
|
||||
core::{
|
||||
app::controller::{delete_app, read_app_table},
|
||||
trash::persistence::{TrashTable, TRASH_TABLE},
|
||||
view::{delete_view, read_view_table},
|
||||
},
|
||||
document::persistence::DocumentKVPersistence,
|
||||
services::folder::{
|
||||
app::controller::{delete_app, read_app_table},
|
||||
trash::persistence::{TrashTable, TRASH_TABLE},
|
||||
view::{delete_view, read_view_table},
|
||||
},
|
||||
util::sqlx_ext::{map_sqlx_error, DBTransaction, SqlBuilder},
|
||||
};
|
||||
@ -39,10 +37,10 @@ pub(crate) async fn create_trash(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tracing::instrument(skip(transaction, kv_store, user), fields(delete_rows), err)]
|
||||
#[tracing::instrument(skip(transaction, document_store, user), fields(delete_rows), err)]
|
||||
pub(crate) async fn delete_all_trash(
|
||||
transaction: &mut DBTransaction<'_>,
|
||||
kv_store: &Arc<DocumentKVPersistence>,
|
||||
document_store: &Arc<DocumentRevisionKV>,
|
||||
user: &LoggedUser,
|
||||
) -> Result<(), ServerError> {
|
||||
let (sql, args) = SqlBuilder::select(TRASH_TABLE)
|
||||
@ -57,7 +55,7 @@ pub(crate) async fn delete_all_trash(
|
||||
.collect::<Vec<(Uuid, i32)>>();
|
||||
tracing::Span::current().record("delete_rows", &format!("{:?}", rows).as_str());
|
||||
let affected_row_count = rows.len();
|
||||
let _ = delete_trash_associate_targets(transaction as &mut DBTransaction<'_>, kv_store, rows).await?;
|
||||
let _ = delete_trash_associate_targets(transaction as &mut DBTransaction<'_>, document_store, rows).await?;
|
||||
|
||||
let (sql, args) = SqlBuilder::delete(TRASH_TABLE)
|
||||
.and_where_eq("user_id", &user.user_id)
|
||||
@ -72,10 +70,10 @@ pub(crate) async fn delete_all_trash(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tracing::instrument(skip(transaction, kv_store), err)]
|
||||
#[tracing::instrument(skip(transaction, document_store), err)]
|
||||
pub(crate) async fn delete_trash(
|
||||
transaction: &mut DBTransaction<'_>,
|
||||
kv_store: &Arc<DocumentKVPersistence>,
|
||||
document_store: &Arc<DocumentRevisionKV>,
|
||||
records: Vec<(Uuid, i32)>,
|
||||
) -> Result<(), ServerError> {
|
||||
for (trash_id, _) in records {
|
||||
@ -92,7 +90,7 @@ pub(crate) async fn delete_trash(
|
||||
|
||||
let _ = delete_trash_associate_targets(
|
||||
transaction as &mut DBTransaction<'_>,
|
||||
kv_store,
|
||||
document_store,
|
||||
vec![(trash_table.id, trash_table.ty)],
|
||||
)
|
||||
.await?;
|
||||
@ -107,23 +105,23 @@ pub(crate) async fn delete_trash(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tracing::instrument(skip(transaction, kv_store, targets), err)]
|
||||
#[tracing::instrument(skip(transaction, document_store, targets), err)]
|
||||
async fn delete_trash_associate_targets(
|
||||
transaction: &mut DBTransaction<'_>,
|
||||
kv_store: &Arc<DocumentKVPersistence>,
|
||||
document_store: &Arc<DocumentRevisionKV>,
|
||||
targets: Vec<(Uuid, i32)>,
|
||||
) -> Result<(), ServerError> {
|
||||
for (id, ty) in targets {
|
||||
match TrashType::from_i32(ty) {
|
||||
None => log::error!("Parser trash type with value: {} failed", ty),
|
||||
Some(ty) => match ty {
|
||||
TrashType::Unknown => {}
|
||||
TrashType::Unknown => {},
|
||||
TrashType::View => {
|
||||
let _ = delete_view(transaction as &mut DBTransaction<'_>, kv_store, vec![id]).await;
|
||||
}
|
||||
let _ = delete_view(transaction as &mut DBTransaction<'_>, document_store, vec![id]).await;
|
||||
},
|
||||
TrashType::App => {
|
||||
let _ = delete_app(transaction as &mut DBTransaction<'_>, id).await;
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
@ -164,13 +162,13 @@ pub(crate) async fn read_trash(
|
||||
match TrashType::from_i32(table.ty) {
|
||||
None => log::error!("Parser trash type with value: {} failed", table.ty),
|
||||
Some(ty) => match ty {
|
||||
TrashType::Unknown => {}
|
||||
TrashType::Unknown => {},
|
||||
TrashType::View => {
|
||||
trash.push(read_view_table(table.id, transaction).await?.into());
|
||||
}
|
||||
},
|
||||
TrashType::App => {
|
||||
trash.push(read_app_table(table.id, transaction).await?.into());
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
@ -1,15 +1,17 @@
|
||||
use crate::{
|
||||
entities::logged_user::LoggedUser,
|
||||
services::{
|
||||
core::{trash::read_trash_ids, view::persistence::*},
|
||||
document::persistence::{create_document, delete_document, DocumentKVPersistence},
|
||||
document::persistence::{create_document, delete_document},
|
||||
folder::{trash::read_trash_ids, view::persistence::*},
|
||||
},
|
||||
util::sqlx_ext::{map_sqlx_error, DBTransaction, SqlBuilder},
|
||||
};
|
||||
use backend_service::errors::{invalid_params, ServerError};
|
||||
use bytes::Bytes;
|
||||
|
||||
use crate::context::DocumentRevisionKV;
|
||||
use chrono::Utc;
|
||||
use flowy_collaboration::{
|
||||
client_document::default::initial_delta,
|
||||
entities::revision::{RepeatedRevision, Revision},
|
||||
protobuf::CreateDocParams as CreateDocParamsPB,
|
||||
};
|
||||
@ -47,10 +49,10 @@ pub(crate) async fn update_view(
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tracing::instrument(skip(transaction, kv_store), err)]
|
||||
#[tracing::instrument(skip(transaction, document_store), err)]
|
||||
pub(crate) async fn delete_view(
|
||||
transaction: &mut DBTransaction<'_>,
|
||||
kv_store: &Arc<DocumentKVPersistence>,
|
||||
document_store: &Arc<DocumentRevisionKV>,
|
||||
view_ids: Vec<Uuid>,
|
||||
) -> Result<(), ServerError> {
|
||||
for view_id in view_ids {
|
||||
@ -60,15 +62,15 @@ pub(crate) async fn delete_view(
|
||||
.await
|
||||
.map_err(map_sqlx_error)?;
|
||||
|
||||
let _ = delete_document(kv_store, view_id).await?;
|
||||
let _ = delete_document(document_store, view_id).await?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tracing::instrument(name = "create_view", level = "debug", skip(transaction, kv_store), err)]
|
||||
#[tracing::instrument(name = "create_view", level = "debug", skip(transaction, document_store), err)]
|
||||
pub(crate) async fn create_view(
|
||||
transaction: &mut DBTransaction<'_>,
|
||||
kv_store: Arc<DocumentKVPersistence>,
|
||||
document_store: Arc<DocumentRevisionKV>,
|
||||
params: CreateViewParamsPB,
|
||||
user_id: &str,
|
||||
) -> Result<ViewPB, ServerError> {
|
||||
@ -90,14 +92,14 @@ pub(crate) async fn create_view(
|
||||
.await
|
||||
.map_err(map_sqlx_error)?;
|
||||
|
||||
let delta_data = Bytes::from(params.view_data);
|
||||
let md5 = format!("{:x}", md5::compute(&delta_data));
|
||||
let revision = Revision::new(&view.id, 0, 0, delta_data, user_id, md5);
|
||||
let initial_delta_data = initial_delta().to_bytes();
|
||||
let md5 = format!("{:x}", md5::compute(&initial_delta_data));
|
||||
let revision = Revision::new(&view.id, 0, 0, initial_delta_data, user_id, md5);
|
||||
let repeated_revision = RepeatedRevision::new(vec![revision]);
|
||||
let mut create_doc_params = CreateDocParamsPB::new();
|
||||
create_doc_params.set_revisions(repeated_revision.try_into().unwrap());
|
||||
create_doc_params.set_id(view.id.clone());
|
||||
let _ = create_document(&kv_store, create_doc_params).await?;
|
||||
let _ = create_document(&document_store, create_doc_params).await?;
|
||||
|
||||
Ok(view)
|
||||
}
|
@ -1,10 +1,12 @@
|
||||
use crate::{
|
||||
context::FlowyPersistence,
|
||||
entities::logged_user::LoggedUser,
|
||||
services::core::view::{
|
||||
create_view, delete_view,
|
||||
services::folder::view::{
|
||||
create_view,
|
||||
delete_view,
|
||||
persistence::{check_view_id, check_view_ids},
|
||||
read_view, update_view,
|
||||
read_view,
|
||||
update_view,
|
||||
},
|
||||
util::serde_ext::parse_from_payload,
|
||||
};
|
||||
@ -20,8 +22,10 @@ use backend_service::{
|
||||
use flowy_core_data_model::{
|
||||
parser::view::{ViewDesc, ViewName, ViewThumbnail},
|
||||
protobuf::{
|
||||
CreateViewParams as CreateViewParamsPB, QueryViewRequest as QueryViewRequestPB,
|
||||
UpdateViewParams as UpdateViewParamsPB, ViewId as ViewIdPB,
|
||||
CreateViewParams as CreateViewParamsPB,
|
||||
QueryViewRequest as QueryViewRequestPB,
|
||||
UpdateViewParams as UpdateViewParamsPB,
|
||||
ViewId as ViewIdPB,
|
||||
},
|
||||
};
|
||||
use sqlx::PgPool;
|
||||
@ -33,7 +37,7 @@ pub async fn create_handler(
|
||||
user: LoggedUser,
|
||||
) -> Result<HttpResponse, ServerError> {
|
||||
let params: CreateViewParamsPB = parse_from_payload(payload).await?;
|
||||
let kv_store = persistence.kv_store();
|
||||
let kv_store = persistence.document_kv_store();
|
||||
let pool = persistence.pg_pool();
|
||||
let mut transaction = pool
|
||||
.begin()
|
||||
@ -110,7 +114,7 @@ pub async fn delete_handler(
|
||||
) -> Result<HttpResponse, ServerError> {
|
||||
let params: QueryViewRequestPB = parse_from_payload(payload).await?;
|
||||
let pool = persistence.pg_pool();
|
||||
let kv_store = persistence.kv_store();
|
||||
let kv_store = persistence.document_kv_store();
|
||||
let view_ids = check_view_ids(params.view_ids.to_vec())?;
|
||||
let mut transaction = pool
|
||||
.begin()
|
@ -1,7 +1,7 @@
|
||||
use super::persistence::NewWorkspaceBuilder;
|
||||
use crate::{
|
||||
entities::logged_user::LoggedUser,
|
||||
services::core::{
|
||||
services::folder::{
|
||||
app::{controller::read_app, persistence::AppTable},
|
||||
workspace::persistence::*,
|
||||
},
|
@ -1,7 +1,11 @@
|
||||
use crate::{
|
||||
entities::logged_user::LoggedUser,
|
||||
services::core::workspace::{
|
||||
create_workspace, delete_workspace, persistence::check_workspace_id, read_workspaces, update_workspace,
|
||||
services::folder::workspace::{
|
||||
create_workspace,
|
||||
delete_workspace,
|
||||
persistence::check_workspace_id,
|
||||
read_workspaces,
|
||||
update_workspace,
|
||||
},
|
||||
util::serde_ext::parse_from_payload,
|
||||
};
|
||||
@ -17,7 +21,8 @@ use backend_service::{
|
||||
use flowy_core_data_model::{
|
||||
parser::workspace::{WorkspaceDesc, WorkspaceName},
|
||||
protobuf::{
|
||||
CreateWorkspaceParams as CreateWorkspaceParamsPB, UpdateWorkspaceParams as UpdateWorkspaceParamsPB,
|
||||
CreateWorkspaceParams as CreateWorkspaceParamsPB,
|
||||
UpdateWorkspaceParams as UpdateWorkspaceParamsPB,
|
||||
WorkspaceId as WorkspaceIdPB,
|
||||
},
|
||||
};
|
||||
@ -105,7 +110,7 @@ pub async fn update_handler(
|
||||
.map_err(invalid_params)?
|
||||
.0;
|
||||
Some(name)
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
let desc = match params.has_desc() {
|
||||
@ -115,7 +120,7 @@ pub async fn update_handler(
|
||||
.map_err(invalid_params)?
|
||||
.0;
|
||||
Some(desc)
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
let mut transaction = pool
|
147
backend/src/services/folder/ws_actor.rs
Normal file
147
backend/src/services/folder/ws_actor.rs
Normal file
@ -0,0 +1,147 @@
|
||||
use crate::{
|
||||
context::FlowyPersistence,
|
||||
services::web_socket::{entities::Socket, revision_data_to_ws_message, WSClientData, WSUser, WebSocketMessage},
|
||||
util::serde_ext::parse_from_bytes,
|
||||
};
|
||||
use actix_rt::task::spawn_blocking;
|
||||
use async_stream::stream;
|
||||
use backend_service::errors::{internal_error, Result};
|
||||
|
||||
use flowy_collaboration::{
|
||||
protobuf::{
|
||||
ClientRevisionWSData as ClientRevisionWSDataPB,
|
||||
ClientRevisionWSDataType as ClientRevisionWSDataTypePB,
|
||||
},
|
||||
server_folder::ServerFolderManager,
|
||||
synchronizer::{RevisionSyncResponse, RevisionUser},
|
||||
};
|
||||
use futures::stream::StreamExt;
|
||||
use lib_ws::WSChannel;
|
||||
use std::sync::Arc;
|
||||
use tokio::sync::{mpsc, oneshot};
|
||||
|
||||
pub enum FolderWSActorMessage {
|
||||
ClientData {
|
||||
client_data: WSClientData,
|
||||
persistence: Arc<FlowyPersistence>,
|
||||
ret: oneshot::Sender<Result<()>>,
|
||||
},
|
||||
}
|
||||
|
||||
pub struct FolderWebSocketActor {
|
||||
actor_msg_receiver: Option<mpsc::Receiver<FolderWSActorMessage>>,
|
||||
folder_manager: Arc<ServerFolderManager>,
|
||||
}
|
||||
|
||||
impl FolderWebSocketActor {
|
||||
pub fn new(receiver: mpsc::Receiver<FolderWSActorMessage>, folder_manager: Arc<ServerFolderManager>) -> Self {
|
||||
Self {
|
||||
actor_msg_receiver: Some(receiver),
|
||||
folder_manager,
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn run(mut self) {
|
||||
let mut actor_msg_receiver = self
|
||||
.actor_msg_receiver
|
||||
.take()
|
||||
.expect("FolderWebSocketActor's receiver should only take one time");
|
||||
let stream = stream! {
|
||||
loop {
|
||||
match actor_msg_receiver.recv().await {
|
||||
Some(msg) => yield msg,
|
||||
None => {
|
||||
break
|
||||
},
|
||||
}
|
||||
}
|
||||
};
|
||||
stream.for_each(|msg| self.handle_message(msg)).await;
|
||||
}
|
||||
|
||||
async fn handle_message(&self, msg: FolderWSActorMessage) {
|
||||
match msg {
|
||||
FolderWSActorMessage::ClientData {
|
||||
client_data,
|
||||
persistence: _,
|
||||
ret,
|
||||
} => {
|
||||
let _ = ret.send(self.handle_folder_data(client_data).await);
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
async fn handle_folder_data(&self, client_data: WSClientData) -> Result<()> {
|
||||
let WSClientData { user, socket, data } = client_data;
|
||||
let folder_client_data = spawn_blocking(move || parse_from_bytes::<ClientRevisionWSDataPB>(&data))
|
||||
.await
|
||||
.map_err(internal_error)??;
|
||||
|
||||
tracing::debug!(
|
||||
"[FolderWebSocketActor]: receive: {}:{}, {:?}",
|
||||
folder_client_data.object_id,
|
||||
folder_client_data.data_id,
|
||||
folder_client_data.ty
|
||||
);
|
||||
|
||||
let user = Arc::new(FolderRevisionUser { user, socket });
|
||||
match &folder_client_data.ty {
|
||||
ClientRevisionWSDataTypePB::ClientPushRev => {
|
||||
let _ = self
|
||||
.folder_manager
|
||||
.handle_client_revisions(user, folder_client_data)
|
||||
.await
|
||||
.map_err(internal_error)?;
|
||||
},
|
||||
ClientRevisionWSDataTypePB::ClientPing => {
|
||||
let _ = self
|
||||
.folder_manager
|
||||
.handle_client_ping(user, folder_client_data)
|
||||
.await
|
||||
.map_err(internal_error)?;
|
||||
},
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct FolderRevisionUser {
|
||||
pub user: Arc<WSUser>,
|
||||
pub(crate) socket: Socket,
|
||||
}
|
||||
|
||||
impl std::fmt::Debug for FolderRevisionUser {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
f.debug_struct("FolderRevisionUser")
|
||||
.field("user", &self.user)
|
||||
.field("socket", &self.socket)
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl RevisionUser for FolderRevisionUser {
|
||||
fn user_id(&self) -> String { self.user.id().to_string() }
|
||||
|
||||
fn receive(&self, resp: RevisionSyncResponse) {
|
||||
let result = match resp {
|
||||
RevisionSyncResponse::Pull(data) => {
|
||||
let msg: WebSocketMessage = revision_data_to_ws_message(data, WSChannel::Folder);
|
||||
self.socket.try_send(msg).map_err(internal_error)
|
||||
},
|
||||
RevisionSyncResponse::Push(data) => {
|
||||
let msg: WebSocketMessage = revision_data_to_ws_message(data, WSChannel::Folder);
|
||||
self.socket.try_send(msg).map_err(internal_error)
|
||||
},
|
||||
RevisionSyncResponse::Ack(data) => {
|
||||
let msg: WebSocketMessage = revision_data_to_ws_message(data, WSChannel::Folder);
|
||||
self.socket.try_send(msg).map_err(internal_error)
|
||||
},
|
||||
};
|
||||
|
||||
match result {
|
||||
Ok(_) => {},
|
||||
Err(e) => log::error!("[FolderRevisionUser]: {}", e),
|
||||
}
|
||||
}
|
||||
}
|
167
backend/src/services/folder/ws_receiver.rs
Normal file
167
backend/src/services/folder/ws_receiver.rs
Normal file
@ -0,0 +1,167 @@
|
||||
use crate::{
|
||||
context::FlowyPersistence,
|
||||
services::{
|
||||
folder::ws_actor::{FolderWSActorMessage, FolderWebSocketActor},
|
||||
web_socket::{WSClientData, WebSocketReceiver},
|
||||
},
|
||||
};
|
||||
use std::fmt::{Debug, Formatter};
|
||||
|
||||
use crate::{context::FolderRevisionKV, services::kv::revision_kv::revisions_to_key_value_items};
|
||||
use flowy_collaboration::{
|
||||
entities::folder_info::FolderInfo,
|
||||
errors::CollaborateError,
|
||||
protobuf::{RepeatedRevision as RepeatedRevisionPB, Revision as RevisionPB},
|
||||
server_folder::{FolderCloudPersistence, ServerFolderManager},
|
||||
util::make_folder_from_revisions_pb,
|
||||
};
|
||||
use lib_infra::future::BoxResultFuture;
|
||||
use std::sync::Arc;
|
||||
use tokio::sync::{mpsc, oneshot};
|
||||
|
||||
pub fn make_folder_ws_receiver(
|
||||
persistence: Arc<FlowyPersistence>,
|
||||
folder_manager: Arc<ServerFolderManager>,
|
||||
) -> Arc<FolderWebSocketReceiver> {
|
||||
let (actor_msg_sender, rx) = tokio::sync::mpsc::channel(1000);
|
||||
let actor = FolderWebSocketActor::new(rx, folder_manager);
|
||||
tokio::task::spawn(actor.run());
|
||||
Arc::new(FolderWebSocketReceiver::new(persistence, actor_msg_sender))
|
||||
}
|
||||
|
||||
pub struct FolderWebSocketReceiver {
|
||||
actor_msg_sender: mpsc::Sender<FolderWSActorMessage>,
|
||||
persistence: Arc<FlowyPersistence>,
|
||||
}
|
||||
|
||||
impl FolderWebSocketReceiver {
|
||||
pub fn new(persistence: Arc<FlowyPersistence>, actor_msg_sender: mpsc::Sender<FolderWSActorMessage>) -> Self {
|
||||
Self {
|
||||
actor_msg_sender,
|
||||
persistence,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl WebSocketReceiver for FolderWebSocketReceiver {
|
||||
fn receive(&self, data: WSClientData) {
|
||||
let (ret, rx) = oneshot::channel();
|
||||
let actor_msg_sender = self.actor_msg_sender.clone();
|
||||
let persistence = self.persistence.clone();
|
||||
|
||||
actix_rt::spawn(async move {
|
||||
let msg = FolderWSActorMessage::ClientData {
|
||||
client_data: data,
|
||||
persistence,
|
||||
ret,
|
||||
};
|
||||
|
||||
match actor_msg_sender.send(msg).await {
|
||||
Ok(_) => {},
|
||||
Err(e) => {
|
||||
log::error!("[FolderWebSocketReceiver]: send message to actor failed: {}", e);
|
||||
},
|
||||
}
|
||||
match rx.await {
|
||||
Ok(_) => {},
|
||||
Err(e) => log::error!("[FolderWebSocketReceiver]: message ret failed {:?}", e),
|
||||
};
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
pub struct HttpFolderCloudPersistence(pub Arc<FolderRevisionKV>);
|
||||
impl Debug for HttpFolderCloudPersistence {
|
||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { f.write_str("HttpFolderCloudPersistence") }
|
||||
}
|
||||
|
||||
impl FolderCloudPersistence for HttpFolderCloudPersistence {
|
||||
fn read_folder(&self, _user_id: &str, folder_id: &str) -> BoxResultFuture<FolderInfo, CollaborateError> {
|
||||
let folder_store = self.0.clone();
|
||||
let folder_id = folder_id.to_owned();
|
||||
Box::pin(async move {
|
||||
let revisions = folder_store
|
||||
.get_revisions(&folder_id, None)
|
||||
.await
|
||||
.map_err(|e| e.to_collaborate_error())?;
|
||||
match make_folder_from_revisions_pb(&folder_id, revisions)? {
|
||||
Some(folder_info) => Ok(folder_info),
|
||||
None => Err(CollaborateError::record_not_found().context(format!("{} not exist", folder_id))),
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
fn create_folder(
|
||||
&self,
|
||||
_user_id: &str,
|
||||
folder_id: &str,
|
||||
mut repeated_revision: RepeatedRevisionPB,
|
||||
) -> BoxResultFuture<Option<FolderInfo>, CollaborateError> {
|
||||
let folder_store = self.0.clone();
|
||||
let folder_id = folder_id.to_owned();
|
||||
Box::pin(async move {
|
||||
let folder_info = make_folder_from_revisions_pb(&folder_id, repeated_revision.clone())?;
|
||||
let revisions: Vec<RevisionPB> = repeated_revision.take_items().into();
|
||||
let _ = folder_store
|
||||
.set_revision(revisions)
|
||||
.await
|
||||
.map_err(|e| e.to_collaborate_error())?;
|
||||
Ok(folder_info)
|
||||
})
|
||||
}
|
||||
|
||||
fn save_folder_revisions(
|
||||
&self,
|
||||
mut repeated_revision: RepeatedRevisionPB,
|
||||
) -> BoxResultFuture<(), CollaborateError> {
|
||||
let folder_store = self.0.clone();
|
||||
Box::pin(async move {
|
||||
let revisions: Vec<RevisionPB> = repeated_revision.take_items().into();
|
||||
let _ = folder_store
|
||||
.set_revision(revisions)
|
||||
.await
|
||||
.map_err(|e| e.to_collaborate_error())?;
|
||||
Ok(())
|
||||
})
|
||||
}
|
||||
|
||||
fn read_folder_revisions(
|
||||
&self,
|
||||
folder_id: &str,
|
||||
rev_ids: Option<Vec<i64>>,
|
||||
) -> BoxResultFuture<Vec<RevisionPB>, CollaborateError> {
|
||||
let folder_store = self.0.clone();
|
||||
let folder_id = folder_id.to_owned();
|
||||
Box::pin(async move {
|
||||
let mut repeated_revision = folder_store
|
||||
.get_revisions(&folder_id, rev_ids)
|
||||
.await
|
||||
.map_err(|e| e.to_collaborate_error())?;
|
||||
let revisions: Vec<RevisionPB> = repeated_revision.take_items().into();
|
||||
Ok(revisions)
|
||||
})
|
||||
}
|
||||
|
||||
fn reset_folder(
|
||||
&self,
|
||||
folder_id: &str,
|
||||
mut repeated_revision: RepeatedRevisionPB,
|
||||
) -> BoxResultFuture<(), CollaborateError> {
|
||||
let folder_store = self.0.clone();
|
||||
let folder_id = folder_id.to_owned();
|
||||
Box::pin(async move {
|
||||
let _ = folder_store
|
||||
.transaction(|mut transaction| {
|
||||
Box::pin(async move {
|
||||
let _ = transaction.batch_delete_key_start_with(&folder_id).await?;
|
||||
let items = revisions_to_key_value_items(repeated_revision.take_items().into())?;
|
||||
let _ = transaction.batch_set(items).await?;
|
||||
Ok(())
|
||||
})
|
||||
})
|
||||
.await
|
||||
.map_err(|e| e.to_collaborate_error())?;
|
||||
Ok(())
|
||||
})
|
||||
}
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
#![allow(clippy::module_inception)]
|
||||
mod kv;
|
||||
pub mod revision_kv;
|
||||
|
||||
use async_trait::async_trait;
|
||||
use bytes::Bytes;
|
||||
|
120
backend/src/services/kv/revision_kv.rs
Normal file
120
backend/src/services/kv/revision_kv.rs
Normal file
@ -0,0 +1,120 @@
|
||||
use crate::{
|
||||
services::kv::{KVStore, KeyValue},
|
||||
util::serde_ext::parse_from_bytes,
|
||||
};
|
||||
use backend_service::errors::ServerError;
|
||||
use bytes::Bytes;
|
||||
use flowy_collaboration::protobuf::{RepeatedRevision as RepeatedRevisionPB, Revision as RevisionPB};
|
||||
|
||||
use protobuf::Message;
|
||||
use std::sync::Arc;
|
||||
|
||||
pub struct RevisionKVPersistence {
|
||||
inner: Arc<KVStore>,
|
||||
}
|
||||
|
||||
impl std::ops::Deref for RevisionKVPersistence {
|
||||
type Target = Arc<KVStore>;
|
||||
|
||||
fn deref(&self) -> &Self::Target { &self.inner }
|
||||
}
|
||||
|
||||
impl std::ops::DerefMut for RevisionKVPersistence {
|
||||
fn deref_mut(&mut self) -> &mut Self::Target { &mut self.inner }
|
||||
}
|
||||
|
||||
impl RevisionKVPersistence {
|
||||
pub(crate) fn new(kv_store: Arc<KVStore>) -> Self { RevisionKVPersistence { inner: kv_store } }
|
||||
|
||||
pub(crate) async fn set_revision(&self, revisions: Vec<RevisionPB>) -> Result<(), ServerError> {
|
||||
let items = revisions_to_key_value_items(revisions)?;
|
||||
self.inner
|
||||
.transaction(|mut t| Box::pin(async move { t.batch_set(items).await }))
|
||||
.await
|
||||
}
|
||||
|
||||
pub(crate) async fn get_revisions<T: Into<Option<Vec<i64>>>>(
|
||||
&self,
|
||||
object_id: &str,
|
||||
rev_ids: T,
|
||||
) -> Result<RepeatedRevisionPB, ServerError> {
|
||||
let rev_ids = rev_ids.into();
|
||||
let items = match rev_ids {
|
||||
None => {
|
||||
let object_id = object_id.to_owned();
|
||||
self.inner
|
||||
.transaction(|mut t| Box::pin(async move { t.batch_get_start_with(&object_id).await }))
|
||||
.await?
|
||||
},
|
||||
Some(rev_ids) => {
|
||||
let keys = rev_ids
|
||||
.into_iter()
|
||||
.map(|rev_id| make_revision_key(object_id, rev_id))
|
||||
.collect::<Vec<String>>();
|
||||
|
||||
self.inner
|
||||
.transaction(|mut t| Box::pin(async move { t.batch_get(keys).await }))
|
||||
.await?
|
||||
},
|
||||
};
|
||||
|
||||
Ok(key_value_items_to_revisions(items))
|
||||
}
|
||||
|
||||
pub(crate) async fn delete_revisions<T: Into<Option<Vec<i64>>>>(
|
||||
&self,
|
||||
object_id: &str,
|
||||
rev_ids: T,
|
||||
) -> Result<(), ServerError> {
|
||||
match rev_ids.into() {
|
||||
None => {
|
||||
let object_id = object_id.to_owned();
|
||||
self.inner
|
||||
.transaction(|mut t| Box::pin(async move { t.batch_delete_key_start_with(&object_id).await }))
|
||||
.await
|
||||
},
|
||||
Some(rev_ids) => {
|
||||
let keys = rev_ids
|
||||
.into_iter()
|
||||
.map(|rev_id| make_revision_key(object_id, rev_id))
|
||||
.collect::<Vec<String>>();
|
||||
|
||||
self.inner
|
||||
.transaction(|mut t| Box::pin(async move { t.batch_delete(keys).await }))
|
||||
.await
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn revisions_to_key_value_items(revisions: Vec<RevisionPB>) -> Result<Vec<KeyValue>, ServerError> {
|
||||
let mut items = vec![];
|
||||
for revision in revisions {
|
||||
let key = make_revision_key(&revision.object_id, revision.rev_id);
|
||||
|
||||
if revision.delta_data.is_empty() {
|
||||
return Err(ServerError::internal().context("The delta_data of RevisionPB should not be empty"));
|
||||
}
|
||||
|
||||
let value = Bytes::from(revision.write_to_bytes().unwrap());
|
||||
items.push(KeyValue { key, value });
|
||||
}
|
||||
Ok(items)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn key_value_items_to_revisions(items: Vec<KeyValue>) -> RepeatedRevisionPB {
|
||||
let mut revisions = items
|
||||
.into_iter()
|
||||
.filter_map(|kv| parse_from_bytes::<RevisionPB>(&kv.value).ok())
|
||||
.collect::<Vec<RevisionPB>>();
|
||||
|
||||
revisions.sort_by(|a, b| a.rev_id.cmp(&b.rev_id));
|
||||
let mut repeated_revision = RepeatedRevisionPB::new();
|
||||
repeated_revision.set_items(revisions.into());
|
||||
repeated_revision
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn make_revision_key(object_id: &str, rev_id: i64) -> String { format!("{}:{}", object_id, rev_id) }
|
@ -28,7 +28,7 @@ impl Builder {
|
||||
let env_filter = EnvFilter::new(self.env_filter);
|
||||
let subscriber = tracing_subscriber::fmt()
|
||||
.with_target(true)
|
||||
.with_max_level(tracing::Level::DEBUG)
|
||||
.with_max_level(tracing::Level::TRACE)
|
||||
.with_writer(std::io::stderr)
|
||||
.with_thread_ids(true)
|
||||
.compact()
|
@ -1,5 +1,6 @@
|
||||
pub mod core;
|
||||
pub mod document;
|
||||
pub mod folder;
|
||||
pub mod kv;
|
||||
pub(crate) mod log;
|
||||
pub mod user;
|
||||
pub mod web_socket;
|
||||
|
@ -1,7 +1,7 @@
|
||||
use actix::Message;
|
||||
use bytes::Bytes;
|
||||
use flowy_collaboration::entities::ws::{DocumentClientWSData, DocumentServerWSData};
|
||||
use lib_ws::{WSModule, WebSocketRawMessage};
|
||||
use flowy_collaboration::entities::ws_data::ServerRevisionWSData;
|
||||
use lib_ws::{WSChannel, WebSocketRawMessage};
|
||||
use std::convert::TryInto;
|
||||
|
||||
#[derive(Debug, Message, Clone)]
|
||||
@ -16,27 +16,12 @@ impl std::ops::Deref for WebSocketMessage {
|
||||
}
|
||||
}
|
||||
|
||||
impl std::convert::From<DocumentClientWSData> for WebSocketMessage {
|
||||
fn from(data: DocumentClientWSData) -> Self {
|
||||
let bytes: Bytes = data.try_into().unwrap();
|
||||
let msg = WebSocketRawMessage {
|
||||
module: WSModule::Doc,
|
||||
data: bytes.to_vec(),
|
||||
};
|
||||
|
||||
let bytes: Bytes = msg.try_into().unwrap();
|
||||
WebSocketMessage(bytes)
|
||||
}
|
||||
}
|
||||
|
||||
impl std::convert::From<DocumentServerWSData> for WebSocketMessage {
|
||||
fn from(data: DocumentServerWSData) -> Self {
|
||||
let bytes: Bytes = data.try_into().unwrap();
|
||||
let msg = WebSocketRawMessage {
|
||||
module: WSModule::Doc,
|
||||
data: bytes.to_vec(),
|
||||
};
|
||||
let bytes: Bytes = msg.try_into().unwrap();
|
||||
WebSocketMessage(bytes)
|
||||
}
|
||||
pub fn revision_data_to_ws_message(data: ServerRevisionWSData, channel: WSChannel) -> WebSocketMessage {
|
||||
let bytes: Bytes = data.try_into().unwrap();
|
||||
let msg = WebSocketRawMessage {
|
||||
channel,
|
||||
data: bytes.to_vec(),
|
||||
};
|
||||
let bytes: Bytes = msg.try_into().unwrap();
|
||||
WebSocketMessage(bytes)
|
||||
}
|
||||
|
@ -3,37 +3,38 @@ use crate::{
|
||||
entities::logged_user::LoggedUser,
|
||||
services::web_socket::{
|
||||
entities::{Connect, Disconnect, Socket},
|
||||
WSServer, WebSocketMessage,
|
||||
WSServer,
|
||||
WebSocketMessage,
|
||||
},
|
||||
};
|
||||
use actix::*;
|
||||
use actix_web::web::Data;
|
||||
use actix_web_actors::{ws, ws::Message::Text};
|
||||
use bytes::Bytes;
|
||||
use lib_ws::{WSModule, WebSocketRawMessage};
|
||||
use lib_ws::{WSChannel, WebSocketRawMessage};
|
||||
use std::{collections::HashMap, convert::TryFrom, sync::Arc, time::Instant};
|
||||
|
||||
pub trait WebSocketReceiver: Send + Sync {
|
||||
fn receive(&self, data: WSClientData);
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct WebSocketReceivers {
|
||||
inner: HashMap<WSModule, Arc<dyn WebSocketReceiver>>,
|
||||
inner: HashMap<WSChannel, Arc<dyn WebSocketReceiver>>,
|
||||
}
|
||||
|
||||
impl std::default::Default for WebSocketReceivers {
|
||||
fn default() -> Self { Self { inner: HashMap::new() } }
|
||||
}
|
||||
|
||||
impl WebSocketReceivers {
|
||||
pub fn new() -> Self {
|
||||
WebSocketReceivers::default()
|
||||
pub fn new() -> Self { WebSocketReceivers::default() }
|
||||
|
||||
pub fn set(&mut self, channel: WSChannel, receiver: Arc<dyn WebSocketReceiver>) {
|
||||
tracing::trace!("Add {:?} receiver", channel);
|
||||
self.inner.insert(channel, receiver);
|
||||
}
|
||||
|
||||
pub fn set(&mut self, source: WSModule, receiver: Arc<dyn WebSocketReceiver>) {
|
||||
self.inner.insert(source, receiver);
|
||||
}
|
||||
|
||||
pub fn get(&self, source: &WSModule) -> Option<Arc<dyn WebSocketReceiver>> {
|
||||
self.inner.get(source).cloned()
|
||||
}
|
||||
pub fn get(&self, source: &WSChannel) -> Option<Arc<dyn WebSocketReceiver>> { self.inner.get(source).cloned() }
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
@ -42,13 +43,9 @@ pub struct WSUser {
|
||||
}
|
||||
|
||||
impl WSUser {
|
||||
pub fn new(inner: LoggedUser) -> Self {
|
||||
Self { inner }
|
||||
}
|
||||
pub fn new(inner: LoggedUser) -> Self { Self { inner } }
|
||||
|
||||
pub fn id(&self) -> &str {
|
||||
&self.inner.user_id
|
||||
}
|
||||
pub fn id(&self) -> &str { &self.inner.user_id }
|
||||
}
|
||||
|
||||
pub struct WSClientData {
|
||||
@ -90,10 +87,10 @@ impl WSClient {
|
||||
fn handle_binary_message(&self, bytes: Bytes, socket: Socket) {
|
||||
// TODO: ok to unwrap?
|
||||
let message: WebSocketRawMessage = WebSocketRawMessage::try_from(bytes).unwrap();
|
||||
match self.ws_receivers.get(&message.module) {
|
||||
match self.ws_receivers.get(&message.channel) {
|
||||
None => {
|
||||
log::error!("Can't find the receiver for {:?}", message.module);
|
||||
}
|
||||
log::error!("Can't find the receiver for {:?}", message.channel);
|
||||
},
|
||||
Some(handler) => {
|
||||
let client_data = WSClientData {
|
||||
user: self.user.clone(),
|
||||
@ -101,7 +98,7 @@ impl WSClient {
|
||||
data: Bytes::from(message.data),
|
||||
};
|
||||
handler.receive(client_data);
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -112,28 +109,28 @@ impl StreamHandler<Result<ws::Message, ws::ProtocolError>> for WSClient {
|
||||
Ok(ws::Message::Ping(msg)) => {
|
||||
self.hb = Instant::now();
|
||||
ctx.pong(&msg);
|
||||
}
|
||||
},
|
||||
Ok(ws::Message::Pong(_msg)) => {
|
||||
// tracing::debug!("Receive {} pong {:?}", &self.session_id, &msg);
|
||||
self.hb = Instant::now();
|
||||
}
|
||||
},
|
||||
Ok(ws::Message::Binary(bytes)) => {
|
||||
let socket = ctx.address().recipient();
|
||||
self.handle_binary_message(bytes, socket);
|
||||
}
|
||||
},
|
||||
Ok(Text(_)) => {
|
||||
log::warn!("Receive unexpected text message");
|
||||
}
|
||||
},
|
||||
Ok(ws::Message::Close(reason)) => {
|
||||
ctx.close(reason);
|
||||
ctx.stop();
|
||||
}
|
||||
Ok(ws::Message::Continuation(_)) => {}
|
||||
Ok(ws::Message::Nop) => {}
|
||||
},
|
||||
Ok(ws::Message::Continuation(_)) => {},
|
||||
Ok(ws::Message::Nop) => {},
|
||||
Err(e) => {
|
||||
log::error!("[{}]: WebSocketStream protocol error {:?}", self.user.id(), e);
|
||||
ctx.stop();
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -141,9 +138,7 @@ impl StreamHandler<Result<ws::Message, ws::ProtocolError>> for WSClient {
|
||||
impl Handler<WebSocketMessage> for WSClient {
|
||||
type Result = ();
|
||||
|
||||
fn handle(&mut self, msg: WebSocketMessage, ctx: &mut Self::Context) {
|
||||
ctx.binary(msg.0);
|
||||
}
|
||||
fn handle(&mut self, msg: WebSocketMessage, ctx: &mut Self::Context) { ctx.binary(msg.0); }
|
||||
}
|
||||
|
||||
impl Actor for WSClient {
|
||||
|
@ -5,7 +5,7 @@ use std::str;
|
||||
#[actix_rt::test]
|
||||
async fn kv_set_test() {
|
||||
let server = spawn_server().await;
|
||||
let kv = server.app_ctx.persistence.kv_store();
|
||||
let kv = server.app_ctx.persistence.document_kv_store();
|
||||
let s1 = "123".to_string();
|
||||
let key = "1";
|
||||
|
||||
@ -18,7 +18,7 @@ async fn kv_set_test() {
|
||||
#[actix_rt::test]
|
||||
async fn kv_delete_test() {
|
||||
let server = spawn_server().await;
|
||||
let kv = server.app_ctx.persistence.kv_store();
|
||||
let kv = server.app_ctx.persistence.document_kv_store();
|
||||
let s1 = "123".to_string();
|
||||
let key = "1";
|
||||
|
||||
@ -30,7 +30,7 @@ async fn kv_delete_test() {
|
||||
#[actix_rt::test]
|
||||
async fn kv_batch_set_test() {
|
||||
let server = spawn_server().await;
|
||||
let kv = server.app_ctx.persistence.kv_store();
|
||||
let kv = server.app_ctx.persistence.document_kv_store();
|
||||
let kvs = vec![
|
||||
KeyValue {
|
||||
key: "1".to_string(),
|
||||
@ -54,7 +54,7 @@ async fn kv_batch_set_test() {
|
||||
#[actix_rt::test]
|
||||
async fn kv_batch_get_start_with_test() {
|
||||
let server = spawn_server().await;
|
||||
let kv = server.app_ctx.persistence.kv_store();
|
||||
let kv = server.app_ctx.persistence.document_kv_store();
|
||||
let kvs = vec![
|
||||
KeyValue {
|
||||
key: "abc:1".to_string(),
|
||||
|
@ -1,10 +1,10 @@
|
||||
#![allow(clippy::all)]
|
||||
|
||||
use crate::util::helper::{ViewTest, *};
|
||||
use crate::util::helper::{BackendViewTest, *};
|
||||
use flowy_collaboration::{
|
||||
document::{Document, PlainDoc},
|
||||
client_document::{ClientDocument, PlainDoc},
|
||||
entities::{
|
||||
doc::{CreateDocParams, DocumentId},
|
||||
document_info::{CreateDocParams, DocumentId},
|
||||
revision::{md5, RepeatedRevision, Revision},
|
||||
},
|
||||
};
|
||||
@ -17,13 +17,13 @@ use flowy_core_data_model::entities::{
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn workspace_create() {
|
||||
let test = WorkspaceTest::new().await;
|
||||
let test = BackendWorkspaceTest::new().await;
|
||||
tracing::info!("{:?}", test.workspace);
|
||||
}
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn workspace_read() {
|
||||
let test = WorkspaceTest::new().await;
|
||||
let test = BackendWorkspaceTest::new().await;
|
||||
let read_params = WorkspaceId::new(Some(test.workspace.id.clone()));
|
||||
let repeated_workspace = test.server.read_workspaces(read_params).await;
|
||||
tracing::info!("{:?}", repeated_workspace);
|
||||
@ -31,7 +31,7 @@ async fn workspace_read() {
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn workspace_read_with_belongs() {
|
||||
let test = WorkspaceTest::new().await;
|
||||
let test = BackendWorkspaceTest::new().await;
|
||||
|
||||
let _ = test.create_app().await;
|
||||
let _ = test.create_app().await;
|
||||
@ -45,7 +45,7 @@ async fn workspace_read_with_belongs() {
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn workspace_update() {
|
||||
let test = WorkspaceTest::new().await;
|
||||
let test = BackendWorkspaceTest::new().await;
|
||||
let new_name = "rename workspace name";
|
||||
let new_desc = "rename workspace description";
|
||||
|
||||
@ -65,7 +65,7 @@ async fn workspace_update() {
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn workspace_delete() {
|
||||
let test = WorkspaceTest::new().await;
|
||||
let test = BackendWorkspaceTest::new().await;
|
||||
let delete_params = WorkspaceId {
|
||||
workspace_id: Some(test.workspace.id.clone()),
|
||||
};
|
||||
@ -78,20 +78,20 @@ async fn workspace_delete() {
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn app_create() {
|
||||
let test = AppTest::new().await;
|
||||
let test = BackendAppTest::new().await;
|
||||
tracing::info!("{:?}", test.app);
|
||||
}
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn app_read() {
|
||||
let test = AppTest::new().await;
|
||||
let test = BackendAppTest::new().await;
|
||||
let read_params = AppId::new(&test.app.id);
|
||||
assert_eq!(test.server.read_app(read_params).await.is_some(), true);
|
||||
}
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn app_read_with_belongs() {
|
||||
let test = AppTest::new().await;
|
||||
let test = BackendAppTest::new().await;
|
||||
|
||||
let _ = create_test_view(&test.server, &test.app.id).await;
|
||||
let _ = create_test_view(&test.server, &test.app.id).await;
|
||||
@ -103,7 +103,7 @@ async fn app_read_with_belongs() {
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn app_read_with_belongs_in_trash() {
|
||||
let test = AppTest::new().await;
|
||||
let test = BackendAppTest::new().await;
|
||||
|
||||
let _ = create_test_view(&test.server, &test.app.id).await;
|
||||
let view = create_test_view(&test.server, &test.app.id).await;
|
||||
@ -117,7 +117,7 @@ async fn app_read_with_belongs_in_trash() {
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn app_update() {
|
||||
let test = AppTest::new().await;
|
||||
let test = BackendAppTest::new().await;
|
||||
|
||||
let new_name = "flowy";
|
||||
|
||||
@ -131,7 +131,7 @@ async fn app_update() {
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn app_delete() {
|
||||
let test = AppTest::new().await;
|
||||
let test = BackendAppTest::new().await;
|
||||
|
||||
let delete_params = AppId {
|
||||
app_id: test.app.id.clone(),
|
||||
@ -143,13 +143,13 @@ async fn app_delete() {
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn view_create() {
|
||||
let test = ViewTest::new().await;
|
||||
let test = BackendViewTest::new().await;
|
||||
tracing::info!("{:?}", test.view);
|
||||
}
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn view_update() {
|
||||
let test = ViewTest::new().await;
|
||||
let test = BackendViewTest::new().await;
|
||||
let new_name = "name view name";
|
||||
|
||||
// update
|
||||
@ -164,7 +164,7 @@ async fn view_update() {
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn view_delete() {
|
||||
let test = ViewTest::new().await;
|
||||
let test = BackendViewTest::new().await;
|
||||
test.server.create_view_trash(&test.view.id).await;
|
||||
|
||||
let trash_ids = test
|
||||
@ -185,7 +185,7 @@ async fn view_delete() {
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn trash_delete() {
|
||||
let test = ViewTest::new().await;
|
||||
let test = BackendViewTest::new().await;
|
||||
test.server.create_view_trash(&test.view.id).await;
|
||||
|
||||
let identifier = TrashId {
|
||||
@ -199,7 +199,7 @@ async fn trash_delete() {
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn trash_delete_all() {
|
||||
let test = ViewTest::new().await;
|
||||
let test = BackendViewTest::new().await;
|
||||
test.server.create_view_trash(&test.view.id).await;
|
||||
|
||||
test.server.delete_view_trash(RepeatedTrashId::all()).await;
|
||||
@ -226,7 +226,7 @@ async fn workspace_list_read() {
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn doc_read() {
|
||||
let test = ViewTest::new().await;
|
||||
let test = BackendViewTest::new().await;
|
||||
let params = DocumentId {
|
||||
doc_id: test.view.id.clone(),
|
||||
};
|
||||
@ -240,7 +240,7 @@ async fn doc_create() {
|
||||
let server = TestUserServer::new().await;
|
||||
let doc_id = uuid::Uuid::new_v4().to_string();
|
||||
let user_id = "a".to_owned();
|
||||
let mut document = Document::new::<PlainDoc>();
|
||||
let mut document = ClientDocument::new::<PlainDoc>();
|
||||
let mut offset = 0;
|
||||
for i in 0..1000 {
|
||||
let content = i.to_string();
|
||||
@ -268,7 +268,7 @@ async fn doc_create() {
|
||||
|
||||
#[actix_rt::test]
|
||||
async fn doc_delete() {
|
||||
let test = ViewTest::new().await;
|
||||
let test = BackendViewTest::new().await;
|
||||
let delete_params = RepeatedViewId {
|
||||
items: vec![test.view.id.clone()],
|
||||
};
|
||||
|
@ -2,22 +2,22 @@
|
||||
#![cfg_attr(rustfmt, rustfmt::skip)]
|
||||
use std::convert::TryInto;
|
||||
use actix_web::web::Data;
|
||||
use flowy_document::core::edit::ClientDocumentEditor;
|
||||
use flowy_document::core::ClientDocumentEditor;
|
||||
use flowy_test::{helper::ViewTest, FlowySDKTest};
|
||||
use flowy_user::services::user::UserSession;
|
||||
use flowy_user::services::UserSession;
|
||||
use futures_util::{stream, stream::StreamExt};
|
||||
use std::sync::Arc;
|
||||
use bytes::Bytes;
|
||||
use tokio::time::{sleep, Duration};
|
||||
use crate::util::helper::{spawn_server, TestServer};
|
||||
use flowy_collaboration::{entities::doc::DocumentId, protobuf::ResetDocumentParams as ResetDocumentParamsPB};
|
||||
use flowy_collaboration::{entities::document_info::DocumentId, protobuf::ResetDocumentParams as ResetDocumentParamsPB};
|
||||
use lib_ot::rich_text::{RichTextAttribute, RichTextDelta};
|
||||
use parking_lot::RwLock;
|
||||
use backend::services::document::persistence::{read_document, reset_document};
|
||||
use flowy_collaboration::entities::revision::{RepeatedRevision, Revision};
|
||||
use flowy_collaboration::protobuf::{RepeatedRevision as RepeatedRevisionPB, DocumentId as DocumentIdPB};
|
||||
use flowy_collaboration::sync::ServerDocumentManager;
|
||||
use flowy_net::services::ws_conn::FlowyWebSocketConnect;
|
||||
use flowy_collaboration::server_document::ServerDocumentManager;
|
||||
use flowy_net::ws::connection::FlowyWebSocketConnect;
|
||||
use lib_ot::core::Interval;
|
||||
|
||||
pub struct DocumentTest {
|
||||
@ -63,14 +63,14 @@ struct ScriptContext {
|
||||
impl ScriptContext {
|
||||
async fn new(client_sdk: FlowySDKTest, server: TestServer) -> Self {
|
||||
let user_session = client_sdk.user_session.clone();
|
||||
let ws_manager = client_sdk.ws_conn.clone();
|
||||
let ws_conn = client_sdk.ws_conn.clone();
|
||||
let doc_id = create_doc(&client_sdk).await;
|
||||
|
||||
Self {
|
||||
client_editor: None,
|
||||
client_sdk,
|
||||
client_user_session: user_session,
|
||||
ws_conn: ws_manager,
|
||||
ws_conn,
|
||||
server,
|
||||
doc_id,
|
||||
}
|
||||
@ -78,7 +78,7 @@ impl ScriptContext {
|
||||
|
||||
async fn open_doc(&mut self) {
|
||||
let doc_id = self.doc_id.clone();
|
||||
let edit_context = self.client_sdk.document_ctx.controller.open_document(doc_id).await.unwrap();
|
||||
let edit_context = self.client_sdk.document_manager.open_document(doc_id).await.unwrap();
|
||||
self.client_editor = Some(edit_context);
|
||||
}
|
||||
|
||||
@ -113,7 +113,7 @@ async fn run_scripts(context: Arc<RwLock<ScriptContext>>, scripts: Vec<DocScript
|
||||
},
|
||||
DocScript::AssertServer(s, rev_id) => {
|
||||
sleep(Duration::from_millis(2000)).await;
|
||||
let persistence = Data::new(context.read().server.app_ctx.persistence.kv_store());
|
||||
let persistence = Data::new(context.read().server.app_ctx.persistence.document_kv_store());
|
||||
let doc_identifier: DocumentIdPB = DocumentId {
|
||||
doc_id
|
||||
}.try_into().unwrap();
|
||||
|
@ -1,5 +1,5 @@
|
||||
use crate::document_test::edit_script::{DocScript, DocumentTest};
|
||||
use flowy_collaboration::document::{Document, NewlineDoc};
|
||||
use flowy_collaboration::client_document::{ClientDocument, NewlineDoc};
|
||||
use lib_ot::{core::Interval, rich_text::RichTextAttribute};
|
||||
|
||||
#[rustfmt::skip]
|
||||
@ -75,7 +75,7 @@ async fn delta_sync_while_editing_with_attribute() {
|
||||
#[actix_rt::test]
|
||||
async fn delta_sync_with_server_push() {
|
||||
let test = DocumentTest::new().await;
|
||||
let mut document = Document::new::<NewlineDoc>();
|
||||
let mut document = ClientDocument::new::<NewlineDoc>();
|
||||
document.insert(0, "123").unwrap();
|
||||
document.insert(3, "456").unwrap();
|
||||
let json = document.to_json();
|
||||
@ -109,7 +109,7 @@ async fn delta_sync_with_server_push() {
|
||||
#[actix_rt::test]
|
||||
async fn delta_sync_with_server_push_after_reset_document() {
|
||||
let test = DocumentTest::new().await;
|
||||
let mut document = Document::new::<NewlineDoc>();
|
||||
let mut document = ClientDocument::new::<NewlineDoc>();
|
||||
document.insert(0, "123").unwrap();
|
||||
let json = document.to_json();
|
||||
|
||||
@ -148,7 +148,7 @@ async fn delta_sync_with_server_push_after_reset_document() {
|
||||
#[actix_rt::test]
|
||||
async fn delta_sync_while_local_rev_less_than_server_rev() {
|
||||
let test = DocumentTest::new().await;
|
||||
let mut document = Document::new::<NewlineDoc>();
|
||||
let mut document = ClientDocument::new::<NewlineDoc>();
|
||||
document.insert(0, "123").unwrap();
|
||||
let json = document.to_json();
|
||||
|
||||
@ -190,7 +190,7 @@ async fn delta_sync_while_local_rev_less_than_server_rev() {
|
||||
#[actix_rt::test]
|
||||
async fn delta_sync_while_local_rev_greater_than_server_rev() {
|
||||
let test = DocumentTest::new().await;
|
||||
let mut document = Document::new::<NewlineDoc>();
|
||||
let mut document = ClientDocument::new::<NewlineDoc>();
|
||||
document.insert(0, "123").unwrap();
|
||||
let json = document.to_json();
|
||||
|
||||
|
@ -6,14 +6,17 @@ use backend::{
|
||||
use backend_service::{
|
||||
configuration::{get_client_server_configuration, ClientServerConfiguration},
|
||||
errors::ServerError,
|
||||
http_request::*,
|
||||
};
|
||||
use flowy_collaboration::{
|
||||
document::default::initial_delta_string,
|
||||
entities::doc::{CreateDocParams, DocumentId, DocumentInfo},
|
||||
client_document::default::initial_delta_string,
|
||||
entities::document_info::{CreateDocParams, DocumentId, DocumentInfo},
|
||||
};
|
||||
use flowy_core_data_model::entities::{app::*, trash::*, view::*, workspace::*};
|
||||
use flowy_net::http_server::{
|
||||
core::*,
|
||||
document::{create_document_request, read_document_request},
|
||||
user::*,
|
||||
};
|
||||
use flowy_core_data_model::entities::prelude::*;
|
||||
use flowy_document::server::{create_doc_request, read_doc_request};
|
||||
use flowy_user_data_model::entities::*;
|
||||
use lib_infra::uuid_string;
|
||||
use sqlx::{Connection, Executor, PgConnection, PgPool};
|
||||
@ -157,13 +160,13 @@ impl TestUserServer {
|
||||
|
||||
pub async fn read_doc(&self, params: DocumentId) -> Option<DocumentInfo> {
|
||||
let url = format!("{}/api/doc", self.http_addr());
|
||||
let doc = read_doc_request(self.user_token(), params, &url).await.unwrap();
|
||||
let doc = read_document_request(self.user_token(), params, &url).await.unwrap();
|
||||
doc
|
||||
}
|
||||
|
||||
pub async fn create_doc(&self, params: CreateDocParams) {
|
||||
let url = format!("{}/api/doc", self.http_addr());
|
||||
let _ = create_doc_request(self.user_token(), params, &url).await.unwrap();
|
||||
let _ = create_document_request(self.user_token(), params, &url).await.unwrap();
|
||||
}
|
||||
|
||||
pub async fn register_user(&self) -> SignUpResponse {
|
||||
@ -330,12 +333,12 @@ pub async fn create_test_view(application: &TestUserServer, app_id: &str) -> Vie
|
||||
app
|
||||
}
|
||||
|
||||
pub struct WorkspaceTest {
|
||||
pub struct BackendWorkspaceTest {
|
||||
pub server: TestUserServer,
|
||||
pub workspace: Workspace,
|
||||
}
|
||||
|
||||
impl WorkspaceTest {
|
||||
impl BackendWorkspaceTest {
|
||||
pub async fn new() -> Self {
|
||||
let server = TestUserServer::new().await;
|
||||
let workspace = create_test_workspace(&server).await;
|
||||
@ -347,13 +350,13 @@ impl WorkspaceTest {
|
||||
}
|
||||
}
|
||||
|
||||
pub struct AppTest {
|
||||
pub struct BackendAppTest {
|
||||
pub server: TestUserServer,
|
||||
pub workspace: Workspace,
|
||||
pub app: App,
|
||||
}
|
||||
|
||||
impl AppTest {
|
||||
impl BackendAppTest {
|
||||
pub async fn new() -> Self {
|
||||
let server = TestUserServer::new().await;
|
||||
let workspace = create_test_workspace(&server).await;
|
||||
@ -362,14 +365,14 @@ impl AppTest {
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ViewTest {
|
||||
pub struct BackendViewTest {
|
||||
pub server: TestUserServer,
|
||||
pub workspace: Workspace,
|
||||
pub app: App,
|
||||
pub view: View,
|
||||
}
|
||||
|
||||
impl ViewTest {
|
||||
impl BackendViewTest {
|
||||
pub async fn new() -> Self {
|
||||
let server = TestUserServer::new().await;
|
||||
let workspace = create_test_workspace(&server).await;
|
||||
|
@ -2,6 +2,7 @@ import 'package:app_flowy/startup/startup.dart';
|
||||
import 'package:app_flowy/user/application/splash_bloc.dart';
|
||||
import 'package:app_flowy/user/domain/auth_state.dart';
|
||||
import 'package:app_flowy/user/domain/i_splash.dart';
|
||||
import 'package:flowy_log/flowy_log.dart';
|
||||
import 'package:flowy_sdk/dispatch/dispatch.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/errors.pb.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
@ -48,6 +49,7 @@ class SplashScreen extends StatelessWidget {
|
||||
return result.fold(
|
||||
(workspaceSetting) => getIt<ISplashRoute>().pushHomeScreen(context, userProfile, workspaceSetting),
|
||||
(error) async {
|
||||
Log.error(error);
|
||||
assert(error.code == ErrorCode.RecordNotFound.value);
|
||||
getIt<ISplashRoute>().pushWelcomeScreen(context, userProfile);
|
||||
},
|
||||
|
@ -5,7 +5,7 @@ import 'package:flowy_infra/theme.dart';
|
||||
import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart';
|
||||
import 'package:flowy_infra_ui/style_widget/button.dart';
|
||||
import 'package:flowy_infra_ui/widget/error_page.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace.pb.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart';
|
||||
|
@ -1,7 +1,7 @@
|
||||
import 'package:app_flowy/workspace/domain/i_app.dart';
|
||||
import 'package:flowy_log/flowy_log.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
|
@ -2,8 +2,8 @@ import 'dart:convert';
|
||||
|
||||
import 'package:app_flowy/workspace/domain/i_trash.dart';
|
||||
import 'package:app_flowy/workspace/domain/i_view.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
import 'package:flutter_quill/flutter_quill.dart';
|
||||
import 'package:flowy_log/flowy_log.dart';
|
||||
|
@ -1,7 +1,7 @@
|
||||
import 'package:app_flowy/workspace/domain/i_share.dart';
|
||||
import 'package:app_flowy/workspace/infrastructure/markdown/delta_markdown.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/export.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/share.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
|
@ -4,7 +4,7 @@ import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart';
|
||||
import 'package:app_flowy/workspace/presentation/stack_page/blank/blank_page.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flowy_log/flowy_log.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import 'package:app_flowy/workspace/domain/i_user.dart';
|
||||
import 'package:flowy_log/flowy_log.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
|
@ -1,7 +1,7 @@
|
||||
import 'package:app_flowy/workspace/domain/i_trash.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flowy_log/flowy_log.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
|
@ -1,5 +1,5 @@
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
|
@ -1,7 +1,7 @@
|
||||
import 'package:app_flowy/workspace/domain/i_user.dart';
|
||||
import 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart';
|
||||
import 'package:flowy_log/flowy_log.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
import 'package:freezed_annotation/freezed_annotation.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import 'dart:async';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-collaboration/doc.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-collaboration/document_info.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
|
||||
abstract class IDoc {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import 'dart:async';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
|
||||
abstract class ITrash {
|
||||
|
@ -2,7 +2,7 @@ import 'package:dartz/dartz.dart';
|
||||
import 'package:flowy_infra/notifier.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile;
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace.pb.dart';
|
||||
export 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile;
|
||||
|
||||
abstract class IUser {
|
||||
|
@ -1,4 +1,4 @@
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flowy_infra/notifier.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
|
@ -1,4 +1,4 @@
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flowy_infra/image.dart';
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart';
|
||||
import 'package:app_flowy/workspace/presentation/stack_page/blank/blank_page.dart';
|
||||
import 'package:app_flowy/workspace/presentation/stack_page/doc/doc_stack_page.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
|
||||
extension ToHomeStackContext on View {
|
||||
HomeStackContext stackContext() {
|
||||
|
@ -21,8 +21,8 @@ import 'package:app_flowy/workspace/infrastructure/repos/trash_repo.dart';
|
||||
import 'package:app_flowy/workspace/infrastructure/repos/view_repo.dart';
|
||||
import 'package:app_flowy/workspace/infrastructure/repos/workspace_repo.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile;
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:get_it/get_it.dart';
|
||||
|
||||
import 'i_share_impl.dart';
|
||||
|
@ -1,7 +1,7 @@
|
||||
import 'package:app_flowy/workspace/infrastructure/repos/app_repo.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:app_flowy/workspace/domain/i_app.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
export 'package:app_flowy/workspace/domain/i_app.dart';
|
||||
|
||||
|
@ -4,7 +4,7 @@ import 'dart:typed_data';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:app_flowy/workspace/domain/i_doc.dart';
|
||||
import 'package:app_flowy/workspace/infrastructure/repos/doc_repo.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-collaboration/doc.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-collaboration/document_info.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
|
||||
class IDocImpl extends IDoc {
|
||||
|
@ -1,7 +1,7 @@
|
||||
import 'package:app_flowy/workspace/domain/i_trash.dart';
|
||||
import 'package:app_flowy/workspace/infrastructure/repos/trash_repo.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
|
||||
class ITrashImpl implements ITrash {
|
||||
|
@ -6,11 +6,11 @@ import 'package:app_flowy/workspace/domain/i_user.dart';
|
||||
import 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart';
|
||||
import 'package:flowy_infra/notifier.dart';
|
||||
import 'package:flowy_sdk/protobuf/dart-notify/protobuf.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core/observable.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core/dart_notification.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-user-data-model/errors.pb.dart';
|
||||
// import 'package:flowy_sdk/protobuf/flowy-user/errors.pb.dart' as user_error;
|
||||
import 'package:flowy_sdk/protobuf/flowy-user/observable.pb.dart' as user;
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-user/dart_notification.pb.dart' as user;
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
export 'package:app_flowy/workspace/domain/i_user.dart';
|
||||
export 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart';
|
||||
|
@ -2,7 +2,7 @@ import 'package:app_flowy/workspace/domain/i_view.dart';
|
||||
import 'package:app_flowy/workspace/infrastructure/repos/view_repo.dart';
|
||||
import 'package:flowy_infra/notifier.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
|
||||
class IViewImpl extends IView {
|
||||
|
@ -1,7 +1,7 @@
|
||||
import 'package:app_flowy/workspace/domain/i_workspace.dart';
|
||||
import 'package:app_flowy/workspace/infrastructure/repos/workspace_repo.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
|
||||
export 'package:app_flowy/workspace/domain/i_workspace.dart';
|
||||
|
@ -5,12 +5,10 @@ import 'package:dartz/dartz.dart';
|
||||
import 'package:flowy_log/flowy_log.dart';
|
||||
import 'package:flowy_sdk/dispatch/dispatch.dart';
|
||||
import 'package:flowy_sdk/protobuf/dart-notify/subject.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_query.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_update.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core/observable.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core/dart_notification.pb.dart';
|
||||
import 'package:flowy_sdk/rust_stream.dart';
|
||||
import 'helper.dart';
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flowy_sdk/dispatch/dispatch.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-collaboration/doc.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_query.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-collaboration/document_info.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
|
||||
class DocRepository {
|
||||
@ -12,7 +12,7 @@ class DocRepository {
|
||||
|
||||
Future<Either<DocumentDelta, FlowyError>> readDoc() {
|
||||
final request = QueryViewRequest(viewIds: [docId]);
|
||||
return WorkspaceEventOpenView(request).send();
|
||||
return WorkspaceEventOpenDocument(request).send();
|
||||
}
|
||||
|
||||
Future<Either<DocumentDelta, FlowyError>> composeDelta({required String data}) {
|
||||
|
@ -3,7 +3,7 @@ import 'package:flowy_sdk/protobuf/dart-notify/protobuf.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-user/protobuf.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core/observable.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core/dart_notification.pb.dart';
|
||||
|
||||
typedef UserNotificationCallback = void Function(UserNotification, Either<Uint8List, FlowyError>);
|
||||
|
||||
|
@ -5,9 +5,9 @@ import 'package:app_flowy/workspace/infrastructure/repos/helper.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flowy_sdk/dispatch/dispatch.dart';
|
||||
import 'package:flowy_sdk/protobuf/dart-notify/subject.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core/observable.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core/dart_notification.pb.dart';
|
||||
import 'package:flowy_sdk/rust_stream.dart';
|
||||
|
||||
class TrashRepo {
|
||||
@ -33,11 +33,11 @@ class TrashRepo {
|
||||
}
|
||||
|
||||
Future<Either<Unit, FlowyError>> restoreAll() {
|
||||
return WorkspaceEventRestoreAll().send();
|
||||
return WorkspaceEventRestoreAllTrash().send();
|
||||
}
|
||||
|
||||
Future<Either<Unit, FlowyError>> deleteAll() {
|
||||
return WorkspaceEventDeleteAll().send();
|
||||
return WorkspaceEventDeleteAllTrash().send();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,8 +1,7 @@
|
||||
import 'dart:async';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flowy_sdk/dispatch/dispatch.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_query.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace.pb.dart';
|
||||
import 'package:app_flowy/workspace/domain/i_user.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
|
||||
|
@ -3,11 +3,9 @@ import 'dart:typed_data';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:flowy_sdk/dispatch/dispatch.dart';
|
||||
import 'package:flowy_sdk/protobuf/dart-notify/subject.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_query.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_update.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core/observable.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core/dart_notification.pb.dart';
|
||||
import 'package:flowy_sdk/rust_stream.dart';
|
||||
|
||||
import 'package:app_flowy/workspace/domain/i_view.dart';
|
||||
|
@ -7,11 +7,10 @@ import 'package:flowy_log/flowy_log.dart';
|
||||
import 'package:flowy_sdk/dispatch/dispatch.dart';
|
||||
import 'package:flowy_sdk/protobuf/dart-notify/subject.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile;
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_query.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core/observable.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core/dart_notification.pb.dart';
|
||||
import 'package:flowy_sdk/rust_stream.dart';
|
||||
|
||||
import 'package:app_flowy/generated/locale_keys.g.dart';
|
||||
|
@ -4,7 +4,7 @@ import 'package:flowy_infra_ui/style_widget/scrolling/styled_scroll_bar.dart';
|
||||
import 'package:flowy_infra_ui/widget/spacing.dart';
|
||||
import 'package:flutter_quill/flutter_quill.dart' as quill;
|
||||
import 'package:flowy_infra_ui/widget/error_page.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:styled_widget/styled_widget.dart';
|
||||
|
@ -12,8 +12,8 @@ import 'package:flowy_infra/theme.dart';
|
||||
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
||||
import 'package:flowy_infra_ui/widget/rounded_button.dart';
|
||||
import 'package:flowy_log/flowy_log.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/export.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/share.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:dartz/dartz.dart' as dartz;
|
||||
|
@ -2,7 +2,7 @@ import 'package:flowy_infra/image.dart';
|
||||
import 'package:flowy_infra_ui/style_widget/icon_button.dart';
|
||||
import 'package:flowy_infra_ui/style_widget/text.dart';
|
||||
import 'package:flowy_infra_ui/widget/spacing.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash.pb.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:fixnum/fixnum.dart' as $fixnum;
|
||||
|
@ -4,8 +4,7 @@ import 'package:app_flowy/workspace/presentation/home/home_sizes.dart';
|
||||
import 'package:app_flowy/workspace/presentation/home/navigation.dart';
|
||||
import 'package:flowy_infra/theme.dart';
|
||||
import 'package:flowy_infra_ui/widget/spacing.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pbenum.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flowy_infra_ui/style_widget/extension.dart';
|
||||
import 'package:flowy_infra_ui/style_widget/text.dart';
|
||||
|
@ -4,8 +4,8 @@ import 'package:flowy_infra/size.dart';
|
||||
import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart';
|
||||
import 'package:flowy_infra_ui/widget/spacing.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile;
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_setting.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace.pb.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
@ -4,7 +4,7 @@ import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
||||
import 'package:flowy_infra_ui/style_widget/hover.dart';
|
||||
import 'package:flowy_infra_ui/style_widget/icon_button.dart';
|
||||
import 'package:flowy_infra_ui/style_widget/text.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:styled_widget/styled_widget.dart';
|
||||
|
@ -6,7 +6,7 @@ import 'package:flowy_infra/flowy_icon_data_icons.dart';
|
||||
import 'package:flowy_infra/theme.dart';
|
||||
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
||||
import 'package:flowy_infra_ui/style_widget/text.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app.pb.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:app_flowy/workspace/application/app/app_bloc.dart';
|
||||
|
@ -1,8 +1,8 @@
|
||||
import 'package:app_flowy/workspace/presentation/widgets/menu/menu.dart';
|
||||
import 'package:app_flowy/workspace/presentation/widgets/menu/widget/app/header/header.dart';
|
||||
import 'package:expandable/expandable.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:app_flowy/startup/startup.dart';
|
||||
|
@ -8,7 +8,7 @@ import 'package:flowy_infra/theme.dart';
|
||||
import 'package:flowy_infra_ui/style_widget/hover.dart';
|
||||
import 'package:flowy_infra_ui/style_widget/text.dart';
|
||||
import 'package:flowy_infra_ui/widget/spacing.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:styled_widget/styled_widget.dart';
|
||||
|
@ -3,7 +3,7 @@ import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart';
|
||||
import 'package:app_flowy/workspace/domain/view_ext.dart';
|
||||
import 'package:app_flowy/workspace/presentation/widgets/menu/menu.dart';
|
||||
import 'package:app_flowy/workspace/presentation/widgets/menu/widget/app/menu_app.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:styled_widget/styled_widget.dart';
|
||||
|
@ -268,13 +268,13 @@ class WorkspaceEventCopyLink {
|
||||
}
|
||||
}
|
||||
|
||||
class WorkspaceEventOpenView {
|
||||
class WorkspaceEventOpenDocument {
|
||||
QueryViewRequest request;
|
||||
WorkspaceEventOpenView(this.request);
|
||||
WorkspaceEventOpenDocument(this.request);
|
||||
|
||||
Future<Either<DocumentDelta, FlowyError>> send() {
|
||||
final request = FFIRequest.create()
|
||||
..event = WorkspaceEvent.OpenView.toString()
|
||||
..event = WorkspaceEvent.OpenDocument.toString()
|
||||
..payload = requestToBytes(this.request);
|
||||
|
||||
return Dispatch.asyncRequest(request)
|
||||
@ -350,12 +350,12 @@ class WorkspaceEventDeleteTrash {
|
||||
}
|
||||
}
|
||||
|
||||
class WorkspaceEventRestoreAll {
|
||||
WorkspaceEventRestoreAll();
|
||||
class WorkspaceEventRestoreAllTrash {
|
||||
WorkspaceEventRestoreAllTrash();
|
||||
|
||||
Future<Either<Unit, FlowyError>> send() {
|
||||
final request = FFIRequest.create()
|
||||
..event = WorkspaceEvent.RestoreAll.toString();
|
||||
..event = WorkspaceEvent.RestoreAllTrash.toString();
|
||||
|
||||
return Dispatch.asyncRequest(request).then((bytesResult) => bytesResult.fold(
|
||||
(bytes) => left(unit),
|
||||
@ -364,12 +364,12 @@ class WorkspaceEventRestoreAll {
|
||||
}
|
||||
}
|
||||
|
||||
class WorkspaceEventDeleteAll {
|
||||
WorkspaceEventDeleteAll();
|
||||
class WorkspaceEventDeleteAllTrash {
|
||||
WorkspaceEventDeleteAllTrash();
|
||||
|
||||
Future<Either<Unit, FlowyError>> send() {
|
||||
final request = FFIRequest.create()
|
||||
..event = WorkspaceEvent.DeleteAll.toString();
|
||||
..event = WorkspaceEvent.DeleteAllTrash.toString();
|
||||
|
||||
return Dispatch.asyncRequest(request).then((bytesResult) => bytesResult.fold(
|
||||
(bytes) => left(unit),
|
||||
|
@ -4,6 +4,7 @@ import 'package:flowy_log/flowy_log.dart';
|
||||
// ignore: unnecessary_import
|
||||
import 'package:flowy_sdk/protobuf/dart-ffi/ffi_response.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/dart-ffi/ffi_request.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-collaboration/document_info.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-net/event.pb.dart';
|
||||
import 'package:flowy_sdk/protobuf/flowy-net/network_state.pb.dart';
|
||||
|
@ -1,6 +1,6 @@
|
||||
///
|
||||
// Generated code. Do not modify.
|
||||
// source: doc.proto
|
||||
// source: document_info.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
|
@ -1,6 +1,6 @@
|
||||
///
|
||||
// Generated code. Do not modify.
|
||||
// source: app_create.proto
|
||||
// source: document_info.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
|
@ -1,6 +1,6 @@
|
||||
///
|
||||
// Generated code. Do not modify.
|
||||
// source: doc.proto
|
||||
// source: document_info.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
|
@ -0,0 +1,9 @@
|
||||
///
|
||||
// Generated code. Do not modify.
|
||||
// source: document_info.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
|
||||
|
||||
export 'document_info.pb.dart';
|
||||
|
@ -0,0 +1,101 @@
|
||||
///
|
||||
// Generated code. Do not modify.
|
||||
// source: folder_info.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
|
||||
|
||||
import 'dart:core' as $core;
|
||||
|
||||
import 'package:fixnum/fixnum.dart' as $fixnum;
|
||||
import 'package:protobuf/protobuf.dart' as $pb;
|
||||
|
||||
class FolderInfo extends $pb.GeneratedMessage {
|
||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'FolderInfo', createEmptyInstance: create)
|
||||
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'folderId')
|
||||
..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'text')
|
||||
..aInt64(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'revId')
|
||||
..aInt64(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'baseRevId')
|
||||
..hasRequiredFields = false
|
||||
;
|
||||
|
||||
FolderInfo._() : super();
|
||||
factory FolderInfo({
|
||||
$core.String? folderId,
|
||||
$core.String? text,
|
||||
$fixnum.Int64? revId,
|
||||
$fixnum.Int64? baseRevId,
|
||||
}) {
|
||||
final _result = create();
|
||||
if (folderId != null) {
|
||||
_result.folderId = folderId;
|
||||
}
|
||||
if (text != null) {
|
||||
_result.text = text;
|
||||
}
|
||||
if (revId != null) {
|
||||
_result.revId = revId;
|
||||
}
|
||||
if (baseRevId != null) {
|
||||
_result.baseRevId = baseRevId;
|
||||
}
|
||||
return _result;
|
||||
}
|
||||
factory FolderInfo.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
|
||||
factory FolderInfo.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
|
||||
@$core.Deprecated(
|
||||
'Using this can add significant overhead to your binary. '
|
||||
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
|
||||
'Will be removed in next major version')
|
||||
FolderInfo clone() => FolderInfo()..mergeFromMessage(this);
|
||||
@$core.Deprecated(
|
||||
'Using this can add significant overhead to your binary. '
|
||||
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
|
||||
'Will be removed in next major version')
|
||||
FolderInfo copyWith(void Function(FolderInfo) updates) => super.copyWith((message) => updates(message as FolderInfo)) as FolderInfo; // ignore: deprecated_member_use
|
||||
$pb.BuilderInfo get info_ => _i;
|
||||
@$core.pragma('dart2js:noInline')
|
||||
static FolderInfo create() => FolderInfo._();
|
||||
FolderInfo createEmptyInstance() => create();
|
||||
static $pb.PbList<FolderInfo> createRepeated() => $pb.PbList<FolderInfo>();
|
||||
@$core.pragma('dart2js:noInline')
|
||||
static FolderInfo getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<FolderInfo>(create);
|
||||
static FolderInfo? _defaultInstance;
|
||||
|
||||
@$pb.TagNumber(1)
|
||||
$core.String get folderId => $_getSZ(0);
|
||||
@$pb.TagNumber(1)
|
||||
set folderId($core.String v) { $_setString(0, v); }
|
||||
@$pb.TagNumber(1)
|
||||
$core.bool hasFolderId() => $_has(0);
|
||||
@$pb.TagNumber(1)
|
||||
void clearFolderId() => clearField(1);
|
||||
|
||||
@$pb.TagNumber(2)
|
||||
$core.String get text => $_getSZ(1);
|
||||
@$pb.TagNumber(2)
|
||||
set text($core.String v) { $_setString(1, v); }
|
||||
@$pb.TagNumber(2)
|
||||
$core.bool hasText() => $_has(1);
|
||||
@$pb.TagNumber(2)
|
||||
void clearText() => clearField(2);
|
||||
|
||||
@$pb.TagNumber(3)
|
||||
$fixnum.Int64 get revId => $_getI64(2);
|
||||
@$pb.TagNumber(3)
|
||||
set revId($fixnum.Int64 v) { $_setInt64(2, v); }
|
||||
@$pb.TagNumber(3)
|
||||
$core.bool hasRevId() => $_has(2);
|
||||
@$pb.TagNumber(3)
|
||||
void clearRevId() => clearField(3);
|
||||
|
||||
@$pb.TagNumber(4)
|
||||
$fixnum.Int64 get baseRevId => $_getI64(3);
|
||||
@$pb.TagNumber(4)
|
||||
set baseRevId($fixnum.Int64 v) { $_setInt64(3, v); }
|
||||
@$pb.TagNumber(4)
|
||||
$core.bool hasBaseRevId() => $_has(3);
|
||||
@$pb.TagNumber(4)
|
||||
void clearBaseRevId() => clearField(4);
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
///
|
||||
// Generated code. Do not modify.
|
||||
// source: app_update.proto
|
||||
// source: folder_info.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
|
@ -0,0 +1,23 @@
|
||||
///
|
||||
// Generated code. Do not modify.
|
||||
// source: folder_info.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
|
||||
|
||||
import 'dart:core' as $core;
|
||||
import 'dart:convert' as $convert;
|
||||
import 'dart:typed_data' as $typed_data;
|
||||
@$core.Deprecated('Use folderInfoDescriptor instead')
|
||||
const FolderInfo$json = const {
|
||||
'1': 'FolderInfo',
|
||||
'2': const [
|
||||
const {'1': 'folder_id', '3': 1, '4': 1, '5': 9, '10': 'folderId'},
|
||||
const {'1': 'text', '3': 2, '4': 1, '5': 9, '10': 'text'},
|
||||
const {'1': 'rev_id', '3': 3, '4': 1, '5': 3, '10': 'revId'},
|
||||
const {'1': 'base_rev_id', '3': 4, '4': 1, '5': 3, '10': 'baseRevId'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `FolderInfo`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List folderInfoDescriptor = $convert.base64Decode('CgpGb2xkZXJJbmZvEhsKCWZvbGRlcl9pZBgBIAEoCVIIZm9sZGVySWQSEgoEdGV4dBgCIAEoCVIEdGV4dBIVCgZyZXZfaWQYAyABKANSBXJldklkEh4KC2Jhc2VfcmV2X2lkGAQgASgDUgliYXNlUmV2SWQ=');
|
@ -1,9 +1,9 @@
|
||||
///
|
||||
// Generated code. Do not modify.
|
||||
// source: app_create.proto
|
||||
// source: folder_info.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
|
||||
|
||||
export 'app_create.pb.dart';
|
||||
export 'folder_info.pb.dart';
|
||||
|
@ -1,4 +1,5 @@
|
||||
// Auto-generated, do not edit
|
||||
export './ws.pb.dart';
|
||||
export './folder_info.pb.dart';
|
||||
export './ws_data.pb.dart';
|
||||
export './revision.pb.dart';
|
||||
export './doc.pb.dart';
|
||||
export './document_info.pb.dart';
|
||||
|
@ -20,7 +20,7 @@ class Revision extends $pb.GeneratedMessage {
|
||||
..aInt64(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'revId')
|
||||
..a<$core.List<$core.int>>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'deltaData', $pb.PbFieldType.OY)
|
||||
..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'md5')
|
||||
..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'docId')
|
||||
..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'objectId')
|
||||
..e<RevType>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ty', $pb.PbFieldType.OE, defaultOrMaker: RevType.DeprecatedLocal, valueOf: RevType.valueOf, enumValues: RevType.values)
|
||||
..aOS(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'userId')
|
||||
..hasRequiredFields = false
|
||||
@ -32,7 +32,7 @@ class Revision extends $pb.GeneratedMessage {
|
||||
$fixnum.Int64? revId,
|
||||
$core.List<$core.int>? deltaData,
|
||||
$core.String? md5,
|
||||
$core.String? docId,
|
||||
$core.String? objectId,
|
||||
RevType? ty,
|
||||
$core.String? userId,
|
||||
}) {
|
||||
@ -49,8 +49,8 @@ class Revision extends $pb.GeneratedMessage {
|
||||
if (md5 != null) {
|
||||
_result.md5 = md5;
|
||||
}
|
||||
if (docId != null) {
|
||||
_result.docId = docId;
|
||||
if (objectId != null) {
|
||||
_result.objectId = objectId;
|
||||
}
|
||||
if (ty != null) {
|
||||
_result.ty = ty;
|
||||
@ -118,13 +118,13 @@ class Revision extends $pb.GeneratedMessage {
|
||||
void clearMd5() => clearField(4);
|
||||
|
||||
@$pb.TagNumber(5)
|
||||
$core.String get docId => $_getSZ(4);
|
||||
$core.String get objectId => $_getSZ(4);
|
||||
@$pb.TagNumber(5)
|
||||
set docId($core.String v) { $_setString(4, v); }
|
||||
set objectId($core.String v) { $_setString(4, v); }
|
||||
@$pb.TagNumber(5)
|
||||
$core.bool hasDocId() => $_has(4);
|
||||
$core.bool hasObjectId() => $_has(4);
|
||||
@$pb.TagNumber(5)
|
||||
void clearDocId() => clearField(5);
|
||||
void clearObjectId() => clearField(5);
|
||||
|
||||
@$pb.TagNumber(6)
|
||||
RevType get ty => $_getN(5);
|
||||
@ -235,7 +235,7 @@ class RevId extends $pb.GeneratedMessage {
|
||||
|
||||
class RevisionRange extends $pb.GeneratedMessage {
|
||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RevisionRange', createEmptyInstance: create)
|
||||
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'docId')
|
||||
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'objectId')
|
||||
..aInt64(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'start')
|
||||
..aInt64(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'end')
|
||||
..hasRequiredFields = false
|
||||
@ -243,13 +243,13 @@ class RevisionRange extends $pb.GeneratedMessage {
|
||||
|
||||
RevisionRange._() : super();
|
||||
factory RevisionRange({
|
||||
$core.String? docId,
|
||||
$core.String? objectId,
|
||||
$fixnum.Int64? start,
|
||||
$fixnum.Int64? end,
|
||||
}) {
|
||||
final _result = create();
|
||||
if (docId != null) {
|
||||
_result.docId = docId;
|
||||
if (objectId != null) {
|
||||
_result.objectId = objectId;
|
||||
}
|
||||
if (start != null) {
|
||||
_result.start = start;
|
||||
@ -281,13 +281,13 @@ class RevisionRange extends $pb.GeneratedMessage {
|
||||
static RevisionRange? _defaultInstance;
|
||||
|
||||
@$pb.TagNumber(1)
|
||||
$core.String get docId => $_getSZ(0);
|
||||
$core.String get objectId => $_getSZ(0);
|
||||
@$pb.TagNumber(1)
|
||||
set docId($core.String v) { $_setString(0, v); }
|
||||
set objectId($core.String v) { $_setString(0, v); }
|
||||
@$pb.TagNumber(1)
|
||||
$core.bool hasDocId() => $_has(0);
|
||||
$core.bool hasObjectId() => $_has(0);
|
||||
@$pb.TagNumber(1)
|
||||
void clearDocId() => clearField(1);
|
||||
void clearObjectId() => clearField(1);
|
||||
|
||||
@$pb.TagNumber(2)
|
||||
$fixnum.Int64 get start => $_getI64(1);
|
||||
|
@ -10,11 +10,11 @@ import 'dart:core' as $core;
|
||||
import 'package:protobuf/protobuf.dart' as $pb;
|
||||
|
||||
class RevisionState extends $pb.ProtobufEnum {
|
||||
static const RevisionState Local = RevisionState._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Local');
|
||||
static const RevisionState Sync = RevisionState._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Sync');
|
||||
static const RevisionState Ack = RevisionState._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Ack');
|
||||
|
||||
static const $core.List<RevisionState> values = <RevisionState> [
|
||||
Local,
|
||||
Sync,
|
||||
Ack,
|
||||
];
|
||||
|
||||
|
@ -12,13 +12,13 @@ import 'dart:typed_data' as $typed_data;
|
||||
const RevisionState$json = const {
|
||||
'1': 'RevisionState',
|
||||
'2': const [
|
||||
const {'1': 'Local', '2': 0},
|
||||
const {'1': 'Sync', '2': 0},
|
||||
const {'1': 'Ack', '2': 1},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `RevisionState`. Decode as a `google.protobuf.EnumDescriptorProto`.
|
||||
final $typed_data.Uint8List revisionStateDescriptor = $convert.base64Decode('Cg1SZXZpc2lvblN0YXRlEgkKBUxvY2FsEAASBwoDQWNrEAE=');
|
||||
final $typed_data.Uint8List revisionStateDescriptor = $convert.base64Decode('Cg1SZXZpc2lvblN0YXRlEggKBFN5bmMQABIHCgNBY2sQAQ==');
|
||||
@$core.Deprecated('Use revTypeDescriptor instead')
|
||||
const RevType$json = const {
|
||||
'1': 'RevType',
|
||||
@ -38,14 +38,14 @@ const Revision$json = const {
|
||||
const {'1': 'rev_id', '3': 2, '4': 1, '5': 3, '10': 'revId'},
|
||||
const {'1': 'delta_data', '3': 3, '4': 1, '5': 12, '10': 'deltaData'},
|
||||
const {'1': 'md5', '3': 4, '4': 1, '5': 9, '10': 'md5'},
|
||||
const {'1': 'doc_id', '3': 5, '4': 1, '5': 9, '10': 'docId'},
|
||||
const {'1': 'object_id', '3': 5, '4': 1, '5': 9, '10': 'objectId'},
|
||||
const {'1': 'ty', '3': 6, '4': 1, '5': 14, '6': '.RevType', '10': 'ty'},
|
||||
const {'1': 'user_id', '3': 7, '4': 1, '5': 9, '10': 'userId'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `Revision`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List revisionDescriptor = $convert.base64Decode('CghSZXZpc2lvbhIeCgtiYXNlX3Jldl9pZBgBIAEoA1IJYmFzZVJldklkEhUKBnJldl9pZBgCIAEoA1IFcmV2SWQSHQoKZGVsdGFfZGF0YRgDIAEoDFIJZGVsdGFEYXRhEhAKA21kNRgEIAEoCVIDbWQ1EhUKBmRvY19pZBgFIAEoCVIFZG9jSWQSGAoCdHkYBiABKA4yCC5SZXZUeXBlUgJ0eRIXCgd1c2VyX2lkGAcgASgJUgZ1c2VySWQ=');
|
||||
final $typed_data.Uint8List revisionDescriptor = $convert.base64Decode('CghSZXZpc2lvbhIeCgtiYXNlX3Jldl9pZBgBIAEoA1IJYmFzZVJldklkEhUKBnJldl9pZBgCIAEoA1IFcmV2SWQSHQoKZGVsdGFfZGF0YRgDIAEoDFIJZGVsdGFEYXRhEhAKA21kNRgEIAEoCVIDbWQ1EhsKCW9iamVjdF9pZBgFIAEoCVIIb2JqZWN0SWQSGAoCdHkYBiABKA4yCC5SZXZUeXBlUgJ0eRIXCgd1c2VyX2lkGAcgASgJUgZ1c2VySWQ=');
|
||||
@$core.Deprecated('Use repeatedRevisionDescriptor instead')
|
||||
const RepeatedRevision$json = const {
|
||||
'1': 'RepeatedRevision',
|
||||
@ -70,11 +70,11 @@ final $typed_data.Uint8List revIdDescriptor = $convert.base64Decode('CgVSZXZJZBI
|
||||
const RevisionRange$json = const {
|
||||
'1': 'RevisionRange',
|
||||
'2': const [
|
||||
const {'1': 'doc_id', '3': 1, '4': 1, '5': 9, '10': 'docId'},
|
||||
const {'1': 'object_id', '3': 1, '4': 1, '5': 9, '10': 'objectId'},
|
||||
const {'1': 'start', '3': 2, '4': 1, '5': 3, '10': 'start'},
|
||||
const {'1': 'end', '3': 3, '4': 1, '5': 3, '10': 'end'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `RevisionRange`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List revisionRangeDescriptor = $convert.base64Decode('Cg1SZXZpc2lvblJhbmdlEhUKBmRvY19pZBgBIAEoCVIFZG9jSWQSFAoFc3RhcnQYAiABKANSBXN0YXJ0EhAKA2VuZBgDIAEoA1IDZW5k');
|
||||
final $typed_data.Uint8List revisionRangeDescriptor = $convert.base64Decode('Cg1SZXZpc2lvblJhbmdlEhsKCW9iamVjdF9pZBgBIAEoCVIIb2JqZWN0SWQSFAoFc3RhcnQYAiABKANSBXN0YXJ0EhAKA2VuZBgDIAEoA1IDZW5k');
|
||||
|
@ -1,45 +0,0 @@
|
||||
///
|
||||
// Generated code. Do not modify.
|
||||
// source: ws.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
|
||||
|
||||
// ignore_for_file: UNDEFINED_SHOWN_NAME
|
||||
import 'dart:core' as $core;
|
||||
import 'package:protobuf/protobuf.dart' as $pb;
|
||||
|
||||
class DocumentClientWSDataType extends $pb.ProtobufEnum {
|
||||
static const DocumentClientWSDataType ClientPushRev = DocumentClientWSDataType._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ClientPushRev');
|
||||
static const DocumentClientWSDataType ClientPing = DocumentClientWSDataType._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ClientPing');
|
||||
|
||||
static const $core.List<DocumentClientWSDataType> values = <DocumentClientWSDataType> [
|
||||
ClientPushRev,
|
||||
ClientPing,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, DocumentClientWSDataType> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static DocumentClientWSDataType? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const DocumentClientWSDataType._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class DocumentServerWSDataType extends $pb.ProtobufEnum {
|
||||
static const DocumentServerWSDataType ServerAck = DocumentServerWSDataType._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ServerAck');
|
||||
static const DocumentServerWSDataType ServerPushRev = DocumentServerWSDataType._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ServerPushRev');
|
||||
static const DocumentServerWSDataType ServerPullRev = DocumentServerWSDataType._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ServerPullRev');
|
||||
static const DocumentServerWSDataType UserConnect = DocumentServerWSDataType._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserConnect');
|
||||
|
||||
static const $core.List<DocumentServerWSDataType> values = <DocumentServerWSDataType> [
|
||||
ServerAck,
|
||||
ServerPushRev,
|
||||
ServerPullRev,
|
||||
UserConnect,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, DocumentServerWSDataType> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static DocumentServerWSDataType? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const DocumentServerWSDataType._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
@ -1,71 +0,0 @@
|
||||
///
|
||||
// Generated code. Do not modify.
|
||||
// source: ws.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
|
||||
|
||||
import 'dart:core' as $core;
|
||||
import 'dart:convert' as $convert;
|
||||
import 'dart:typed_data' as $typed_data;
|
||||
@$core.Deprecated('Use documentClientWSDataTypeDescriptor instead')
|
||||
const DocumentClientWSDataType$json = const {
|
||||
'1': 'DocumentClientWSDataType',
|
||||
'2': const [
|
||||
const {'1': 'ClientPushRev', '2': 0},
|
||||
const {'1': 'ClientPing', '2': 1},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `DocumentClientWSDataType`. Decode as a `google.protobuf.EnumDescriptorProto`.
|
||||
final $typed_data.Uint8List documentClientWSDataTypeDescriptor = $convert.base64Decode('ChhEb2N1bWVudENsaWVudFdTRGF0YVR5cGUSEQoNQ2xpZW50UHVzaFJldhAAEg4KCkNsaWVudFBpbmcQAQ==');
|
||||
@$core.Deprecated('Use documentServerWSDataTypeDescriptor instead')
|
||||
const DocumentServerWSDataType$json = const {
|
||||
'1': 'DocumentServerWSDataType',
|
||||
'2': const [
|
||||
const {'1': 'ServerAck', '2': 0},
|
||||
const {'1': 'ServerPushRev', '2': 1},
|
||||
const {'1': 'ServerPullRev', '2': 2},
|
||||
const {'1': 'UserConnect', '2': 3},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `DocumentServerWSDataType`. Decode as a `google.protobuf.EnumDescriptorProto`.
|
||||
final $typed_data.Uint8List documentServerWSDataTypeDescriptor = $convert.base64Decode('ChhEb2N1bWVudFNlcnZlcldTRGF0YVR5cGUSDQoJU2VydmVyQWNrEAASEQoNU2VydmVyUHVzaFJldhABEhEKDVNlcnZlclB1bGxSZXYQAhIPCgtVc2VyQ29ubmVjdBAD');
|
||||
@$core.Deprecated('Use documentClientWSDataDescriptor instead')
|
||||
const DocumentClientWSData$json = const {
|
||||
'1': 'DocumentClientWSData',
|
||||
'2': const [
|
||||
const {'1': 'doc_id', '3': 1, '4': 1, '5': 9, '10': 'docId'},
|
||||
const {'1': 'ty', '3': 2, '4': 1, '5': 14, '6': '.DocumentClientWSDataType', '10': 'ty'},
|
||||
const {'1': 'revisions', '3': 3, '4': 1, '5': 11, '6': '.RepeatedRevision', '10': 'revisions'},
|
||||
const {'1': 'id', '3': 4, '4': 1, '5': 9, '10': 'id'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `DocumentClientWSData`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List documentClientWSDataDescriptor = $convert.base64Decode('ChREb2N1bWVudENsaWVudFdTRGF0YRIVCgZkb2NfaWQYASABKAlSBWRvY0lkEikKAnR5GAIgASgOMhkuRG9jdW1lbnRDbGllbnRXU0RhdGFUeXBlUgJ0eRIvCglyZXZpc2lvbnMYAyABKAsyES5SZXBlYXRlZFJldmlzaW9uUglyZXZpc2lvbnMSDgoCaWQYBCABKAlSAmlk');
|
||||
@$core.Deprecated('Use documentServerWSDataDescriptor instead')
|
||||
const DocumentServerWSData$json = const {
|
||||
'1': 'DocumentServerWSData',
|
||||
'2': const [
|
||||
const {'1': 'doc_id', '3': 1, '4': 1, '5': 9, '10': 'docId'},
|
||||
const {'1': 'ty', '3': 2, '4': 1, '5': 14, '6': '.DocumentServerWSDataType', '10': 'ty'},
|
||||
const {'1': 'data', '3': 3, '4': 1, '5': 12, '10': 'data'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `DocumentServerWSData`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List documentServerWSDataDescriptor = $convert.base64Decode('ChREb2N1bWVudFNlcnZlcldTRGF0YRIVCgZkb2NfaWQYASABKAlSBWRvY0lkEikKAnR5GAIgASgOMhkuRG9jdW1lbnRTZXJ2ZXJXU0RhdGFUeXBlUgJ0eRISCgRkYXRhGAMgASgMUgRkYXRh');
|
||||
@$core.Deprecated('Use newDocumentUserDescriptor instead')
|
||||
const NewDocumentUser$json = const {
|
||||
'1': 'NewDocumentUser',
|
||||
'2': const [
|
||||
const {'1': 'user_id', '3': 1, '4': 1, '5': 9, '10': 'userId'},
|
||||
const {'1': 'doc_id', '3': 2, '4': 1, '5': 9, '10': 'docId'},
|
||||
const {'1': 'revision_data', '3': 3, '4': 1, '5': 12, '10': 'revisionData'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `NewDocumentUser`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List newDocumentUserDescriptor = $convert.base64Decode('Cg9OZXdEb2N1bWVudFVzZXISFwoHdXNlcl9pZBgBIAEoCVIGdXNlcklkEhUKBmRvY19pZBgCIAEoCVIFZG9jSWQSIwoNcmV2aXNpb25fZGF0YRgDIAEoDFIMcmV2aXNpb25EYXRh');
|
@ -1,6 +1,6 @@
|
||||
///
|
||||
// Generated code. Do not modify.
|
||||
// source: ws.proto
|
||||
// source: ws_data.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
|
||||
@ -11,29 +11,29 @@ import 'package:protobuf/protobuf.dart' as $pb;
|
||||
|
||||
import 'revision.pb.dart' as $0;
|
||||
|
||||
import 'ws.pbenum.dart';
|
||||
import 'ws_data.pbenum.dart';
|
||||
|
||||
export 'ws.pbenum.dart';
|
||||
export 'ws_data.pbenum.dart';
|
||||
|
||||
class DocumentClientWSData extends $pb.GeneratedMessage {
|
||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DocumentClientWSData', createEmptyInstance: create)
|
||||
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'docId')
|
||||
..e<DocumentClientWSDataType>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ty', $pb.PbFieldType.OE, defaultOrMaker: DocumentClientWSDataType.ClientPushRev, valueOf: DocumentClientWSDataType.valueOf, enumValues: DocumentClientWSDataType.values)
|
||||
class ClientRevisionWSData extends $pb.GeneratedMessage {
|
||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ClientRevisionWSData', createEmptyInstance: create)
|
||||
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'objectId')
|
||||
..e<ClientRevisionWSDataType>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ty', $pb.PbFieldType.OE, defaultOrMaker: ClientRevisionWSDataType.ClientPushRev, valueOf: ClientRevisionWSDataType.valueOf, enumValues: ClientRevisionWSDataType.values)
|
||||
..aOM<$0.RepeatedRevision>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'revisions', subBuilder: $0.RepeatedRevision.create)
|
||||
..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id')
|
||||
..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'dataId')
|
||||
..hasRequiredFields = false
|
||||
;
|
||||
|
||||
DocumentClientWSData._() : super();
|
||||
factory DocumentClientWSData({
|
||||
$core.String? docId,
|
||||
DocumentClientWSDataType? ty,
|
||||
ClientRevisionWSData._() : super();
|
||||
factory ClientRevisionWSData({
|
||||
$core.String? objectId,
|
||||
ClientRevisionWSDataType? ty,
|
||||
$0.RepeatedRevision? revisions,
|
||||
$core.String? id,
|
||||
$core.String? dataId,
|
||||
}) {
|
||||
final _result = create();
|
||||
if (docId != null) {
|
||||
_result.docId = docId;
|
||||
if (objectId != null) {
|
||||
_result.objectId = objectId;
|
||||
}
|
||||
if (ty != null) {
|
||||
_result.ty = ty;
|
||||
@ -41,45 +41,45 @@ class DocumentClientWSData extends $pb.GeneratedMessage {
|
||||
if (revisions != null) {
|
||||
_result.revisions = revisions;
|
||||
}
|
||||
if (id != null) {
|
||||
_result.id = id;
|
||||
if (dataId != null) {
|
||||
_result.dataId = dataId;
|
||||
}
|
||||
return _result;
|
||||
}
|
||||
factory DocumentClientWSData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
|
||||
factory DocumentClientWSData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
|
||||
factory ClientRevisionWSData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
|
||||
factory ClientRevisionWSData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
|
||||
@$core.Deprecated(
|
||||
'Using this can add significant overhead to your binary. '
|
||||
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
|
||||
'Will be removed in next major version')
|
||||
DocumentClientWSData clone() => DocumentClientWSData()..mergeFromMessage(this);
|
||||
ClientRevisionWSData clone() => ClientRevisionWSData()..mergeFromMessage(this);
|
||||
@$core.Deprecated(
|
||||
'Using this can add significant overhead to your binary. '
|
||||
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
|
||||
'Will be removed in next major version')
|
||||
DocumentClientWSData copyWith(void Function(DocumentClientWSData) updates) => super.copyWith((message) => updates(message as DocumentClientWSData)) as DocumentClientWSData; // ignore: deprecated_member_use
|
||||
ClientRevisionWSData copyWith(void Function(ClientRevisionWSData) updates) => super.copyWith((message) => updates(message as ClientRevisionWSData)) as ClientRevisionWSData; // ignore: deprecated_member_use
|
||||
$pb.BuilderInfo get info_ => _i;
|
||||
@$core.pragma('dart2js:noInline')
|
||||
static DocumentClientWSData create() => DocumentClientWSData._();
|
||||
DocumentClientWSData createEmptyInstance() => create();
|
||||
static $pb.PbList<DocumentClientWSData> createRepeated() => $pb.PbList<DocumentClientWSData>();
|
||||
static ClientRevisionWSData create() => ClientRevisionWSData._();
|
||||
ClientRevisionWSData createEmptyInstance() => create();
|
||||
static $pb.PbList<ClientRevisionWSData> createRepeated() => $pb.PbList<ClientRevisionWSData>();
|
||||
@$core.pragma('dart2js:noInline')
|
||||
static DocumentClientWSData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DocumentClientWSData>(create);
|
||||
static DocumentClientWSData? _defaultInstance;
|
||||
static ClientRevisionWSData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ClientRevisionWSData>(create);
|
||||
static ClientRevisionWSData? _defaultInstance;
|
||||
|
||||
@$pb.TagNumber(1)
|
||||
$core.String get docId => $_getSZ(0);
|
||||
$core.String get objectId => $_getSZ(0);
|
||||
@$pb.TagNumber(1)
|
||||
set docId($core.String v) { $_setString(0, v); }
|
||||
set objectId($core.String v) { $_setString(0, v); }
|
||||
@$pb.TagNumber(1)
|
||||
$core.bool hasDocId() => $_has(0);
|
||||
$core.bool hasObjectId() => $_has(0);
|
||||
@$pb.TagNumber(1)
|
||||
void clearDocId() => clearField(1);
|
||||
void clearObjectId() => clearField(1);
|
||||
|
||||
@$pb.TagNumber(2)
|
||||
DocumentClientWSDataType get ty => $_getN(1);
|
||||
ClientRevisionWSDataType get ty => $_getN(1);
|
||||
@$pb.TagNumber(2)
|
||||
set ty(DocumentClientWSDataType v) { setField(2, v); }
|
||||
set ty(ClientRevisionWSDataType v) { setField(2, v); }
|
||||
@$pb.TagNumber(2)
|
||||
$core.bool hasTy() => $_has(1);
|
||||
@$pb.TagNumber(2)
|
||||
@ -97,32 +97,32 @@ class DocumentClientWSData extends $pb.GeneratedMessage {
|
||||
$0.RepeatedRevision ensureRevisions() => $_ensure(2);
|
||||
|
||||
@$pb.TagNumber(4)
|
||||
$core.String get id => $_getSZ(3);
|
||||
$core.String get dataId => $_getSZ(3);
|
||||
@$pb.TagNumber(4)
|
||||
set id($core.String v) { $_setString(3, v); }
|
||||
set dataId($core.String v) { $_setString(3, v); }
|
||||
@$pb.TagNumber(4)
|
||||
$core.bool hasId() => $_has(3);
|
||||
$core.bool hasDataId() => $_has(3);
|
||||
@$pb.TagNumber(4)
|
||||
void clearId() => clearField(4);
|
||||
void clearDataId() => clearField(4);
|
||||
}
|
||||
|
||||
class DocumentServerWSData extends $pb.GeneratedMessage {
|
||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DocumentServerWSData', createEmptyInstance: create)
|
||||
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'docId')
|
||||
..e<DocumentServerWSDataType>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ty', $pb.PbFieldType.OE, defaultOrMaker: DocumentServerWSDataType.ServerAck, valueOf: DocumentServerWSDataType.valueOf, enumValues: DocumentServerWSDataType.values)
|
||||
class ServerRevisionWSData extends $pb.GeneratedMessage {
|
||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ServerRevisionWSData', createEmptyInstance: create)
|
||||
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'objectId')
|
||||
..e<ServerRevisionWSDataType>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ty', $pb.PbFieldType.OE, defaultOrMaker: ServerRevisionWSDataType.ServerAck, valueOf: ServerRevisionWSDataType.valueOf, enumValues: ServerRevisionWSDataType.values)
|
||||
..a<$core.List<$core.int>>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'data', $pb.PbFieldType.OY)
|
||||
..hasRequiredFields = false
|
||||
;
|
||||
|
||||
DocumentServerWSData._() : super();
|
||||
factory DocumentServerWSData({
|
||||
$core.String? docId,
|
||||
DocumentServerWSDataType? ty,
|
||||
ServerRevisionWSData._() : super();
|
||||
factory ServerRevisionWSData({
|
||||
$core.String? objectId,
|
||||
ServerRevisionWSDataType? ty,
|
||||
$core.List<$core.int>? data,
|
||||
}) {
|
||||
final _result = create();
|
||||
if (docId != null) {
|
||||
_result.docId = docId;
|
||||
if (objectId != null) {
|
||||
_result.objectId = objectId;
|
||||
}
|
||||
if (ty != null) {
|
||||
_result.ty = ty;
|
||||
@ -132,40 +132,40 @@ class DocumentServerWSData extends $pb.GeneratedMessage {
|
||||
}
|
||||
return _result;
|
||||
}
|
||||
factory DocumentServerWSData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
|
||||
factory DocumentServerWSData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
|
||||
factory ServerRevisionWSData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
|
||||
factory ServerRevisionWSData.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
|
||||
@$core.Deprecated(
|
||||
'Using this can add significant overhead to your binary. '
|
||||
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
|
||||
'Will be removed in next major version')
|
||||
DocumentServerWSData clone() => DocumentServerWSData()..mergeFromMessage(this);
|
||||
ServerRevisionWSData clone() => ServerRevisionWSData()..mergeFromMessage(this);
|
||||
@$core.Deprecated(
|
||||
'Using this can add significant overhead to your binary. '
|
||||
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
|
||||
'Will be removed in next major version')
|
||||
DocumentServerWSData copyWith(void Function(DocumentServerWSData) updates) => super.copyWith((message) => updates(message as DocumentServerWSData)) as DocumentServerWSData; // ignore: deprecated_member_use
|
||||
ServerRevisionWSData copyWith(void Function(ServerRevisionWSData) updates) => super.copyWith((message) => updates(message as ServerRevisionWSData)) as ServerRevisionWSData; // ignore: deprecated_member_use
|
||||
$pb.BuilderInfo get info_ => _i;
|
||||
@$core.pragma('dart2js:noInline')
|
||||
static DocumentServerWSData create() => DocumentServerWSData._();
|
||||
DocumentServerWSData createEmptyInstance() => create();
|
||||
static $pb.PbList<DocumentServerWSData> createRepeated() => $pb.PbList<DocumentServerWSData>();
|
||||
static ServerRevisionWSData create() => ServerRevisionWSData._();
|
||||
ServerRevisionWSData createEmptyInstance() => create();
|
||||
static $pb.PbList<ServerRevisionWSData> createRepeated() => $pb.PbList<ServerRevisionWSData>();
|
||||
@$core.pragma('dart2js:noInline')
|
||||
static DocumentServerWSData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DocumentServerWSData>(create);
|
||||
static DocumentServerWSData? _defaultInstance;
|
||||
static ServerRevisionWSData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ServerRevisionWSData>(create);
|
||||
static ServerRevisionWSData? _defaultInstance;
|
||||
|
||||
@$pb.TagNumber(1)
|
||||
$core.String get docId => $_getSZ(0);
|
||||
$core.String get objectId => $_getSZ(0);
|
||||
@$pb.TagNumber(1)
|
||||
set docId($core.String v) { $_setString(0, v); }
|
||||
set objectId($core.String v) { $_setString(0, v); }
|
||||
@$pb.TagNumber(1)
|
||||
$core.bool hasDocId() => $_has(0);
|
||||
$core.bool hasObjectId() => $_has(0);
|
||||
@$pb.TagNumber(1)
|
||||
void clearDocId() => clearField(1);
|
||||
void clearObjectId() => clearField(1);
|
||||
|
||||
@$pb.TagNumber(2)
|
||||
DocumentServerWSDataType get ty => $_getN(1);
|
||||
ServerRevisionWSDataType get ty => $_getN(1);
|
||||
@$pb.TagNumber(2)
|
||||
set ty(DocumentServerWSDataType v) { setField(2, v); }
|
||||
set ty(ServerRevisionWSDataType v) { setField(2, v); }
|
||||
@$pb.TagNumber(2)
|
||||
$core.bool hasTy() => $_has(1);
|
||||
@$pb.TagNumber(2)
|
@ -0,0 +1,45 @@
|
||||
///
|
||||
// Generated code. Do not modify.
|
||||
// source: ws_data.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
|
||||
|
||||
// ignore_for_file: UNDEFINED_SHOWN_NAME
|
||||
import 'dart:core' as $core;
|
||||
import 'package:protobuf/protobuf.dart' as $pb;
|
||||
|
||||
class ClientRevisionWSDataType extends $pb.ProtobufEnum {
|
||||
static const ClientRevisionWSDataType ClientPushRev = ClientRevisionWSDataType._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ClientPushRev');
|
||||
static const ClientRevisionWSDataType ClientPing = ClientRevisionWSDataType._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ClientPing');
|
||||
|
||||
static const $core.List<ClientRevisionWSDataType> values = <ClientRevisionWSDataType> [
|
||||
ClientPushRev,
|
||||
ClientPing,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, ClientRevisionWSDataType> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static ClientRevisionWSDataType? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const ClientRevisionWSDataType._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
||||
class ServerRevisionWSDataType extends $pb.ProtobufEnum {
|
||||
static const ServerRevisionWSDataType ServerAck = ServerRevisionWSDataType._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ServerAck');
|
||||
static const ServerRevisionWSDataType ServerPushRev = ServerRevisionWSDataType._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ServerPushRev');
|
||||
static const ServerRevisionWSDataType ServerPullRev = ServerRevisionWSDataType._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ServerPullRev');
|
||||
static const ServerRevisionWSDataType UserConnect = ServerRevisionWSDataType._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UserConnect');
|
||||
|
||||
static const $core.List<ServerRevisionWSDataType> values = <ServerRevisionWSDataType> [
|
||||
ServerAck,
|
||||
ServerPushRev,
|
||||
ServerPullRev,
|
||||
UserConnect,
|
||||
];
|
||||
|
||||
static final $core.Map<$core.int, ServerRevisionWSDataType> _byValue = $pb.ProtobufEnum.initByValue(values);
|
||||
static ServerRevisionWSDataType? valueOf($core.int value) => _byValue[value];
|
||||
|
||||
const ServerRevisionWSDataType._($core.int v, $core.String n) : super(v, n);
|
||||
}
|
||||
|
@ -0,0 +1,71 @@
|
||||
///
|
||||
// Generated code. Do not modify.
|
||||
// source: ws_data.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
|
||||
|
||||
import 'dart:core' as $core;
|
||||
import 'dart:convert' as $convert;
|
||||
import 'dart:typed_data' as $typed_data;
|
||||
@$core.Deprecated('Use clientRevisionWSDataTypeDescriptor instead')
|
||||
const ClientRevisionWSDataType$json = const {
|
||||
'1': 'ClientRevisionWSDataType',
|
||||
'2': const [
|
||||
const {'1': 'ClientPushRev', '2': 0},
|
||||
const {'1': 'ClientPing', '2': 1},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `ClientRevisionWSDataType`. Decode as a `google.protobuf.EnumDescriptorProto`.
|
||||
final $typed_data.Uint8List clientRevisionWSDataTypeDescriptor = $convert.base64Decode('ChhDbGllbnRSZXZpc2lvbldTRGF0YVR5cGUSEQoNQ2xpZW50UHVzaFJldhAAEg4KCkNsaWVudFBpbmcQAQ==');
|
||||
@$core.Deprecated('Use serverRevisionWSDataTypeDescriptor instead')
|
||||
const ServerRevisionWSDataType$json = const {
|
||||
'1': 'ServerRevisionWSDataType',
|
||||
'2': const [
|
||||
const {'1': 'ServerAck', '2': 0},
|
||||
const {'1': 'ServerPushRev', '2': 1},
|
||||
const {'1': 'ServerPullRev', '2': 2},
|
||||
const {'1': 'UserConnect', '2': 3},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `ServerRevisionWSDataType`. Decode as a `google.protobuf.EnumDescriptorProto`.
|
||||
final $typed_data.Uint8List serverRevisionWSDataTypeDescriptor = $convert.base64Decode('ChhTZXJ2ZXJSZXZpc2lvbldTRGF0YVR5cGUSDQoJU2VydmVyQWNrEAASEQoNU2VydmVyUHVzaFJldhABEhEKDVNlcnZlclB1bGxSZXYQAhIPCgtVc2VyQ29ubmVjdBAD');
|
||||
@$core.Deprecated('Use clientRevisionWSDataDescriptor instead')
|
||||
const ClientRevisionWSData$json = const {
|
||||
'1': 'ClientRevisionWSData',
|
||||
'2': const [
|
||||
const {'1': 'object_id', '3': 1, '4': 1, '5': 9, '10': 'objectId'},
|
||||
const {'1': 'ty', '3': 2, '4': 1, '5': 14, '6': '.ClientRevisionWSDataType', '10': 'ty'},
|
||||
const {'1': 'revisions', '3': 3, '4': 1, '5': 11, '6': '.RepeatedRevision', '10': 'revisions'},
|
||||
const {'1': 'data_id', '3': 4, '4': 1, '5': 9, '10': 'dataId'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `ClientRevisionWSData`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List clientRevisionWSDataDescriptor = $convert.base64Decode('ChRDbGllbnRSZXZpc2lvbldTRGF0YRIbCglvYmplY3RfaWQYASABKAlSCG9iamVjdElkEikKAnR5GAIgASgOMhkuQ2xpZW50UmV2aXNpb25XU0RhdGFUeXBlUgJ0eRIvCglyZXZpc2lvbnMYAyABKAsyES5SZXBlYXRlZFJldmlzaW9uUglyZXZpc2lvbnMSFwoHZGF0YV9pZBgEIAEoCVIGZGF0YUlk');
|
||||
@$core.Deprecated('Use serverRevisionWSDataDescriptor instead')
|
||||
const ServerRevisionWSData$json = const {
|
||||
'1': 'ServerRevisionWSData',
|
||||
'2': const [
|
||||
const {'1': 'object_id', '3': 1, '4': 1, '5': 9, '10': 'objectId'},
|
||||
const {'1': 'ty', '3': 2, '4': 1, '5': 14, '6': '.ServerRevisionWSDataType', '10': 'ty'},
|
||||
const {'1': 'data', '3': 3, '4': 1, '5': 12, '10': 'data'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `ServerRevisionWSData`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List serverRevisionWSDataDescriptor = $convert.base64Decode('ChRTZXJ2ZXJSZXZpc2lvbldTRGF0YRIbCglvYmplY3RfaWQYASABKAlSCG9iamVjdElkEikKAnR5GAIgASgOMhkuU2VydmVyUmV2aXNpb25XU0RhdGFUeXBlUgJ0eRISCgRkYXRhGAMgASgMUgRkYXRh');
|
||||
@$core.Deprecated('Use newDocumentUserDescriptor instead')
|
||||
const NewDocumentUser$json = const {
|
||||
'1': 'NewDocumentUser',
|
||||
'2': const [
|
||||
const {'1': 'user_id', '3': 1, '4': 1, '5': 9, '10': 'userId'},
|
||||
const {'1': 'doc_id', '3': 2, '4': 1, '5': 9, '10': 'docId'},
|
||||
const {'1': 'revision_data', '3': 3, '4': 1, '5': 12, '10': 'revisionData'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `NewDocumentUser`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List newDocumentUserDescriptor = $convert.base64Decode('Cg9OZXdEb2N1bWVudFVzZXISFwoHdXNlcl9pZBgBIAEoCVIGdXNlcklkEhUKBmRvY19pZBgCIAEoCVIFZG9jSWQSIwoNcmV2aXNpb25fZGF0YRgDIAEoDFIMcmV2aXNpb25EYXRh');
|
@ -1,9 +1,9 @@
|
||||
///
|
||||
// Generated code. Do not modify.
|
||||
// source: app_query.proto
|
||||
// source: ws_data.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
|
||||
|
||||
export 'app_query.pb.dart';
|
||||
export 'ws_data.pb.dart';
|
||||
|
@ -1,6 +1,6 @@
|
||||
///
|
||||
// Generated code. Do not modify.
|
||||
// source: app_create.proto
|
||||
// source: app.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
|
||||
@ -10,7 +10,195 @@ import 'dart:core' as $core;
|
||||
import 'package:fixnum/fixnum.dart' as $fixnum;
|
||||
import 'package:protobuf/protobuf.dart' as $pb;
|
||||
|
||||
import 'view_create.pb.dart' as $0;
|
||||
import 'view.pb.dart' as $0;
|
||||
|
||||
class App extends $pb.GeneratedMessage {
|
||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'App', createEmptyInstance: create)
|
||||
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id')
|
||||
..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'workspaceId')
|
||||
..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
|
||||
..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc')
|
||||
..aOM<$0.RepeatedView>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'belongings', subBuilder: $0.RepeatedView.create)
|
||||
..aInt64(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'version')
|
||||
..aInt64(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'modifiedTime')
|
||||
..aInt64(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'createTime')
|
||||
..hasRequiredFields = false
|
||||
;
|
||||
|
||||
App._() : super();
|
||||
factory App({
|
||||
$core.String? id,
|
||||
$core.String? workspaceId,
|
||||
$core.String? name,
|
||||
$core.String? desc,
|
||||
$0.RepeatedView? belongings,
|
||||
$fixnum.Int64? version,
|
||||
$fixnum.Int64? modifiedTime,
|
||||
$fixnum.Int64? createTime,
|
||||
}) {
|
||||
final _result = create();
|
||||
if (id != null) {
|
||||
_result.id = id;
|
||||
}
|
||||
if (workspaceId != null) {
|
||||
_result.workspaceId = workspaceId;
|
||||
}
|
||||
if (name != null) {
|
||||
_result.name = name;
|
||||
}
|
||||
if (desc != null) {
|
||||
_result.desc = desc;
|
||||
}
|
||||
if (belongings != null) {
|
||||
_result.belongings = belongings;
|
||||
}
|
||||
if (version != null) {
|
||||
_result.version = version;
|
||||
}
|
||||
if (modifiedTime != null) {
|
||||
_result.modifiedTime = modifiedTime;
|
||||
}
|
||||
if (createTime != null) {
|
||||
_result.createTime = createTime;
|
||||
}
|
||||
return _result;
|
||||
}
|
||||
factory App.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
|
||||
factory App.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
|
||||
@$core.Deprecated(
|
||||
'Using this can add significant overhead to your binary. '
|
||||
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
|
||||
'Will be removed in next major version')
|
||||
App clone() => App()..mergeFromMessage(this);
|
||||
@$core.Deprecated(
|
||||
'Using this can add significant overhead to your binary. '
|
||||
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
|
||||
'Will be removed in next major version')
|
||||
App copyWith(void Function(App) updates) => super.copyWith((message) => updates(message as App)) as App; // ignore: deprecated_member_use
|
||||
$pb.BuilderInfo get info_ => _i;
|
||||
@$core.pragma('dart2js:noInline')
|
||||
static App create() => App._();
|
||||
App createEmptyInstance() => create();
|
||||
static $pb.PbList<App> createRepeated() => $pb.PbList<App>();
|
||||
@$core.pragma('dart2js:noInline')
|
||||
static App getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<App>(create);
|
||||
static App? _defaultInstance;
|
||||
|
||||
@$pb.TagNumber(1)
|
||||
$core.String get id => $_getSZ(0);
|
||||
@$pb.TagNumber(1)
|
||||
set id($core.String v) { $_setString(0, v); }
|
||||
@$pb.TagNumber(1)
|
||||
$core.bool hasId() => $_has(0);
|
||||
@$pb.TagNumber(1)
|
||||
void clearId() => clearField(1);
|
||||
|
||||
@$pb.TagNumber(2)
|
||||
$core.String get workspaceId => $_getSZ(1);
|
||||
@$pb.TagNumber(2)
|
||||
set workspaceId($core.String v) { $_setString(1, v); }
|
||||
@$pb.TagNumber(2)
|
||||
$core.bool hasWorkspaceId() => $_has(1);
|
||||
@$pb.TagNumber(2)
|
||||
void clearWorkspaceId() => clearField(2);
|
||||
|
||||
@$pb.TagNumber(3)
|
||||
$core.String get name => $_getSZ(2);
|
||||
@$pb.TagNumber(3)
|
||||
set name($core.String v) { $_setString(2, v); }
|
||||
@$pb.TagNumber(3)
|
||||
$core.bool hasName() => $_has(2);
|
||||
@$pb.TagNumber(3)
|
||||
void clearName() => clearField(3);
|
||||
|
||||
@$pb.TagNumber(4)
|
||||
$core.String get desc => $_getSZ(3);
|
||||
@$pb.TagNumber(4)
|
||||
set desc($core.String v) { $_setString(3, v); }
|
||||
@$pb.TagNumber(4)
|
||||
$core.bool hasDesc() => $_has(3);
|
||||
@$pb.TagNumber(4)
|
||||
void clearDesc() => clearField(4);
|
||||
|
||||
@$pb.TagNumber(5)
|
||||
$0.RepeatedView get belongings => $_getN(4);
|
||||
@$pb.TagNumber(5)
|
||||
set belongings($0.RepeatedView v) { setField(5, v); }
|
||||
@$pb.TagNumber(5)
|
||||
$core.bool hasBelongings() => $_has(4);
|
||||
@$pb.TagNumber(5)
|
||||
void clearBelongings() => clearField(5);
|
||||
@$pb.TagNumber(5)
|
||||
$0.RepeatedView ensureBelongings() => $_ensure(4);
|
||||
|
||||
@$pb.TagNumber(6)
|
||||
$fixnum.Int64 get version => $_getI64(5);
|
||||
@$pb.TagNumber(6)
|
||||
set version($fixnum.Int64 v) { $_setInt64(5, v); }
|
||||
@$pb.TagNumber(6)
|
||||
$core.bool hasVersion() => $_has(5);
|
||||
@$pb.TagNumber(6)
|
||||
void clearVersion() => clearField(6);
|
||||
|
||||
@$pb.TagNumber(7)
|
||||
$fixnum.Int64 get modifiedTime => $_getI64(6);
|
||||
@$pb.TagNumber(7)
|
||||
set modifiedTime($fixnum.Int64 v) { $_setInt64(6, v); }
|
||||
@$pb.TagNumber(7)
|
||||
$core.bool hasModifiedTime() => $_has(6);
|
||||
@$pb.TagNumber(7)
|
||||
void clearModifiedTime() => clearField(7);
|
||||
|
||||
@$pb.TagNumber(8)
|
||||
$fixnum.Int64 get createTime => $_getI64(7);
|
||||
@$pb.TagNumber(8)
|
||||
set createTime($fixnum.Int64 v) { $_setInt64(7, v); }
|
||||
@$pb.TagNumber(8)
|
||||
$core.bool hasCreateTime() => $_has(7);
|
||||
@$pb.TagNumber(8)
|
||||
void clearCreateTime() => clearField(8);
|
||||
}
|
||||
|
||||
class RepeatedApp extends $pb.GeneratedMessage {
|
||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RepeatedApp', createEmptyInstance: create)
|
||||
..pc<App>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'items', $pb.PbFieldType.PM, subBuilder: App.create)
|
||||
..hasRequiredFields = false
|
||||
;
|
||||
|
||||
RepeatedApp._() : super();
|
||||
factory RepeatedApp({
|
||||
$core.Iterable<App>? items,
|
||||
}) {
|
||||
final _result = create();
|
||||
if (items != null) {
|
||||
_result.items.addAll(items);
|
||||
}
|
||||
return _result;
|
||||
}
|
||||
factory RepeatedApp.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
|
||||
factory RepeatedApp.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
|
||||
@$core.Deprecated(
|
||||
'Using this can add significant overhead to your binary. '
|
||||
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
|
||||
'Will be removed in next major version')
|
||||
RepeatedApp clone() => RepeatedApp()..mergeFromMessage(this);
|
||||
@$core.Deprecated(
|
||||
'Using this can add significant overhead to your binary. '
|
||||
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
|
||||
'Will be removed in next major version')
|
||||
RepeatedApp copyWith(void Function(RepeatedApp) updates) => super.copyWith((message) => updates(message as RepeatedApp)) as RepeatedApp; // ignore: deprecated_member_use
|
||||
$pb.BuilderInfo get info_ => _i;
|
||||
@$core.pragma('dart2js:noInline')
|
||||
static RepeatedApp create() => RepeatedApp._();
|
||||
RepeatedApp createEmptyInstance() => create();
|
||||
static $pb.PbList<RepeatedApp> createRepeated() => $pb.PbList<RepeatedApp>();
|
||||
@$core.pragma('dart2js:noInline')
|
||||
static RepeatedApp getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<RepeatedApp>(create);
|
||||
static RepeatedApp? _defaultInstance;
|
||||
|
||||
@$pb.TagNumber(1)
|
||||
$core.List<App> get items => $_getList(0);
|
||||
}
|
||||
|
||||
class CreateAppRequest extends $pb.GeneratedMessage {
|
||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CreateAppRequest', createEmptyInstance: create)
|
||||
@ -241,36 +429,155 @@ class CreateAppParams extends $pb.GeneratedMessage {
|
||||
ColorStyle ensureColorStyle() => $_ensure(3);
|
||||
}
|
||||
|
||||
class App extends $pb.GeneratedMessage {
|
||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'App', createEmptyInstance: create)
|
||||
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id')
|
||||
..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'workspaceId')
|
||||
..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
|
||||
..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc')
|
||||
..aOM<$0.RepeatedView>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'belongings', subBuilder: $0.RepeatedView.create)
|
||||
..aInt64(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'version')
|
||||
..aInt64(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'modifiedTime')
|
||||
..aInt64(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'createTime')
|
||||
class QueryAppRequest extends $pb.GeneratedMessage {
|
||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'QueryAppRequest', createEmptyInstance: create)
|
||||
..pPS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'appIds')
|
||||
..hasRequiredFields = false
|
||||
;
|
||||
|
||||
App._() : super();
|
||||
factory App({
|
||||
$core.String? id,
|
||||
$core.String? workspaceId,
|
||||
$core.String? name,
|
||||
$core.String? desc,
|
||||
$0.RepeatedView? belongings,
|
||||
$fixnum.Int64? version,
|
||||
$fixnum.Int64? modifiedTime,
|
||||
$fixnum.Int64? createTime,
|
||||
QueryAppRequest._() : super();
|
||||
factory QueryAppRequest({
|
||||
$core.Iterable<$core.String>? appIds,
|
||||
}) {
|
||||
final _result = create();
|
||||
if (id != null) {
|
||||
_result.id = id;
|
||||
if (appIds != null) {
|
||||
_result.appIds.addAll(appIds);
|
||||
}
|
||||
if (workspaceId != null) {
|
||||
_result.workspaceId = workspaceId;
|
||||
return _result;
|
||||
}
|
||||
factory QueryAppRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
|
||||
factory QueryAppRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
|
||||
@$core.Deprecated(
|
||||
'Using this can add significant overhead to your binary. '
|
||||
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
|
||||
'Will be removed in next major version')
|
||||
QueryAppRequest clone() => QueryAppRequest()..mergeFromMessage(this);
|
||||
@$core.Deprecated(
|
||||
'Using this can add significant overhead to your binary. '
|
||||
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
|
||||
'Will be removed in next major version')
|
||||
QueryAppRequest copyWith(void Function(QueryAppRequest) updates) => super.copyWith((message) => updates(message as QueryAppRequest)) as QueryAppRequest; // ignore: deprecated_member_use
|
||||
$pb.BuilderInfo get info_ => _i;
|
||||
@$core.pragma('dart2js:noInline')
|
||||
static QueryAppRequest create() => QueryAppRequest._();
|
||||
QueryAppRequest createEmptyInstance() => create();
|
||||
static $pb.PbList<QueryAppRequest> createRepeated() => $pb.PbList<QueryAppRequest>();
|
||||
@$core.pragma('dart2js:noInline')
|
||||
static QueryAppRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<QueryAppRequest>(create);
|
||||
static QueryAppRequest? _defaultInstance;
|
||||
|
||||
@$pb.TagNumber(1)
|
||||
$core.List<$core.String> get appIds => $_getList(0);
|
||||
}
|
||||
|
||||
class AppId extends $pb.GeneratedMessage {
|
||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'AppId', createEmptyInstance: create)
|
||||
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'appId')
|
||||
..hasRequiredFields = false
|
||||
;
|
||||
|
||||
AppId._() : super();
|
||||
factory AppId({
|
||||
$core.String? appId,
|
||||
}) {
|
||||
final _result = create();
|
||||
if (appId != null) {
|
||||
_result.appId = appId;
|
||||
}
|
||||
return _result;
|
||||
}
|
||||
factory AppId.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
|
||||
factory AppId.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
|
||||
@$core.Deprecated(
|
||||
'Using this can add significant overhead to your binary. '
|
||||
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
|
||||
'Will be removed in next major version')
|
||||
AppId clone() => AppId()..mergeFromMessage(this);
|
||||
@$core.Deprecated(
|
||||
'Using this can add significant overhead to your binary. '
|
||||
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
|
||||
'Will be removed in next major version')
|
||||
AppId copyWith(void Function(AppId) updates) => super.copyWith((message) => updates(message as AppId)) as AppId; // ignore: deprecated_member_use
|
||||
$pb.BuilderInfo get info_ => _i;
|
||||
@$core.pragma('dart2js:noInline')
|
||||
static AppId create() => AppId._();
|
||||
AppId createEmptyInstance() => create();
|
||||
static $pb.PbList<AppId> createRepeated() => $pb.PbList<AppId>();
|
||||
@$core.pragma('dart2js:noInline')
|
||||
static AppId getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AppId>(create);
|
||||
static AppId? _defaultInstance;
|
||||
|
||||
@$pb.TagNumber(1)
|
||||
$core.String get appId => $_getSZ(0);
|
||||
@$pb.TagNumber(1)
|
||||
set appId($core.String v) { $_setString(0, v); }
|
||||
@$pb.TagNumber(1)
|
||||
$core.bool hasAppId() => $_has(0);
|
||||
@$pb.TagNumber(1)
|
||||
void clearAppId() => clearField(1);
|
||||
}
|
||||
|
||||
enum UpdateAppRequest_OneOfName {
|
||||
name,
|
||||
notSet
|
||||
}
|
||||
|
||||
enum UpdateAppRequest_OneOfDesc {
|
||||
desc,
|
||||
notSet
|
||||
}
|
||||
|
||||
enum UpdateAppRequest_OneOfColorStyle {
|
||||
colorStyle,
|
||||
notSet
|
||||
}
|
||||
|
||||
enum UpdateAppRequest_OneOfIsTrash {
|
||||
isTrash,
|
||||
notSet
|
||||
}
|
||||
|
||||
class UpdateAppRequest extends $pb.GeneratedMessage {
|
||||
static const $core.Map<$core.int, UpdateAppRequest_OneOfName> _UpdateAppRequest_OneOfNameByTag = {
|
||||
2 : UpdateAppRequest_OneOfName.name,
|
||||
0 : UpdateAppRequest_OneOfName.notSet
|
||||
};
|
||||
static const $core.Map<$core.int, UpdateAppRequest_OneOfDesc> _UpdateAppRequest_OneOfDescByTag = {
|
||||
3 : UpdateAppRequest_OneOfDesc.desc,
|
||||
0 : UpdateAppRequest_OneOfDesc.notSet
|
||||
};
|
||||
static const $core.Map<$core.int, UpdateAppRequest_OneOfColorStyle> _UpdateAppRequest_OneOfColorStyleByTag = {
|
||||
4 : UpdateAppRequest_OneOfColorStyle.colorStyle,
|
||||
0 : UpdateAppRequest_OneOfColorStyle.notSet
|
||||
};
|
||||
static const $core.Map<$core.int, UpdateAppRequest_OneOfIsTrash> _UpdateAppRequest_OneOfIsTrashByTag = {
|
||||
5 : UpdateAppRequest_OneOfIsTrash.isTrash,
|
||||
0 : UpdateAppRequest_OneOfIsTrash.notSet
|
||||
};
|
||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UpdateAppRequest', createEmptyInstance: create)
|
||||
..oo(0, [2])
|
||||
..oo(1, [3])
|
||||
..oo(2, [4])
|
||||
..oo(3, [5])
|
||||
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'appId')
|
||||
..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
|
||||
..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc')
|
||||
..aOM<ColorStyle>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'colorStyle', subBuilder: ColorStyle.create)
|
||||
..aOB(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'isTrash')
|
||||
..hasRequiredFields = false
|
||||
;
|
||||
|
||||
UpdateAppRequest._() : super();
|
||||
factory UpdateAppRequest({
|
||||
$core.String? appId,
|
||||
$core.String? name,
|
||||
$core.String? desc,
|
||||
ColorStyle? colorStyle,
|
||||
$core.bool? isTrash,
|
||||
}) {
|
||||
final _result = create();
|
||||
if (appId != null) {
|
||||
_result.appId = appId;
|
||||
}
|
||||
if (name != null) {
|
||||
_result.name = name;
|
||||
@ -278,154 +585,249 @@ class App extends $pb.GeneratedMessage {
|
||||
if (desc != null) {
|
||||
_result.desc = desc;
|
||||
}
|
||||
if (belongings != null) {
|
||||
_result.belongings = belongings;
|
||||
if (colorStyle != null) {
|
||||
_result.colorStyle = colorStyle;
|
||||
}
|
||||
if (version != null) {
|
||||
_result.version = version;
|
||||
}
|
||||
if (modifiedTime != null) {
|
||||
_result.modifiedTime = modifiedTime;
|
||||
}
|
||||
if (createTime != null) {
|
||||
_result.createTime = createTime;
|
||||
if (isTrash != null) {
|
||||
_result.isTrash = isTrash;
|
||||
}
|
||||
return _result;
|
||||
}
|
||||
factory App.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
|
||||
factory App.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
|
||||
factory UpdateAppRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
|
||||
factory UpdateAppRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
|
||||
@$core.Deprecated(
|
||||
'Using this can add significant overhead to your binary. '
|
||||
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
|
||||
'Will be removed in next major version')
|
||||
App clone() => App()..mergeFromMessage(this);
|
||||
UpdateAppRequest clone() => UpdateAppRequest()..mergeFromMessage(this);
|
||||
@$core.Deprecated(
|
||||
'Using this can add significant overhead to your binary. '
|
||||
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
|
||||
'Will be removed in next major version')
|
||||
App copyWith(void Function(App) updates) => super.copyWith((message) => updates(message as App)) as App; // ignore: deprecated_member_use
|
||||
UpdateAppRequest copyWith(void Function(UpdateAppRequest) updates) => super.copyWith((message) => updates(message as UpdateAppRequest)) as UpdateAppRequest; // ignore: deprecated_member_use
|
||||
$pb.BuilderInfo get info_ => _i;
|
||||
@$core.pragma('dart2js:noInline')
|
||||
static App create() => App._();
|
||||
App createEmptyInstance() => create();
|
||||
static $pb.PbList<App> createRepeated() => $pb.PbList<App>();
|
||||
static UpdateAppRequest create() => UpdateAppRequest._();
|
||||
UpdateAppRequest createEmptyInstance() => create();
|
||||
static $pb.PbList<UpdateAppRequest> createRepeated() => $pb.PbList<UpdateAppRequest>();
|
||||
@$core.pragma('dart2js:noInline')
|
||||
static App getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<App>(create);
|
||||
static App? _defaultInstance;
|
||||
static UpdateAppRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UpdateAppRequest>(create);
|
||||
static UpdateAppRequest? _defaultInstance;
|
||||
|
||||
UpdateAppRequest_OneOfName whichOneOfName() => _UpdateAppRequest_OneOfNameByTag[$_whichOneof(0)]!;
|
||||
void clearOneOfName() => clearField($_whichOneof(0));
|
||||
|
||||
UpdateAppRequest_OneOfDesc whichOneOfDesc() => _UpdateAppRequest_OneOfDescByTag[$_whichOneof(1)]!;
|
||||
void clearOneOfDesc() => clearField($_whichOneof(1));
|
||||
|
||||
UpdateAppRequest_OneOfColorStyle whichOneOfColorStyle() => _UpdateAppRequest_OneOfColorStyleByTag[$_whichOneof(2)]!;
|
||||
void clearOneOfColorStyle() => clearField($_whichOneof(2));
|
||||
|
||||
UpdateAppRequest_OneOfIsTrash whichOneOfIsTrash() => _UpdateAppRequest_OneOfIsTrashByTag[$_whichOneof(3)]!;
|
||||
void clearOneOfIsTrash() => clearField($_whichOneof(3));
|
||||
|
||||
@$pb.TagNumber(1)
|
||||
$core.String get id => $_getSZ(0);
|
||||
$core.String get appId => $_getSZ(0);
|
||||
@$pb.TagNumber(1)
|
||||
set id($core.String v) { $_setString(0, v); }
|
||||
set appId($core.String v) { $_setString(0, v); }
|
||||
@$pb.TagNumber(1)
|
||||
$core.bool hasId() => $_has(0);
|
||||
$core.bool hasAppId() => $_has(0);
|
||||
@$pb.TagNumber(1)
|
||||
void clearId() => clearField(1);
|
||||
void clearAppId() => clearField(1);
|
||||
|
||||
@$pb.TagNumber(2)
|
||||
$core.String get workspaceId => $_getSZ(1);
|
||||
$core.String get name => $_getSZ(1);
|
||||
@$pb.TagNumber(2)
|
||||
set workspaceId($core.String v) { $_setString(1, v); }
|
||||
set name($core.String v) { $_setString(1, v); }
|
||||
@$pb.TagNumber(2)
|
||||
$core.bool hasWorkspaceId() => $_has(1);
|
||||
$core.bool hasName() => $_has(1);
|
||||
@$pb.TagNumber(2)
|
||||
void clearWorkspaceId() => clearField(2);
|
||||
void clearName() => clearField(2);
|
||||
|
||||
@$pb.TagNumber(3)
|
||||
$core.String get name => $_getSZ(2);
|
||||
$core.String get desc => $_getSZ(2);
|
||||
@$pb.TagNumber(3)
|
||||
set name($core.String v) { $_setString(2, v); }
|
||||
set desc($core.String v) { $_setString(2, v); }
|
||||
@$pb.TagNumber(3)
|
||||
$core.bool hasName() => $_has(2);
|
||||
$core.bool hasDesc() => $_has(2);
|
||||
@$pb.TagNumber(3)
|
||||
void clearName() => clearField(3);
|
||||
void clearDesc() => clearField(3);
|
||||
|
||||
@$pb.TagNumber(4)
|
||||
$core.String get desc => $_getSZ(3);
|
||||
ColorStyle get colorStyle => $_getN(3);
|
||||
@$pb.TagNumber(4)
|
||||
set desc($core.String v) { $_setString(3, v); }
|
||||
set colorStyle(ColorStyle v) { setField(4, v); }
|
||||
@$pb.TagNumber(4)
|
||||
$core.bool hasDesc() => $_has(3);
|
||||
$core.bool hasColorStyle() => $_has(3);
|
||||
@$pb.TagNumber(4)
|
||||
void clearDesc() => clearField(4);
|
||||
void clearColorStyle() => clearField(4);
|
||||
@$pb.TagNumber(4)
|
||||
ColorStyle ensureColorStyle() => $_ensure(3);
|
||||
|
||||
@$pb.TagNumber(5)
|
||||
$0.RepeatedView get belongings => $_getN(4);
|
||||
$core.bool get isTrash => $_getBF(4);
|
||||
@$pb.TagNumber(5)
|
||||
set belongings($0.RepeatedView v) { setField(5, v); }
|
||||
set isTrash($core.bool v) { $_setBool(4, v); }
|
||||
@$pb.TagNumber(5)
|
||||
$core.bool hasBelongings() => $_has(4);
|
||||
$core.bool hasIsTrash() => $_has(4);
|
||||
@$pb.TagNumber(5)
|
||||
void clearBelongings() => clearField(5);
|
||||
@$pb.TagNumber(5)
|
||||
$0.RepeatedView ensureBelongings() => $_ensure(4);
|
||||
|
||||
@$pb.TagNumber(6)
|
||||
$fixnum.Int64 get version => $_getI64(5);
|
||||
@$pb.TagNumber(6)
|
||||
set version($fixnum.Int64 v) { $_setInt64(5, v); }
|
||||
@$pb.TagNumber(6)
|
||||
$core.bool hasVersion() => $_has(5);
|
||||
@$pb.TagNumber(6)
|
||||
void clearVersion() => clearField(6);
|
||||
|
||||
@$pb.TagNumber(7)
|
||||
$fixnum.Int64 get modifiedTime => $_getI64(6);
|
||||
@$pb.TagNumber(7)
|
||||
set modifiedTime($fixnum.Int64 v) { $_setInt64(6, v); }
|
||||
@$pb.TagNumber(7)
|
||||
$core.bool hasModifiedTime() => $_has(6);
|
||||
@$pb.TagNumber(7)
|
||||
void clearModifiedTime() => clearField(7);
|
||||
|
||||
@$pb.TagNumber(8)
|
||||
$fixnum.Int64 get createTime => $_getI64(7);
|
||||
@$pb.TagNumber(8)
|
||||
set createTime($fixnum.Int64 v) { $_setInt64(7, v); }
|
||||
@$pb.TagNumber(8)
|
||||
$core.bool hasCreateTime() => $_has(7);
|
||||
@$pb.TagNumber(8)
|
||||
void clearCreateTime() => clearField(8);
|
||||
void clearIsTrash() => clearField(5);
|
||||
}
|
||||
|
||||
class RepeatedApp extends $pb.GeneratedMessage {
|
||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RepeatedApp', createEmptyInstance: create)
|
||||
..pc<App>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'items', $pb.PbFieldType.PM, subBuilder: App.create)
|
||||
enum UpdateAppParams_OneOfName {
|
||||
name,
|
||||
notSet
|
||||
}
|
||||
|
||||
enum UpdateAppParams_OneOfDesc {
|
||||
desc,
|
||||
notSet
|
||||
}
|
||||
|
||||
enum UpdateAppParams_OneOfColorStyle {
|
||||
colorStyle,
|
||||
notSet
|
||||
}
|
||||
|
||||
enum UpdateAppParams_OneOfIsTrash {
|
||||
isTrash,
|
||||
notSet
|
||||
}
|
||||
|
||||
class UpdateAppParams extends $pb.GeneratedMessage {
|
||||
static const $core.Map<$core.int, UpdateAppParams_OneOfName> _UpdateAppParams_OneOfNameByTag = {
|
||||
2 : UpdateAppParams_OneOfName.name,
|
||||
0 : UpdateAppParams_OneOfName.notSet
|
||||
};
|
||||
static const $core.Map<$core.int, UpdateAppParams_OneOfDesc> _UpdateAppParams_OneOfDescByTag = {
|
||||
3 : UpdateAppParams_OneOfDesc.desc,
|
||||
0 : UpdateAppParams_OneOfDesc.notSet
|
||||
};
|
||||
static const $core.Map<$core.int, UpdateAppParams_OneOfColorStyle> _UpdateAppParams_OneOfColorStyleByTag = {
|
||||
4 : UpdateAppParams_OneOfColorStyle.colorStyle,
|
||||
0 : UpdateAppParams_OneOfColorStyle.notSet
|
||||
};
|
||||
static const $core.Map<$core.int, UpdateAppParams_OneOfIsTrash> _UpdateAppParams_OneOfIsTrashByTag = {
|
||||
5 : UpdateAppParams_OneOfIsTrash.isTrash,
|
||||
0 : UpdateAppParams_OneOfIsTrash.notSet
|
||||
};
|
||||
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UpdateAppParams', createEmptyInstance: create)
|
||||
..oo(0, [2])
|
||||
..oo(1, [3])
|
||||
..oo(2, [4])
|
||||
..oo(3, [5])
|
||||
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'appId')
|
||||
..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
|
||||
..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc')
|
||||
..aOM<ColorStyle>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'colorStyle', subBuilder: ColorStyle.create)
|
||||
..aOB(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'isTrash')
|
||||
..hasRequiredFields = false
|
||||
;
|
||||
|
||||
RepeatedApp._() : super();
|
||||
factory RepeatedApp({
|
||||
$core.Iterable<App>? items,
|
||||
UpdateAppParams._() : super();
|
||||
factory UpdateAppParams({
|
||||
$core.String? appId,
|
||||
$core.String? name,
|
||||
$core.String? desc,
|
||||
ColorStyle? colorStyle,
|
||||
$core.bool? isTrash,
|
||||
}) {
|
||||
final _result = create();
|
||||
if (items != null) {
|
||||
_result.items.addAll(items);
|
||||
if (appId != null) {
|
||||
_result.appId = appId;
|
||||
}
|
||||
if (name != null) {
|
||||
_result.name = name;
|
||||
}
|
||||
if (desc != null) {
|
||||
_result.desc = desc;
|
||||
}
|
||||
if (colorStyle != null) {
|
||||
_result.colorStyle = colorStyle;
|
||||
}
|
||||
if (isTrash != null) {
|
||||
_result.isTrash = isTrash;
|
||||
}
|
||||
return _result;
|
||||
}
|
||||
factory RepeatedApp.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
|
||||
factory RepeatedApp.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
|
||||
factory UpdateAppParams.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
|
||||
factory UpdateAppParams.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
|
||||
@$core.Deprecated(
|
||||
'Using this can add significant overhead to your binary. '
|
||||
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
|
||||
'Will be removed in next major version')
|
||||
RepeatedApp clone() => RepeatedApp()..mergeFromMessage(this);
|
||||
UpdateAppParams clone() => UpdateAppParams()..mergeFromMessage(this);
|
||||
@$core.Deprecated(
|
||||
'Using this can add significant overhead to your binary. '
|
||||
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
|
||||
'Will be removed in next major version')
|
||||
RepeatedApp copyWith(void Function(RepeatedApp) updates) => super.copyWith((message) => updates(message as RepeatedApp)) as RepeatedApp; // ignore: deprecated_member_use
|
||||
UpdateAppParams copyWith(void Function(UpdateAppParams) updates) => super.copyWith((message) => updates(message as UpdateAppParams)) as UpdateAppParams; // ignore: deprecated_member_use
|
||||
$pb.BuilderInfo get info_ => _i;
|
||||
@$core.pragma('dart2js:noInline')
|
||||
static RepeatedApp create() => RepeatedApp._();
|
||||
RepeatedApp createEmptyInstance() => create();
|
||||
static $pb.PbList<RepeatedApp> createRepeated() => $pb.PbList<RepeatedApp>();
|
||||
static UpdateAppParams create() => UpdateAppParams._();
|
||||
UpdateAppParams createEmptyInstance() => create();
|
||||
static $pb.PbList<UpdateAppParams> createRepeated() => $pb.PbList<UpdateAppParams>();
|
||||
@$core.pragma('dart2js:noInline')
|
||||
static RepeatedApp getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<RepeatedApp>(create);
|
||||
static RepeatedApp? _defaultInstance;
|
||||
static UpdateAppParams getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UpdateAppParams>(create);
|
||||
static UpdateAppParams? _defaultInstance;
|
||||
|
||||
UpdateAppParams_OneOfName whichOneOfName() => _UpdateAppParams_OneOfNameByTag[$_whichOneof(0)]!;
|
||||
void clearOneOfName() => clearField($_whichOneof(0));
|
||||
|
||||
UpdateAppParams_OneOfDesc whichOneOfDesc() => _UpdateAppParams_OneOfDescByTag[$_whichOneof(1)]!;
|
||||
void clearOneOfDesc() => clearField($_whichOneof(1));
|
||||
|
||||
UpdateAppParams_OneOfColorStyle whichOneOfColorStyle() => _UpdateAppParams_OneOfColorStyleByTag[$_whichOneof(2)]!;
|
||||
void clearOneOfColorStyle() => clearField($_whichOneof(2));
|
||||
|
||||
UpdateAppParams_OneOfIsTrash whichOneOfIsTrash() => _UpdateAppParams_OneOfIsTrashByTag[$_whichOneof(3)]!;
|
||||
void clearOneOfIsTrash() => clearField($_whichOneof(3));
|
||||
|
||||
@$pb.TagNumber(1)
|
||||
$core.List<App> get items => $_getList(0);
|
||||
$core.String get appId => $_getSZ(0);
|
||||
@$pb.TagNumber(1)
|
||||
set appId($core.String v) { $_setString(0, v); }
|
||||
@$pb.TagNumber(1)
|
||||
$core.bool hasAppId() => $_has(0);
|
||||
@$pb.TagNumber(1)
|
||||
void clearAppId() => clearField(1);
|
||||
|
||||
@$pb.TagNumber(2)
|
||||
$core.String get name => $_getSZ(1);
|
||||
@$pb.TagNumber(2)
|
||||
set name($core.String v) { $_setString(1, v); }
|
||||
@$pb.TagNumber(2)
|
||||
$core.bool hasName() => $_has(1);
|
||||
@$pb.TagNumber(2)
|
||||
void clearName() => clearField(2);
|
||||
|
||||
@$pb.TagNumber(3)
|
||||
$core.String get desc => $_getSZ(2);
|
||||
@$pb.TagNumber(3)
|
||||
set desc($core.String v) { $_setString(2, v); }
|
||||
@$pb.TagNumber(3)
|
||||
$core.bool hasDesc() => $_has(2);
|
||||
@$pb.TagNumber(3)
|
||||
void clearDesc() => clearField(3);
|
||||
|
||||
@$pb.TagNumber(4)
|
||||
ColorStyle get colorStyle => $_getN(3);
|
||||
@$pb.TagNumber(4)
|
||||
set colorStyle(ColorStyle v) { setField(4, v); }
|
||||
@$pb.TagNumber(4)
|
||||
$core.bool hasColorStyle() => $_has(3);
|
||||
@$pb.TagNumber(4)
|
||||
void clearColorStyle() => clearField(4);
|
||||
@$pb.TagNumber(4)
|
||||
ColorStyle ensureColorStyle() => $_ensure(3);
|
||||
|
||||
@$pb.TagNumber(5)
|
||||
$core.bool get isTrash => $_getBF(4);
|
||||
@$pb.TagNumber(5)
|
||||
set isTrash($core.bool v) { $_setBool(4, v); }
|
||||
@$pb.TagNumber(5)
|
||||
$core.bool hasIsTrash() => $_has(4);
|
||||
@$pb.TagNumber(5)
|
||||
void clearIsTrash() => clearField(5);
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
///
|
||||
// Generated code. Do not modify.
|
||||
// source: doc.proto
|
||||
// source: app.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
|
@ -1,6 +1,6 @@
|
||||
///
|
||||
// Generated code. Do not modify.
|
||||
// source: app_create.proto
|
||||
// source: app.proto
|
||||
//
|
||||
// @dart = 2.12
|
||||
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
|
||||
@ -8,6 +8,33 @@
|
||||
import 'dart:core' as $core;
|
||||
import 'dart:convert' as $convert;
|
||||
import 'dart:typed_data' as $typed_data;
|
||||
@$core.Deprecated('Use appDescriptor instead')
|
||||
const App$json = const {
|
||||
'1': 'App',
|
||||
'2': const [
|
||||
const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'},
|
||||
const {'1': 'workspace_id', '3': 2, '4': 1, '5': 9, '10': 'workspaceId'},
|
||||
const {'1': 'name', '3': 3, '4': 1, '5': 9, '10': 'name'},
|
||||
const {'1': 'desc', '3': 4, '4': 1, '5': 9, '10': 'desc'},
|
||||
const {'1': 'belongings', '3': 5, '4': 1, '5': 11, '6': '.RepeatedView', '10': 'belongings'},
|
||||
const {'1': 'version', '3': 6, '4': 1, '5': 3, '10': 'version'},
|
||||
const {'1': 'modified_time', '3': 7, '4': 1, '5': 3, '10': 'modifiedTime'},
|
||||
const {'1': 'create_time', '3': 8, '4': 1, '5': 3, '10': 'createTime'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `App`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List appDescriptor = $convert.base64Decode('CgNBcHASDgoCaWQYASABKAlSAmlkEiEKDHdvcmtzcGFjZV9pZBgCIAEoCVILd29ya3NwYWNlSWQSEgoEbmFtZRgDIAEoCVIEbmFtZRISCgRkZXNjGAQgASgJUgRkZXNjEi0KCmJlbG9uZ2luZ3MYBSABKAsyDS5SZXBlYXRlZFZpZXdSCmJlbG9uZ2luZ3MSGAoHdmVyc2lvbhgGIAEoA1IHdmVyc2lvbhIjCg1tb2RpZmllZF90aW1lGAcgASgDUgxtb2RpZmllZFRpbWUSHwoLY3JlYXRlX3RpbWUYCCABKANSCmNyZWF0ZVRpbWU=');
|
||||
@$core.Deprecated('Use repeatedAppDescriptor instead')
|
||||
const RepeatedApp$json = const {
|
||||
'1': 'RepeatedApp',
|
||||
'2': const [
|
||||
const {'1': 'items', '3': 1, '4': 3, '5': 11, '6': '.App', '10': 'items'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `RepeatedApp`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List repeatedAppDescriptor = $convert.base64Decode('CgtSZXBlYXRlZEFwcBIaCgVpdGVtcxgBIAMoCzIELkFwcFIFaXRlbXM=');
|
||||
@$core.Deprecated('Use createAppRequestDescriptor instead')
|
||||
const CreateAppRequest$json = const {
|
||||
'1': 'CreateAppRequest',
|
||||
@ -44,30 +71,63 @@ const CreateAppParams$json = const {
|
||||
|
||||
/// Descriptor for `CreateAppParams`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List createAppParamsDescriptor = $convert.base64Decode('Cg9DcmVhdGVBcHBQYXJhbXMSIQoMd29ya3NwYWNlX2lkGAEgASgJUgt3b3Jrc3BhY2VJZBISCgRuYW1lGAIgASgJUgRuYW1lEhIKBGRlc2MYAyABKAlSBGRlc2MSLAoLY29sb3Jfc3R5bGUYBCABKAsyCy5Db2xvclN0eWxlUgpjb2xvclN0eWxl');
|
||||
@$core.Deprecated('Use appDescriptor instead')
|
||||
const App$json = const {
|
||||
'1': 'App',
|
||||
@$core.Deprecated('Use queryAppRequestDescriptor instead')
|
||||
const QueryAppRequest$json = const {
|
||||
'1': 'QueryAppRequest',
|
||||
'2': const [
|
||||
const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'},
|
||||
const {'1': 'workspace_id', '3': 2, '4': 1, '5': 9, '10': 'workspaceId'},
|
||||
const {'1': 'name', '3': 3, '4': 1, '5': 9, '10': 'name'},
|
||||
const {'1': 'desc', '3': 4, '4': 1, '5': 9, '10': 'desc'},
|
||||
const {'1': 'belongings', '3': 5, '4': 1, '5': 11, '6': '.RepeatedView', '10': 'belongings'},
|
||||
const {'1': 'version', '3': 6, '4': 1, '5': 3, '10': 'version'},
|
||||
const {'1': 'modified_time', '3': 7, '4': 1, '5': 3, '10': 'modifiedTime'},
|
||||
const {'1': 'create_time', '3': 8, '4': 1, '5': 3, '10': 'createTime'},
|
||||
const {'1': 'app_ids', '3': 1, '4': 3, '5': 9, '10': 'appIds'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `App`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List appDescriptor = $convert.base64Decode('CgNBcHASDgoCaWQYASABKAlSAmlkEiEKDHdvcmtzcGFjZV9pZBgCIAEoCVILd29ya3NwYWNlSWQSEgoEbmFtZRgDIAEoCVIEbmFtZRISCgRkZXNjGAQgASgJUgRkZXNjEi0KCmJlbG9uZ2luZ3MYBSABKAsyDS5SZXBlYXRlZFZpZXdSCmJlbG9uZ2luZ3MSGAoHdmVyc2lvbhgGIAEoA1IHdmVyc2lvbhIjCg1tb2RpZmllZF90aW1lGAcgASgDUgxtb2RpZmllZFRpbWUSHwoLY3JlYXRlX3RpbWUYCCABKANSCmNyZWF0ZVRpbWU=');
|
||||
@$core.Deprecated('Use repeatedAppDescriptor instead')
|
||||
const RepeatedApp$json = const {
|
||||
'1': 'RepeatedApp',
|
||||
/// Descriptor for `QueryAppRequest`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List queryAppRequestDescriptor = $convert.base64Decode('Cg9RdWVyeUFwcFJlcXVlc3QSFwoHYXBwX2lkcxgBIAMoCVIGYXBwSWRz');
|
||||
@$core.Deprecated('Use appIdDescriptor instead')
|
||||
const AppId$json = const {
|
||||
'1': 'AppId',
|
||||
'2': const [
|
||||
const {'1': 'items', '3': 1, '4': 3, '5': 11, '6': '.App', '10': 'items'},
|
||||
const {'1': 'app_id', '3': 1, '4': 1, '5': 9, '10': 'appId'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `RepeatedApp`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List repeatedAppDescriptor = $convert.base64Decode('CgtSZXBlYXRlZEFwcBIaCgVpdGVtcxgBIAMoCzIELkFwcFIFaXRlbXM=');
|
||||
/// Descriptor for `AppId`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List appIdDescriptor = $convert.base64Decode('CgVBcHBJZBIVCgZhcHBfaWQYASABKAlSBWFwcElk');
|
||||
@$core.Deprecated('Use updateAppRequestDescriptor instead')
|
||||
const UpdateAppRequest$json = const {
|
||||
'1': 'UpdateAppRequest',
|
||||
'2': const [
|
||||
const {'1': 'app_id', '3': 1, '4': 1, '5': 9, '10': 'appId'},
|
||||
const {'1': 'name', '3': 2, '4': 1, '5': 9, '9': 0, '10': 'name'},
|
||||
const {'1': 'desc', '3': 3, '4': 1, '5': 9, '9': 1, '10': 'desc'},
|
||||
const {'1': 'color_style', '3': 4, '4': 1, '5': 11, '6': '.ColorStyle', '9': 2, '10': 'colorStyle'},
|
||||
const {'1': 'is_trash', '3': 5, '4': 1, '5': 8, '9': 3, '10': 'isTrash'},
|
||||
],
|
||||
'8': const [
|
||||
const {'1': 'one_of_name'},
|
||||
const {'1': 'one_of_desc'},
|
||||
const {'1': 'one_of_color_style'},
|
||||
const {'1': 'one_of_is_trash'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `UpdateAppRequest`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List updateAppRequestDescriptor = $convert.base64Decode('ChBVcGRhdGVBcHBSZXF1ZXN0EhUKBmFwcF9pZBgBIAEoCVIFYXBwSWQSFAoEbmFtZRgCIAEoCUgAUgRuYW1lEhQKBGRlc2MYAyABKAlIAVIEZGVzYxIuCgtjb2xvcl9zdHlsZRgEIAEoCzILLkNvbG9yU3R5bGVIAlIKY29sb3JTdHlsZRIbCghpc190cmFzaBgFIAEoCEgDUgdpc1RyYXNoQg0KC29uZV9vZl9uYW1lQg0KC29uZV9vZl9kZXNjQhQKEm9uZV9vZl9jb2xvcl9zdHlsZUIRCg9vbmVfb2ZfaXNfdHJhc2g=');
|
||||
@$core.Deprecated('Use updateAppParamsDescriptor instead')
|
||||
const UpdateAppParams$json = const {
|
||||
'1': 'UpdateAppParams',
|
||||
'2': const [
|
||||
const {'1': 'app_id', '3': 1, '4': 1, '5': 9, '10': 'appId'},
|
||||
const {'1': 'name', '3': 2, '4': 1, '5': 9, '9': 0, '10': 'name'},
|
||||
const {'1': 'desc', '3': 3, '4': 1, '5': 9, '9': 1, '10': 'desc'},
|
||||
const {'1': 'color_style', '3': 4, '4': 1, '5': 11, '6': '.ColorStyle', '9': 2, '10': 'colorStyle'},
|
||||
const {'1': 'is_trash', '3': 5, '4': 1, '5': 8, '9': 3, '10': 'isTrash'},
|
||||
],
|
||||
'8': const [
|
||||
const {'1': 'one_of_name'},
|
||||
const {'1': 'one_of_desc'},
|
||||
const {'1': 'one_of_color_style'},
|
||||
const {'1': 'one_of_is_trash'},
|
||||
],
|
||||
};
|
||||
|
||||
/// Descriptor for `UpdateAppParams`. Decode as a `google.protobuf.DescriptorProto`.
|
||||
final $typed_data.Uint8List updateAppParamsDescriptor = $convert.base64Decode('Cg9VcGRhdGVBcHBQYXJhbXMSFQoGYXBwX2lkGAEgASgJUgVhcHBJZBIUCgRuYW1lGAIgASgJSABSBG5hbWUSFAoEZGVzYxgDIAEoCUgBUgRkZXNjEi4KC2NvbG9yX3N0eWxlGAQgASgLMgsuQ29sb3JTdHlsZUgCUgpjb2xvclN0eWxlEhsKCGlzX3RyYXNoGAUgASgISANSB2lzVHJhc2hCDQoLb25lX29mX25hbWVCDQoLb25lX29mX2Rlc2NCFAoSb25lX29mX2NvbG9yX3N0eWxlQhEKD29uZV9vZl9pc190cmFzaA==');
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user