solver conflicts

This commit is contained in:
appflowy 2022-01-24 17:32:40 +08:00
commit a9eec5baed
426 changed files with 22160 additions and 16593 deletions

58
backend/Cargo.lock generated
View File

@ -1111,6 +1111,12 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0"
[[package]]
name = "dissimilar"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "31ad93652f40969dead8d4bf897a41e9462095152eb21c56e5830537e41179dd"
[[package]] [[package]]
name = "dotenv" name = "dotenv"
version = "0.15.0" version = "0.15.0"
@ -1227,6 +1233,8 @@ dependencies = [
"bytes", "bytes",
"chrono", "chrono",
"dashmap", "dashmap",
"dissimilar",
"flowy-core-data-model",
"flowy-derive", "flowy-derive",
"futures", "futures",
"lib-infra", "lib-infra",
@ -1236,6 +1244,7 @@ dependencies = [
"parking_lot", "parking_lot",
"protobuf", "protobuf",
"serde", "serde",
"serde_json",
"strum", "strum",
"strum_macros", "strum_macros",
"tokio", "tokio",
@ -1247,7 +1256,6 @@ dependencies = [
name = "flowy-core" name = "flowy-core"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"backend-service",
"bincode", "bincode",
"bytes", "bytes",
"chrono", "chrono",
@ -1263,7 +1271,7 @@ dependencies = [
"flowy-derive", "flowy-derive",
"flowy-document", "flowy-document",
"flowy-error", "flowy-error",
"flowy-net", "flowy-sync",
"futures", "futures",
"futures-core", "futures-core",
"lazy_static", "lazy_static",
@ -1290,10 +1298,11 @@ dependencies = [
"chrono", "chrono",
"derive_more", "derive_more",
"error-code", "error-code",
"flowy-collaboration",
"flowy-derive", "flowy-derive",
"log", "log",
"protobuf", "protobuf",
"serde",
"serde_json",
"strum", "strum",
"strum_macros", "strum_macros",
"unicode-segmentation", "unicode-segmentation",
@ -1327,7 +1336,7 @@ name = "flowy-document"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"async-stream", "async-stream",
"backend-service", "async-trait",
"bytecount", "bytecount",
"byteorder", "byteorder",
"bytes", "bytes",
@ -1341,10 +1350,9 @@ dependencies = [
"flowy-database", "flowy-database",
"flowy-derive", "flowy-derive",
"flowy-error", "flowy-error",
"flowy-sync",
"futures", "futures",
"futures-core",
"futures-util", "futures-util",
"lazy_static",
"lib-dispatch", "lib-dispatch",
"lib-infra", "lib-infra",
"lib-ot", "lib-ot",
@ -1386,11 +1394,20 @@ name = "flowy-net"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async-stream",
"backend-service",
"bytes", "bytes",
"dashmap", "dashmap",
"flowy-collaboration", "flowy-collaboration",
"flowy-core",
"flowy-core-data-model",
"flowy-derive", "flowy-derive",
"flowy-document",
"flowy-error", "flowy-error",
"flowy-user",
"flowy-user-data-model",
"futures-util",
"lazy_static",
"lib-dispatch", "lib-dispatch",
"lib-infra", "lib-infra",
"lib-ws", "lib-ws",
@ -1414,6 +1431,7 @@ dependencies = [
"flowy-database", "flowy-database",
"flowy-document", "flowy-document",
"flowy-net", "flowy-net",
"flowy-sync",
"flowy-user", "flowy-user",
"futures-core", "futures-core",
"lib-dispatch", "lib-dispatch",
@ -1426,6 +1444,32 @@ dependencies = [
"tracing", "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]] [[package]]
name = "flowy-test" name = "flowy-test"
version = "0.1.0" version = "0.1.0"
@ -1455,7 +1499,6 @@ dependencies = [
name = "flowy-user" name = "flowy-user"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"backend-service",
"bytes", "bytes",
"dart-notify", "dart-notify",
"dashmap", "dashmap",
@ -1465,7 +1508,6 @@ dependencies = [
"flowy-database", "flowy-database",
"flowy-derive", "flowy-derive",
"flowy-error", "flowy-error",
"flowy-net",
"flowy-user-data-model", "flowy-user-data-model",
"futures-core", "futures-core",
"lazy_static", "lazy_static",

View File

@ -12,8 +12,8 @@ use crate::{
}, },
context::AppContext, context::AppContext,
services::{ services::{
core::{app::router as app, trash::router as trash, view::router as view, workspace::router as workspace},
document::router as doc, 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, user::router as user,
web_socket::WSServer, web_socket::WSServer,
}, },
@ -135,7 +135,7 @@ fn user_scope() -> Scope {
} }
pub async fn init_app_context(configuration: &Settings) -> AppContext { 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") .env_filter("Trace")
.build(); .build();
let pg_pool = get_connection_pool(&configuration.database) let pg_pool = get_connection_pool(&configuration.database)

View File

@ -5,12 +5,13 @@ use crate::services::{
use actix::Addr; use actix::Addr;
use actix_web::web::Data; use actix_web::web::Data;
use crate::services::document::{ use crate::services::{
persistence::DocumentKVPersistence, document::ws_receiver::{make_document_ws_receiver, HttpDocumentCloudPersistence},
ws_receiver::{make_document_ws_receiver, DocumentPersistenceImpl}, folder::ws_receiver::{make_folder_ws_receiver, HttpFolderCloudPersistence},
kv::revision_kv::RevisionKVPersistence,
}; };
use flowy_collaboration::sync::ServerDocumentManager; use flowy_collaboration::{server_document::ServerDocumentManager, server_folder::ServerFolderManager};
use lib_ws::WSModule; use lib_ws::WSChannel;
use sqlx::PgPool; use sqlx::PgPool;
use std::sync::Arc; use std::sync::Arc;
@ -20,6 +21,7 @@ pub struct AppContext {
pub persistence: Data<Arc<FlowyPersistence>>, pub persistence: Data<Arc<FlowyPersistence>>,
pub ws_receivers: Data<WebSocketReceivers>, pub ws_receivers: Data<WebSocketReceivers>,
pub document_manager: Data<Arc<ServerDocumentManager>>, pub document_manager: Data<Arc<ServerDocumentManager>>,
pub folder_manager: Data<Arc<ServerFolderManager>>,
} }
impl AppContext { impl AppContext {
@ -27,40 +29,58 @@ impl AppContext {
let ws_server = Data::new(ws_server); let ws_server = Data::new(ws_server);
let mut ws_receivers = WebSocketReceivers::new(); let mut ws_receivers = WebSocketReceivers::new();
let kv_store = make_document_kv_store(pg_pool.clone()); let document_store = make_document_kv_store(pg_pool.clone());
let persistence = Arc::new(FlowyPersistence { pg_pool, kv_store }); 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_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 { AppContext {
ws_server, ws_server,
persistence: Data::new(persistence), persistence: Data::new(flowy_persistence),
ws_receivers: Data::new(ws_receivers), ws_receivers: Data::new(ws_receivers),
document_manager: Data::new(document_manager), 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 }); 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)] #[derive(Clone)]
pub struct FlowyPersistence { pub struct FlowyPersistence {
pg_pool: PgPool, pg_pool: PgPool,
kv_store: Arc<DocumentKVPersistence>, document_store: Arc<DocumentRevisionKV>,
folder_store: Arc<FolderRevisionKV>,
} }
impl FlowyPersistence { impl FlowyPersistence {
pub fn pg_pool(&self) -> PgPool { pub fn pg_pool(&self) -> PgPool { self.pg_pool.clone() }
self.pg_pool.clone()
}
pub fn kv_store(&self) -> Arc<DocumentKVPersistence> { pub fn document_kv_store(&self) -> Arc<DocumentRevisionKV> { self.document_store.clone() }
self.kv_store.clone()
} pub fn folder_kv_store(&self) -> Arc<FolderRevisionKV> { self.folder_store.clone() }
} }

View File

@ -1,40 +1,38 @@
use crate::{
services::kv::{KVStore, KeyValue},
util::serde_ext::parse_from_bytes,
};
use anyhow::Context; use anyhow::Context;
use backend_service::errors::{internal_error, ServerError}; use backend_service::errors::{internal_error, ServerError};
use bytes::Bytes;
use flowy_collaboration::{ use flowy_collaboration::{
protobuf::{ protobuf::{CreateDocParams, DocumentId, DocumentInfo, ResetDocumentParams},
CreateDocParams, DocumentId, DocumentInfo, RepeatedRevision as RepeatedRevisionPB, ResetDocumentParams, server_document::ServerDocumentManager,
Revision as RevisionPB, util::make_document_info_pb_from_revisions_pb,
},
sync::ServerDocumentManager,
}; };
use lib_ot::{core::OperationTransformable, rich_text::RichTextDelta};
use protobuf::Message; use crate::services::kv::revision_kv::RevisionKVPersistence;
use std::sync::Arc; use std::sync::Arc;
use uuid::Uuid; 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( pub(crate) async fn create_document(
kv_store: &Arc<DocumentKVPersistence>, document_store: &Arc<RevisionKVPersistence>,
mut params: CreateDocParams, mut params: CreateDocParams,
) -> Result<(), ServerError> { ) -> Result<(), ServerError> {
let revisions = params.take_revisions().take_items(); 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(()) Ok(())
} }
#[tracing::instrument(level = "debug", skip(kv_store), err)] #[tracing::instrument(level = "trace", skip(document_store), err)]
pub async fn read_document( pub async fn read_document(
kv_store: &Arc<DocumentKVPersistence>, document_store: &Arc<RevisionKVPersistence>,
params: DocumentId, params: DocumentId,
) -> Result<DocumentInfo, ServerError> { ) -> Result<DocumentInfo, ServerError> {
let _ = Uuid::parse_str(&params.doc_id).context("Parse document id to uuid failed")?; let _ = Uuid::parse_str(&params.doc_id).context("Parse document id to uuid failed")?;
let revisions = kv_store.batch_get_revisions(&params.doc_id, None).await?; let revisions = document_store.get_revisions(&params.doc_id, None).await?;
make_doc_from_revisions(&params.doc_id, revisions) match make_document_info_pb_from_revisions_pb(&params.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)] #[tracing::instrument(level = "debug", skip(document_manager, params), fields(delta), err)]
@ -54,167 +52,12 @@ pub async fn reset_document(
Ok(()) Ok(())
} }
#[tracing::instrument(level = "debug", skip(kv_store), err)] #[tracing::instrument(level = "trace", skip(document_store), err)]
pub(crate) async fn delete_document(kv_store: &Arc<DocumentKVPersistence>, doc_id: Uuid) -> Result<(), ServerError> { pub(crate) async fn delete_document(
let _ = kv_store.batch_delete_revisions(&doc_id.to_string(), None).await?; 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(()) 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)
}

View File

@ -12,7 +12,7 @@ use flowy_collaboration::{
protobuf::{ protobuf::{
CreateDocParams as CreateDocParamsPB, DocumentId as DocumentIdPB, ResetDocumentParams as ResetDocumentParamsPB, CreateDocParams as CreateDocParamsPB, DocumentId as DocumentIdPB, ResetDocumentParams as ResetDocumentParamsPB,
}, },
sync::ServerDocumentManager, server_document::ServerDocumentManager,
}; };
use std::sync::Arc; use std::sync::Arc;
@ -21,7 +21,7 @@ pub async fn create_document_handler(
persistence: Data<Arc<FlowyPersistence>>, persistence: Data<Arc<FlowyPersistence>>,
) -> Result<HttpResponse, ServerError> { ) -> Result<HttpResponse, ServerError> {
let params: CreateDocParamsPB = parse_from_payload(payload).await?; 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?; let _ = create_document(&kv_store, params).await?;
Ok(FlowyResponse::success().into()) Ok(FlowyResponse::success().into())
} }
@ -32,7 +32,7 @@ pub async fn read_document_handler(
persistence: Data<Arc<FlowyPersistence>>, persistence: Data<Arc<FlowyPersistence>>,
) -> Result<HttpResponse, ServerError> { ) -> Result<HttpResponse, ServerError> {
let params: DocumentIdPB = parse_from_payload(payload).await?; 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 doc = read_document(&kv_store, params).await?;
let response = FlowyResponse::success().pb(doc)?; let response = FlowyResponse::success().pb(doc)?;
Ok(response.into()) Ok(response.into())

View File

@ -7,18 +7,22 @@ use actix_rt::task::spawn_blocking;
use async_stream::stream; use async_stream::stream;
use backend_service::errors::{internal_error, Result, ServerError}; use backend_service::errors::{internal_error, Result, ServerError};
use crate::services::web_socket::revision_data_to_ws_message;
use flowy_collaboration::{ use flowy_collaboration::{
protobuf::{ protobuf::{
DocumentClientWSData as DocumentClientWSDataPB, DocumentClientWSDataType as DocumentClientWSDataTypePB, ClientRevisionWSData as ClientRevisionWSDataPB,
ClientRevisionWSDataType as ClientRevisionWSDataTypePB,
Revision as RevisionPB, Revision as RevisionPB,
}, },
sync::{RevisionUser, ServerDocumentManager, SyncResponse}, server_document::ServerDocumentManager,
synchronizer::{RevisionSyncResponse, RevisionUser},
}; };
use futures::stream::StreamExt; use futures::stream::StreamExt;
use lib_ws::WSChannel;
use std::sync::Arc; use std::sync::Arc;
use tokio::sync::{mpsc, oneshot}; use tokio::sync::{mpsc, oneshot};
pub enum WSActorMessage { pub enum DocumentWSActorMessage {
ClientData { ClientData {
client_data: WSClientData, client_data: WSClientData,
persistence: Arc<FlowyPersistence>, persistence: Arc<FlowyPersistence>,
@ -27,27 +31,27 @@ pub enum WSActorMessage {
} }
pub struct DocumentWebSocketActor { pub struct DocumentWebSocketActor {
receiver: Option<mpsc::Receiver<WSActorMessage>>, actor_msg_receiver: Option<mpsc::Receiver<DocumentWSActorMessage>>,
doc_manager: Arc<ServerDocumentManager>, doc_manager: Arc<ServerDocumentManager>,
} }
impl DocumentWebSocketActor { 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 { Self {
receiver: Some(receiver), actor_msg_receiver: Some(receiver),
doc_manager: manager, doc_manager: manager,
} }
} }
pub async fn run(mut self) { pub async fn run(mut self) {
let mut receiver = self let mut actor_msg_receiver = self
.receiver .actor_msg_receiver
.take() .take()
.expect("DocActor's receiver should only take one time"); .expect("DocumentWebSocketActor's receiver should only take one time");
let stream = stream! { let stream = stream! {
loop { loop {
match receiver.recv().await { match actor_msg_receiver.recv().await {
Some(msg) => yield msg, Some(msg) => yield msg,
None => break, None => break,
} }
@ -57,52 +61,47 @@ impl DocumentWebSocketActor {
stream.for_each(|msg| self.handle_message(msg)).await; 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 { match msg {
WSActorMessage::ClientData { DocumentWSActorMessage::ClientData {
client_data, client_data,
persistence, persistence: _,
ret, 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 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 .await
.map_err(internal_error)??; .map_err(internal_error)??;
tracing::debug!( tracing::trace!(
"[DocumentWebSocketActor]: receive: {}:{}, {:?}", "[DocumentWebSocketActor]: receive: {}:{}, {:?}",
document_client_data.doc_id, document_client_data.object_id,
document_client_data.id, document_client_data.data_id,
document_client_data.ty document_client_data.ty
); );
let user = Arc::new(ServerDocUser { let user = Arc::new(DocumentRevisionUser { user, socket });
user,
socket,
persistence,
});
match &document_client_data.ty { match &document_client_data.ty {
DocumentClientWSDataTypePB::ClientPushRev => { ClientRevisionWSDataTypePB::ClientPushRev => {
let _ = self let _ = self
.doc_manager .doc_manager
.handle_client_revisions(user, document_client_data) .handle_client_revisions(user, document_client_data)
.await .await
.map_err(internal_error)?; .map_err(internal_error)?;
} },
DocumentClientWSDataTypePB::ClientPing => { ClientRevisionWSDataTypePB::ClientPing => {
let _ = self let _ = self
.doc_manager .doc_manager
.handle_client_ping(user, document_client_data) .handle_client_ping(user, document_client_data)
.await .await
.map_err(internal_error)?; .map_err(internal_error)?;
} },
} }
Ok(()) Ok(())
@ -118,56 +117,42 @@ fn verify_md5(revision: &RevisionPB) -> Result<()> {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct ServerDocUser { pub struct DocumentRevisionUser {
pub user: Arc<WSUser>, pub user: Arc<WSUser>,
pub(crate) socket: Socket, 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 { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
f.debug_struct("ServerDocUser") f.debug_struct("DocumentRevisionUser")
.field("user", &self.user) .field("user", &self.user)
.field("socket", &self.socket) .field("socket", &self.socket)
.finish() .finish()
} }
} }
impl RevisionUser for ServerDocUser { impl RevisionUser for DocumentRevisionUser {
fn user_id(&self) -> String { fn user_id(&self) -> String { self.user.id().to_string() }
self.user.id().to_string()
}
fn receive(&self, resp: SyncResponse) { fn receive(&self, resp: RevisionSyncResponse) {
let result = match resp { let result = match resp {
SyncResponse::Pull(data) => { RevisionSyncResponse::Pull(data) => {
let msg: WebSocketMessage = data.into(); let msg: WebSocketMessage = revision_data_to_ws_message(data, WSChannel::Document);
self.socket.try_send(msg).map_err(internal_error) self.socket.try_send(msg).map_err(internal_error)
} },
SyncResponse::Push(data) => { RevisionSyncResponse::Push(data) => {
let msg: WebSocketMessage = data.into(); let msg: WebSocketMessage = revision_data_to_ws_message(data, WSChannel::Document);
self.socket.try_send(msg).map_err(internal_error) self.socket.try_send(msg).map_err(internal_error)
} },
SyncResponse::Ack(data) => { RevisionSyncResponse::Ack(data) => {
let msg: WebSocketMessage = data.into(); let msg: WebSocketMessage = revision_data_to_ws_message(data, WSChannel::Document);
self.socket.try_send(msg).map_err(internal_error) 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 { match result {
Ok(_) => {} Ok(_) => {},
Err(e) => log::error!("[ServerDocUser]: {}", e), Err(e) => log::error!("[DocumentRevisionUser]: {}", e),
} }
} }
} }

View File

@ -1,23 +1,26 @@
use crate::{ use crate::{
context::FlowyPersistence, context::{DocumentRevisionKV, FlowyPersistence},
services::{ services::{
document::{ document::{
persistence::{create_document, read_document, revisions_to_key_value_items}, persistence::{create_document, read_document},
ws_actor::{DocumentWebSocketActor, WSActorMessage}, ws_actor::{DocumentWSActorMessage, DocumentWebSocketActor},
}, },
kv::revision_kv::revisions_to_key_value_items,
web_socket::{WSClientData, WebSocketReceiver}, web_socket::{WSClientData, WebSocketReceiver},
}, },
}; };
use backend_service::errors::ServerError; use backend_service::errors::ServerError;
use flowy_collaboration::{ use flowy_collaboration::{
entities::doc::DocumentInfo, entities::document_info::DocumentInfo,
errors::CollaborateError, errors::CollaborateError,
protobuf::{ protobuf::{
CreateDocParams as CreateDocParamsPB, DocumentId, RepeatedRevision as RepeatedRevisionPB, CreateDocParams as CreateDocParamsPB,
DocumentId,
RepeatedRevision as RepeatedRevisionPB,
Revision as RevisionPB, Revision as RevisionPB,
}, },
sync::{DocumentPersistence, ServerDocumentManager}, server_document::{DocumentCloudPersistence, ServerDocumentManager},
util::repeated_revision_from_repeated_revision_pb, util::make_document_info_from_revisions_pb,
}; };
use lib_infra::future::BoxResultFuture; use lib_infra::future::BoxResultFuture;
use std::{ use std::{
@ -31,67 +34,68 @@ pub fn make_document_ws_receiver(
persistence: Arc<FlowyPersistence>, persistence: Arc<FlowyPersistence>,
document_manager: Arc<ServerDocumentManager>, document_manager: Arc<ServerDocumentManager>,
) -> Arc<DocumentWebSocketReceiver> { ) -> 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); let actor = DocumentWebSocketActor::new(rx, document_manager);
tokio::task::spawn(actor.run()); tokio::task::spawn(actor.run());
Arc::new(DocumentWebSocketReceiver::new(persistence, ws_sender)) Arc::new(DocumentWebSocketReceiver::new(persistence, actor_msg_sender))
} }
pub struct DocumentWebSocketReceiver { pub struct DocumentWebSocketReceiver {
ws_sender: mpsc::Sender<WSActorMessage>, actor_msg_sender: mpsc::Sender<DocumentWSActorMessage>,
persistence: Arc<FlowyPersistence>, persistence: Arc<FlowyPersistence>,
} }
impl DocumentWebSocketReceiver { impl DocumentWebSocketReceiver {
pub fn new(persistence: Arc<FlowyPersistence>, ws_sender: mpsc::Sender<WSActorMessage>) -> Self { pub fn new(persistence: Arc<FlowyPersistence>, actor_msg_sender: mpsc::Sender<DocumentWSActorMessage>) -> Self {
Self { ws_sender, persistence } Self {
actor_msg_sender,
persistence,
}
} }
} }
impl WebSocketReceiver for DocumentWebSocketReceiver { impl WebSocketReceiver for DocumentWebSocketReceiver {
fn receive(&self, data: WSClientData) { fn receive(&self, data: WSClientData) {
let (ret, rx) = oneshot::channel(); 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(); let persistence = self.persistence.clone();
actix_rt::spawn(async move { actix_rt::spawn(async move {
let msg = WSActorMessage::ClientData { let msg = DocumentWSActorMessage::ClientData {
client_data: data, client_data: data,
persistence, persistence,
ret, ret,
}; };
match sender.send(msg).await { match actor_msg_sender.send(msg).await {
Ok(_) => {} Ok(_) => {},
Err(e) => log::error!("{}", e), Err(e) => log::error!("[DocumentWebSocketReceiver]: send message to actor failed: {}", e),
} }
match rx.await { match rx.await {
Ok(_) => {} Ok(_) => {},
Err(e) => log::error!("{:?}", e), Err(e) => log::error!("[DocumentWebSocketReceiver]: message ret failed {:?}", e),
}; };
}); });
} }
} }
pub struct DocumentPersistenceImpl(pub Arc<FlowyPersistence>); pub struct HttpDocumentCloudPersistence(pub Arc<DocumentRevisionKV>);
impl Debug for DocumentPersistenceImpl { impl Debug for HttpDocumentCloudPersistence {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { f.write_str("HttpDocumentCloudPersistence") }
f.write_str("DocumentPersistenceImpl")
}
} }
impl DocumentPersistence for DocumentPersistenceImpl { impl DocumentCloudPersistence for HttpDocumentCloudPersistence {
fn read_doc(&self, doc_id: &str) -> BoxResultFuture<DocumentInfo, CollaborateError> { fn read_document(&self, doc_id: &str) -> BoxResultFuture<DocumentInfo, CollaborateError> {
let params = DocumentId { let params = DocumentId {
doc_id: doc_id.to_string(), doc_id: doc_id.to_string(),
..Default::default() ..Default::default()
}; };
let kv_store = self.0.kv_store(); let document_store = self.0.clone();
Box::pin(async move { Box::pin(async move {
let mut pb_doc = read_document(&kv_store, params) let mut pb_doc = read_document(&document_store, params)
.await .await
.map_err(server_error_to_collaborate_error)?; .map_err(|e| e.to_collaborate_error())?;
let doc = (&mut pb_doc) let doc = (&mut pb_doc)
.try_into() .try_into()
.map_err(|e| CollaborateError::internal().context(e))?; .map_err(|e| CollaborateError::internal().context(e))?;
@ -99,47 +103,53 @@ impl DocumentPersistence for DocumentPersistenceImpl {
}) })
} }
fn create_doc( fn create_document(
&self, &self,
doc_id: &str, doc_id: &str,
repeated_revision: RepeatedRevisionPB, repeated_revision: RepeatedRevisionPB,
) -> BoxResultFuture<DocumentInfo, CollaborateError> { ) -> BoxResultFuture<Option<DocumentInfo>, CollaborateError> {
let kv_store = self.0.kv_store(); let document_store = self.0.clone();
let doc_id = doc_id.to_owned(); let doc_id = doc_id.to_owned();
Box::pin(async move { Box::pin(async move {
let revisions = repeated_revision_from_repeated_revision_pb(repeated_revision.clone())?.into_inner(); let document_info = make_document_info_from_revisions_pb(&doc_id, repeated_revision.clone())?;
let doc = DocumentInfo::from_revisions(&doc_id, revisions)?;
let doc_id = doc_id.to_owned(); let doc_id = doc_id.to_owned();
let mut params = CreateDocParamsPB::new(); let mut params = CreateDocParamsPB::new();
params.set_id(doc_id); params.set_id(doc_id);
params.set_revisions(repeated_revision); params.set_revisions(repeated_revision);
let _ = create_document(&kv_store, params) let _ = create_document(&document_store, params)
.await .await
.map_err(server_error_to_collaborate_error)?; .map_err(|e| e.to_collaborate_error())?;
Ok(doc) Ok(document_info)
}) })
} }
fn get_revisions(&self, doc_id: &str, rev_ids: Vec<i64>) -> BoxResultFuture<Vec<RevisionPB>, CollaborateError> { fn read_document_revisions(
let kv_store = self.0.kv_store(); &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 doc_id = doc_id.to_owned();
let f = || async move { let f = || async move {
let mut repeated_revision = kv_store.batch_get_revisions(&doc_id, rev_ids).await?; let mut repeated_revision = document_store.get_revisions(&doc_id, rev_ids).await?;
Ok(repeated_revision.take_items().into()) 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> { fn save_document_revisions(
let kv_store = self.0.kv_store(); &self,
let doc_id = doc_id.to_owned(); mut repeated_revision: RepeatedRevisionPB,
) -> BoxResultFuture<(), CollaborateError> {
let document_store = self.0.clone();
let f = || async move { let f = || async move {
let mut repeated_revision = kv_store.get_doc_revisions(&doc_id).await?; let revisions = repeated_revision.take_items().into();
Ok(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( fn reset_document(
@ -147,10 +157,10 @@ impl DocumentPersistence for DocumentPersistenceImpl {
doc_id: &str, doc_id: &str,
mut repeated_revision: RepeatedRevisionPB, mut repeated_revision: RepeatedRevisionPB,
) -> BoxResultFuture<(), CollaborateError> { ) -> BoxResultFuture<(), CollaborateError> {
let kv_store = self.0.kv_store(); let document_store = self.0.clone();
let doc_id = doc_id.to_owned(); let doc_id = doc_id.to_owned();
let f = || async move { let f = || async move {
kv_store document_store
.transaction(|mut transaction| { .transaction(|mut transaction| {
Box::pin(async move { Box::pin(async move {
let _ = transaction.batch_delete_key_start_with(&doc_id).await?; let _ = transaction.batch_delete_key_start_with(&doc_id).await?;
@ -161,14 +171,6 @@ impl DocumentPersistence for DocumentPersistenceImpl {
}) })
.await .await
}; };
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 server_error_to_collaborate_error(error: ServerError) -> CollaborateError {
if error.is_record_not_found() {
CollaborateError::record_not_found()
} else {
CollaborateError::internal().context(error)
} }
} }

View File

@ -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::{ use crate::{
entities::logged_user::LoggedUser, 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}, util::sqlx_ext::{map_sqlx_error, DBTransaction, SqlBuilder},
}; };
use backend_service::errors::{invalid_params, ServerError}; use backend_service::errors::{invalid_params, ServerError};

View File

@ -1,6 +1,6 @@
use crate::{ use crate::{
entities::logged_user::LoggedUser, entities::logged_user::LoggedUser,
services::core::app::{ services::folder::app::{
controller::{create_app, delete_app, read_app, update_app}, controller::{create_app, delete_app, read_app, update_app},
persistence::check_app_id, persistence::check_app_id,
}, },

View File

@ -1,5 +1,6 @@
pub mod app; pub mod app;
pub(crate) mod log;
pub mod trash; pub mod trash;
pub mod view; pub mod view;
pub mod workspace; pub mod workspace;
pub(crate) mod ws_actor;
pub(crate) mod ws_receiver;

View File

@ -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}; use flowy_core_data_model::protobuf::{Trash, TrashType};
pub(crate) const TRASH_TABLE: &str = "trash_table"; pub(crate) const TRASH_TABLE: &str = "trash_table";

View File

@ -1,7 +1,7 @@
use crate::{ use crate::{
context::FlowyPersistence, context::FlowyPersistence,
entities::logged_user::LoggedUser, 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, util::serde_ext::parse_from_payload,
}; };
use ::protobuf::ProtobufEnum; use ::protobuf::ProtobufEnum;
@ -48,7 +48,7 @@ pub async fn delete_handler(
logged_user: LoggedUser, logged_user: LoggedUser,
) -> Result<HttpResponse, ServerError> { ) -> Result<HttpResponse, ServerError> {
let pool = persistence.pg_pool(); 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 params: RepeatedTrashId = parse_from_payload(payload).await?;
let mut transaction = pool let mut transaction = pool
.begin() .begin()

View File

@ -1,12 +1,10 @@
use crate::{ use crate::{
context::DocumentRevisionKV,
entities::logged_user::LoggedUser, entities::logged_user::LoggedUser,
services::{ services::folder::{
core::{ app::controller::{delete_app, read_app_table},
app::controller::{delete_app, read_app_table}, trash::persistence::{TrashTable, TRASH_TABLE},
trash::persistence::{TrashTable, TRASH_TABLE}, view::{delete_view, read_view_table},
view::{delete_view, read_view_table},
},
document::persistence::DocumentKVPersistence,
}, },
util::sqlx_ext::{map_sqlx_error, DBTransaction, SqlBuilder}, util::sqlx_ext::{map_sqlx_error, DBTransaction, SqlBuilder},
}; };
@ -39,10 +37,10 @@ pub(crate) async fn create_trash(
Ok(()) 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( pub(crate) async fn delete_all_trash(
transaction: &mut DBTransaction<'_>, transaction: &mut DBTransaction<'_>,
kv_store: &Arc<DocumentKVPersistence>, document_store: &Arc<DocumentRevisionKV>,
user: &LoggedUser, user: &LoggedUser,
) -> Result<(), ServerError> { ) -> Result<(), ServerError> {
let (sql, args) = SqlBuilder::select(TRASH_TABLE) let (sql, args) = SqlBuilder::select(TRASH_TABLE)
@ -57,7 +55,7 @@ pub(crate) async fn delete_all_trash(
.collect::<Vec<(Uuid, i32)>>(); .collect::<Vec<(Uuid, i32)>>();
tracing::Span::current().record("delete_rows", &format!("{:?}", rows).as_str()); tracing::Span::current().record("delete_rows", &format!("{:?}", rows).as_str());
let affected_row_count = rows.len(); 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) let (sql, args) = SqlBuilder::delete(TRASH_TABLE)
.and_where_eq("user_id", &user.user_id) .and_where_eq("user_id", &user.user_id)
@ -72,10 +70,10 @@ pub(crate) async fn delete_all_trash(
Ok(()) Ok(())
} }
#[tracing::instrument(skip(transaction, kv_store), err)] #[tracing::instrument(skip(transaction, document_store), err)]
pub(crate) async fn delete_trash( pub(crate) async fn delete_trash(
transaction: &mut DBTransaction<'_>, transaction: &mut DBTransaction<'_>,
kv_store: &Arc<DocumentKVPersistence>, document_store: &Arc<DocumentRevisionKV>,
records: Vec<(Uuid, i32)>, records: Vec<(Uuid, i32)>,
) -> Result<(), ServerError> { ) -> Result<(), ServerError> {
for (trash_id, _) in records { for (trash_id, _) in records {
@ -92,7 +90,7 @@ pub(crate) async fn delete_trash(
let _ = delete_trash_associate_targets( let _ = delete_trash_associate_targets(
transaction as &mut DBTransaction<'_>, transaction as &mut DBTransaction<'_>,
kv_store, document_store,
vec![(trash_table.id, trash_table.ty)], vec![(trash_table.id, trash_table.ty)],
) )
.await?; .await?;
@ -107,23 +105,23 @@ pub(crate) async fn delete_trash(
Ok(()) Ok(())
} }
#[tracing::instrument(skip(transaction, kv_store, targets), err)] #[tracing::instrument(skip(transaction, document_store, targets), err)]
async fn delete_trash_associate_targets( async fn delete_trash_associate_targets(
transaction: &mut DBTransaction<'_>, transaction: &mut DBTransaction<'_>,
kv_store: &Arc<DocumentKVPersistence>, document_store: &Arc<DocumentRevisionKV>,
targets: Vec<(Uuid, i32)>, targets: Vec<(Uuid, i32)>,
) -> Result<(), ServerError> { ) -> Result<(), ServerError> {
for (id, ty) in targets { for (id, ty) in targets {
match TrashType::from_i32(ty) { match TrashType::from_i32(ty) {
None => log::error!("Parser trash type with value: {} failed", ty), None => log::error!("Parser trash type with value: {} failed", ty),
Some(ty) => match ty { Some(ty) => match ty {
TrashType::Unknown => {} TrashType::Unknown => {},
TrashType::View => { 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 => { TrashType::App => {
let _ = delete_app(transaction as &mut DBTransaction<'_>, id).await; 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) { match TrashType::from_i32(table.ty) {
None => log::error!("Parser trash type with value: {} failed", table.ty), None => log::error!("Parser trash type with value: {} failed", table.ty),
Some(ty) => match ty { Some(ty) => match ty {
TrashType::Unknown => {} TrashType::Unknown => {},
TrashType::View => { TrashType::View => {
trash.push(read_view_table(table.id, transaction).await?.into()); trash.push(read_view_table(table.id, transaction).await?.into());
} },
TrashType::App => { TrashType::App => {
trash.push(read_app_table(table.id, transaction).await?.into()); trash.push(read_app_table(table.id, transaction).await?.into());
} },
}, },
} }
} }

View File

@ -1,15 +1,17 @@
use crate::{ use crate::{
entities::logged_user::LoggedUser, entities::logged_user::LoggedUser,
services::{ services::{
core::{trash::read_trash_ids, view::persistence::*}, document::persistence::{create_document, delete_document},
document::persistence::{create_document, delete_document, DocumentKVPersistence}, folder::{trash::read_trash_ids, view::persistence::*},
}, },
util::sqlx_ext::{map_sqlx_error, DBTransaction, SqlBuilder}, util::sqlx_ext::{map_sqlx_error, DBTransaction, SqlBuilder},
}; };
use backend_service::errors::{invalid_params, ServerError}; use backend_service::errors::{invalid_params, ServerError};
use bytes::Bytes;
use crate::context::DocumentRevisionKV;
use chrono::Utc; use chrono::Utc;
use flowy_collaboration::{ use flowy_collaboration::{
client_document::default::initial_delta,
entities::revision::{RepeatedRevision, Revision}, entities::revision::{RepeatedRevision, Revision},
protobuf::CreateDocParams as CreateDocParamsPB, protobuf::CreateDocParams as CreateDocParamsPB,
}; };
@ -47,10 +49,10 @@ pub(crate) async fn update_view(
Ok(()) Ok(())
} }
#[tracing::instrument(skip(transaction, kv_store), err)] #[tracing::instrument(skip(transaction, document_store), err)]
pub(crate) async fn delete_view( pub(crate) async fn delete_view(
transaction: &mut DBTransaction<'_>, transaction: &mut DBTransaction<'_>,
kv_store: &Arc<DocumentKVPersistence>, document_store: &Arc<DocumentRevisionKV>,
view_ids: Vec<Uuid>, view_ids: Vec<Uuid>,
) -> Result<(), ServerError> { ) -> Result<(), ServerError> {
for view_id in view_ids { for view_id in view_ids {
@ -60,15 +62,15 @@ pub(crate) async fn delete_view(
.await .await
.map_err(map_sqlx_error)?; .map_err(map_sqlx_error)?;
let _ = delete_document(kv_store, view_id).await?; let _ = delete_document(document_store, view_id).await?;
} }
Ok(()) 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( pub(crate) async fn create_view(
transaction: &mut DBTransaction<'_>, transaction: &mut DBTransaction<'_>,
kv_store: Arc<DocumentKVPersistence>, document_store: Arc<DocumentRevisionKV>,
params: CreateViewParamsPB, params: CreateViewParamsPB,
user_id: &str, user_id: &str,
) -> Result<ViewPB, ServerError> { ) -> Result<ViewPB, ServerError> {
@ -90,14 +92,14 @@ pub(crate) async fn create_view(
.await .await
.map_err(map_sqlx_error)?; .map_err(map_sqlx_error)?;
let delta_data = Bytes::from(params.view_data); let initial_delta_data = initial_delta().to_bytes();
let md5 = format!("{:x}", md5::compute(&delta_data)); let md5 = format!("{:x}", md5::compute(&initial_delta_data));
let revision = Revision::new(&view.id, 0, 0, delta_data, user_id, md5); let revision = Revision::new(&view.id, 0, 0, initial_delta_data, user_id, md5);
let repeated_revision = RepeatedRevision::new(vec![revision]); let repeated_revision = RepeatedRevision::new(vec![revision]);
let mut create_doc_params = CreateDocParamsPB::new(); let mut create_doc_params = CreateDocParamsPB::new();
create_doc_params.set_revisions(repeated_revision.try_into().unwrap()); create_doc_params.set_revisions(repeated_revision.try_into().unwrap());
create_doc_params.set_id(view.id.clone()); 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) Ok(view)
} }

View File

@ -1,10 +1,12 @@
use crate::{ use crate::{
context::FlowyPersistence, context::FlowyPersistence,
entities::logged_user::LoggedUser, entities::logged_user::LoggedUser,
services::core::view::{ services::folder::view::{
create_view, delete_view, create_view,
delete_view,
persistence::{check_view_id, check_view_ids}, persistence::{check_view_id, check_view_ids},
read_view, update_view, read_view,
update_view,
}, },
util::serde_ext::parse_from_payload, util::serde_ext::parse_from_payload,
}; };
@ -20,8 +22,10 @@ use backend_service::{
use flowy_core_data_model::{ use flowy_core_data_model::{
parser::view::{ViewDesc, ViewName, ViewThumbnail}, parser::view::{ViewDesc, ViewName, ViewThumbnail},
protobuf::{ protobuf::{
CreateViewParams as CreateViewParamsPB, QueryViewRequest as QueryViewRequestPB, CreateViewParams as CreateViewParamsPB,
UpdateViewParams as UpdateViewParamsPB, ViewId as ViewIdPB, QueryViewRequest as QueryViewRequestPB,
UpdateViewParams as UpdateViewParamsPB,
ViewId as ViewIdPB,
}, },
}; };
use sqlx::PgPool; use sqlx::PgPool;
@ -33,7 +37,7 @@ pub async fn create_handler(
user: LoggedUser, user: LoggedUser,
) -> Result<HttpResponse, ServerError> { ) -> Result<HttpResponse, ServerError> {
let params: CreateViewParamsPB = parse_from_payload(payload).await?; 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 pool = persistence.pg_pool();
let mut transaction = pool let mut transaction = pool
.begin() .begin()
@ -110,7 +114,7 @@ pub async fn delete_handler(
) -> Result<HttpResponse, ServerError> { ) -> Result<HttpResponse, ServerError> {
let params: QueryViewRequestPB = parse_from_payload(payload).await?; let params: QueryViewRequestPB = parse_from_payload(payload).await?;
let pool = persistence.pg_pool(); 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 view_ids = check_view_ids(params.view_ids.to_vec())?;
let mut transaction = pool let mut transaction = pool
.begin() .begin()

View File

@ -1,7 +1,7 @@
use super::persistence::NewWorkspaceBuilder; use super::persistence::NewWorkspaceBuilder;
use crate::{ use crate::{
entities::logged_user::LoggedUser, entities::logged_user::LoggedUser,
services::core::{ services::folder::{
app::{controller::read_app, persistence::AppTable}, app::{controller::read_app, persistence::AppTable},
workspace::persistence::*, workspace::persistence::*,
}, },

View File

@ -1,7 +1,11 @@
use crate::{ use crate::{
entities::logged_user::LoggedUser, entities::logged_user::LoggedUser,
services::core::workspace::{ services::folder::workspace::{
create_workspace, delete_workspace, persistence::check_workspace_id, read_workspaces, update_workspace, create_workspace,
delete_workspace,
persistence::check_workspace_id,
read_workspaces,
update_workspace,
}, },
util::serde_ext::parse_from_payload, util::serde_ext::parse_from_payload,
}; };
@ -17,7 +21,8 @@ use backend_service::{
use flowy_core_data_model::{ use flowy_core_data_model::{
parser::workspace::{WorkspaceDesc, WorkspaceName}, parser::workspace::{WorkspaceDesc, WorkspaceName},
protobuf::{ protobuf::{
CreateWorkspaceParams as CreateWorkspaceParamsPB, UpdateWorkspaceParams as UpdateWorkspaceParamsPB, CreateWorkspaceParams as CreateWorkspaceParamsPB,
UpdateWorkspaceParams as UpdateWorkspaceParamsPB,
WorkspaceId as WorkspaceIdPB, WorkspaceId as WorkspaceIdPB,
}, },
}; };
@ -105,7 +110,7 @@ pub async fn update_handler(
.map_err(invalid_params)? .map_err(invalid_params)?
.0; .0;
Some(name) Some(name)
} },
}; };
let desc = match params.has_desc() { let desc = match params.has_desc() {
@ -115,7 +120,7 @@ pub async fn update_handler(
.map_err(invalid_params)? .map_err(invalid_params)?
.0; .0;
Some(desc) Some(desc)
} },
}; };
let mut transaction = pool let mut transaction = pool

View 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),
}
}
}

View 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(())
})
}
}

View File

@ -1,5 +1,6 @@
#![allow(clippy::module_inception)] #![allow(clippy::module_inception)]
mod kv; mod kv;
pub mod revision_kv;
use async_trait::async_trait; use async_trait::async_trait;
use bytes::Bytes; use bytes::Bytes;

View 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) }

View File

@ -28,7 +28,7 @@ impl Builder {
let env_filter = EnvFilter::new(self.env_filter); let env_filter = EnvFilter::new(self.env_filter);
let subscriber = tracing_subscriber::fmt() let subscriber = tracing_subscriber::fmt()
.with_target(true) .with_target(true)
.with_max_level(tracing::Level::DEBUG) .with_max_level(tracing::Level::TRACE)
.with_writer(std::io::stderr) .with_writer(std::io::stderr)
.with_thread_ids(true) .with_thread_ids(true)
.compact() .compact()

View File

@ -1,5 +1,6 @@
pub mod core;
pub mod document; pub mod document;
pub mod folder;
pub mod kv; pub mod kv;
pub(crate) mod log;
pub mod user; pub mod user;
pub mod web_socket; pub mod web_socket;

View File

@ -1,7 +1,7 @@
use actix::Message; use actix::Message;
use bytes::Bytes; use bytes::Bytes;
use flowy_collaboration::entities::ws::{DocumentClientWSData, DocumentServerWSData}; use flowy_collaboration::entities::ws_data::ServerRevisionWSData;
use lib_ws::{WSModule, WebSocketRawMessage}; use lib_ws::{WSChannel, WebSocketRawMessage};
use std::convert::TryInto; use std::convert::TryInto;
#[derive(Debug, Message, Clone)] #[derive(Debug, Message, Clone)]
@ -16,27 +16,12 @@ impl std::ops::Deref for WebSocketMessage {
} }
} }
impl std::convert::From<DocumentClientWSData> for WebSocketMessage { pub fn revision_data_to_ws_message(data: ServerRevisionWSData, channel: WSChannel) -> WebSocketMessage {
fn from(data: DocumentClientWSData) -> Self { let bytes: Bytes = data.try_into().unwrap();
let bytes: Bytes = data.try_into().unwrap(); let msg = WebSocketRawMessage {
let msg = WebSocketRawMessage { channel,
module: WSModule::Doc, data: bytes.to_vec(),
data: bytes.to_vec(), };
}; let bytes: Bytes = msg.try_into().unwrap();
WebSocketMessage(bytes)
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)
}
} }

View File

@ -3,37 +3,38 @@ use crate::{
entities::logged_user::LoggedUser, entities::logged_user::LoggedUser,
services::web_socket::{ services::web_socket::{
entities::{Connect, Disconnect, Socket}, entities::{Connect, Disconnect, Socket},
WSServer, WebSocketMessage, WSServer,
WebSocketMessage,
}, },
}; };
use actix::*; use actix::*;
use actix_web::web::Data; use actix_web::web::Data;
use actix_web_actors::{ws, ws::Message::Text}; use actix_web_actors::{ws, ws::Message::Text};
use bytes::Bytes; use bytes::Bytes;
use lib_ws::{WSModule, WebSocketRawMessage}; use lib_ws::{WSChannel, WebSocketRawMessage};
use std::{collections::HashMap, convert::TryFrom, sync::Arc, time::Instant}; use std::{collections::HashMap, convert::TryFrom, sync::Arc, time::Instant};
pub trait WebSocketReceiver: Send + Sync { pub trait WebSocketReceiver: Send + Sync {
fn receive(&self, data: WSClientData); fn receive(&self, data: WSClientData);
} }
#[derive(Default)]
pub struct WebSocketReceivers { 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 { impl WebSocketReceivers {
pub fn new() -> Self { pub fn new() -> Self { WebSocketReceivers::default() }
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>) { pub fn get(&self, source: &WSChannel) -> Option<Arc<dyn WebSocketReceiver>> { self.inner.get(source).cloned() }
self.inner.insert(source, receiver);
}
pub fn get(&self, source: &WSModule) -> Option<Arc<dyn WebSocketReceiver>> {
self.inner.get(source).cloned()
}
} }
#[derive(Debug)] #[derive(Debug)]
@ -42,13 +43,9 @@ pub struct WSUser {
} }
impl WSUser { impl WSUser {
pub fn new(inner: LoggedUser) -> Self { pub fn new(inner: LoggedUser) -> Self { Self { inner } }
Self { inner }
}
pub fn id(&self) -> &str { pub fn id(&self) -> &str { &self.inner.user_id }
&self.inner.user_id
}
} }
pub struct WSClientData { pub struct WSClientData {
@ -90,10 +87,10 @@ impl WSClient {
fn handle_binary_message(&self, bytes: Bytes, socket: Socket) { fn handle_binary_message(&self, bytes: Bytes, socket: Socket) {
// TODO: ok to unwrap? // TODO: ok to unwrap?
let message: WebSocketRawMessage = WebSocketRawMessage::try_from(bytes).unwrap(); let message: WebSocketRawMessage = WebSocketRawMessage::try_from(bytes).unwrap();
match self.ws_receivers.get(&message.module) { match self.ws_receivers.get(&message.channel) {
None => { None => {
log::error!("Can't find the receiver for {:?}", message.module); log::error!("Can't find the receiver for {:?}", message.channel);
} },
Some(handler) => { Some(handler) => {
let client_data = WSClientData { let client_data = WSClientData {
user: self.user.clone(), user: self.user.clone(),
@ -101,7 +98,7 @@ impl WSClient {
data: Bytes::from(message.data), data: Bytes::from(message.data),
}; };
handler.receive(client_data); handler.receive(client_data);
} },
} }
} }
} }
@ -112,28 +109,28 @@ impl StreamHandler<Result<ws::Message, ws::ProtocolError>> for WSClient {
Ok(ws::Message::Ping(msg)) => { Ok(ws::Message::Ping(msg)) => {
self.hb = Instant::now(); self.hb = Instant::now();
ctx.pong(&msg); ctx.pong(&msg);
} },
Ok(ws::Message::Pong(_msg)) => { Ok(ws::Message::Pong(_msg)) => {
// tracing::debug!("Receive {} pong {:?}", &self.session_id, &msg); // tracing::debug!("Receive {} pong {:?}", &self.session_id, &msg);
self.hb = Instant::now(); self.hb = Instant::now();
} },
Ok(ws::Message::Binary(bytes)) => { Ok(ws::Message::Binary(bytes)) => {
let socket = ctx.address().recipient(); let socket = ctx.address().recipient();
self.handle_binary_message(bytes, socket); self.handle_binary_message(bytes, socket);
} },
Ok(Text(_)) => { Ok(Text(_)) => {
log::warn!("Receive unexpected text message"); log::warn!("Receive unexpected text message");
} },
Ok(ws::Message::Close(reason)) => { Ok(ws::Message::Close(reason)) => {
ctx.close(reason); ctx.close(reason);
ctx.stop(); ctx.stop();
} },
Ok(ws::Message::Continuation(_)) => {} Ok(ws::Message::Continuation(_)) => {},
Ok(ws::Message::Nop) => {} Ok(ws::Message::Nop) => {},
Err(e) => { Err(e) => {
log::error!("[{}]: WebSocketStream protocol error {:?}", self.user.id(), e); log::error!("[{}]: WebSocketStream protocol error {:?}", self.user.id(), e);
ctx.stop(); ctx.stop();
} },
} }
} }
} }
@ -141,9 +138,7 @@ impl StreamHandler<Result<ws::Message, ws::ProtocolError>> for WSClient {
impl Handler<WebSocketMessage> for WSClient { impl Handler<WebSocketMessage> for WSClient {
type Result = (); type Result = ();
fn handle(&mut self, msg: WebSocketMessage, ctx: &mut Self::Context) { fn handle(&mut self, msg: WebSocketMessage, ctx: &mut Self::Context) { ctx.binary(msg.0); }
ctx.binary(msg.0);
}
} }
impl Actor for WSClient { impl Actor for WSClient {

View File

@ -5,7 +5,7 @@ use std::str;
#[actix_rt::test] #[actix_rt::test]
async fn kv_set_test() { async fn kv_set_test() {
let server = spawn_server().await; 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 s1 = "123".to_string();
let key = "1"; let key = "1";
@ -18,7 +18,7 @@ async fn kv_set_test() {
#[actix_rt::test] #[actix_rt::test]
async fn kv_delete_test() { async fn kv_delete_test() {
let server = spawn_server().await; 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 s1 = "123".to_string();
let key = "1"; let key = "1";
@ -30,7 +30,7 @@ async fn kv_delete_test() {
#[actix_rt::test] #[actix_rt::test]
async fn kv_batch_set_test() { async fn kv_batch_set_test() {
let server = spawn_server().await; 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![ let kvs = vec![
KeyValue { KeyValue {
key: "1".to_string(), key: "1".to_string(),
@ -54,7 +54,7 @@ async fn kv_batch_set_test() {
#[actix_rt::test] #[actix_rt::test]
async fn kv_batch_get_start_with_test() { async fn kv_batch_get_start_with_test() {
let server = spawn_server().await; 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![ let kvs = vec![
KeyValue { KeyValue {
key: "abc:1".to_string(), key: "abc:1".to_string(),

View File

@ -1,10 +1,10 @@
#![allow(clippy::all)] #![allow(clippy::all)]
use crate::util::helper::{ViewTest, *}; use crate::util::helper::{BackendViewTest, *};
use flowy_collaboration::{ use flowy_collaboration::{
document::{Document, PlainDoc}, client_document::{ClientDocument, PlainDoc},
entities::{ entities::{
doc::{CreateDocParams, DocumentId}, document_info::{CreateDocParams, DocumentId},
revision::{md5, RepeatedRevision, Revision}, revision::{md5, RepeatedRevision, Revision},
}, },
}; };
@ -17,13 +17,13 @@ use flowy_core_data_model::entities::{
#[actix_rt::test] #[actix_rt::test]
async fn workspace_create() { async fn workspace_create() {
let test = WorkspaceTest::new().await; let test = BackendWorkspaceTest::new().await;
tracing::info!("{:?}", test.workspace); tracing::info!("{:?}", test.workspace);
} }
#[actix_rt::test] #[actix_rt::test]
async fn workspace_read() { 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 read_params = WorkspaceId::new(Some(test.workspace.id.clone()));
let repeated_workspace = test.server.read_workspaces(read_params).await; let repeated_workspace = test.server.read_workspaces(read_params).await;
tracing::info!("{:?}", repeated_workspace); tracing::info!("{:?}", repeated_workspace);
@ -31,7 +31,7 @@ async fn workspace_read() {
#[actix_rt::test] #[actix_rt::test]
async fn workspace_read_with_belongs() { 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;
let _ = test.create_app().await; let _ = test.create_app().await;
@ -45,7 +45,7 @@ async fn workspace_read_with_belongs() {
#[actix_rt::test] #[actix_rt::test]
async fn workspace_update() { async fn workspace_update() {
let test = WorkspaceTest::new().await; let test = BackendWorkspaceTest::new().await;
let new_name = "rename workspace name"; let new_name = "rename workspace name";
let new_desc = "rename workspace description"; let new_desc = "rename workspace description";
@ -65,7 +65,7 @@ async fn workspace_update() {
#[actix_rt::test] #[actix_rt::test]
async fn workspace_delete() { async fn workspace_delete() {
let test = WorkspaceTest::new().await; let test = BackendWorkspaceTest::new().await;
let delete_params = WorkspaceId { let delete_params = WorkspaceId {
workspace_id: Some(test.workspace.id.clone()), workspace_id: Some(test.workspace.id.clone()),
}; };
@ -78,20 +78,20 @@ async fn workspace_delete() {
#[actix_rt::test] #[actix_rt::test]
async fn app_create() { async fn app_create() {
let test = AppTest::new().await; let test = BackendAppTest::new().await;
tracing::info!("{:?}", test.app); tracing::info!("{:?}", test.app);
} }
#[actix_rt::test] #[actix_rt::test]
async fn app_read() { async fn app_read() {
let test = AppTest::new().await; let test = BackendAppTest::new().await;
let read_params = AppId::new(&test.app.id); let read_params = AppId::new(&test.app.id);
assert_eq!(test.server.read_app(read_params).await.is_some(), true); assert_eq!(test.server.read_app(read_params).await.is_some(), true);
} }
#[actix_rt::test] #[actix_rt::test]
async fn app_read_with_belongs() { 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;
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] #[actix_rt::test]
async fn app_read_with_belongs_in_trash() { 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 _ = create_test_view(&test.server, &test.app.id).await;
let view = 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] #[actix_rt::test]
async fn app_update() { async fn app_update() {
let test = AppTest::new().await; let test = BackendAppTest::new().await;
let new_name = "flowy"; let new_name = "flowy";
@ -131,7 +131,7 @@ async fn app_update() {
#[actix_rt::test] #[actix_rt::test]
async fn app_delete() { async fn app_delete() {
let test = AppTest::new().await; let test = BackendAppTest::new().await;
let delete_params = AppId { let delete_params = AppId {
app_id: test.app.id.clone(), app_id: test.app.id.clone(),
@ -143,13 +143,13 @@ async fn app_delete() {
#[actix_rt::test] #[actix_rt::test]
async fn view_create() { async fn view_create() {
let test = ViewTest::new().await; let test = BackendViewTest::new().await;
tracing::info!("{:?}", test.view); tracing::info!("{:?}", test.view);
} }
#[actix_rt::test] #[actix_rt::test]
async fn view_update() { async fn view_update() {
let test = ViewTest::new().await; let test = BackendViewTest::new().await;
let new_name = "name view name"; let new_name = "name view name";
// update // update
@ -164,7 +164,7 @@ async fn view_update() {
#[actix_rt::test] #[actix_rt::test]
async fn view_delete() { async fn view_delete() {
let test = ViewTest::new().await; let test = BackendViewTest::new().await;
test.server.create_view_trash(&test.view.id).await; test.server.create_view_trash(&test.view.id).await;
let trash_ids = test let trash_ids = test
@ -185,7 +185,7 @@ async fn view_delete() {
#[actix_rt::test] #[actix_rt::test]
async fn trash_delete() { async fn trash_delete() {
let test = ViewTest::new().await; let test = BackendViewTest::new().await;
test.server.create_view_trash(&test.view.id).await; test.server.create_view_trash(&test.view.id).await;
let identifier = TrashId { let identifier = TrashId {
@ -199,7 +199,7 @@ async fn trash_delete() {
#[actix_rt::test] #[actix_rt::test]
async fn trash_delete_all() { 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.create_view_trash(&test.view.id).await;
test.server.delete_view_trash(RepeatedTrashId::all()).await; test.server.delete_view_trash(RepeatedTrashId::all()).await;
@ -226,7 +226,7 @@ async fn workspace_list_read() {
#[actix_rt::test] #[actix_rt::test]
async fn doc_read() { async fn doc_read() {
let test = ViewTest::new().await; let test = BackendViewTest::new().await;
let params = DocumentId { let params = DocumentId {
doc_id: test.view.id.clone(), doc_id: test.view.id.clone(),
}; };
@ -240,7 +240,7 @@ async fn doc_create() {
let server = TestUserServer::new().await; let server = TestUserServer::new().await;
let doc_id = uuid::Uuid::new_v4().to_string(); let doc_id = uuid::Uuid::new_v4().to_string();
let user_id = "a".to_owned(); let user_id = "a".to_owned();
let mut document = Document::new::<PlainDoc>(); let mut document = ClientDocument::new::<PlainDoc>();
let mut offset = 0; let mut offset = 0;
for i in 0..1000 { for i in 0..1000 {
let content = i.to_string(); let content = i.to_string();
@ -268,7 +268,7 @@ async fn doc_create() {
#[actix_rt::test] #[actix_rt::test]
async fn doc_delete() { async fn doc_delete() {
let test = ViewTest::new().await; let test = BackendViewTest::new().await;
let delete_params = RepeatedViewId { let delete_params = RepeatedViewId {
items: vec![test.view.id.clone()], items: vec![test.view.id.clone()],
}; };

View File

@ -2,22 +2,22 @@
#![cfg_attr(rustfmt, rustfmt::skip)] #![cfg_attr(rustfmt, rustfmt::skip)]
use std::convert::TryInto; use std::convert::TryInto;
use actix_web::web::Data; use actix_web::web::Data;
use flowy_document::core::edit::ClientDocumentEditor; use flowy_document::core::ClientDocumentEditor;
use flowy_test::{helper::ViewTest, FlowySDKTest}; use flowy_test::{helper::ViewTest, FlowySDKTest};
use flowy_user::services::user::UserSession; use flowy_user::services::UserSession;
use futures_util::{stream, stream::StreamExt}; use futures_util::{stream, stream::StreamExt};
use std::sync::Arc; use std::sync::Arc;
use bytes::Bytes; use bytes::Bytes;
use tokio::time::{sleep, Duration}; use tokio::time::{sleep, Duration};
use crate::util::helper::{spawn_server, TestServer}; 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 lib_ot::rich_text::{RichTextAttribute, RichTextDelta};
use parking_lot::RwLock; use parking_lot::RwLock;
use backend::services::document::persistence::{read_document, reset_document}; use backend::services::document::persistence::{read_document, reset_document};
use flowy_collaboration::entities::revision::{RepeatedRevision, Revision}; use flowy_collaboration::entities::revision::{RepeatedRevision, Revision};
use flowy_collaboration::protobuf::{RepeatedRevision as RepeatedRevisionPB, DocumentId as DocumentIdPB}; use flowy_collaboration::protobuf::{RepeatedRevision as RepeatedRevisionPB, DocumentId as DocumentIdPB};
use flowy_collaboration::sync::ServerDocumentManager; use flowy_collaboration::server_document::ServerDocumentManager;
use flowy_net::services::ws_conn::FlowyWebSocketConnect; use flowy_net::ws::connection::FlowyWebSocketConnect;
use lib_ot::core::Interval; use lib_ot::core::Interval;
pub struct DocumentTest { pub struct DocumentTest {
@ -63,14 +63,14 @@ struct ScriptContext {
impl ScriptContext { impl ScriptContext {
async fn new(client_sdk: FlowySDKTest, server: TestServer) -> Self { async fn new(client_sdk: FlowySDKTest, server: TestServer) -> Self {
let user_session = client_sdk.user_session.clone(); 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; let doc_id = create_doc(&client_sdk).await;
Self { Self {
client_editor: None, client_editor: None,
client_sdk, client_sdk,
client_user_session: user_session, client_user_session: user_session,
ws_conn: ws_manager, ws_conn,
server, server,
doc_id, doc_id,
} }
@ -78,7 +78,7 @@ impl ScriptContext {
async fn open_doc(&mut self) { async fn open_doc(&mut self) {
let doc_id = self.doc_id.clone(); 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); 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) => { DocScript::AssertServer(s, rev_id) => {
sleep(Duration::from_millis(2000)).await; 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 { let doc_identifier: DocumentIdPB = DocumentId {
doc_id doc_id
}.try_into().unwrap(); }.try_into().unwrap();

View File

@ -1,5 +1,5 @@
use crate::document_test::edit_script::{DocScript, DocumentTest}; 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}; use lib_ot::{core::Interval, rich_text::RichTextAttribute};
#[rustfmt::skip] #[rustfmt::skip]
@ -75,7 +75,7 @@ async fn delta_sync_while_editing_with_attribute() {
#[actix_rt::test] #[actix_rt::test]
async fn delta_sync_with_server_push() { async fn delta_sync_with_server_push() {
let test = DocumentTest::new().await; let test = DocumentTest::new().await;
let mut document = Document::new::<NewlineDoc>(); let mut document = ClientDocument::new::<NewlineDoc>();
document.insert(0, "123").unwrap(); document.insert(0, "123").unwrap();
document.insert(3, "456").unwrap(); document.insert(3, "456").unwrap();
let json = document.to_json(); let json = document.to_json();
@ -109,7 +109,7 @@ async fn delta_sync_with_server_push() {
#[actix_rt::test] #[actix_rt::test]
async fn delta_sync_with_server_push_after_reset_document() { async fn delta_sync_with_server_push_after_reset_document() {
let test = DocumentTest::new().await; let test = DocumentTest::new().await;
let mut document = Document::new::<NewlineDoc>(); let mut document = ClientDocument::new::<NewlineDoc>();
document.insert(0, "123").unwrap(); document.insert(0, "123").unwrap();
let json = document.to_json(); let json = document.to_json();
@ -148,7 +148,7 @@ async fn delta_sync_with_server_push_after_reset_document() {
#[actix_rt::test] #[actix_rt::test]
async fn delta_sync_while_local_rev_less_than_server_rev() { async fn delta_sync_while_local_rev_less_than_server_rev() {
let test = DocumentTest::new().await; let test = DocumentTest::new().await;
let mut document = Document::new::<NewlineDoc>(); let mut document = ClientDocument::new::<NewlineDoc>();
document.insert(0, "123").unwrap(); document.insert(0, "123").unwrap();
let json = document.to_json(); let json = document.to_json();
@ -190,7 +190,7 @@ async fn delta_sync_while_local_rev_less_than_server_rev() {
#[actix_rt::test] #[actix_rt::test]
async fn delta_sync_while_local_rev_greater_than_server_rev() { async fn delta_sync_while_local_rev_greater_than_server_rev() {
let test = DocumentTest::new().await; let test = DocumentTest::new().await;
let mut document = Document::new::<NewlineDoc>(); let mut document = ClientDocument::new::<NewlineDoc>();
document.insert(0, "123").unwrap(); document.insert(0, "123").unwrap();
let json = document.to_json(); let json = document.to_json();

View File

@ -6,14 +6,17 @@ use backend::{
use backend_service::{ use backend_service::{
configuration::{get_client_server_configuration, ClientServerConfiguration}, configuration::{get_client_server_configuration, ClientServerConfiguration},
errors::ServerError, errors::ServerError,
http_request::*,
}; };
use flowy_collaboration::{ use flowy_collaboration::{
document::default::initial_delta_string, client_document::default::initial_delta_string,
entities::doc::{CreateDocParams, DocumentId, DocumentInfo}, 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 flowy_user_data_model::entities::*;
use lib_infra::uuid_string; use lib_infra::uuid_string;
use sqlx::{Connection, Executor, PgConnection, PgPool}; use sqlx::{Connection, Executor, PgConnection, PgPool};
@ -157,13 +160,13 @@ impl TestUserServer {
pub async fn read_doc(&self, params: DocumentId) -> Option<DocumentInfo> { pub async fn read_doc(&self, params: DocumentId) -> Option<DocumentInfo> {
let url = format!("{}/api/doc", self.http_addr()); 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 doc
} }
pub async fn create_doc(&self, params: CreateDocParams) { pub async fn create_doc(&self, params: CreateDocParams) {
let url = format!("{}/api/doc", self.http_addr()); 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 { pub async fn register_user(&self) -> SignUpResponse {
@ -330,12 +333,12 @@ pub async fn create_test_view(application: &TestUserServer, app_id: &str) -> Vie
app app
} }
pub struct WorkspaceTest { pub struct BackendWorkspaceTest {
pub server: TestUserServer, pub server: TestUserServer,
pub workspace: Workspace, pub workspace: Workspace,
} }
impl WorkspaceTest { impl BackendWorkspaceTest {
pub async fn new() -> Self { pub async fn new() -> Self {
let server = TestUserServer::new().await; let server = TestUserServer::new().await;
let workspace = create_test_workspace(&server).await; let workspace = create_test_workspace(&server).await;
@ -347,13 +350,13 @@ impl WorkspaceTest {
} }
} }
pub struct AppTest { pub struct BackendAppTest {
pub server: TestUserServer, pub server: TestUserServer,
pub workspace: Workspace, pub workspace: Workspace,
pub app: App, pub app: App,
} }
impl AppTest { impl BackendAppTest {
pub async fn new() -> Self { pub async fn new() -> Self {
let server = TestUserServer::new().await; let server = TestUserServer::new().await;
let workspace = create_test_workspace(&server).await; let workspace = create_test_workspace(&server).await;
@ -362,14 +365,14 @@ impl AppTest {
} }
} }
pub struct ViewTest { pub struct BackendViewTest {
pub server: TestUserServer, pub server: TestUserServer,
pub workspace: Workspace, pub workspace: Workspace,
pub app: App, pub app: App,
pub view: View, pub view: View,
} }
impl ViewTest { impl BackendViewTest {
pub async fn new() -> Self { pub async fn new() -> Self {
let server = TestUserServer::new().await; let server = TestUserServer::new().await;
let workspace = create_test_workspace(&server).await; let workspace = create_test_workspace(&server).await;

View File

@ -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/application/splash_bloc.dart';
import 'package:app_flowy/user/domain/auth_state.dart'; import 'package:app_flowy/user/domain/auth_state.dart';
import 'package:app_flowy/user/domain/i_splash.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/dispatch/dispatch.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/errors.pb.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -48,6 +49,7 @@ class SplashScreen extends StatelessWidget {
return result.fold( return result.fold(
(workspaceSetting) => getIt<ISplashRoute>().pushHomeScreen(context, userProfile, workspaceSetting), (workspaceSetting) => getIt<ISplashRoute>().pushHomeScreen(context, userProfile, workspaceSetting),
(error) async { (error) async {
Log.error(error);
assert(error.code == ErrorCode.RecordNotFound.value); assert(error.code == ErrorCode.RecordNotFound.value);
getIt<ISplashRoute>().pushWelcomeScreen(context, userProfile); getIt<ISplashRoute>().pushWelcomeScreen(context, userProfile);
}, },

View File

@ -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/scrolling/styled_list.dart';
import 'package:flowy_infra_ui/style_widget/button.dart'; import 'package:flowy_infra_ui/style_widget/button.dart';
import 'package:flowy_infra_ui/widget/error_page.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/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart'; import 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart';

View File

@ -1,7 +1,7 @@
import 'package:app_flowy/workspace/domain/i_app.dart'; import 'package:app_flowy/workspace/domain/i_app.dart';
import 'package:flowy_log/flowy_log.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-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:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';

View File

@ -2,8 +2,8 @@ import 'dart:convert';
import 'package:app_flowy/workspace/domain/i_trash.dart'; import 'package:app_flowy/workspace/domain/i_trash.dart';
import 'package:app_flowy/workspace/domain/i_view.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/trash.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.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flutter_quill/flutter_quill.dart'; import 'package:flutter_quill/flutter_quill.dart';
import 'package:flowy_log/flowy_log.dart'; import 'package:flowy_log/flowy_log.dart';

View File

@ -1,7 +1,7 @@
import 'package:app_flowy/workspace/domain/i_share.dart'; import 'package:app_flowy/workspace/domain/i_share.dart';
import 'package:app_flowy/workspace/infrastructure/markdown/delta_markdown.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/share.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.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';

View File

@ -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:app_flowy/workspace/presentation/stack_page/blank/blank_page.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flowy_log/flowy_log.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:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';

View File

@ -1,6 +1,6 @@
import 'package:app_flowy/workspace/domain/i_user.dart'; import 'package:app_flowy/workspace/domain/i_user.dart';
import 'package:flowy_log/flowy_log.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:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';

View File

@ -1,7 +1,7 @@
import 'package:app_flowy/workspace/domain/i_trash.dart'; import 'package:app_flowy/workspace/domain/i_trash.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flowy_log/flowy_log.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:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';

View File

@ -1,5 +1,5 @@
import 'package:dartz/dartz.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'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';

View File

@ -1,7 +1,7 @@
import 'package:app_flowy/workspace/domain/i_user.dart'; import 'package:app_flowy/workspace/domain/i_user.dart';
import 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart'; import 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart';
import 'package:flowy_log/flowy_log.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:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';

View File

@ -1,6 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'package:dartz/dartz.dart'; 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'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
abstract class IDoc { abstract class IDoc {

View File

@ -1,6 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'package:dartz/dartz.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'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
abstract class ITrash { abstract class ITrash {

View File

@ -2,7 +2,7 @@ import 'package:dartz/dartz.dart';
import 'package:flowy_infra/notifier.dart'; import 'package:flowy_infra/notifier.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.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-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; export 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile;
abstract class IUser { abstract class IUser {

View File

@ -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:dartz/dartz.dart';
import 'package:flowy_infra/notifier.dart'; import 'package:flowy_infra/notifier.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';

View File

@ -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:flutter/material.dart';
import 'package:flowy_infra/image.dart'; import 'package:flowy_infra/image.dart';

View File

@ -1,7 +1,7 @@
import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart'; 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/blank/blank_page.dart';
import 'package:app_flowy/workspace/presentation/stack_page/doc/doc_stack_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 { extension ToHomeStackContext on View {
HomeStackContext stackContext() { HomeStackContext stackContext() {

View File

@ -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/view_repo.dart';
import 'package:app_flowy/workspace/infrastructure/repos/workspace_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-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/app.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.pb.dart';
import 'package:get_it/get_it.dart'; import 'package:get_it/get_it.dart';
import 'i_share_impl.dart'; import 'i_share_impl.dart';

View File

@ -1,7 +1,7 @@
import 'package:app_flowy/workspace/infrastructure/repos/app_repo.dart'; import 'package:app_flowy/workspace/infrastructure/repos/app_repo.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:app_flowy/workspace/domain/i_app.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'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
export 'package:app_flowy/workspace/domain/i_app.dart'; export 'package:app_flowy/workspace/domain/i_app.dart';

View File

@ -4,7 +4,7 @@ import 'dart:typed_data';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:app_flowy/workspace/domain/i_doc.dart'; import 'package:app_flowy/workspace/domain/i_doc.dart';
import 'package:app_flowy/workspace/infrastructure/repos/doc_repo.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'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
class IDocImpl extends IDoc { class IDocImpl extends IDoc {

View File

@ -1,7 +1,7 @@
import 'package:app_flowy/workspace/domain/i_trash.dart'; import 'package:app_flowy/workspace/domain/i_trash.dart';
import 'package:app_flowy/workspace/infrastructure/repos/trash_repo.dart'; import 'package:app_flowy/workspace/infrastructure/repos/trash_repo.dart';
import 'package:dartz/dartz.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'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
class ITrashImpl implements ITrash { class ITrashImpl implements ITrash {

View File

@ -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:app_flowy/workspace/infrastructure/repos/user_repo.dart';
import 'package:flowy_infra/notifier.dart'; import 'package:flowy_infra/notifier.dart';
import 'package:flowy_sdk/protobuf/dart-notify/protobuf.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-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/errors.pb.dart' as user_error;
import 'package:flowy_sdk/protobuf/flowy-user/observable.pb.dart' as user; import 'package:flowy_sdk/protobuf/flowy-user/dart_notification.pb.dart' as user;
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:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
export 'package:app_flowy/workspace/domain/i_user.dart'; export 'package:app_flowy/workspace/domain/i_user.dart';
export 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart'; export 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart';

View File

@ -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:app_flowy/workspace/infrastructure/repos/view_repo.dart';
import 'package:flowy_infra/notifier.dart'; import 'package:flowy_infra/notifier.dart';
import 'package:dartz/dartz.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'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
class IViewImpl extends IView { class IViewImpl extends IView {

View File

@ -1,7 +1,7 @@
import 'package:app_flowy/workspace/domain/i_workspace.dart'; import 'package:app_flowy/workspace/domain/i_workspace.dart';
import 'package:app_flowy/workspace/infrastructure/repos/workspace_repo.dart'; import 'package:app_flowy/workspace/infrastructure/repos/workspace_repo.dart';
import 'package:dartz/dartz.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'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
export 'package:app_flowy/workspace/domain/i_workspace.dart'; export 'package:app_flowy/workspace/domain/i_workspace.dart';

View File

@ -5,12 +5,10 @@ import 'package:dartz/dartz.dart';
import 'package:flowy_log/flowy_log.dart'; import 'package:flowy_log/flowy_log.dart';
import 'package:flowy_sdk/dispatch/dispatch.dart'; import 'package:flowy_sdk/dispatch/dispatch.dart';
import 'package:flowy_sdk/protobuf/dart-notify/subject.pb.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.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_query.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.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-error/errors.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:flowy_sdk/rust_stream.dart';
import 'helper.dart'; import 'helper.dart';

View File

@ -1,7 +1,7 @@
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/dispatch/dispatch.dart'; import 'package:flowy_sdk/dispatch/dispatch.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-core-data-model/view_query.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-error/errors.pb.dart';
class DocRepository { class DocRepository {
@ -12,7 +12,7 @@ class DocRepository {
Future<Either<DocumentDelta, FlowyError>> readDoc() { Future<Either<DocumentDelta, FlowyError>> readDoc() {
final request = QueryViewRequest(viewIds: [docId]); final request = QueryViewRequest(viewIds: [docId]);
return WorkspaceEventOpenView(request).send(); return WorkspaceEventOpenDocument(request).send();
} }
Future<Either<DocumentDelta, FlowyError>> composeDelta({required String data}) { Future<Either<DocumentDelta, FlowyError>> composeDelta({required String data}) {

View File

@ -3,7 +3,7 @@ import 'package:flowy_sdk/protobuf/dart-notify/protobuf.dart';
import 'package:flowy_sdk/protobuf/flowy-user/protobuf.dart'; import 'package:flowy_sdk/protobuf/flowy-user/protobuf.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.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';
typedef UserNotificationCallback = void Function(UserNotification, Either<Uint8List, FlowyError>); typedef UserNotificationCallback = void Function(UserNotification, Either<Uint8List, FlowyError>);

View File

@ -5,9 +5,9 @@ import 'package:app_flowy/workspace/infrastructure/repos/helper.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/dispatch/dispatch.dart'; import 'package:flowy_sdk/dispatch/dispatch.dart';
import 'package:flowy_sdk/protobuf/dart-notify/subject.pb.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-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:flowy_sdk/rust_stream.dart';
class TrashRepo { class TrashRepo {
@ -33,11 +33,11 @@ class TrashRepo {
} }
Future<Either<Unit, FlowyError>> restoreAll() { Future<Either<Unit, FlowyError>> restoreAll() {
return WorkspaceEventRestoreAll().send(); return WorkspaceEventRestoreAllTrash().send();
} }
Future<Either<Unit, FlowyError>> deleteAll() { Future<Either<Unit, FlowyError>> deleteAll() {
return WorkspaceEventDeleteAll().send(); return WorkspaceEventDeleteAllTrash().send();
} }
} }

View File

@ -1,8 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/dispatch/dispatch.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.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_query.pb.dart';
import 'package:app_flowy/workspace/domain/i_user.dart'; import 'package:app_flowy/workspace/domain/i_user.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';

View File

@ -3,11 +3,9 @@ import 'dart:typed_data';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/dispatch/dispatch.dart'; import 'package:flowy_sdk/dispatch/dispatch.dart';
import 'package:flowy_sdk/protobuf/dart-notify/subject.pb.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.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-error/errors.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:flowy_sdk/rust_stream.dart';
import 'package:app_flowy/workspace/domain/i_view.dart'; import 'package:app_flowy/workspace/domain/i_view.dart';

View File

@ -7,11 +7,10 @@ import 'package:flowy_log/flowy_log.dart';
import 'package:flowy_sdk/dispatch/dispatch.dart'; import 'package:flowy_sdk/dispatch/dispatch.dart';
import 'package:flowy_sdk/protobuf/dart-notify/subject.pb.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-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/app.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.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_query.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.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:flowy_sdk/rust_stream.dart';
import 'package:app_flowy/generated/locale_keys.g.dart'; import 'package:app_flowy/generated/locale_keys.g.dart';

View File

@ -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:flowy_infra_ui/widget/spacing.dart';
import 'package:flutter_quill/flutter_quill.dart' as quill; import 'package:flutter_quill/flutter_quill.dart' as quill;
import 'package:flowy_infra_ui/widget/error_page.dart'; 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/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:styled_widget/styled_widget.dart'; import 'package:styled_widget/styled_widget.dart';

View File

@ -12,8 +12,8 @@ import 'package:flowy_infra/theme.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart'; import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flowy_infra_ui/widget/rounded_button.dart'; import 'package:flowy_infra_ui/widget/rounded_button.dart';
import 'package:flowy_log/flowy_log.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/share.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.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:dartz/dartz.dart' as dartz; import 'package:dartz/dartz.dart' as dartz;

View File

@ -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/icon_button.dart';
import 'package:flowy_infra_ui/style_widget/text.dart'; import 'package:flowy_infra_ui/style_widget/text.dart';
import 'package:flowy_infra_ui/widget/spacing.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:flutter/material.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:fixnum/fixnum.dart' as $fixnum; import 'package:fixnum/fixnum.dart' as $fixnum;

View File

@ -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:app_flowy/workspace/presentation/home/navigation.dart';
import 'package:flowy_infra/theme.dart'; import 'package:flowy_infra/theme.dart';
import 'package:flowy_infra_ui/widget/spacing.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:flowy_sdk/protobuf/flowy-core-data-model/view_create.pbenum.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flowy_infra_ui/style_widget/extension.dart'; import 'package:flowy_infra_ui/style_widget/extension.dart';
import 'package:flowy_infra_ui/style_widget/text.dart'; import 'package:flowy_infra_ui/style_widget/text.dart';

View File

@ -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/style_widget/scrolling/styled_list.dart';
import 'package:flowy_infra_ui/widget/spacing.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-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/view.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_setting.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace.pb.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';

View File

@ -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/hover.dart';
import 'package:flowy_infra_ui/style_widget/icon_button.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/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/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:styled_widget/styled_widget.dart'; import 'package:styled_widget/styled_widget.dart';

View File

@ -6,7 +6,7 @@ import 'package:flowy_infra/flowy_icon_data_icons.dart';
import 'package:flowy_infra/theme.dart'; import 'package:flowy_infra/theme.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart'; import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flowy_infra_ui/style_widget/text.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/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:app_flowy/workspace/application/app/app_bloc.dart'; import 'package:app_flowy/workspace/application/app/app_bloc.dart';

View File

@ -1,8 +1,8 @@
import 'package:app_flowy/workspace/presentation/widgets/menu/menu.dart'; 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:app_flowy/workspace/presentation/widgets/menu/widget/app/header/header.dart';
import 'package:expandable/expandable.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/app.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.pb.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:app_flowy/startup/startup.dart'; import 'package:app_flowy/startup/startup.dart';

View File

@ -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/hover.dart';
import 'package:flowy_infra_ui/style_widget/text.dart'; import 'package:flowy_infra_ui/style_widget/text.dart';
import 'package:flowy_infra_ui/widget/spacing.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/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:styled_widget/styled_widget.dart'; import 'package:styled_widget/styled_widget.dart';

View File

@ -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/domain/view_ext.dart';
import 'package:app_flowy/workspace/presentation/widgets/menu/menu.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: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:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:styled_widget/styled_widget.dart'; import 'package:styled_widget/styled_widget.dart';

View File

@ -268,13 +268,13 @@ class WorkspaceEventCopyLink {
} }
} }
class WorkspaceEventOpenView { class WorkspaceEventOpenDocument {
QueryViewRequest request; QueryViewRequest request;
WorkspaceEventOpenView(this.request); WorkspaceEventOpenDocument(this.request);
Future<Either<DocumentDelta, FlowyError>> send() { Future<Either<DocumentDelta, FlowyError>> send() {
final request = FFIRequest.create() final request = FFIRequest.create()
..event = WorkspaceEvent.OpenView.toString() ..event = WorkspaceEvent.OpenDocument.toString()
..payload = requestToBytes(this.request); ..payload = requestToBytes(this.request);
return Dispatch.asyncRequest(request) return Dispatch.asyncRequest(request)
@ -350,12 +350,12 @@ class WorkspaceEventDeleteTrash {
} }
} }
class WorkspaceEventRestoreAll { class WorkspaceEventRestoreAllTrash {
WorkspaceEventRestoreAll(); WorkspaceEventRestoreAllTrash();
Future<Either<Unit, FlowyError>> send() { Future<Either<Unit, FlowyError>> send() {
final request = FFIRequest.create() final request = FFIRequest.create()
..event = WorkspaceEvent.RestoreAll.toString(); ..event = WorkspaceEvent.RestoreAllTrash.toString();
return Dispatch.asyncRequest(request).then((bytesResult) => bytesResult.fold( return Dispatch.asyncRequest(request).then((bytesResult) => bytesResult.fold(
(bytes) => left(unit), (bytes) => left(unit),
@ -364,12 +364,12 @@ class WorkspaceEventRestoreAll {
} }
} }
class WorkspaceEventDeleteAll { class WorkspaceEventDeleteAllTrash {
WorkspaceEventDeleteAll(); WorkspaceEventDeleteAllTrash();
Future<Either<Unit, FlowyError>> send() { Future<Either<Unit, FlowyError>> send() {
final request = FFIRequest.create() final request = FFIRequest.create()
..event = WorkspaceEvent.DeleteAll.toString(); ..event = WorkspaceEvent.DeleteAllTrash.toString();
return Dispatch.asyncRequest(request).then((bytesResult) => bytesResult.fold( return Dispatch.asyncRequest(request).then((bytesResult) => bytesResult.fold(
(bytes) => left(unit), (bytes) => left(unit),

View File

@ -4,6 +4,7 @@ import 'package:flowy_log/flowy_log.dart';
// ignore: unnecessary_import // ignore: unnecessary_import
import 'package:flowy_sdk/protobuf/dart-ffi/ffi_response.pb.dart'; 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/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-error/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-net/event.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-net/event.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-net/network_state.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-net/network_state.pb.dart';

View File

@ -1,6 +1,6 @@
/// ///
// Generated code. Do not modify. // Generated code. Do not modify.
// source: doc.proto // source: document_info.proto
// //
// @dart = 2.12 // @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: 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

View File

@ -1,6 +1,6 @@
/// ///
// Generated code. Do not modify. // Generated code. Do not modify.
// source: app_create.proto // source: document_info.proto
// //
// @dart = 2.12 // @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: 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

View File

@ -1,6 +1,6 @@
/// ///
// Generated code. Do not modify. // Generated code. Do not modify.
// source: doc.proto // source: document_info.proto
// //
// @dart = 2.12 // @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 // 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

View File

@ -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';

View File

@ -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);
}

View File

@ -1,6 +1,6 @@
/// ///
// Generated code. Do not modify. // Generated code. Do not modify.
// source: app_update.proto // source: folder_info.proto
// //
// @dart = 2.12 // @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: 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

View File

@ -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=');

View File

@ -1,9 +1,9 @@
/// ///
// Generated code. Do not modify. // Generated code. Do not modify.
// source: app_create.proto // source: folder_info.proto
// //
// @dart = 2.12 // @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 // 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';

View File

@ -1,4 +1,5 @@
// Auto-generated, do not edit // Auto-generated, do not edit
export './ws.pb.dart'; export './folder_info.pb.dart';
export './ws_data.pb.dart';
export './revision.pb.dart'; export './revision.pb.dart';
export './doc.pb.dart'; export './document_info.pb.dart';

View File

@ -20,7 +20,7 @@ class Revision extends $pb.GeneratedMessage {
..aInt64(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'revId') ..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) ..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(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) ..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') ..aOS(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'userId')
..hasRequiredFields = false ..hasRequiredFields = false
@ -32,7 +32,7 @@ class Revision extends $pb.GeneratedMessage {
$fixnum.Int64? revId, $fixnum.Int64? revId,
$core.List<$core.int>? deltaData, $core.List<$core.int>? deltaData,
$core.String? md5, $core.String? md5,
$core.String? docId, $core.String? objectId,
RevType? ty, RevType? ty,
$core.String? userId, $core.String? userId,
}) { }) {
@ -49,8 +49,8 @@ class Revision extends $pb.GeneratedMessage {
if (md5 != null) { if (md5 != null) {
_result.md5 = md5; _result.md5 = md5;
} }
if (docId != null) { if (objectId != null) {
_result.docId = docId; _result.objectId = objectId;
} }
if (ty != null) { if (ty != null) {
_result.ty = ty; _result.ty = ty;
@ -118,13 +118,13 @@ class Revision extends $pb.GeneratedMessage {
void clearMd5() => clearField(4); void clearMd5() => clearField(4);
@$pb.TagNumber(5) @$pb.TagNumber(5)
$core.String get docId => $_getSZ(4); $core.String get objectId => $_getSZ(4);
@$pb.TagNumber(5) @$pb.TagNumber(5)
set docId($core.String v) { $_setString(4, v); } set objectId($core.String v) { $_setString(4, v); }
@$pb.TagNumber(5) @$pb.TagNumber(5)
$core.bool hasDocId() => $_has(4); $core.bool hasObjectId() => $_has(4);
@$pb.TagNumber(5) @$pb.TagNumber(5)
void clearDocId() => clearField(5); void clearObjectId() => clearField(5);
@$pb.TagNumber(6) @$pb.TagNumber(6)
RevType get ty => $_getN(5); RevType get ty => $_getN(5);
@ -235,7 +235,7 @@ class RevId extends $pb.GeneratedMessage {
class RevisionRange 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) 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(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'start')
..aInt64(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'end') ..aInt64(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'end')
..hasRequiredFields = false ..hasRequiredFields = false
@ -243,13 +243,13 @@ class RevisionRange extends $pb.GeneratedMessage {
RevisionRange._() : super(); RevisionRange._() : super();
factory RevisionRange({ factory RevisionRange({
$core.String? docId, $core.String? objectId,
$fixnum.Int64? start, $fixnum.Int64? start,
$fixnum.Int64? end, $fixnum.Int64? end,
}) { }) {
final _result = create(); final _result = create();
if (docId != null) { if (objectId != null) {
_result.docId = docId; _result.objectId = objectId;
} }
if (start != null) { if (start != null) {
_result.start = start; _result.start = start;
@ -281,13 +281,13 @@ class RevisionRange extends $pb.GeneratedMessage {
static RevisionRange? _defaultInstance; static RevisionRange? _defaultInstance;
@$pb.TagNumber(1) @$pb.TagNumber(1)
$core.String get docId => $_getSZ(0); $core.String get objectId => $_getSZ(0);
@$pb.TagNumber(1) @$pb.TagNumber(1)
set docId($core.String v) { $_setString(0, v); } set objectId($core.String v) { $_setString(0, v); }
@$pb.TagNumber(1) @$pb.TagNumber(1)
$core.bool hasDocId() => $_has(0); $core.bool hasObjectId() => $_has(0);
@$pb.TagNumber(1) @$pb.TagNumber(1)
void clearDocId() => clearField(1); void clearObjectId() => clearField(1);
@$pb.TagNumber(2) @$pb.TagNumber(2)
$fixnum.Int64 get start => $_getI64(1); $fixnum.Int64 get start => $_getI64(1);

View File

@ -10,11 +10,11 @@ import 'dart:core' as $core;
import 'package:protobuf/protobuf.dart' as $pb; import 'package:protobuf/protobuf.dart' as $pb;
class RevisionState extends $pb.ProtobufEnum { 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 RevisionState Ack = RevisionState._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Ack');
static const $core.List<RevisionState> values = <RevisionState> [ static const $core.List<RevisionState> values = <RevisionState> [
Local, Sync,
Ack, Ack,
]; ];

View File

@ -12,13 +12,13 @@ import 'dart:typed_data' as $typed_data;
const RevisionState$json = const { const RevisionState$json = const {
'1': 'RevisionState', '1': 'RevisionState',
'2': const [ '2': const [
const {'1': 'Local', '2': 0}, const {'1': 'Sync', '2': 0},
const {'1': 'Ack', '2': 1}, const {'1': 'Ack', '2': 1},
], ],
}; };
/// Descriptor for `RevisionState`. Decode as a `google.protobuf.EnumDescriptorProto`. /// 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') @$core.Deprecated('Use revTypeDescriptor instead')
const RevType$json = const { const RevType$json = const {
'1': 'RevType', '1': 'RevType',
@ -38,14 +38,14 @@ const Revision$json = const {
const {'1': 'rev_id', '3': 2, '4': 1, '5': 3, '10': 'revId'}, 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': 'delta_data', '3': 3, '4': 1, '5': 12, '10': 'deltaData'},
const {'1': 'md5', '3': 4, '4': 1, '5': 9, '10': 'md5'}, 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': 'ty', '3': 6, '4': 1, '5': 14, '6': '.RevType', '10': 'ty'},
const {'1': 'user_id', '3': 7, '4': 1, '5': 9, '10': 'userId'}, const {'1': 'user_id', '3': 7, '4': 1, '5': 9, '10': 'userId'},
], ],
}; };
/// Descriptor for `Revision`. Decode as a `google.protobuf.DescriptorProto`. /// 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') @$core.Deprecated('Use repeatedRevisionDescriptor instead')
const RepeatedRevision$json = const { const RepeatedRevision$json = const {
'1': 'RepeatedRevision', '1': 'RepeatedRevision',
@ -70,11 +70,11 @@ final $typed_data.Uint8List revIdDescriptor = $convert.base64Decode('CgVSZXZJZBI
const RevisionRange$json = const { const RevisionRange$json = const {
'1': 'RevisionRange', '1': 'RevisionRange',
'2': const [ '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': 'start', '3': 2, '4': 1, '5': 3, '10': 'start'},
const {'1': 'end', '3': 3, '4': 1, '5': 3, '10': 'end'}, const {'1': 'end', '3': 3, '4': 1, '5': 3, '10': 'end'},
], ],
}; };
/// Descriptor for `RevisionRange`. Decode as a `google.protobuf.DescriptorProto`. /// 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');

View File

@ -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);
}

View File

@ -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');

View File

@ -1,6 +1,6 @@
/// ///
// Generated code. Do not modify. // Generated code. Do not modify.
// source: ws.proto // source: ws_data.proto
// //
// @dart = 2.12 // @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: 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 '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 { class ClientRevisionWSData extends $pb.GeneratedMessage {
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DocumentClientWSData', createEmptyInstance: create) 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') ? '' : 'docId') ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'objectId')
..e<DocumentClientWSDataType>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ty', $pb.PbFieldType.OE, defaultOrMaker: DocumentClientWSDataType.ClientPushRev, valueOf: DocumentClientWSDataType.valueOf, enumValues: DocumentClientWSDataType.values) ..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) ..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 ..hasRequiredFields = false
; ;
DocumentClientWSData._() : super(); ClientRevisionWSData._() : super();
factory DocumentClientWSData({ factory ClientRevisionWSData({
$core.String? docId, $core.String? objectId,
DocumentClientWSDataType? ty, ClientRevisionWSDataType? ty,
$0.RepeatedRevision? revisions, $0.RepeatedRevision? revisions,
$core.String? id, $core.String? dataId,
}) { }) {
final _result = create(); final _result = create();
if (docId != null) { if (objectId != null) {
_result.docId = docId; _result.objectId = objectId;
} }
if (ty != null) { if (ty != null) {
_result.ty = ty; _result.ty = ty;
@ -41,45 +41,45 @@ class DocumentClientWSData extends $pb.GeneratedMessage {
if (revisions != null) { if (revisions != null) {
_result.revisions = revisions; _result.revisions = revisions;
} }
if (id != null) { if (dataId != null) {
_result.id = id; _result.dataId = dataId;
} }
return _result; return _result;
} }
factory DocumentClientWSData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory ClientRevisionWSData.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.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
@$core.Deprecated( @$core.Deprecated(
'Using this can add significant overhead to your binary. ' 'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version') 'Will be removed in next major version')
DocumentClientWSData clone() => DocumentClientWSData()..mergeFromMessage(this); ClientRevisionWSData clone() => ClientRevisionWSData()..mergeFromMessage(this);
@$core.Deprecated( @$core.Deprecated(
'Using this can add significant overhead to your binary. ' 'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version') '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; $pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline') @$core.pragma('dart2js:noInline')
static DocumentClientWSData create() => DocumentClientWSData._(); static ClientRevisionWSData create() => ClientRevisionWSData._();
DocumentClientWSData createEmptyInstance() => create(); ClientRevisionWSData createEmptyInstance() => create();
static $pb.PbList<DocumentClientWSData> createRepeated() => $pb.PbList<DocumentClientWSData>(); static $pb.PbList<ClientRevisionWSData> createRepeated() => $pb.PbList<ClientRevisionWSData>();
@$core.pragma('dart2js:noInline') @$core.pragma('dart2js:noInline')
static DocumentClientWSData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DocumentClientWSData>(create); static ClientRevisionWSData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ClientRevisionWSData>(create);
static DocumentClientWSData? _defaultInstance; static ClientRevisionWSData? _defaultInstance;
@$pb.TagNumber(1) @$pb.TagNumber(1)
$core.String get docId => $_getSZ(0); $core.String get objectId => $_getSZ(0);
@$pb.TagNumber(1) @$pb.TagNumber(1)
set docId($core.String v) { $_setString(0, v); } set objectId($core.String v) { $_setString(0, v); }
@$pb.TagNumber(1) @$pb.TagNumber(1)
$core.bool hasDocId() => $_has(0); $core.bool hasObjectId() => $_has(0);
@$pb.TagNumber(1) @$pb.TagNumber(1)
void clearDocId() => clearField(1); void clearObjectId() => clearField(1);
@$pb.TagNumber(2) @$pb.TagNumber(2)
DocumentClientWSDataType get ty => $_getN(1); ClientRevisionWSDataType get ty => $_getN(1);
@$pb.TagNumber(2) @$pb.TagNumber(2)
set ty(DocumentClientWSDataType v) { setField(2, v); } set ty(ClientRevisionWSDataType v) { setField(2, v); }
@$pb.TagNumber(2) @$pb.TagNumber(2)
$core.bool hasTy() => $_has(1); $core.bool hasTy() => $_has(1);
@$pb.TagNumber(2) @$pb.TagNumber(2)
@ -97,32 +97,32 @@ class DocumentClientWSData extends $pb.GeneratedMessage {
$0.RepeatedRevision ensureRevisions() => $_ensure(2); $0.RepeatedRevision ensureRevisions() => $_ensure(2);
@$pb.TagNumber(4) @$pb.TagNumber(4)
$core.String get id => $_getSZ(3); $core.String get dataId => $_getSZ(3);
@$pb.TagNumber(4) @$pb.TagNumber(4)
set id($core.String v) { $_setString(3, v); } set dataId($core.String v) { $_setString(3, v); }
@$pb.TagNumber(4) @$pb.TagNumber(4)
$core.bool hasId() => $_has(3); $core.bool hasDataId() => $_has(3);
@$pb.TagNumber(4) @$pb.TagNumber(4)
void clearId() => clearField(4); void clearDataId() => clearField(4);
} }
class DocumentServerWSData extends $pb.GeneratedMessage { class ServerRevisionWSData extends $pb.GeneratedMessage {
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DocumentServerWSData', createEmptyInstance: create) 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') ? '' : 'docId') ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'objectId')
..e<DocumentServerWSDataType>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ty', $pb.PbFieldType.OE, defaultOrMaker: DocumentServerWSDataType.ServerAck, valueOf: DocumentServerWSDataType.valueOf, enumValues: DocumentServerWSDataType.values) ..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) ..a<$core.List<$core.int>>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'data', $pb.PbFieldType.OY)
..hasRequiredFields = false ..hasRequiredFields = false
; ;
DocumentServerWSData._() : super(); ServerRevisionWSData._() : super();
factory DocumentServerWSData({ factory ServerRevisionWSData({
$core.String? docId, $core.String? objectId,
DocumentServerWSDataType? ty, ServerRevisionWSDataType? ty,
$core.List<$core.int>? data, $core.List<$core.int>? data,
}) { }) {
final _result = create(); final _result = create();
if (docId != null) { if (objectId != null) {
_result.docId = docId; _result.objectId = objectId;
} }
if (ty != null) { if (ty != null) {
_result.ty = ty; _result.ty = ty;
@ -132,40 +132,40 @@ class DocumentServerWSData extends $pb.GeneratedMessage {
} }
return _result; return _result;
} }
factory DocumentServerWSData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory ServerRevisionWSData.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.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
@$core.Deprecated( @$core.Deprecated(
'Using this can add significant overhead to your binary. ' 'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version') 'Will be removed in next major version')
DocumentServerWSData clone() => DocumentServerWSData()..mergeFromMessage(this); ServerRevisionWSData clone() => ServerRevisionWSData()..mergeFromMessage(this);
@$core.Deprecated( @$core.Deprecated(
'Using this can add significant overhead to your binary. ' 'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version') '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; $pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline') @$core.pragma('dart2js:noInline')
static DocumentServerWSData create() => DocumentServerWSData._(); static ServerRevisionWSData create() => ServerRevisionWSData._();
DocumentServerWSData createEmptyInstance() => create(); ServerRevisionWSData createEmptyInstance() => create();
static $pb.PbList<DocumentServerWSData> createRepeated() => $pb.PbList<DocumentServerWSData>(); static $pb.PbList<ServerRevisionWSData> createRepeated() => $pb.PbList<ServerRevisionWSData>();
@$core.pragma('dart2js:noInline') @$core.pragma('dart2js:noInline')
static DocumentServerWSData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DocumentServerWSData>(create); static ServerRevisionWSData getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ServerRevisionWSData>(create);
static DocumentServerWSData? _defaultInstance; static ServerRevisionWSData? _defaultInstance;
@$pb.TagNumber(1) @$pb.TagNumber(1)
$core.String get docId => $_getSZ(0); $core.String get objectId => $_getSZ(0);
@$pb.TagNumber(1) @$pb.TagNumber(1)
set docId($core.String v) { $_setString(0, v); } set objectId($core.String v) { $_setString(0, v); }
@$pb.TagNumber(1) @$pb.TagNumber(1)
$core.bool hasDocId() => $_has(0); $core.bool hasObjectId() => $_has(0);
@$pb.TagNumber(1) @$pb.TagNumber(1)
void clearDocId() => clearField(1); void clearObjectId() => clearField(1);
@$pb.TagNumber(2) @$pb.TagNumber(2)
DocumentServerWSDataType get ty => $_getN(1); ServerRevisionWSDataType get ty => $_getN(1);
@$pb.TagNumber(2) @$pb.TagNumber(2)
set ty(DocumentServerWSDataType v) { setField(2, v); } set ty(ServerRevisionWSDataType v) { setField(2, v); }
@$pb.TagNumber(2) @$pb.TagNumber(2)
$core.bool hasTy() => $_has(1); $core.bool hasTy() => $_has(1);
@$pb.TagNumber(2) @$pb.TagNumber(2)

View File

@ -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);
}

View File

@ -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');

View File

@ -1,9 +1,9 @@
/// ///
// Generated code. Do not modify. // Generated code. Do not modify.
// source: app_query.proto // source: ws_data.proto
// //
// @dart = 2.12 // @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 // 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';

View File

@ -1,6 +1,6 @@
/// ///
// Generated code. Do not modify. // Generated code. Do not modify.
// source: app_create.proto // source: app.proto
// //
// @dart = 2.12 // @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: 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:fixnum/fixnum.dart' as $fixnum;
import 'package:protobuf/protobuf.dart' as $pb; 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 { class CreateAppRequest extends $pb.GeneratedMessage {
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CreateAppRequest', createEmptyInstance: create) 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); ColorStyle ensureColorStyle() => $_ensure(3);
} }
class App extends $pb.GeneratedMessage { class QueryAppRequest extends $pb.GeneratedMessage {
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'App', createEmptyInstance: create) static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'QueryAppRequest', createEmptyInstance: create)
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id') ..pPS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'appIds')
..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 ..hasRequiredFields = false
; ;
App._() : super(); QueryAppRequest._() : super();
factory App({ factory QueryAppRequest({
$core.String? id, $core.Iterable<$core.String>? appIds,
$core.String? workspaceId,
$core.String? name,
$core.String? desc,
$0.RepeatedView? belongings,
$fixnum.Int64? version,
$fixnum.Int64? modifiedTime,
$fixnum.Int64? createTime,
}) { }) {
final _result = create(); final _result = create();
if (id != null) { if (appIds != null) {
_result.id = id; _result.appIds.addAll(appIds);
} }
if (workspaceId != null) { return _result;
_result.workspaceId = workspaceId; }
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) { if (name != null) {
_result.name = name; _result.name = name;
@ -278,154 +585,249 @@ class App extends $pb.GeneratedMessage {
if (desc != null) { if (desc != null) {
_result.desc = desc; _result.desc = desc;
} }
if (belongings != null) { if (colorStyle != null) {
_result.belongings = belongings; _result.colorStyle = colorStyle;
} }
if (version != null) { if (isTrash != null) {
_result.version = version; _result.isTrash = isTrash;
}
if (modifiedTime != null) {
_result.modifiedTime = modifiedTime;
}
if (createTime != null) {
_result.createTime = createTime;
} }
return _result; return _result;
} }
factory App.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory UpdateAppRequest.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.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
@$core.Deprecated( @$core.Deprecated(
'Using this can add significant overhead to your binary. ' 'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version') 'Will be removed in next major version')
App clone() => App()..mergeFromMessage(this); UpdateAppRequest clone() => UpdateAppRequest()..mergeFromMessage(this);
@$core.Deprecated( @$core.Deprecated(
'Using this can add significant overhead to your binary. ' 'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version') '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; $pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline') @$core.pragma('dart2js:noInline')
static App create() => App._(); static UpdateAppRequest create() => UpdateAppRequest._();
App createEmptyInstance() => create(); UpdateAppRequest createEmptyInstance() => create();
static $pb.PbList<App> createRepeated() => $pb.PbList<App>(); static $pb.PbList<UpdateAppRequest> createRepeated() => $pb.PbList<UpdateAppRequest>();
@$core.pragma('dart2js:noInline') @$core.pragma('dart2js:noInline')
static App getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<App>(create); static UpdateAppRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UpdateAppRequest>(create);
static App? _defaultInstance; 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) @$pb.TagNumber(1)
$core.String get id => $_getSZ(0); $core.String get appId => $_getSZ(0);
@$pb.TagNumber(1) @$pb.TagNumber(1)
set id($core.String v) { $_setString(0, v); } set appId($core.String v) { $_setString(0, v); }
@$pb.TagNumber(1) @$pb.TagNumber(1)
$core.bool hasId() => $_has(0); $core.bool hasAppId() => $_has(0);
@$pb.TagNumber(1) @$pb.TagNumber(1)
void clearId() => clearField(1); void clearAppId() => clearField(1);
@$pb.TagNumber(2) @$pb.TagNumber(2)
$core.String get workspaceId => $_getSZ(1); $core.String get name => $_getSZ(1);
@$pb.TagNumber(2) @$pb.TagNumber(2)
set workspaceId($core.String v) { $_setString(1, v); } set name($core.String v) { $_setString(1, v); }
@$pb.TagNumber(2) @$pb.TagNumber(2)
$core.bool hasWorkspaceId() => $_has(1); $core.bool hasName() => $_has(1);
@$pb.TagNumber(2) @$pb.TagNumber(2)
void clearWorkspaceId() => clearField(2); void clearName() => clearField(2);
@$pb.TagNumber(3) @$pb.TagNumber(3)
$core.String get name => $_getSZ(2); $core.String get desc => $_getSZ(2);
@$pb.TagNumber(3) @$pb.TagNumber(3)
set name($core.String v) { $_setString(2, v); } set desc($core.String v) { $_setString(2, v); }
@$pb.TagNumber(3) @$pb.TagNumber(3)
$core.bool hasName() => $_has(2); $core.bool hasDesc() => $_has(2);
@$pb.TagNumber(3) @$pb.TagNumber(3)
void clearName() => clearField(3); void clearDesc() => clearField(3);
@$pb.TagNumber(4) @$pb.TagNumber(4)
$core.String get desc => $_getSZ(3); ColorStyle get colorStyle => $_getN(3);
@$pb.TagNumber(4) @$pb.TagNumber(4)
set desc($core.String v) { $_setString(3, v); } set colorStyle(ColorStyle v) { setField(4, v); }
@$pb.TagNumber(4) @$pb.TagNumber(4)
$core.bool hasDesc() => $_has(3); $core.bool hasColorStyle() => $_has(3);
@$pb.TagNumber(4) @$pb.TagNumber(4)
void clearDesc() => clearField(4); void clearColorStyle() => clearField(4);
@$pb.TagNumber(4)
ColorStyle ensureColorStyle() => $_ensure(3);
@$pb.TagNumber(5) @$pb.TagNumber(5)
$0.RepeatedView get belongings => $_getN(4); $core.bool get isTrash => $_getBF(4);
@$pb.TagNumber(5) @$pb.TagNumber(5)
set belongings($0.RepeatedView v) { setField(5, v); } set isTrash($core.bool v) { $_setBool(4, v); }
@$pb.TagNumber(5) @$pb.TagNumber(5)
$core.bool hasBelongings() => $_has(4); $core.bool hasIsTrash() => $_has(4);
@$pb.TagNumber(5) @$pb.TagNumber(5)
void clearBelongings() => clearField(5); void clearIsTrash() => 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 { enum UpdateAppParams_OneOfName {
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RepeatedApp', createEmptyInstance: create) name,
..pc<App>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'items', $pb.PbFieldType.PM, subBuilder: App.create) 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 ..hasRequiredFields = false
; ;
RepeatedApp._() : super(); UpdateAppParams._() : super();
factory RepeatedApp({ factory UpdateAppParams({
$core.Iterable<App>? items, $core.String? appId,
$core.String? name,
$core.String? desc,
ColorStyle? colorStyle,
$core.bool? isTrash,
}) { }) {
final _result = create(); final _result = create();
if (items != null) { if (appId != null) {
_result.items.addAll(items); _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; return _result;
} }
factory RepeatedApp.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); factory UpdateAppParams.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.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
@$core.Deprecated( @$core.Deprecated(
'Using this can add significant overhead to your binary. ' 'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version') 'Will be removed in next major version')
RepeatedApp clone() => RepeatedApp()..mergeFromMessage(this); UpdateAppParams clone() => UpdateAppParams()..mergeFromMessage(this);
@$core.Deprecated( @$core.Deprecated(
'Using this can add significant overhead to your binary. ' 'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' 'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version') '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; $pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline') @$core.pragma('dart2js:noInline')
static RepeatedApp create() => RepeatedApp._(); static UpdateAppParams create() => UpdateAppParams._();
RepeatedApp createEmptyInstance() => create(); UpdateAppParams createEmptyInstance() => create();
static $pb.PbList<RepeatedApp> createRepeated() => $pb.PbList<RepeatedApp>(); static $pb.PbList<UpdateAppParams> createRepeated() => $pb.PbList<UpdateAppParams>();
@$core.pragma('dart2js:noInline') @$core.pragma('dart2js:noInline')
static RepeatedApp getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<RepeatedApp>(create); static UpdateAppParams getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UpdateAppParams>(create);
static RepeatedApp? _defaultInstance; 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) @$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);
} }

View File

@ -1,6 +1,6 @@
/// ///
// Generated code. Do not modify. // Generated code. Do not modify.
// source: doc.proto // source: app.proto
// //
// @dart = 2.12 // @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: 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

View File

@ -1,6 +1,6 @@
/// ///
// Generated code. Do not modify. // Generated code. Do not modify.
// source: app_create.proto // source: app.proto
// //
// @dart = 2.12 // @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 // 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:core' as $core;
import 'dart:convert' as $convert; import 'dart:convert' as $convert;
import 'dart:typed_data' as $typed_data; 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') @$core.Deprecated('Use createAppRequestDescriptor instead')
const CreateAppRequest$json = const { const CreateAppRequest$json = const {
'1': 'CreateAppRequest', '1': 'CreateAppRequest',
@ -44,30 +71,63 @@ const CreateAppParams$json = const {
/// Descriptor for `CreateAppParams`. Decode as a `google.protobuf.DescriptorProto`. /// Descriptor for `CreateAppParams`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List createAppParamsDescriptor = $convert.base64Decode('Cg9DcmVhdGVBcHBQYXJhbXMSIQoMd29ya3NwYWNlX2lkGAEgASgJUgt3b3Jrc3BhY2VJZBISCgRuYW1lGAIgASgJUgRuYW1lEhIKBGRlc2MYAyABKAlSBGRlc2MSLAoLY29sb3Jfc3R5bGUYBCABKAsyCy5Db2xvclN0eWxlUgpjb2xvclN0eWxl'); final $typed_data.Uint8List createAppParamsDescriptor = $convert.base64Decode('Cg9DcmVhdGVBcHBQYXJhbXMSIQoMd29ya3NwYWNlX2lkGAEgASgJUgt3b3Jrc3BhY2VJZBISCgRuYW1lGAIgASgJUgRuYW1lEhIKBGRlc2MYAyABKAlSBGRlc2MSLAoLY29sb3Jfc3R5bGUYBCABKAsyCy5Db2xvclN0eWxlUgpjb2xvclN0eWxl');
@$core.Deprecated('Use appDescriptor instead') @$core.Deprecated('Use queryAppRequestDescriptor instead')
const App$json = const { const QueryAppRequest$json = const {
'1': 'App', '1': 'QueryAppRequest',
'2': const [ '2': const [
const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'}, const {'1': 'app_ids', '3': 1, '4': 3, '5': 9, '10': 'appIds'},
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`. /// Descriptor for `QueryAppRequest`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List appDescriptor = $convert.base64Decode('CgNBcHASDgoCaWQYASABKAlSAmlkEiEKDHdvcmtzcGFjZV9pZBgCIAEoCVILd29ya3NwYWNlSWQSEgoEbmFtZRgDIAEoCVIEbmFtZRISCgRkZXNjGAQgASgJUgRkZXNjEi0KCmJlbG9uZ2luZ3MYBSABKAsyDS5SZXBlYXRlZFZpZXdSCmJlbG9uZ2luZ3MSGAoHdmVyc2lvbhgGIAEoA1IHdmVyc2lvbhIjCg1tb2RpZmllZF90aW1lGAcgASgDUgxtb2RpZmllZFRpbWUSHwoLY3JlYXRlX3RpbWUYCCABKANSCmNyZWF0ZVRpbWU='); final $typed_data.Uint8List queryAppRequestDescriptor = $convert.base64Decode('Cg9RdWVyeUFwcFJlcXVlc3QSFwoHYXBwX2lkcxgBIAMoCVIGYXBwSWRz');
@$core.Deprecated('Use repeatedAppDescriptor instead') @$core.Deprecated('Use appIdDescriptor instead')
const RepeatedApp$json = const { const AppId$json = const {
'1': 'RepeatedApp', '1': 'AppId',
'2': const [ '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`. /// Descriptor for `AppId`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List repeatedAppDescriptor = $convert.base64Decode('CgtSZXBlYXRlZEFwcBIaCgVpdGVtcxgBIAMoCzIELkFwcFIFaXRlbXM='); 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