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

View File

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

View File

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

View File

@ -1,40 +1,38 @@
use crate::{
services::kv::{KVStore, KeyValue},
util::serde_ext::parse_from_bytes,
};
use anyhow::Context;
use backend_service::errors::{internal_error, ServerError};
use bytes::Bytes;
use flowy_collaboration::{
protobuf::{
CreateDocParams, DocumentId, DocumentInfo, RepeatedRevision as RepeatedRevisionPB, ResetDocumentParams,
Revision as RevisionPB,
},
sync::ServerDocumentManager,
protobuf::{CreateDocParams, DocumentId, DocumentInfo, ResetDocumentParams},
server_document::ServerDocumentManager,
util::make_document_info_pb_from_revisions_pb,
};
use lib_ot::{core::OperationTransformable, rich_text::RichTextDelta};
use protobuf::Message;
use crate::services::kv::revision_kv::RevisionKVPersistence;
use std::sync::Arc;
use uuid::Uuid;
#[tracing::instrument(level = "debug", skip(kv_store, params), err)]
#[tracing::instrument(level = "trace", skip(document_store, params), err)]
pub(crate) async fn create_document(
kv_store: &Arc<DocumentKVPersistence>,
document_store: &Arc<RevisionKVPersistence>,
mut params: CreateDocParams,
) -> Result<(), ServerError> {
let revisions = params.take_revisions().take_items();
let _ = kv_store.batch_set_revision(revisions.into()).await?;
let _ = document_store.set_revision(revisions.into()).await?;
Ok(())
}
#[tracing::instrument(level = "debug", skip(kv_store), err)]
#[tracing::instrument(level = "trace", skip(document_store), err)]
pub async fn read_document(
kv_store: &Arc<DocumentKVPersistence>,
document_store: &Arc<RevisionKVPersistence>,
params: DocumentId,
) -> Result<DocumentInfo, ServerError> {
let _ = Uuid::parse_str(&params.doc_id).context("Parse document id to uuid failed")?;
let revisions = kv_store.batch_get_revisions(&params.doc_id, None).await?;
make_doc_from_revisions(&params.doc_id, revisions)
let revisions = document_store.get_revisions(&params.doc_id, None).await?;
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)]
@ -54,167 +52,12 @@ pub async fn reset_document(
Ok(())
}
#[tracing::instrument(level = "debug", skip(kv_store), err)]
pub(crate) async fn delete_document(kv_store: &Arc<DocumentKVPersistence>, doc_id: Uuid) -> Result<(), ServerError> {
let _ = kv_store.batch_delete_revisions(&doc_id.to_string(), None).await?;
#[tracing::instrument(level = "trace", skip(document_store), err)]
pub(crate) async fn delete_document(
document_store: &Arc<RevisionKVPersistence>,
doc_id: Uuid,
) -> Result<(), ServerError> {
// TODO: delete revisions may cause time issue. Maybe delete asynchronously?
let _ = document_store.delete_revisions(&doc_id.to_string(), None).await?;
Ok(())
}
pub struct DocumentKVPersistence {
inner: Arc<KVStore>,
}
impl std::ops::Deref for DocumentKVPersistence {
type Target = Arc<KVStore>;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl std::ops::DerefMut for DocumentKVPersistence {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}
impl DocumentKVPersistence {
pub(crate) fn new(kv_store: Arc<KVStore>) -> Self {
DocumentKVPersistence { inner: kv_store }
}
pub(crate) async fn batch_set_revision(&self, revisions: Vec<RevisionPB>) -> Result<(), ServerError> {
let items = revisions_to_key_value_items(revisions)?;
self.inner
.transaction(|mut t| Box::pin(async move { t.batch_set(items).await }))
.await
}
pub(crate) async fn get_doc_revisions(&self, doc_id: &str) -> Result<RepeatedRevisionPB, ServerError> {
let doc_id = doc_id.to_owned();
let items = self
.inner
.transaction(|mut t| Box::pin(async move { t.batch_get_start_with(&doc_id).await }))
.await?;
Ok(key_value_items_to_revisions(items))
}
pub(crate) async fn batch_get_revisions<T: Into<Option<Vec<i64>>>>(
&self,
doc_id: &str,
rev_ids: T,
) -> Result<RepeatedRevisionPB, ServerError> {
let rev_ids = rev_ids.into();
let items = match rev_ids {
None => {
let doc_id = doc_id.to_owned();
self.inner
.transaction(|mut t| Box::pin(async move { t.batch_get_start_with(&doc_id).await }))
.await?
}
Some(rev_ids) => {
let keys = rev_ids
.into_iter()
.map(|rev_id| make_revision_key(doc_id, rev_id))
.collect::<Vec<String>>();
self.inner
.transaction(|mut t| Box::pin(async move { t.batch_get(keys).await }))
.await?
}
};
Ok(key_value_items_to_revisions(items))
}
pub(crate) async fn batch_delete_revisions<T: Into<Option<Vec<i64>>>>(
&self,
doc_id: &str,
rev_ids: T,
) -> Result<(), ServerError> {
match rev_ids.into() {
None => {
let doc_id = doc_id.to_owned();
self.inner
.transaction(|mut t| Box::pin(async move { t.batch_delete_key_start_with(&doc_id).await }))
.await
}
Some(rev_ids) => {
let keys = rev_ids
.into_iter()
.map(|rev_id| make_revision_key(doc_id, rev_id))
.collect::<Vec<String>>();
self.inner
.transaction(|mut t| Box::pin(async move { t.batch_delete(keys).await }))
.await
}
}
}
}
#[inline]
pub fn revisions_to_key_value_items(revisions: Vec<RevisionPB>) -> Result<Vec<KeyValue>, ServerError> {
let mut items = vec![];
for revision in revisions {
let key = make_revision_key(&revision.doc_id, revision.rev_id);
if revision.delta_data.is_empty() {
return Err(ServerError::internal().context("The delta_data of RevisionPB should not be empty"));
}
let value = Bytes::from(revision.write_to_bytes().unwrap());
items.push(KeyValue { key, value });
}
Ok(items)
}
#[inline]
fn key_value_items_to_revisions(items: Vec<KeyValue>) -> RepeatedRevisionPB {
let mut revisions = items
.into_iter()
.filter_map(|kv| parse_from_bytes::<RevisionPB>(&kv.value).ok())
.collect::<Vec<RevisionPB>>();
revisions.sort_by(|a, b| a.rev_id.cmp(&b.rev_id));
let mut repeated_revision = RepeatedRevisionPB::new();
repeated_revision.set_items(revisions.into());
repeated_revision
}
#[inline]
fn make_revision_key(doc_id: &str, rev_id: i64) -> String {
format!("{}:{}", doc_id, rev_id)
}
#[inline]
fn make_doc_from_revisions(doc_id: &str, mut revisions: RepeatedRevisionPB) -> Result<DocumentInfo, ServerError> {
let revisions = revisions.take_items();
if revisions.is_empty() {
return Err(ServerError::record_not_found().context(format!("{} not exist", doc_id)));
}
let mut document_delta = RichTextDelta::new();
let mut base_rev_id = 0;
let mut rev_id = 0;
// TODO: replace with make_delta_from_revisions
for revision in revisions {
base_rev_id = revision.base_rev_id;
rev_id = revision.rev_id;
if revision.delta_data.is_empty() {
tracing::warn!("revision delta_data is empty");
}
let delta = RichTextDelta::from_bytes(revision.delta_data).map_err(internal_error)?;
document_delta = document_delta.compose(&delta).map_err(internal_error)?;
}
let text = document_delta.to_json();
let mut document_info = DocumentInfo::new();
document_info.set_doc_id(doc_id.to_owned());
document_info.set_text(text);
document_info.set_base_rev_id(base_rev_id);
document_info.set_rev_id(rev_id);
Ok(document_info)
}

View File

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

View File

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

View File

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

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::{
entities::logged_user::LoggedUser,
services::core::{app::persistence::*, trash::read_trash_ids},
services::folder::{app::persistence::*, trash::read_trash_ids},
util::sqlx_ext::{map_sqlx_error, DBTransaction, SqlBuilder},
};
use backend_service::errors::{invalid_params, ServerError};

View File

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

View File

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

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};
pub(crate) const TRASH_TABLE: &str = "trash_table";

View File

@ -1,7 +1,7 @@
use crate::{
context::FlowyPersistence,
entities::logged_user::LoggedUser,
services::core::trash::{create_trash, delete_all_trash, delete_trash, read_trash},
services::folder::trash::{create_trash, delete_all_trash, delete_trash, read_trash},
util::serde_ext::parse_from_payload,
};
use ::protobuf::ProtobufEnum;
@ -48,7 +48,7 @@ pub async fn delete_handler(
logged_user: LoggedUser,
) -> Result<HttpResponse, ServerError> {
let pool = persistence.pg_pool();
let kv_store = persistence.kv_store();
let kv_store = persistence.document_kv_store();
let params: RepeatedTrashId = parse_from_payload(payload).await?;
let mut transaction = pool
.begin()

View File

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

View File

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

View File

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

View File

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

View File

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

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)]
mod kv;
pub mod revision_kv;
use async_trait::async_trait;
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 subscriber = tracing_subscriber::fmt()
.with_target(true)
.with_max_level(tracing::Level::DEBUG)
.with_max_level(tracing::Level::TRACE)
.with_writer(std::io::stderr)
.with_thread_ids(true)
.compact()

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

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/button.dart';
import 'package:flowy_infra_ui/widget/error_page.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace.pb.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart';

View File

@ -1,7 +1,7 @@
import 'package:app_flowy/workspace/domain/i_app.dart';
import 'package:flowy_log/flowy_log.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

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_view.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flutter_quill/flutter_quill.dart';
import 'package:flowy_log/flowy_log.dart';

View File

@ -1,7 +1,7 @@
import 'package:app_flowy/workspace/domain/i_share.dart';
import 'package:app_flowy/workspace/infrastructure/markdown/delta_markdown.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/export.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/share.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

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:dartz/dartz.dart';
import 'package:flowy_log/flowy_log.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

View File

@ -1,6 +1,6 @@
import 'package:app_flowy/workspace/domain/i_user.dart';
import 'package:flowy_log/flowy_log.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

View File

@ -1,7 +1,7 @@
import 'package:app_flowy/workspace/domain/i_trash.dart';
import 'package:dartz/dartz.dart';
import 'package:flowy_log/flowy_log.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

View File

@ -1,5 +1,5 @@
import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

View File

@ -1,7 +1,7 @@
import 'package:app_flowy/workspace/domain/i_user.dart';
import 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart';
import 'package:flowy_log/flowy_log.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

View File

@ -1,6 +1,6 @@
import 'dart:async';
import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/protobuf/flowy-collaboration/doc.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-collaboration/document_info.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
abstract class IDoc {

View File

@ -1,6 +1,6 @@
import 'dart:async';
import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
abstract class ITrash {

View File

@ -2,7 +2,7 @@ import 'package:dartz/dartz.dart';
import 'package:flowy_infra/notifier.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile;
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace.pb.dart';
export 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile;
abstract class IUser {

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:flowy_infra/notifier.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: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/presentation/stack_page/blank/blank_page.dart';
import 'package:app_flowy/workspace/presentation/stack_page/doc/doc_stack_page.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
extension ToHomeStackContext on View {
HomeStackContext stackContext() {

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/workspace_repo.dart';
import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile;
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
import 'package:get_it/get_it.dart';
import 'i_share_impl.dart';

View File

@ -1,7 +1,7 @@
import 'package:app_flowy/workspace/infrastructure/repos/app_repo.dart';
import 'package:dartz/dartz.dart';
import 'package:app_flowy/workspace/domain/i_app.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
export 'package:app_flowy/workspace/domain/i_app.dart';

View File

@ -4,7 +4,7 @@ import 'dart:typed_data';
import 'package:dartz/dartz.dart';
import 'package:app_flowy/workspace/domain/i_doc.dart';
import 'package:app_flowy/workspace/infrastructure/repos/doc_repo.dart';
import 'package:flowy_sdk/protobuf/flowy-collaboration/doc.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-collaboration/document_info.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
class IDocImpl extends IDoc {

View File

@ -1,7 +1,7 @@
import 'package:app_flowy/workspace/domain/i_trash.dart';
import 'package:app_flowy/workspace/infrastructure/repos/trash_repo.dart';
import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
class ITrashImpl implements ITrash {

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

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:flowy_infra/notifier.dart';
import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
class IViewImpl extends IView {

View File

@ -1,7 +1,7 @@
import 'package:app_flowy/workspace/domain/i_workspace.dart';
import 'package:app_flowy/workspace/infrastructure/repos/workspace_repo.dart';
import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
export 'package:app_flowy/workspace/domain/i_workspace.dart';

View File

@ -5,12 +5,10 @@ import 'package:dartz/dartz.dart';
import 'package:flowy_log/flowy_log.dart';
import 'package:flowy_sdk/dispatch/dispatch.dart';
import 'package:flowy_sdk/protobuf/dart-notify/subject.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_query.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_update.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core/observable.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core/dart_notification.pb.dart';
import 'package:flowy_sdk/rust_stream.dart';
import 'helper.dart';

View File

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

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:dartz/dartz.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core/observable.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core/dart_notification.pb.dart';
typedef UserNotificationCallback = void Function(UserNotification, Either<Uint8List, FlowyError>);

View File

@ -5,9 +5,9 @@ import 'package:app_flowy/workspace/infrastructure/repos/helper.dart';
import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/dispatch/dispatch.dart';
import 'package:flowy_sdk/protobuf/dart-notify/subject.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core/observable.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core/dart_notification.pb.dart';
import 'package:flowy_sdk/rust_stream.dart';
class TrashRepo {
@ -33,11 +33,11 @@ class TrashRepo {
}
Future<Either<Unit, FlowyError>> restoreAll() {
return WorkspaceEventRestoreAll().send();
return WorkspaceEventRestoreAllTrash().send();
}
Future<Either<Unit, FlowyError>> deleteAll() {
return WorkspaceEventDeleteAll().send();
return WorkspaceEventDeleteAllTrash().send();
}
}

View File

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

View File

@ -3,11 +3,9 @@ import 'dart:typed_data';
import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/dispatch/dispatch.dart';
import 'package:flowy_sdk/protobuf/dart-notify/subject.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_query.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_update.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core/observable.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core/dart_notification.pb.dart';
import 'package:flowy_sdk/rust_stream.dart';
import 'package:app_flowy/workspace/domain/i_view.dart';

View File

@ -7,11 +7,10 @@ import 'package:flowy_log/flowy_log.dart';
import 'package:flowy_sdk/dispatch/dispatch.dart';
import 'package:flowy_sdk/protobuf/dart-notify/subject.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile;
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_query.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core/observable.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core/dart_notification.pb.dart';
import 'package:flowy_sdk/rust_stream.dart';
import 'package:app_flowy/generated/locale_keys.g.dart';

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:flutter_quill/flutter_quill.dart' as quill;
import 'package:flowy_infra_ui/widget/error_page.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:styled_widget/styled_widget.dart';

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/widget/rounded_button.dart';
import 'package:flowy_log/flowy_log.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/export.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/share.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flutter/material.dart';
import 'package:dartz/dartz.dart' as dartz;

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/text.dart';
import 'package:flowy_infra_ui/widget/spacing.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash.pb.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:fixnum/fixnum.dart' as $fixnum;

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

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/widget/spacing.dart';
import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile;
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_setting.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace.pb.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:provider/provider.dart';

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/icon_button.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:styled_widget/styled_widget.dart';

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_ui/flowy_infra_ui.dart';
import 'package:flowy_infra_ui/style_widget/text.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app.pb.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:app_flowy/workspace/application/app/app_bloc.dart';

View File

@ -1,8 +1,8 @@
import 'package:app_flowy/workspace/presentation/widgets/menu/menu.dart';
import 'package:app_flowy/workspace/presentation/widgets/menu/widget/app/header/header.dart';
import 'package:expandable/expandable.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/app.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:app_flowy/startup/startup.dart';

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/text.dart';
import 'package:flowy_infra_ui/widget/spacing.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:styled_widget/styled_widget.dart';

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/presentation/widgets/menu/menu.dart';
import 'package:app_flowy/workspace/presentation/widgets/menu/widget/app/menu_app.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-core-data-model/view.pb.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:styled_widget/styled_widget.dart';

View File

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

View File

@ -4,6 +4,7 @@ import 'package:flowy_log/flowy_log.dart';
// ignore: unnecessary_import
import 'package:flowy_sdk/protobuf/dart-ffi/ffi_response.pb.dart';
import 'package:flowy_sdk/protobuf/dart-ffi/ffi_request.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-collaboration/document_info.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-net/event.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-net/network_state.pb.dart';

View File

@ -1,6 +1,6 @@
///
// Generated code. Do not modify.
// source: doc.proto
// source: document_info.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields

View File

@ -1,6 +1,6 @@
///
// Generated code. Do not modify.
// source: app_create.proto
// source: document_info.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields

View File

@ -1,6 +1,6 @@
///
// Generated code. Do not modify.
// source: doc.proto
// source: document_info.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package

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.
// source: app_update.proto
// source: folder_info.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields

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.
// source: app_create.proto
// source: folder_info.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
export 'app_create.pb.dart';
export 'folder_info.pb.dart';

View File

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

View File

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

View File

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

View File

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

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

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.
// source: app_query.proto
// source: ws_data.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
export 'app_query.pb.dart';
export 'ws_data.pb.dart';

View File

@ -1,6 +1,6 @@
///
// Generated code. Do not modify.
// source: app_create.proto
// source: app.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields
@ -10,7 +10,195 @@ import 'dart:core' as $core;
import 'package:fixnum/fixnum.dart' as $fixnum;
import 'package:protobuf/protobuf.dart' as $pb;
import 'view_create.pb.dart' as $0;
import 'view.pb.dart' as $0;
class App extends $pb.GeneratedMessage {
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'App', createEmptyInstance: create)
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id')
..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'workspaceId')
..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc')
..aOM<$0.RepeatedView>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'belongings', subBuilder: $0.RepeatedView.create)
..aInt64(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'version')
..aInt64(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'modifiedTime')
..aInt64(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'createTime')
..hasRequiredFields = false
;
App._() : super();
factory App({
$core.String? id,
$core.String? workspaceId,
$core.String? name,
$core.String? desc,
$0.RepeatedView? belongings,
$fixnum.Int64? version,
$fixnum.Int64? modifiedTime,
$fixnum.Int64? createTime,
}) {
final _result = create();
if (id != null) {
_result.id = id;
}
if (workspaceId != null) {
_result.workspaceId = workspaceId;
}
if (name != null) {
_result.name = name;
}
if (desc != null) {
_result.desc = desc;
}
if (belongings != null) {
_result.belongings = belongings;
}
if (version != null) {
_result.version = version;
}
if (modifiedTime != null) {
_result.modifiedTime = modifiedTime;
}
if (createTime != null) {
_result.createTime = createTime;
}
return _result;
}
factory App.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory App.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
App clone() => App()..mergeFromMessage(this);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
App copyWith(void Function(App) updates) => super.copyWith((message) => updates(message as App)) as App; // ignore: deprecated_member_use
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static App create() => App._();
App createEmptyInstance() => create();
static $pb.PbList<App> createRepeated() => $pb.PbList<App>();
@$core.pragma('dart2js:noInline')
static App getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<App>(create);
static App? _defaultInstance;
@$pb.TagNumber(1)
$core.String get id => $_getSZ(0);
@$pb.TagNumber(1)
set id($core.String v) { $_setString(0, v); }
@$pb.TagNumber(1)
$core.bool hasId() => $_has(0);
@$pb.TagNumber(1)
void clearId() => clearField(1);
@$pb.TagNumber(2)
$core.String get workspaceId => $_getSZ(1);
@$pb.TagNumber(2)
set workspaceId($core.String v) { $_setString(1, v); }
@$pb.TagNumber(2)
$core.bool hasWorkspaceId() => $_has(1);
@$pb.TagNumber(2)
void clearWorkspaceId() => clearField(2);
@$pb.TagNumber(3)
$core.String get name => $_getSZ(2);
@$pb.TagNumber(3)
set name($core.String v) { $_setString(2, v); }
@$pb.TagNumber(3)
$core.bool hasName() => $_has(2);
@$pb.TagNumber(3)
void clearName() => clearField(3);
@$pb.TagNumber(4)
$core.String get desc => $_getSZ(3);
@$pb.TagNumber(4)
set desc($core.String v) { $_setString(3, v); }
@$pb.TagNumber(4)
$core.bool hasDesc() => $_has(3);
@$pb.TagNumber(4)
void clearDesc() => clearField(4);
@$pb.TagNumber(5)
$0.RepeatedView get belongings => $_getN(4);
@$pb.TagNumber(5)
set belongings($0.RepeatedView v) { setField(5, v); }
@$pb.TagNumber(5)
$core.bool hasBelongings() => $_has(4);
@$pb.TagNumber(5)
void clearBelongings() => clearField(5);
@$pb.TagNumber(5)
$0.RepeatedView ensureBelongings() => $_ensure(4);
@$pb.TagNumber(6)
$fixnum.Int64 get version => $_getI64(5);
@$pb.TagNumber(6)
set version($fixnum.Int64 v) { $_setInt64(5, v); }
@$pb.TagNumber(6)
$core.bool hasVersion() => $_has(5);
@$pb.TagNumber(6)
void clearVersion() => clearField(6);
@$pb.TagNumber(7)
$fixnum.Int64 get modifiedTime => $_getI64(6);
@$pb.TagNumber(7)
set modifiedTime($fixnum.Int64 v) { $_setInt64(6, v); }
@$pb.TagNumber(7)
$core.bool hasModifiedTime() => $_has(6);
@$pb.TagNumber(7)
void clearModifiedTime() => clearField(7);
@$pb.TagNumber(8)
$fixnum.Int64 get createTime => $_getI64(7);
@$pb.TagNumber(8)
set createTime($fixnum.Int64 v) { $_setInt64(7, v); }
@$pb.TagNumber(8)
$core.bool hasCreateTime() => $_has(7);
@$pb.TagNumber(8)
void clearCreateTime() => clearField(8);
}
class RepeatedApp extends $pb.GeneratedMessage {
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RepeatedApp', createEmptyInstance: create)
..pc<App>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'items', $pb.PbFieldType.PM, subBuilder: App.create)
..hasRequiredFields = false
;
RepeatedApp._() : super();
factory RepeatedApp({
$core.Iterable<App>? items,
}) {
final _result = create();
if (items != null) {
_result.items.addAll(items);
}
return _result;
}
factory RepeatedApp.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory RepeatedApp.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
RepeatedApp clone() => RepeatedApp()..mergeFromMessage(this);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
RepeatedApp copyWith(void Function(RepeatedApp) updates) => super.copyWith((message) => updates(message as RepeatedApp)) as RepeatedApp; // ignore: deprecated_member_use
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static RepeatedApp create() => RepeatedApp._();
RepeatedApp createEmptyInstance() => create();
static $pb.PbList<RepeatedApp> createRepeated() => $pb.PbList<RepeatedApp>();
@$core.pragma('dart2js:noInline')
static RepeatedApp getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<RepeatedApp>(create);
static RepeatedApp? _defaultInstance;
@$pb.TagNumber(1)
$core.List<App> get items => $_getList(0);
}
class CreateAppRequest extends $pb.GeneratedMessage {
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CreateAppRequest', createEmptyInstance: create)
@ -241,36 +429,155 @@ class CreateAppParams extends $pb.GeneratedMessage {
ColorStyle ensureColorStyle() => $_ensure(3);
}
class App extends $pb.GeneratedMessage {
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'App', createEmptyInstance: create)
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id')
..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'workspaceId')
..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc')
..aOM<$0.RepeatedView>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'belongings', subBuilder: $0.RepeatedView.create)
..aInt64(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'version')
..aInt64(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'modifiedTime')
..aInt64(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'createTime')
class QueryAppRequest extends $pb.GeneratedMessage {
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'QueryAppRequest', createEmptyInstance: create)
..pPS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'appIds')
..hasRequiredFields = false
;
App._() : super();
factory App({
$core.String? id,
$core.String? workspaceId,
$core.String? name,
$core.String? desc,
$0.RepeatedView? belongings,
$fixnum.Int64? version,
$fixnum.Int64? modifiedTime,
$fixnum.Int64? createTime,
QueryAppRequest._() : super();
factory QueryAppRequest({
$core.Iterable<$core.String>? appIds,
}) {
final _result = create();
if (id != null) {
_result.id = id;
if (appIds != null) {
_result.appIds.addAll(appIds);
}
if (workspaceId != null) {
_result.workspaceId = workspaceId;
return _result;
}
factory QueryAppRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory QueryAppRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
QueryAppRequest clone() => QueryAppRequest()..mergeFromMessage(this);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
QueryAppRequest copyWith(void Function(QueryAppRequest) updates) => super.copyWith((message) => updates(message as QueryAppRequest)) as QueryAppRequest; // ignore: deprecated_member_use
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static QueryAppRequest create() => QueryAppRequest._();
QueryAppRequest createEmptyInstance() => create();
static $pb.PbList<QueryAppRequest> createRepeated() => $pb.PbList<QueryAppRequest>();
@$core.pragma('dart2js:noInline')
static QueryAppRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<QueryAppRequest>(create);
static QueryAppRequest? _defaultInstance;
@$pb.TagNumber(1)
$core.List<$core.String> get appIds => $_getList(0);
}
class AppId extends $pb.GeneratedMessage {
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'AppId', createEmptyInstance: create)
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'appId')
..hasRequiredFields = false
;
AppId._() : super();
factory AppId({
$core.String? appId,
}) {
final _result = create();
if (appId != null) {
_result.appId = appId;
}
return _result;
}
factory AppId.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory AppId.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
AppId clone() => AppId()..mergeFromMessage(this);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
AppId copyWith(void Function(AppId) updates) => super.copyWith((message) => updates(message as AppId)) as AppId; // ignore: deprecated_member_use
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static AppId create() => AppId._();
AppId createEmptyInstance() => create();
static $pb.PbList<AppId> createRepeated() => $pb.PbList<AppId>();
@$core.pragma('dart2js:noInline')
static AppId getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AppId>(create);
static AppId? _defaultInstance;
@$pb.TagNumber(1)
$core.String get appId => $_getSZ(0);
@$pb.TagNumber(1)
set appId($core.String v) { $_setString(0, v); }
@$pb.TagNumber(1)
$core.bool hasAppId() => $_has(0);
@$pb.TagNumber(1)
void clearAppId() => clearField(1);
}
enum UpdateAppRequest_OneOfName {
name,
notSet
}
enum UpdateAppRequest_OneOfDesc {
desc,
notSet
}
enum UpdateAppRequest_OneOfColorStyle {
colorStyle,
notSet
}
enum UpdateAppRequest_OneOfIsTrash {
isTrash,
notSet
}
class UpdateAppRequest extends $pb.GeneratedMessage {
static const $core.Map<$core.int, UpdateAppRequest_OneOfName> _UpdateAppRequest_OneOfNameByTag = {
2 : UpdateAppRequest_OneOfName.name,
0 : UpdateAppRequest_OneOfName.notSet
};
static const $core.Map<$core.int, UpdateAppRequest_OneOfDesc> _UpdateAppRequest_OneOfDescByTag = {
3 : UpdateAppRequest_OneOfDesc.desc,
0 : UpdateAppRequest_OneOfDesc.notSet
};
static const $core.Map<$core.int, UpdateAppRequest_OneOfColorStyle> _UpdateAppRequest_OneOfColorStyleByTag = {
4 : UpdateAppRequest_OneOfColorStyle.colorStyle,
0 : UpdateAppRequest_OneOfColorStyle.notSet
};
static const $core.Map<$core.int, UpdateAppRequest_OneOfIsTrash> _UpdateAppRequest_OneOfIsTrashByTag = {
5 : UpdateAppRequest_OneOfIsTrash.isTrash,
0 : UpdateAppRequest_OneOfIsTrash.notSet
};
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UpdateAppRequest', createEmptyInstance: create)
..oo(0, [2])
..oo(1, [3])
..oo(2, [4])
..oo(3, [5])
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'appId')
..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc')
..aOM<ColorStyle>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'colorStyle', subBuilder: ColorStyle.create)
..aOB(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'isTrash')
..hasRequiredFields = false
;
UpdateAppRequest._() : super();
factory UpdateAppRequest({
$core.String? appId,
$core.String? name,
$core.String? desc,
ColorStyle? colorStyle,
$core.bool? isTrash,
}) {
final _result = create();
if (appId != null) {
_result.appId = appId;
}
if (name != null) {
_result.name = name;
@ -278,154 +585,249 @@ class App extends $pb.GeneratedMessage {
if (desc != null) {
_result.desc = desc;
}
if (belongings != null) {
_result.belongings = belongings;
if (colorStyle != null) {
_result.colorStyle = colorStyle;
}
if (version != null) {
_result.version = version;
}
if (modifiedTime != null) {
_result.modifiedTime = modifiedTime;
}
if (createTime != null) {
_result.createTime = createTime;
if (isTrash != null) {
_result.isTrash = isTrash;
}
return _result;
}
factory App.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory App.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
factory UpdateAppRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory UpdateAppRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
App clone() => App()..mergeFromMessage(this);
UpdateAppRequest clone() => UpdateAppRequest()..mergeFromMessage(this);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
App copyWith(void Function(App) updates) => super.copyWith((message) => updates(message as App)) as App; // ignore: deprecated_member_use
UpdateAppRequest copyWith(void Function(UpdateAppRequest) updates) => super.copyWith((message) => updates(message as UpdateAppRequest)) as UpdateAppRequest; // ignore: deprecated_member_use
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static App create() => App._();
App createEmptyInstance() => create();
static $pb.PbList<App> createRepeated() => $pb.PbList<App>();
static UpdateAppRequest create() => UpdateAppRequest._();
UpdateAppRequest createEmptyInstance() => create();
static $pb.PbList<UpdateAppRequest> createRepeated() => $pb.PbList<UpdateAppRequest>();
@$core.pragma('dart2js:noInline')
static App getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<App>(create);
static App? _defaultInstance;
static UpdateAppRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UpdateAppRequest>(create);
static UpdateAppRequest? _defaultInstance;
UpdateAppRequest_OneOfName whichOneOfName() => _UpdateAppRequest_OneOfNameByTag[$_whichOneof(0)]!;
void clearOneOfName() => clearField($_whichOneof(0));
UpdateAppRequest_OneOfDesc whichOneOfDesc() => _UpdateAppRequest_OneOfDescByTag[$_whichOneof(1)]!;
void clearOneOfDesc() => clearField($_whichOneof(1));
UpdateAppRequest_OneOfColorStyle whichOneOfColorStyle() => _UpdateAppRequest_OneOfColorStyleByTag[$_whichOneof(2)]!;
void clearOneOfColorStyle() => clearField($_whichOneof(2));
UpdateAppRequest_OneOfIsTrash whichOneOfIsTrash() => _UpdateAppRequest_OneOfIsTrashByTag[$_whichOneof(3)]!;
void clearOneOfIsTrash() => clearField($_whichOneof(3));
@$pb.TagNumber(1)
$core.String get id => $_getSZ(0);
$core.String get appId => $_getSZ(0);
@$pb.TagNumber(1)
set id($core.String v) { $_setString(0, v); }
set appId($core.String v) { $_setString(0, v); }
@$pb.TagNumber(1)
$core.bool hasId() => $_has(0);
$core.bool hasAppId() => $_has(0);
@$pb.TagNumber(1)
void clearId() => clearField(1);
void clearAppId() => clearField(1);
@$pb.TagNumber(2)
$core.String get workspaceId => $_getSZ(1);
$core.String get name => $_getSZ(1);
@$pb.TagNumber(2)
set workspaceId($core.String v) { $_setString(1, v); }
set name($core.String v) { $_setString(1, v); }
@$pb.TagNumber(2)
$core.bool hasWorkspaceId() => $_has(1);
$core.bool hasName() => $_has(1);
@$pb.TagNumber(2)
void clearWorkspaceId() => clearField(2);
void clearName() => clearField(2);
@$pb.TagNumber(3)
$core.String get name => $_getSZ(2);
$core.String get desc => $_getSZ(2);
@$pb.TagNumber(3)
set name($core.String v) { $_setString(2, v); }
set desc($core.String v) { $_setString(2, v); }
@$pb.TagNumber(3)
$core.bool hasName() => $_has(2);
$core.bool hasDesc() => $_has(2);
@$pb.TagNumber(3)
void clearName() => clearField(3);
void clearDesc() => clearField(3);
@$pb.TagNumber(4)
$core.String get desc => $_getSZ(3);
ColorStyle get colorStyle => $_getN(3);
@$pb.TagNumber(4)
set desc($core.String v) { $_setString(3, v); }
set colorStyle(ColorStyle v) { setField(4, v); }
@$pb.TagNumber(4)
$core.bool hasDesc() => $_has(3);
$core.bool hasColorStyle() => $_has(3);
@$pb.TagNumber(4)
void clearDesc() => clearField(4);
void clearColorStyle() => clearField(4);
@$pb.TagNumber(4)
ColorStyle ensureColorStyle() => $_ensure(3);
@$pb.TagNumber(5)
$0.RepeatedView get belongings => $_getN(4);
$core.bool get isTrash => $_getBF(4);
@$pb.TagNumber(5)
set belongings($0.RepeatedView v) { setField(5, v); }
set isTrash($core.bool v) { $_setBool(4, v); }
@$pb.TagNumber(5)
$core.bool hasBelongings() => $_has(4);
$core.bool hasIsTrash() => $_has(4);
@$pb.TagNumber(5)
void clearBelongings() => clearField(5);
@$pb.TagNumber(5)
$0.RepeatedView ensureBelongings() => $_ensure(4);
@$pb.TagNumber(6)
$fixnum.Int64 get version => $_getI64(5);
@$pb.TagNumber(6)
set version($fixnum.Int64 v) { $_setInt64(5, v); }
@$pb.TagNumber(6)
$core.bool hasVersion() => $_has(5);
@$pb.TagNumber(6)
void clearVersion() => clearField(6);
@$pb.TagNumber(7)
$fixnum.Int64 get modifiedTime => $_getI64(6);
@$pb.TagNumber(7)
set modifiedTime($fixnum.Int64 v) { $_setInt64(6, v); }
@$pb.TagNumber(7)
$core.bool hasModifiedTime() => $_has(6);
@$pb.TagNumber(7)
void clearModifiedTime() => clearField(7);
@$pb.TagNumber(8)
$fixnum.Int64 get createTime => $_getI64(7);
@$pb.TagNumber(8)
set createTime($fixnum.Int64 v) { $_setInt64(7, v); }
@$pb.TagNumber(8)
$core.bool hasCreateTime() => $_has(7);
@$pb.TagNumber(8)
void clearCreateTime() => clearField(8);
void clearIsTrash() => clearField(5);
}
class RepeatedApp extends $pb.GeneratedMessage {
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RepeatedApp', createEmptyInstance: create)
..pc<App>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'items', $pb.PbFieldType.PM, subBuilder: App.create)
enum UpdateAppParams_OneOfName {
name,
notSet
}
enum UpdateAppParams_OneOfDesc {
desc,
notSet
}
enum UpdateAppParams_OneOfColorStyle {
colorStyle,
notSet
}
enum UpdateAppParams_OneOfIsTrash {
isTrash,
notSet
}
class UpdateAppParams extends $pb.GeneratedMessage {
static const $core.Map<$core.int, UpdateAppParams_OneOfName> _UpdateAppParams_OneOfNameByTag = {
2 : UpdateAppParams_OneOfName.name,
0 : UpdateAppParams_OneOfName.notSet
};
static const $core.Map<$core.int, UpdateAppParams_OneOfDesc> _UpdateAppParams_OneOfDescByTag = {
3 : UpdateAppParams_OneOfDesc.desc,
0 : UpdateAppParams_OneOfDesc.notSet
};
static const $core.Map<$core.int, UpdateAppParams_OneOfColorStyle> _UpdateAppParams_OneOfColorStyleByTag = {
4 : UpdateAppParams_OneOfColorStyle.colorStyle,
0 : UpdateAppParams_OneOfColorStyle.notSet
};
static const $core.Map<$core.int, UpdateAppParams_OneOfIsTrash> _UpdateAppParams_OneOfIsTrashByTag = {
5 : UpdateAppParams_OneOfIsTrash.isTrash,
0 : UpdateAppParams_OneOfIsTrash.notSet
};
static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UpdateAppParams', createEmptyInstance: create)
..oo(0, [2])
..oo(1, [3])
..oo(2, [4])
..oo(3, [5])
..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'appId')
..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'desc')
..aOM<ColorStyle>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'colorStyle', subBuilder: ColorStyle.create)
..aOB(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'isTrash')
..hasRequiredFields = false
;
RepeatedApp._() : super();
factory RepeatedApp({
$core.Iterable<App>? items,
UpdateAppParams._() : super();
factory UpdateAppParams({
$core.String? appId,
$core.String? name,
$core.String? desc,
ColorStyle? colorStyle,
$core.bool? isTrash,
}) {
final _result = create();
if (items != null) {
_result.items.addAll(items);
if (appId != null) {
_result.appId = appId;
}
if (name != null) {
_result.name = name;
}
if (desc != null) {
_result.desc = desc;
}
if (colorStyle != null) {
_result.colorStyle = colorStyle;
}
if (isTrash != null) {
_result.isTrash = isTrash;
}
return _result;
}
factory RepeatedApp.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory RepeatedApp.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
factory UpdateAppParams.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
factory UpdateAppParams.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
'Will be removed in next major version')
RepeatedApp clone() => RepeatedApp()..mergeFromMessage(this);
UpdateAppParams clone() => UpdateAppParams()..mergeFromMessage(this);
@$core.Deprecated(
'Using this can add significant overhead to your binary. '
'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
'Will be removed in next major version')
RepeatedApp copyWith(void Function(RepeatedApp) updates) => super.copyWith((message) => updates(message as RepeatedApp)) as RepeatedApp; // ignore: deprecated_member_use
UpdateAppParams copyWith(void Function(UpdateAppParams) updates) => super.copyWith((message) => updates(message as UpdateAppParams)) as UpdateAppParams; // ignore: deprecated_member_use
$pb.BuilderInfo get info_ => _i;
@$core.pragma('dart2js:noInline')
static RepeatedApp create() => RepeatedApp._();
RepeatedApp createEmptyInstance() => create();
static $pb.PbList<RepeatedApp> createRepeated() => $pb.PbList<RepeatedApp>();
static UpdateAppParams create() => UpdateAppParams._();
UpdateAppParams createEmptyInstance() => create();
static $pb.PbList<UpdateAppParams> createRepeated() => $pb.PbList<UpdateAppParams>();
@$core.pragma('dart2js:noInline')
static RepeatedApp getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<RepeatedApp>(create);
static RepeatedApp? _defaultInstance;
static UpdateAppParams getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UpdateAppParams>(create);
static UpdateAppParams? _defaultInstance;
UpdateAppParams_OneOfName whichOneOfName() => _UpdateAppParams_OneOfNameByTag[$_whichOneof(0)]!;
void clearOneOfName() => clearField($_whichOneof(0));
UpdateAppParams_OneOfDesc whichOneOfDesc() => _UpdateAppParams_OneOfDescByTag[$_whichOneof(1)]!;
void clearOneOfDesc() => clearField($_whichOneof(1));
UpdateAppParams_OneOfColorStyle whichOneOfColorStyle() => _UpdateAppParams_OneOfColorStyleByTag[$_whichOneof(2)]!;
void clearOneOfColorStyle() => clearField($_whichOneof(2));
UpdateAppParams_OneOfIsTrash whichOneOfIsTrash() => _UpdateAppParams_OneOfIsTrashByTag[$_whichOneof(3)]!;
void clearOneOfIsTrash() => clearField($_whichOneof(3));
@$pb.TagNumber(1)
$core.List<App> get items => $_getList(0);
$core.String get appId => $_getSZ(0);
@$pb.TagNumber(1)
set appId($core.String v) { $_setString(0, v); }
@$pb.TagNumber(1)
$core.bool hasAppId() => $_has(0);
@$pb.TagNumber(1)
void clearAppId() => clearField(1);
@$pb.TagNumber(2)
$core.String get name => $_getSZ(1);
@$pb.TagNumber(2)
set name($core.String v) { $_setString(1, v); }
@$pb.TagNumber(2)
$core.bool hasName() => $_has(1);
@$pb.TagNumber(2)
void clearName() => clearField(2);
@$pb.TagNumber(3)
$core.String get desc => $_getSZ(2);
@$pb.TagNumber(3)
set desc($core.String v) { $_setString(2, v); }
@$pb.TagNumber(3)
$core.bool hasDesc() => $_has(2);
@$pb.TagNumber(3)
void clearDesc() => clearField(3);
@$pb.TagNumber(4)
ColorStyle get colorStyle => $_getN(3);
@$pb.TagNumber(4)
set colorStyle(ColorStyle v) { setField(4, v); }
@$pb.TagNumber(4)
$core.bool hasColorStyle() => $_has(3);
@$pb.TagNumber(4)
void clearColorStyle() => clearField(4);
@$pb.TagNumber(4)
ColorStyle ensureColorStyle() => $_ensure(3);
@$pb.TagNumber(5)
$core.bool get isTrash => $_getBF(4);
@$pb.TagNumber(5)
set isTrash($core.bool v) { $_setBool(4, v); }
@$pb.TagNumber(5)
$core.bool hasIsTrash() => $_has(4);
@$pb.TagNumber(5)
void clearIsTrash() => clearField(5);
}

View File

@ -1,6 +1,6 @@
///
// Generated code. Do not modify.
// source: doc.proto
// source: app.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields

View File

@ -1,6 +1,6 @@
///
// Generated code. Do not modify.
// source: app_create.proto
// source: app.proto
//
// @dart = 2.12
// ignore_for_file: annotate_overrides,camel_case_types,unnecessary_const,non_constant_identifier_names,library_prefixes,unused_import,unused_shown_name,return_of_invalid_type,unnecessary_this,prefer_final_fields,deprecated_member_use_from_same_package
@ -8,6 +8,33 @@
import 'dart:core' as $core;
import 'dart:convert' as $convert;
import 'dart:typed_data' as $typed_data;
@$core.Deprecated('Use appDescriptor instead')
const App$json = const {
'1': 'App',
'2': const [
const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'},
const {'1': 'workspace_id', '3': 2, '4': 1, '5': 9, '10': 'workspaceId'},
const {'1': 'name', '3': 3, '4': 1, '5': 9, '10': 'name'},
const {'1': 'desc', '3': 4, '4': 1, '5': 9, '10': 'desc'},
const {'1': 'belongings', '3': 5, '4': 1, '5': 11, '6': '.RepeatedView', '10': 'belongings'},
const {'1': 'version', '3': 6, '4': 1, '5': 3, '10': 'version'},
const {'1': 'modified_time', '3': 7, '4': 1, '5': 3, '10': 'modifiedTime'},
const {'1': 'create_time', '3': 8, '4': 1, '5': 3, '10': 'createTime'},
],
};
/// Descriptor for `App`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List appDescriptor = $convert.base64Decode('CgNBcHASDgoCaWQYASABKAlSAmlkEiEKDHdvcmtzcGFjZV9pZBgCIAEoCVILd29ya3NwYWNlSWQSEgoEbmFtZRgDIAEoCVIEbmFtZRISCgRkZXNjGAQgASgJUgRkZXNjEi0KCmJlbG9uZ2luZ3MYBSABKAsyDS5SZXBlYXRlZFZpZXdSCmJlbG9uZ2luZ3MSGAoHdmVyc2lvbhgGIAEoA1IHdmVyc2lvbhIjCg1tb2RpZmllZF90aW1lGAcgASgDUgxtb2RpZmllZFRpbWUSHwoLY3JlYXRlX3RpbWUYCCABKANSCmNyZWF0ZVRpbWU=');
@$core.Deprecated('Use repeatedAppDescriptor instead')
const RepeatedApp$json = const {
'1': 'RepeatedApp',
'2': const [
const {'1': 'items', '3': 1, '4': 3, '5': 11, '6': '.App', '10': 'items'},
],
};
/// Descriptor for `RepeatedApp`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List repeatedAppDescriptor = $convert.base64Decode('CgtSZXBlYXRlZEFwcBIaCgVpdGVtcxgBIAMoCzIELkFwcFIFaXRlbXM=');
@$core.Deprecated('Use createAppRequestDescriptor instead')
const CreateAppRequest$json = const {
'1': 'CreateAppRequest',
@ -44,30 +71,63 @@ const CreateAppParams$json = const {
/// Descriptor for `CreateAppParams`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List createAppParamsDescriptor = $convert.base64Decode('Cg9DcmVhdGVBcHBQYXJhbXMSIQoMd29ya3NwYWNlX2lkGAEgASgJUgt3b3Jrc3BhY2VJZBISCgRuYW1lGAIgASgJUgRuYW1lEhIKBGRlc2MYAyABKAlSBGRlc2MSLAoLY29sb3Jfc3R5bGUYBCABKAsyCy5Db2xvclN0eWxlUgpjb2xvclN0eWxl');
@$core.Deprecated('Use appDescriptor instead')
const App$json = const {
'1': 'App',
@$core.Deprecated('Use queryAppRequestDescriptor instead')
const QueryAppRequest$json = const {
'1': 'QueryAppRequest',
'2': const [
const {'1': 'id', '3': 1, '4': 1, '5': 9, '10': 'id'},
const {'1': 'workspace_id', '3': 2, '4': 1, '5': 9, '10': 'workspaceId'},
const {'1': 'name', '3': 3, '4': 1, '5': 9, '10': 'name'},
const {'1': 'desc', '3': 4, '4': 1, '5': 9, '10': 'desc'},
const {'1': 'belongings', '3': 5, '4': 1, '5': 11, '6': '.RepeatedView', '10': 'belongings'},
const {'1': 'version', '3': 6, '4': 1, '5': 3, '10': 'version'},
const {'1': 'modified_time', '3': 7, '4': 1, '5': 3, '10': 'modifiedTime'},
const {'1': 'create_time', '3': 8, '4': 1, '5': 3, '10': 'createTime'},
const {'1': 'app_ids', '3': 1, '4': 3, '5': 9, '10': 'appIds'},
],
};
/// Descriptor for `App`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List appDescriptor = $convert.base64Decode('CgNBcHASDgoCaWQYASABKAlSAmlkEiEKDHdvcmtzcGFjZV9pZBgCIAEoCVILd29ya3NwYWNlSWQSEgoEbmFtZRgDIAEoCVIEbmFtZRISCgRkZXNjGAQgASgJUgRkZXNjEi0KCmJlbG9uZ2luZ3MYBSABKAsyDS5SZXBlYXRlZFZpZXdSCmJlbG9uZ2luZ3MSGAoHdmVyc2lvbhgGIAEoA1IHdmVyc2lvbhIjCg1tb2RpZmllZF90aW1lGAcgASgDUgxtb2RpZmllZFRpbWUSHwoLY3JlYXRlX3RpbWUYCCABKANSCmNyZWF0ZVRpbWU=');
@$core.Deprecated('Use repeatedAppDescriptor instead')
const RepeatedApp$json = const {
'1': 'RepeatedApp',
/// Descriptor for `QueryAppRequest`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List queryAppRequestDescriptor = $convert.base64Decode('Cg9RdWVyeUFwcFJlcXVlc3QSFwoHYXBwX2lkcxgBIAMoCVIGYXBwSWRz');
@$core.Deprecated('Use appIdDescriptor instead')
const AppId$json = const {
'1': 'AppId',
'2': const [
const {'1': 'items', '3': 1, '4': 3, '5': 11, '6': '.App', '10': 'items'},
const {'1': 'app_id', '3': 1, '4': 1, '5': 9, '10': 'appId'},
],
};
/// Descriptor for `RepeatedApp`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List repeatedAppDescriptor = $convert.base64Decode('CgtSZXBlYXRlZEFwcBIaCgVpdGVtcxgBIAMoCzIELkFwcFIFaXRlbXM=');
/// Descriptor for `AppId`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List appIdDescriptor = $convert.base64Decode('CgVBcHBJZBIVCgZhcHBfaWQYASABKAlSBWFwcElk');
@$core.Deprecated('Use updateAppRequestDescriptor instead')
const UpdateAppRequest$json = const {
'1': 'UpdateAppRequest',
'2': const [
const {'1': 'app_id', '3': 1, '4': 1, '5': 9, '10': 'appId'},
const {'1': 'name', '3': 2, '4': 1, '5': 9, '9': 0, '10': 'name'},
const {'1': 'desc', '3': 3, '4': 1, '5': 9, '9': 1, '10': 'desc'},
const {'1': 'color_style', '3': 4, '4': 1, '5': 11, '6': '.ColorStyle', '9': 2, '10': 'colorStyle'},
const {'1': 'is_trash', '3': 5, '4': 1, '5': 8, '9': 3, '10': 'isTrash'},
],
'8': const [
const {'1': 'one_of_name'},
const {'1': 'one_of_desc'},
const {'1': 'one_of_color_style'},
const {'1': 'one_of_is_trash'},
],
};
/// Descriptor for `UpdateAppRequest`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List updateAppRequestDescriptor = $convert.base64Decode('ChBVcGRhdGVBcHBSZXF1ZXN0EhUKBmFwcF9pZBgBIAEoCVIFYXBwSWQSFAoEbmFtZRgCIAEoCUgAUgRuYW1lEhQKBGRlc2MYAyABKAlIAVIEZGVzYxIuCgtjb2xvcl9zdHlsZRgEIAEoCzILLkNvbG9yU3R5bGVIAlIKY29sb3JTdHlsZRIbCghpc190cmFzaBgFIAEoCEgDUgdpc1RyYXNoQg0KC29uZV9vZl9uYW1lQg0KC29uZV9vZl9kZXNjQhQKEm9uZV9vZl9jb2xvcl9zdHlsZUIRCg9vbmVfb2ZfaXNfdHJhc2g=');
@$core.Deprecated('Use updateAppParamsDescriptor instead')
const UpdateAppParams$json = const {
'1': 'UpdateAppParams',
'2': const [
const {'1': 'app_id', '3': 1, '4': 1, '5': 9, '10': 'appId'},
const {'1': 'name', '3': 2, '4': 1, '5': 9, '9': 0, '10': 'name'},
const {'1': 'desc', '3': 3, '4': 1, '5': 9, '9': 1, '10': 'desc'},
const {'1': 'color_style', '3': 4, '4': 1, '5': 11, '6': '.ColorStyle', '9': 2, '10': 'colorStyle'},
const {'1': 'is_trash', '3': 5, '4': 1, '5': 8, '9': 3, '10': 'isTrash'},
],
'8': const [
const {'1': 'one_of_name'},
const {'1': 'one_of_desc'},
const {'1': 'one_of_color_style'},
const {'1': 'one_of_is_trash'},
],
};
/// Descriptor for `UpdateAppParams`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List updateAppParamsDescriptor = $convert.base64Decode('Cg9VcGRhdGVBcHBQYXJhbXMSFQoGYXBwX2lkGAEgASgJUgVhcHBJZBIUCgRuYW1lGAIgASgJSABSBG5hbWUSFAoEZGVzYxgDIAEoCUgBUgRkZXNjEi4KC2NvbG9yX3N0eWxlGAQgASgLMgsuQ29sb3JTdHlsZUgCUgpjb2xvclN0eWxlEhsKCGlzX3RyYXNoGAUgASgISANSB2lzVHJhc2hCDQoLb25lX29mX25hbWVCDQoLb25lX29mX2Rlc2NCFAoSb25lX29mX2NvbG9yX3N0eWxlQhEKD29uZV9vZl9pc190cmFzaA==');

Some files were not shown because too many files have changed in this diff Show More