Merge branch 'feat/online2'

This commit is contained in:
appflowy 2021-12-20 15:38:41 +08:00
commit e55b79d3e6
711 changed files with 11167 additions and 10469 deletions

2
.gitignore vendored
View File

@ -13,5 +13,5 @@ Cargo.lock
**/target/ **/target/
**/*.db **/*.db
.idea/ .idea/
/flowy-test/ **/temp/**
.ruby-version .ruby-version

230
backend/Cargo.lock generated
View File

@ -455,18 +455,20 @@ dependencies = [
"config", "config",
"dashmap", "dashmap",
"derive_more", "derive_more",
"flowy-collaboration",
"flowy-core-data-model",
"flowy-document", "flowy-document",
"flowy-document-infra", "flowy-net",
"flowy-sdk", "flowy-sdk",
"flowy-test", "flowy-test",
"flowy-user", "flowy-user",
"flowy-user-infra", "flowy-user-data-model",
"flowy-workspace-infra",
"futures", "futures",
"futures-core", "futures-core",
"futures-util", "futures-util",
"jsonwebtoken", "jsonwebtoken",
"lazy_static", "lazy_static",
"lib-infra",
"lib-ot", "lib-ot",
"lib-ws", "lib-ws",
"linkify", "linkify",
@ -505,8 +507,9 @@ dependencies = [
"bytes", "bytes",
"config", "config",
"derive_more", "derive_more",
"flowy-user-infra", "flowy-collaboration",
"flowy-workspace-infra", "flowy-core-data-model",
"flowy-user-data-model",
"hyper", "hyper",
"lazy_static", "lazy_static",
"log", "log",
@ -668,9 +671,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
[[package]] [[package]]
name = "bytes" name = "bytes"
version = "1.0.1" version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8"
dependencies = [ dependencies = [
"serde", "serde",
] ]
@ -1148,6 +1151,15 @@ dependencies = [
"backtrace", "backtrace",
] ]
[[package]]
name = "error-code"
version = "0.1.0"
dependencies = [
"derive_more",
"flowy-derive",
"protobuf",
]
[[package]] [[package]]
name = "eyre" name = "eyre"
version = "0.6.5" version = "0.6.5"
@ -1195,6 +1207,87 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "flowy-collaboration"
version = "0.1.0"
dependencies = [
"async-stream",
"bytes",
"chrono",
"dashmap",
"flowy-derive",
"futures",
"lib-infra",
"lib-ot",
"log",
"md5",
"parking_lot",
"protobuf",
"serde",
"strum",
"strum_macros",
"tokio",
"tracing",
"url",
]
[[package]]
name = "flowy-core"
version = "0.1.0"
dependencies = [
"backend-service",
"bincode",
"bytes",
"chrono",
"crossbeam",
"crossbeam-utils",
"dart-notify",
"derive_more",
"diesel",
"diesel_derives",
"flowy-collaboration",
"flowy-core-data-model",
"flowy-database",
"flowy-derive",
"flowy-document",
"flowy-error",
"flowy-net",
"futures",
"futures-core",
"lazy_static",
"lib-dispatch",
"lib-infra",
"lib-ot",
"lib-sqlite",
"log",
"parking_lot",
"pin-project 1.0.8",
"protobuf",
"serde",
"strum",
"strum_macros",
"tokio",
"tracing",
]
[[package]]
name = "flowy-core-data-model"
version = "0.1.0"
dependencies = [
"bytes",
"chrono",
"derive_more",
"error-code",
"flowy-collaboration",
"flowy-derive",
"log",
"protobuf",
"strum",
"strum_macros",
"unicode-segmentation",
"uuid",
]
[[package]] [[package]]
name = "flowy-database" name = "flowy-database"
version = "0.1.0" version = "0.1.0"
@ -1202,7 +1295,9 @@ dependencies = [
"diesel", "diesel",
"diesel_derives", "diesel_derives",
"diesel_migrations", "diesel_migrations",
"lazy_static",
"lib-sqlite", "lib-sqlite",
"log",
] ]
[[package]] [[package]]
@ -1230,11 +1325,13 @@ dependencies = [
"derive_more", "derive_more",
"diesel", "diesel",
"diesel_derives", "diesel_derives",
"flowy-collaboration",
"flowy-database", "flowy-database",
"flowy-derive", "flowy-derive",
"flowy-document-infra", "flowy-error",
"futures", "futures",
"futures-core", "futures-core",
"futures-util",
"lazy_static", "lazy_static",
"lib-dispatch", "lib-dispatch",
"lib-infra", "lib-infra",
@ -1255,22 +1352,40 @@ dependencies = [
] ]
[[package]] [[package]]
name = "flowy-document-infra" name = "flowy-error"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"backend-service",
"bytes", "bytes",
"chrono", "error-code",
"flowy-collaboration",
"flowy-database",
"flowy-derive", "flowy-derive",
"lib-dispatch",
"lib-ot", "lib-ot",
"log", "lib-sqlite",
"md5", "protobuf",
"r2d2",
"serde_json",
]
[[package]]
name = "flowy-net"
version = "0.1.0"
dependencies = [
"anyhow",
"bytes",
"flowy-derive",
"flowy-error",
"lib-dispatch",
"lib-infra",
"lib-ws",
"parking_lot",
"protobuf", "protobuf",
"serde",
"strum", "strum",
"strum_macros", "strum_macros",
"tokio", "tokio",
"tracing", "tracing",
"url",
] ]
[[package]] [[package]]
@ -1280,11 +1395,12 @@ dependencies = [
"backend-service", "backend-service",
"bytes", "bytes",
"color-eyre", "color-eyre",
"flowy-collaboration",
"flowy-core",
"flowy-database", "flowy-database",
"flowy-document", "flowy-document",
"flowy-document-infra", "flowy-net",
"flowy-user", "flowy-user",
"flowy-workspace",
"futures-core", "futures-core",
"lib-dispatch", "lib-dispatch",
"lib-infra", "lib-infra",
@ -1304,17 +1420,20 @@ dependencies = [
"bincode", "bincode",
"bytes", "bytes",
"claim", "claim",
"flowy-collaboration",
"flowy-core",
"flowy-document", "flowy-document",
"flowy-document-infra", "flowy-net",
"flowy-sdk", "flowy-sdk",
"flowy-user", "flowy-user",
"flowy-workspace",
"futures-util", "futures-util",
"lib-dispatch", "lib-dispatch",
"lib-infra", "lib-infra",
"lib-ot",
"log", "log",
"protobuf", "protobuf",
"serde", "serde",
"serde_json",
"thread-id", "thread-id",
"tokio", "tokio",
] ]
@ -1326,18 +1445,20 @@ dependencies = [
"backend-service", "backend-service",
"bytes", "bytes",
"dart-notify", "dart-notify",
"dashmap",
"derive_more", "derive_more",
"diesel", "diesel",
"diesel_derives", "diesel_derives",
"flowy-database", "flowy-database",
"flowy-derive", "flowy-derive",
"flowy-user-infra", "flowy-error",
"flowy-net",
"flowy-user-data-model",
"futures-core", "futures-core",
"lazy_static", "lazy_static",
"lib-dispatch", "lib-dispatch",
"lib-infra", "lib-infra",
"lib-sqlite", "lib-sqlite",
"lib-ws",
"log", "log",
"once_cell", "once_cell",
"parking_lot", "parking_lot",
@ -1355,11 +1476,12 @@ dependencies = [
] ]
[[package]] [[package]]
name = "flowy-user-infra" name = "flowy-user-data-model"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"bytes", "bytes",
"derive_more", "derive_more",
"error-code",
"fancy-regex", "fancy-regex",
"flowy-derive", "flowy-derive",
"lazy_static", "lazy_static",
@ -1369,60 +1491,6 @@ dependencies = [
"validator", "validator",
] ]
[[package]]
name = "flowy-workspace"
version = "0.1.0"
dependencies = [
"backend-service",
"bincode",
"bytes",
"chrono",
"crossbeam",
"crossbeam-utils",
"dart-notify",
"derive_more",
"diesel",
"diesel_derives",
"flowy-database",
"flowy-derive",
"flowy-document",
"flowy-document-infra",
"flowy-workspace-infra",
"futures",
"futures-core",
"lazy_static",
"lib-dispatch",
"lib-infra",
"lib-ot",
"lib-sqlite",
"log",
"parking_lot",
"pin-project 1.0.8",
"protobuf",
"serde",
"strum",
"strum_macros",
"tokio",
"tracing",
]
[[package]]
name = "flowy-workspace-infra"
version = "0.1.0"
dependencies = [
"bytes",
"chrono",
"derive_more",
"flowy-derive",
"flowy-document-infra",
"log",
"protobuf",
"strum",
"strum_macros",
"unicode-segmentation",
"uuid",
]
[[package]] [[package]]
name = "fnv" name = "fnv"
version = "1.0.7" version = "1.0.7"
@ -1933,16 +2001,9 @@ version = "0.1.0"
dependencies = [ dependencies = [
"bytes", "bytes",
"chrono", "chrono",
"diesel",
"diesel_derives",
"diesel_migrations",
"flowy-derive",
"futures-core", "futures-core",
"lazy_static",
"lib-sqlite",
"log", "log",
"pin-project 1.0.8", "pin-project 1.0.8",
"protobuf",
"rand", "rand",
"tokio", "tokio",
"uuid", "uuid",
@ -1972,13 +2033,18 @@ version = "0.1.0"
dependencies = [ dependencies = [
"bytecount", "bytecount",
"bytes", "bytes",
"dashmap",
"derive_more", "derive_more",
"flowy-derive",
"lazy_static", "lazy_static",
"log", "log",
"md5",
"protobuf",
"serde", "serde",
"serde_json", "serde_json",
"strum", "strum",
"strum_macros", "strum_macros",
"tokio",
"tracing", "tracing",
] ]

View File

@ -59,11 +59,12 @@ pin-project = "1.0.0"
byteorder = {version = "1.3.4"} byteorder = {version = "1.3.4"}
async-stream = "0.3.2" async-stream = "0.3.2"
flowy-user-infra = { path = "../shared-lib/flowy-user-infra" } flowy-user-data-model = { path = "../shared-lib/flowy-user-data-model" }
flowy-workspace-infra = { path = "../shared-lib/flowy-workspace-infra" } flowy-core-data-model = { path = "../shared-lib/flowy-core-data-model" }
flowy-document-infra = { path = "../shared-lib/flowy-document-infra" } flowy-collaboration = { path = "../shared-lib/flowy-collaboration" }
lib-ws = { path = "../shared-lib/lib-ws" } lib-ws = { path = "../shared-lib/lib-ws" }
lib-ot = { path = "../shared-lib/lib-ot" } lib-ot = { path = "../shared-lib/lib-ot" }
lib-infra = { path = "../shared-lib/lib-infra" }
backend-service = { path = "../shared-lib/backend-service", features = ["http_server"] } backend-service = { path = "../shared-lib/backend-service", features = ["http_server"] }
ormx = { version = "0.7", features = ["postgres"]} ormx = { version = "0.7", features = ["postgres"]}
@ -100,6 +101,7 @@ futures-util = "0.3.15"
backend = { path = ".", features = ["flowy_test"]} backend = { path = ".", features = ["flowy_test"]}
flowy-sdk = { path = "../frontend/rust-lib/flowy-sdk", features = ["http_server"] } flowy-sdk = { path = "../frontend/rust-lib/flowy-sdk", features = ["http_server"] }
flowy-user = { path = "../frontend/rust-lib/flowy-user", features = ["http_server"] } flowy-user = { path = "../frontend/rust-lib/flowy-user", features = ["http_server"] }
flowy-document = { path = "../frontend/rust-lib/flowy-document", features = ["flowy_test", "http_server"] } flowy-document = { path = "../frontend/rust-lib/flowy-document", features = ["flowy_unit_test", "http_server"] }
flowy-test = { path = "../frontend/rust-lib/flowy-test" } flowy-test = { path = "../frontend/rust-lib/flowy-test" }
flowy-net = { path = "../frontend/rust-lib/flowy-net", features = ["http_server"] }

View File

@ -1,9 +1,8 @@
use std::{net::TcpListener, time::Duration};
use actix::Actor; use actix::Actor;
use actix_identity::{CookieIdentityPolicy, IdentityService}; use actix_identity::{CookieIdentityPolicy, IdentityService};
use actix_web::{dev::Server, middleware, web, web::Data, App, HttpServer, Scope}; use actix_web::{dev::Server, middleware, web, web::Data, App, HttpServer, Scope};
use sqlx::{postgres::PgPoolOptions, PgPool}; use sqlx::{postgres::PgPoolOptions, PgPool};
use std::{net::TcpListener, time::Duration};
use tokio::time::interval; use tokio::time::interval;
use crate::{ use crate::{
@ -13,16 +12,15 @@ use crate::{
Settings, Settings,
}, },
context::AppContext, context::AppContext,
service::{ services::{
app::router as app, app::router as app,
doc::router as doc, doc::router as doc,
trash::router as trash, trash::router as trash,
user::router as user, user::router as user,
view::router as view, view::router as view,
workspace::router as workspace, workspace::router as workspace,
ws,
ws::WsServer,
}, },
web_socket::WsServer,
}; };
pub struct Application { pub struct Application {
@ -61,7 +59,7 @@ pub fn run(listener: TcpListener, app_ctx: AppContext) -> Result<Server, std::io
.app_data(app_ctx.ws_server.clone()) .app_data(app_ctx.ws_server.clone())
.app_data(app_ctx.pg_pool.clone()) .app_data(app_ctx.pg_pool.clone())
.app_data(app_ctx.ws_bizs.clone()) .app_data(app_ctx.ws_bizs.clone())
.app_data(app_ctx.doc_biz.clone()) .app_data(app_ctx.document_core.clone())
}) })
.listen(listener)? .listen(listener)?
.run(); .run();
@ -75,7 +73,7 @@ async fn period_check(_pool: Data<PgPool>) {
} }
} }
fn ws_scope() -> Scope { web::scope("/ws").service(ws::router::establish_ws_connection) } fn ws_scope() -> Scope { web::scope("/ws").service(crate::web_socket::router::establish_ws_connection) }
fn user_scope() -> Scope { fn user_scope() -> Scope {
// https://developer.mozilla.org/en-US/docs/Web/HTTP // https://developer.mozilla.org/en-US/docs/Web/HTTP
@ -124,6 +122,9 @@ fn user_scope() -> Scope {
.route(web::delete().to(trash::delete_handler)) .route(web::delete().to(trash::delete_handler))
.route(web::get().to(trash::read_handler)) .route(web::get().to(trash::read_handler))
) )
.service(web::resource("/sync")
.route(web::post().to(trash::create_handler))
)
// password // password
.service(web::resource("/password_change") .service(web::resource("/password_change")
.route(web::post().to(user::change_password)) .route(web::post().to(user::change_password))
@ -131,7 +132,7 @@ fn user_scope() -> Scope {
} }
pub async fn init_app_context(configuration: &Settings) -> AppContext { pub async fn init_app_context(configuration: &Settings) -> AppContext {
let _ = crate::service::log::Builder::new("flowy-server") let _ = crate::services::log::Builder::new("flowy-server")
.env_filter("Trace") .env_filter("Trace")
.build(); .build();
let pg_pool = get_connection_pool(&configuration.database) let pg_pool = get_connection_pool(&configuration.database)

View File

@ -1,10 +1,10 @@
use crate::service::{ use crate::{
doc::manager::DocBiz, services::doc::manager::DocumentCore,
ws::{WsBizHandlers, WsServer}, web_socket::{WsBizHandlers, WsServer},
}; };
use actix::Addr; use actix::Addr;
use actix_web::web::Data; use actix_web::web::Data;
use lib_ws::WsModule; use lib_ws::WSModule;
use sqlx::PgPool; use sqlx::PgPool;
use std::sync::Arc; use std::sync::Arc;
@ -13,7 +13,7 @@ pub struct AppContext {
pub ws_server: Data<Addr<WsServer>>, pub ws_server: Data<Addr<WsServer>>,
pub pg_pool: Data<PgPool>, pub pg_pool: Data<PgPool>,
pub ws_bizs: Data<WsBizHandlers>, pub ws_bizs: Data<WsBizHandlers>,
pub doc_biz: Data<Arc<DocBiz>>, pub document_core: Data<Arc<DocumentCore>>,
} }
impl AppContext { impl AppContext {
@ -22,14 +22,14 @@ impl AppContext {
let pg_pool = Data::new(db_pool); let pg_pool = Data::new(db_pool);
let mut ws_bizs = WsBizHandlers::new(); let mut ws_bizs = WsBizHandlers::new();
let doc_biz = Arc::new(DocBiz::new(pg_pool.clone())); let document_core = Arc::new(DocumentCore::new(pg_pool.clone()));
ws_bizs.register(WsModule::Doc, doc_biz.clone()); ws_bizs.register(WSModule::Doc, document_core.clone());
AppContext { AppContext {
ws_server, ws_server,
pg_pool, pg_pool,
ws_bizs: Data::new(ws_bizs), ws_bizs: Data::new(ws_bizs),
doc_biz: Data::new(doc_biz), document_core: Data::new(document_core),
} }
} }
} }

View File

@ -1,4 +1,4 @@
use flowy_document_infra::protobuf::Doc; use flowy_collaboration::protobuf::Doc;
pub(crate) const DOC_TABLE: &str = "doc_table"; pub(crate) const DOC_TABLE: &str = "doc_table";

View File

@ -74,7 +74,7 @@ impl Token {
} }
} }
use crate::service::user::EXPIRED_DURATION_DAYS; use crate::services::user::EXPIRED_DURATION_DAYS;
use actix_web::{dev::Payload, FromRequest, HttpRequest}; use actix_web::{dev::Payload, FromRequest, HttpRequest};
use backend_service::configuration::HEADER_TOKEN; use backend_service::configuration::HEADER_TOKEN;
use futures::future::{ready, Ready}; use futures::future::{ready, Ready};

View File

@ -1,5 +1,5 @@
use chrono::Utc; use chrono::Utc;
use flowy_workspace_infra::protobuf::{App, RepeatedView, Trash, TrashType, View, ViewType, Workspace}; use flowy_core_data_model::protobuf::{App, RepeatedView, Trash, TrashType, View, ViewType, Workspace};
use protobuf::ProtobufEnum; use protobuf::ProtobufEnum;
pub(crate) const WORKSPACE_TABLE: &str = "workspace_table"; pub(crate) const WORKSPACE_TABLE: &str = "workspace_table";

View File

@ -3,5 +3,6 @@ pub mod config;
pub mod context; pub mod context;
mod entities; mod entities;
mod middleware; mod middleware;
pub mod service; pub mod services;
mod sqlx_ext; mod sqlx_ext;
pub mod web_socket;

View File

@ -1,4 +1,4 @@
use crate::service::user::{LoggedUser, AUTHORIZED_USERS}; use crate::services::user::{LoggedUser, AUTHORIZED_USERS};
use actix_service::{Service, Transform}; use actix_service::{Service, Transform};
use actix_web::{ use actix_web::{
dev::{ServiceRequest, ServiceResponse}, dev::{ServiceRequest, ServiceResponse},

View File

@ -1,122 +0,0 @@
use crate::service::{
doc::edit::ServerDocEditor,
ws::{entities::Socket, WsUser},
};
use actix_web::web::Data;
use async_stream::stream;
use backend_service::errors::{internal_error, Result as DocResult, ServerError};
use flowy_document_infra::protobuf::{Doc, Revision};
use futures::stream::StreamExt;
use sqlx::PgPool;
use std::sync::{atomic::Ordering::SeqCst, Arc};
use tokio::{
sync::{mpsc, oneshot},
task::spawn_blocking,
};
#[derive(Clone)]
pub struct EditUser {
user: Arc<WsUser>,
pub(crate) socket: Socket,
}
impl EditUser {
pub fn id(&self) -> String { self.user.id().to_string() }
}
#[derive(Debug)]
pub enum EditMsg {
Revision {
user: Arc<WsUser>,
socket: Socket,
revision: Revision,
ret: oneshot::Sender<DocResult<()>>,
},
DocumentJson {
ret: oneshot::Sender<DocResult<String>>,
},
DocumentRevId {
ret: oneshot::Sender<DocResult<i64>>,
},
NewDocUser {
user: Arc<WsUser>,
socket: Socket,
rev_id: i64,
ret: oneshot::Sender<DocResult<()>>,
},
}
pub struct EditDocActor {
receiver: Option<mpsc::Receiver<EditMsg>>,
edit_doc: Arc<ServerDocEditor>,
pg_pool: Data<PgPool>,
}
impl EditDocActor {
pub fn new(receiver: mpsc::Receiver<EditMsg>, doc: Doc, pg_pool: Data<PgPool>) -> Result<Self, ServerError> {
let edit_doc = Arc::new(ServerDocEditor::new(doc)?);
Ok(Self {
receiver: Some(receiver),
edit_doc,
pg_pool,
})
}
pub async fn run(mut self) {
let mut receiver = self
.receiver
.take()
.expect("DocActor's receiver should only take one time");
let stream = stream! {
loop {
match receiver.recv().await {
Some(msg) => yield msg,
None => break,
}
}
};
stream.for_each(|msg| self.handle_message(msg)).await;
}
async fn handle_message(&self, msg: EditMsg) {
match msg {
EditMsg::Revision {
user,
socket,
revision,
ret,
} => {
let user = EditUser {
user: user.clone(),
socket: socket.clone(),
};
let _ = ret.send(self.edit_doc.apply_revision(user, revision, self.pg_pool.clone()).await);
},
EditMsg::DocumentJson { ret } => {
let edit_context = self.edit_doc.clone();
let json = spawn_blocking(move || edit_context.document_json())
.await
.map_err(internal_error);
let _ = ret.send(json);
},
EditMsg::DocumentRevId { ret } => {
let edit_context = self.edit_doc.clone();
let _ = ret.send(Ok(edit_context.rev_id.load(SeqCst)));
},
EditMsg::NewDocUser {
user,
socket,
rev_id,
ret,
} => {
log::debug!("Receive new doc user: {:?}, rev_id: {}", user, rev_id);
let user = EditUser {
user: user.clone(),
socket: socket.clone(),
};
let _ = ret.send(self.edit_doc.new_doc_user(user, rev_id).await);
},
}
}
}

View File

@ -1,259 +0,0 @@
use crate::service::{
doc::{edit::edit_actor::EditUser, update_doc},
util::md5,
ws::{entities::Socket, WsMessageAdaptor},
};
use actix_web::web::Data;
use backend_service::errors::{internal_error, ServerError};
use dashmap::DashMap;
use flowy_document_infra::{
core::Document,
entities::ws::{WsDataType, WsDocumentData},
protobuf::{Doc, RevId, RevType, Revision, RevisionRange, UpdateDocParams},
};
use lib_ot::core::{Delta, OperationTransformable};
use parking_lot::RwLock;
use protobuf::Message;
use sqlx::PgPool;
use std::{
cmp::Ordering,
sync::{
atomic::{AtomicI64, Ordering::SeqCst},
Arc,
},
time::Duration,
};
pub struct ServerDocEditor {
pub doc_id: String,
pub rev_id: AtomicI64,
document: Arc<RwLock<Document>>,
users: DashMap<String, EditUser>,
}
impl ServerDocEditor {
pub fn new(doc: Doc) -> Result<Self, ServerError> {
let delta = Delta::from_bytes(&doc.data).map_err(internal_error)?;
let document = Arc::new(RwLock::new(Document::from_delta(delta)));
let users = DashMap::new();
Ok(Self {
doc_id: doc.id.clone(),
rev_id: AtomicI64::new(doc.rev_id),
document,
users,
})
}
#[tracing::instrument(
level = "debug",
skip(self, user),
fields(
user_id = %user.id(),
rev_id = %rev_id,
)
)]
pub async fn new_doc_user(&self, user: EditUser, rev_id: i64) -> Result<(), ServerError> {
self.users.insert(user.id(), user.clone());
let cur_rev_id = self.rev_id.load(SeqCst);
match cur_rev_id.cmp(&rev_id) {
Ordering::Less => {
user.socket
.do_send(mk_pull_message(&self.doc_id, next(cur_rev_id), rev_id))
.map_err(internal_error)?;
},
Ordering::Equal => {},
Ordering::Greater => {
let doc_delta = self.document.read().delta().clone();
let cli_revision = self.mk_revision(rev_id, doc_delta);
let ws_cli_revision = mk_push_message(&self.doc_id, cli_revision);
user.socket.do_send(ws_cli_revision).map_err(internal_error)?;
},
}
Ok(())
}
#[tracing::instrument(
level = "debug",
skip(self, user, pg_pool, revision),
fields(
cur_rev_id = %self.rev_id.load(SeqCst),
base_rev_id = %revision.base_rev_id,
rev_id = %revision.rev_id,
),
err
)]
pub async fn apply_revision(
&self,
user: EditUser,
revision: Revision,
pg_pool: Data<PgPool>,
) -> Result<(), ServerError> {
self.users.insert(user.id(), user.clone());
let cur_rev_id = self.rev_id.load(SeqCst);
match cur_rev_id.cmp(&revision.rev_id) {
Ordering::Less => {
let next_rev_id = next(cur_rev_id);
if cur_rev_id == revision.base_rev_id || next_rev_id == revision.base_rev_id {
// The rev is in the right order, just compose it.
let _ = self.compose_revision(&revision, pg_pool).await?;
let _ = send_acked_msg(&user.socket, &revision)?;
} else {
// The server document is outdated, pull the missing revision from the client.
let _ = send_pull_message(&user.socket, &self.doc_id, next_rev_id, revision.rev_id)?;
}
},
Ordering::Equal => {
// Do nothing
log::warn!("Applied revision rev_id is the same as cur_rev_id");
},
Ordering::Greater => {
// The client document is outdated. Transform the client revision delta and then
// send the prime delta to the client. Client should compose the this prime
// delta.
let cli_revision = self.transform_revision(&revision)?;
let _ = send_push_message(&user.socket, &self.doc_id, cli_revision)?;
},
}
Ok(())
}
pub fn document_json(&self) -> String { self.document.read().to_json() }
async fn compose_revision(&self, revision: &Revision, pg_pool: Data<PgPool>) -> Result<(), ServerError> {
let delta = Delta::from_bytes(&revision.delta_data).map_err(internal_error)?;
let _ = self.compose_delta(delta)?;
let _ = self.rev_id.fetch_update(SeqCst, SeqCst, |_e| Some(revision.rev_id));
let _ = self.save_revision(&revision, pg_pool).await?;
Ok(())
}
#[tracing::instrument(level = "debug", skip(self, revision))]
fn transform_revision(&self, revision: &Revision) -> Result<Revision, ServerError> {
let cli_delta = Delta::from_bytes(&revision.delta_data).map_err(internal_error)?;
let (cli_prime, server_prime) = self
.document
.read()
.delta()
.transform(&cli_delta)
.map_err(internal_error)?;
let _ = self.compose_delta(server_prime)?;
let cli_revision = self.mk_revision(revision.rev_id, cli_prime);
Ok(cli_revision)
}
fn mk_revision(&self, base_rev_id: i64, delta: Delta) -> Revision {
let delta_data = delta.to_bytes().to_vec();
let md5 = md5(&delta_data);
Revision {
base_rev_id,
rev_id: self.rev_id.load(SeqCst),
delta_data,
md5,
doc_id: self.doc_id.to_string(),
ty: RevType::Remote,
..Default::default()
}
}
#[tracing::instrument(
level = "debug",
skip(self, delta),
fields(
revision_delta = %delta.to_json(),
result,
)
)]
fn compose_delta(&self, delta: Delta) -> Result<(), ServerError> {
if delta.is_empty() {
log::warn!("Composed delta is empty");
}
match self.document.try_write_for(Duration::from_millis(300)) {
None => {
log::error!("Failed to acquire write lock of document");
},
Some(mut write_guard) => {
let _ = write_guard.compose_delta(delta).map_err(internal_error)?;
tracing::Span::current().record("result", &write_guard.to_json().as_str());
},
}
Ok(())
}
#[tracing::instrument(level = "debug", skip(self, revision, pg_pool), err)]
async fn save_revision(&self, revision: &Revision, pg_pool: Data<PgPool>) -> Result<(), ServerError> {
// Opti: save with multiple revisions
let mut params = UpdateDocParams::new();
params.set_doc_id(self.doc_id.clone());
params.set_data(self.document.read().to_json());
params.set_rev_id(revision.rev_id);
let _ = update_doc(pg_pool.get_ref(), params).await?;
Ok(())
}
}
#[tracing::instrument(level = "debug", skip(socket, doc_id, revision), err)]
fn send_push_message(socket: &Socket, doc_id: &str, revision: Revision) -> Result<(), ServerError> {
let msg = mk_push_message(doc_id, revision);
socket.try_send(msg).map_err(internal_error)
}
fn mk_push_message(doc_id: &str, revision: Revision) -> WsMessageAdaptor {
let bytes = revision.write_to_bytes().unwrap();
let data = WsDocumentData {
doc_id: doc_id.to_string(),
ty: WsDataType::PushRev,
data: bytes,
};
data.into()
}
#[tracing::instrument(level = "debug", skip(socket, doc_id), err)]
fn send_pull_message(socket: &Socket, doc_id: &str, from_rev_id: i64, to_rev_id: i64) -> Result<(), ServerError> {
let msg = mk_pull_message(doc_id, from_rev_id, to_rev_id);
socket.try_send(msg).map_err(internal_error)
}
fn mk_pull_message(doc_id: &str, from_rev_id: i64, to_rev_id: i64) -> WsMessageAdaptor {
let range = RevisionRange {
doc_id: doc_id.to_string(),
start: from_rev_id,
end: to_rev_id,
..Default::default()
};
let bytes = range.write_to_bytes().unwrap();
let data = WsDocumentData {
doc_id: doc_id.to_string(),
ty: WsDataType::PullRev,
data: bytes,
};
data.into()
}
#[tracing::instrument(level = "debug", skip(socket, revision), err)]
fn send_acked_msg(socket: &Socket, revision: &Revision) -> Result<(), ServerError> {
let msg = mk_acked_message(revision);
socket.try_send(msg).map_err(internal_error)
}
fn mk_acked_message(revision: &Revision) -> WsMessageAdaptor {
// let mut wtr = vec![];
// let _ = wtr.write_i64::<BigEndian>(revision.rev_id);
let mut rev_id = RevId::new();
rev_id.set_value(revision.rev_id);
let data = rev_id.write_to_bytes().unwrap();
let data = WsDocumentData {
doc_id: revision.doc_id.clone(),
ty: WsDataType::Acked,
data,
};
data.into()
}
#[inline]
fn next(rev_id: i64) -> i64 { rev_id + 1 }

View File

@ -1,5 +0,0 @@
pub(crate) mod edit_actor;
mod editor;
pub use edit_actor::*;
pub use editor::*;

View File

@ -1,153 +0,0 @@
use crate::service::{
doc::{
edit::edit_actor::{EditDocActor, EditMsg},
read_doc,
ws_actor::{DocWsActor, DocWsMsg},
},
ws::{entities::Socket, WsBizHandler, WsClientData, WsUser},
};
use actix_web::web::Data;
use backend_service::errors::{internal_error, Result as DocResult, ServerError};
use dashmap::DashMap;
use flowy_document_infra::protobuf::{Doc, DocIdentifier, Revision};
use sqlx::PgPool;
use std::sync::Arc;
use tokio::{
sync::{mpsc, oneshot},
task::spawn_blocking,
};
pub struct DocBiz {
pub manager: Arc<DocManager>,
sender: mpsc::Sender<DocWsMsg>,
pg_pool: Data<PgPool>,
}
impl DocBiz {
pub fn new(pg_pool: Data<PgPool>) -> Self {
let manager = Arc::new(DocManager::new());
let (tx, rx) = mpsc::channel(100);
let actor = DocWsActor::new(rx, manager.clone());
tokio::task::spawn(actor.run());
Self {
manager,
sender: tx,
pg_pool,
}
}
}
impl WsBizHandler for DocBiz {
fn receive_data(&self, client_data: WsClientData) {
let (ret, rx) = oneshot::channel();
let sender = self.sender.clone();
let pool = self.pg_pool.clone();
actix_rt::spawn(async move {
let msg = DocWsMsg::ClientData { client_data, ret, pool };
match sender.send(msg).await {
Ok(_) => {},
Err(e) => log::error!("{}", e),
}
match rx.await {
Ok(_) => {},
Err(e) => log::error!("{:?}", e),
};
});
}
}
pub struct DocManager {
docs_map: DashMap<String, Arc<DocOpenHandle>>,
}
impl std::default::Default for DocManager {
fn default() -> Self {
Self {
docs_map: DashMap::new(),
}
}
}
impl DocManager {
pub fn new() -> Self { DocManager::default() }
pub async fn get(&self, doc_id: &str, pg_pool: Data<PgPool>) -> Result<Option<Arc<DocOpenHandle>>, ServerError> {
match self.docs_map.get(doc_id) {
None => {
let params = DocIdentifier {
doc_id: doc_id.to_string(),
..Default::default()
};
let doc = read_doc(pg_pool.get_ref(), params).await?;
let handle = spawn_blocking(|| DocOpenHandle::new(doc, pg_pool))
.await
.map_err(internal_error)?;
let handle = Arc::new(handle?);
self.docs_map.insert(doc_id.to_string(), handle.clone());
Ok(Some(handle))
},
Some(ctx) => Ok(Some(ctx.clone())),
}
}
}
pub struct DocOpenHandle {
pub sender: mpsc::Sender<EditMsg>,
}
impl DocOpenHandle {
pub fn new(doc: Doc, pg_pool: Data<PgPool>) -> Result<Self, ServerError> {
let (sender, receiver) = mpsc::channel(100);
let actor = EditDocActor::new(receiver, doc, pg_pool)?;
tokio::task::spawn(actor.run());
Ok(Self { sender })
}
pub async fn add_user(&self, user: Arc<WsUser>, rev_id: i64, socket: Socket) -> Result<(), ServerError> {
let (ret, rx) = oneshot::channel();
let msg = EditMsg::NewDocUser {
user,
socket,
rev_id,
ret,
};
let _ = self.send(msg, rx).await?;
Ok(())
}
pub async fn apply_revision(
&self,
user: Arc<WsUser>,
socket: Socket,
revision: Revision,
) -> Result<(), ServerError> {
let (ret, rx) = oneshot::channel();
let msg = EditMsg::Revision {
user,
socket,
revision,
ret,
};
let _ = self.send(msg, rx).await?;
Ok(())
}
pub async fn document_json(&self) -> DocResult<String> {
let (ret, rx) = oneshot::channel();
let msg = EditMsg::DocumentJson { ret };
self.send(msg, rx).await?
}
pub async fn rev_id(&self) -> DocResult<i64> {
let (ret, rx) = oneshot::channel();
let msg = EditMsg::DocumentRevId { ret };
self.send(msg, rx).await?
}
pub(crate) async fn send<T>(&self, msg: EditMsg, rx: oneshot::Receiver<T>) -> DocResult<T> {
let _ = self.sender.send(msg).await.map_err(internal_error)?;
let result = rx.await?;
Ok(result)
}
}

View File

@ -1,142 +0,0 @@
use crate::service::{
doc::manager::{DocManager, DocOpenHandle},
util::{md5, parse_from_bytes},
ws::{entities::Socket, WsClientData, WsUser},
};
use actix_rt::task::spawn_blocking;
use actix_web::web::Data;
use async_stream::stream;
use backend_service::errors::{internal_error, Result as DocResult, ServerError};
use flowy_document_infra::protobuf::{NewDocUser, Revision, WsDataType, WsDocumentData};
use futures::stream::StreamExt;
use sqlx::PgPool;
use std::sync::Arc;
use tokio::sync::{mpsc, oneshot};
pub enum DocWsMsg {
ClientData {
client_data: WsClientData,
pool: Data<PgPool>,
ret: oneshot::Sender<DocResult<()>>,
},
}
pub struct DocWsActor {
receiver: Option<mpsc::Receiver<DocWsMsg>>,
doc_manager: Arc<DocManager>,
}
impl DocWsActor {
pub fn new(receiver: mpsc::Receiver<DocWsMsg>, manager: Arc<DocManager>) -> Self {
Self {
receiver: Some(receiver),
doc_manager: manager,
}
}
pub async fn run(mut self) {
let mut receiver = self
.receiver
.take()
.expect("DocActor's receiver should only take one time");
let stream = stream! {
loop {
match receiver.recv().await {
Some(msg) => yield msg,
None => break,
}
}
};
stream.for_each(|msg| self.handle_message(msg)).await;
}
async fn handle_message(&self, msg: DocWsMsg) {
match msg {
DocWsMsg::ClientData { client_data, pool, ret } => {
let _ = ret.send(self.handle_client_data(client_data, pool).await);
},
}
}
async fn handle_client_data(&self, client_data: WsClientData, pool: Data<PgPool>) -> DocResult<()> {
let WsClientData { user, socket, data } = client_data;
let document_data = spawn_blocking(move || {
let document_data: WsDocumentData = parse_from_bytes(&data)?;
DocResult::Ok(document_data)
})
.await
.map_err(internal_error)??;
let data = document_data.data;
match document_data.ty {
WsDataType::Acked => Ok(()),
WsDataType::PushRev => self.apply_pushed_rev(user, socket, data, pool).await,
WsDataType::NewDocUser => self.add_doc_user(user, socket, data, pool).await,
WsDataType::PullRev => Ok(()),
WsDataType::Conflict => Ok(()),
}
}
async fn add_doc_user(
&self,
user: Arc<WsUser>,
socket: Socket,
data: Vec<u8>,
pool: Data<PgPool>,
) -> DocResult<()> {
let doc_user = spawn_blocking(move || {
let user: NewDocUser = parse_from_bytes(&data)?;
DocResult::Ok(user)
})
.await
.map_err(internal_error)??;
if let Some(handle) = self.find_doc_handle(&doc_user.doc_id, pool).await {
handle.add_user(user, doc_user.rev_id, socket).await?;
}
Ok(())
}
async fn apply_pushed_rev(
&self,
user: Arc<WsUser>,
socket: Socket,
data: Vec<u8>,
pool: Data<PgPool>,
) -> DocResult<()> {
let revision = spawn_blocking(move || {
let revision: Revision = parse_from_bytes(&data)?;
let _ = verify_md5(&revision)?;
DocResult::Ok(revision)
})
.await
.map_err(internal_error)??;
if let Some(handle) = self.find_doc_handle(&revision.doc_id, pool).await {
handle.apply_revision(user, socket, revision).await?;
}
Ok(())
}
async fn find_doc_handle(&self, doc_id: &str, pool: Data<PgPool>) -> Option<Arc<DocOpenHandle>> {
match self.doc_manager.get(doc_id, pool).await {
Ok(Some(edit_doc)) => Some(edit_doc),
Ok(None) => {
log::error!("Document with id: {} not exist", doc_id);
None
},
Err(e) => {
log::error!("Get doc handle failed: {:?}", e);
None
},
}
}
}
fn verify_md5(revision: &Revision) -> DocResult<()> {
if md5(&revision.delta_data) != revision.md5 {
return Err(ServerError::internal().context("Revision md5 not match"));
}
Ok(())
}

View File

@ -1,45 +0,0 @@
use crate::service::{
user::LoggedUser,
ws::{WsBizHandlers, WsClient, WsServer, WsUser},
};
use actix::Addr;
use actix_web::{
get,
web::{Data, Path, Payload},
Error,
HttpRequest,
HttpResponse,
};
use actix_web_actors::ws;
#[get("/{token}")]
pub async fn establish_ws_connection(
request: HttpRequest,
payload: Payload,
token: Path<String>,
server: Data<Addr<WsServer>>,
biz_handlers: Data<WsBizHandlers>,
) -> Result<HttpResponse, Error> {
tracing::info!("establish_ws_connection");
match LoggedUser::from_token(token.clone()) {
Ok(user) => {
let ws_user = WsUser::new(user);
let client = WsClient::new(ws_user, server.get_ref().clone(), biz_handlers);
let result = ws::start(client, &request, payload);
match result {
Ok(response) => Ok(response),
Err(e) => {
log::error!("ws connection error: {:?}", e);
Err(e)
},
}
},
Err(e) => {
if e.is_unauthorized() {
Ok(HttpResponse::Unauthorized().json(e))
} else {
Ok(HttpResponse::BadRequest().json(e))
}
},
}
}

View File

@ -1,13 +1,13 @@
use crate::{ use crate::{
entities::workspace::{AppTable, APP_TABLE}, entities::workspace::{AppTable, APP_TABLE},
service::{app::sql_builder::*, user::LoggedUser, view::read_view_belong_to_id}, services::{app::sql_builder::*, user::LoggedUser, view::read_view_belong_to_id},
sqlx_ext::{map_sqlx_error, DBTransaction, SqlBuilder}, sqlx_ext::{map_sqlx_error, DBTransaction, SqlBuilder},
}; };
use crate::service::trash::read_trash_ids; use crate::services::trash::read_trash_ids;
use backend_service::errors::{invalid_params, ServerError}; use backend_service::errors::{invalid_params, ServerError};
use chrono::Utc; use chrono::Utc;
use flowy_workspace_infra::{ use flowy_core_data_model::{
parser::{ parser::{
app::{AppDesc, AppName}, app::{AppDesc, AppName},
workspace::WorkspaceId, workspace::WorkspaceId,

View File

@ -3,11 +3,11 @@ use actix_web::{
HttpResponse, HttpResponse,
}; };
use backend_service::errors::{invalid_params, ServerError}; use backend_service::errors::{invalid_params, ServerError};
use flowy_workspace_infra::protobuf::{AppIdentifier, CreateAppParams, UpdateAppParams}; use flowy_core_data_model::protobuf::{AppIdentifier, CreateAppParams, UpdateAppParams};
use protobuf::Message; use protobuf::Message;
use sqlx::PgPool; use sqlx::PgPool;
use crate::service::{ use crate::services::{
app::{ app::{
app::{create_app, delete_app, read_app, update_app}, app::{create_app, delete_app, read_app, update_app},
sql_builder::check_app_id, sql_builder::check_app_id,
@ -17,7 +17,7 @@ use crate::service::{
}; };
use anyhow::Context; use anyhow::Context;
use backend_service::response::FlowyResponse; use backend_service::response::FlowyResponse;
use flowy_workspace_infra::parser::app::{AppDesc, AppName}; use flowy_core_data_model::parser::app::{AppDesc, AppName};
pub async fn create_handler( pub async fn create_handler(
payload: Payload, payload: Payload,

View File

@ -4,7 +4,7 @@ use crate::{
}; };
use backend_service::errors::{invalid_params, ServerError}; use backend_service::errors::{invalid_params, ServerError};
use chrono::{DateTime, NaiveDateTime, Utc}; use chrono::{DateTime, NaiveDateTime, Utc};
use flowy_workspace_infra::{ use flowy_core_data_model::{
parser::app::AppId, parser::app::AppId,
protobuf::{App, ColorStyle}, protobuf::{App, ColorStyle},
}; };

View File

@ -4,12 +4,12 @@ use crate::{
}; };
use anyhow::Context; use anyhow::Context;
use backend_service::errors::ServerError; use backend_service::errors::ServerError;
use flowy_document_infra::protobuf::{CreateDocParams, Doc, DocIdentifier, UpdateDocParams}; use flowy_collaboration::protobuf::{CreateDocParams, Doc, DocIdentifier, UpdateDocParams};
use sqlx::{postgres::PgArguments, PgPool, Postgres}; use sqlx::{postgres::PgArguments, PgPool, Postgres};
use uuid::Uuid; use uuid::Uuid;
#[tracing::instrument(level = "debug", skip(transaction), err)] #[tracing::instrument(level = "debug", skip(transaction), err)]
pub(crate) async fn create_doc( pub(crate) async fn create_doc_with_transaction(
transaction: &mut DBTransaction<'_>, transaction: &mut DBTransaction<'_>,
params: CreateDocParams, params: CreateDocParams,
) -> Result<(), ServerError> { ) -> Result<(), ServerError> {
@ -23,6 +23,22 @@ pub(crate) async fn create_doc(
Ok(()) Ok(())
} }
pub(crate) async fn create_doc(pool: &PgPool, params: CreateDocParams) -> Result<(), ServerError> {
let mut transaction = pool
.begin()
.await
.context("Failed to acquire a Postgres connection to create doc")?;
let _ = create_doc_with_transaction(&mut transaction, params).await?;
transaction
.commit()
.await
.context("Failed to commit SQL transaction to create doc.")?;
Ok(())
}
#[tracing::instrument(level = "debug", skip(pool), err)] #[tracing::instrument(level = "debug", skip(pool), err)]
pub(crate) async fn read_doc(pool: &PgPool, params: DocIdentifier) -> Result<Doc, ServerError> { pub(crate) async fn read_doc(pool: &PgPool, params: DocIdentifier) -> Result<Doc, ServerError> {
let doc_id = Uuid::parse_str(&params.doc_id)?; let doc_id = Uuid::parse_str(&params.doc_id)?;
@ -59,7 +75,7 @@ pub async fn update_doc(pool: &PgPool, mut params: UpdateDocParams) -> Result<()
let data = Some(params.take_data()); let data = Some(params.take_data());
tracing::Span::current().record("result", &data.as_ref().unwrap_or(&"".to_owned()).as_str()); tracing::Span::current().record("delta", &data.as_ref().unwrap_or(&"".to_owned()).as_str());
let (sql, args) = SqlBuilder::update(DOC_TABLE) let (sql, args) = SqlBuilder::update(DOC_TABLE)
.add_some_arg("data", data) .add_some_arg("data", data)

View File

@ -0,0 +1,65 @@
use crate::{
services::doc::update_doc,
web_socket::{entities::Socket, WsMessageAdaptor, WsUser},
};
use actix_web::web::Data;
use backend_service::errors::internal_error;
use flowy_collaboration::{
core::sync::{RevisionUser, SyncResponse},
protobuf::UpdateDocParams,
};
use sqlx::PgPool;
use std::sync::Arc;
#[derive(Clone, Debug)]
pub struct ServerDocUser {
pub user: Arc<WsUser>,
pub(crate) socket: Socket,
pub pg_pool: Data<PgPool>,
}
impl RevisionUser for ServerDocUser {
fn user_id(&self) -> String { self.user.id().to_string() }
fn recv(&self, resp: SyncResponse) {
let result = match resp {
SyncResponse::Pull(data) => {
let msg: WsMessageAdaptor = data.into();
self.socket.try_send(msg).map_err(internal_error)
},
SyncResponse::Push(data) => {
let msg: WsMessageAdaptor = data.into();
self.socket.try_send(msg).map_err(internal_error)
},
SyncResponse::Ack(data) => {
let msg: WsMessageAdaptor = data.into();
self.socket.try_send(msg).map_err(internal_error)
},
SyncResponse::NewRevision {
rev_id,
doc_id,
doc_json,
} => {
let pg_pool = self.pg_pool.clone();
tokio::task::spawn(async move {
let mut params = UpdateDocParams::new();
params.set_doc_id(doc_id);
params.set_data(doc_json);
params.set_rev_id(rev_id);
match update_doc(pg_pool.get_ref(), params).await {
Ok(_) => {},
Err(e) => log::error!("{}", e),
}
});
Ok(())
},
};
match result {
Ok(_) => {},
Err(e) => log::error!("[ServerDocUser]: {}", e),
}
}
}

View File

@ -0,0 +1,132 @@
use crate::{
services::doc::{
read_doc,
update_doc,
ws_actor::{DocWsActor, DocWsMsg},
},
web_socket::{WsBizHandler, WsClientData},
};
use actix_web::web::Data;
use crate::services::doc::create_doc;
use backend_service::errors::ServerError;
use flowy_collaboration::{
core::sync::{ServerDocManager, ServerDocPersistence},
entities::doc::Doc,
errors::CollaborateError,
protobuf::{CreateDocParams, DocIdentifier, UpdateDocParams},
};
use lib_infra::future::FutureResultSend;
use lib_ot::{revision::Revision, rich_text::RichTextDelta};
use sqlx::PgPool;
use std::{convert::TryInto, sync::Arc};
use tokio::sync::{mpsc, oneshot};
pub struct DocumentCore {
pub manager: Arc<ServerDocManager>,
ws_sender: mpsc::Sender<DocWsMsg>,
pg_pool: Data<PgPool>,
}
impl DocumentCore {
pub fn new(pg_pool: Data<PgPool>) -> Self {
let manager = Arc::new(ServerDocManager::new(Arc::new(DocPersistenceImpl(pg_pool.clone()))));
let (ws_sender, rx) = mpsc::channel(100);
let actor = DocWsActor::new(rx, manager.clone());
tokio::task::spawn(actor.run());
Self {
manager,
ws_sender,
pg_pool,
}
}
}
impl WsBizHandler for DocumentCore {
fn receive(&self, data: WsClientData) {
let (ret, rx) = oneshot::channel();
let sender = self.ws_sender.clone();
let pool = self.pg_pool.clone();
actix_rt::spawn(async move {
let msg = DocWsMsg::ClientData {
client_data: data,
ret,
pool,
};
match sender.send(msg).await {
Ok(_) => {},
Err(e) => log::error!("{}", e),
}
match rx.await {
Ok(_) => {},
Err(e) => log::error!("{:?}", e),
};
});
}
}
struct DocPersistenceImpl(Data<PgPool>);
impl ServerDocPersistence for DocPersistenceImpl {
fn update_doc(&self, doc_id: &str, rev_id: i64, delta: RichTextDelta) -> FutureResultSend<(), CollaborateError> {
let pg_pool = self.0.clone();
let mut params = UpdateDocParams::new();
let doc_json = delta.to_json();
params.set_doc_id(doc_id.to_string());
params.set_data(doc_json);
params.set_rev_id(rev_id);
FutureResultSend::new(async move {
let _ = update_doc(pg_pool.get_ref(), params)
.await
.map_err(server_error_to_collaborate_error)?;
Ok(())
})
}
fn read_doc(&self, doc_id: &str) -> FutureResultSend<Doc, CollaborateError> {
let params = DocIdentifier {
doc_id: doc_id.to_string(),
..Default::default()
};
let pg_pool = self.0.clone();
FutureResultSend::new(async move {
let mut pb_doc = read_doc(pg_pool.get_ref(), params)
.await
.map_err(server_error_to_collaborate_error)?;
let doc = (&mut pb_doc)
.try_into()
.map_err(|e| CollaborateError::internal().context(e))?;
Ok(doc)
})
}
fn create_doc(&self, revision: Revision) -> FutureResultSend<Doc, CollaborateError> {
let pg_pool = self.0.clone();
FutureResultSend::new(async move {
let delta = RichTextDelta::from_bytes(&revision.delta_data)?;
let doc_json = delta.to_json();
let params = CreateDocParams {
id: revision.doc_id.clone(),
data: doc_json.clone(),
unknown_fields: Default::default(),
cached_size: Default::default(),
};
let _ = create_doc(pg_pool.get_ref(), params)
.await
.map_err(server_error_to_collaborate_error)?;
let doc: Doc = revision.try_into()?;
Ok(doc)
})
}
}
fn server_error_to_collaborate_error(error: ServerError) -> CollaborateError {
if error.is_record_not_found() {
CollaborateError::record_not_found()
} else {
CollaborateError::internal().context(error)
}
}

View File

@ -1,9 +1,10 @@
#![allow(clippy::module_inception)] #![allow(clippy::module_inception)]
pub(crate) use crud::*; pub(crate) use crud::*;
pub use router::*; pub use router::*;
pub mod crud; pub mod crud;
mod edit; mod editor;
pub mod manager; pub mod manager;
pub mod router; pub mod router;
mod ws_actor; mod ws_actor;

View File

@ -1,4 +1,4 @@
use crate::service::{ use crate::services::{
doc::{create_doc, read_doc, update_doc}, doc::{create_doc, read_doc, update_doc},
util::parse_from_payload, util::parse_from_payload,
}; };
@ -6,26 +6,14 @@ use actix_web::{
web::{Data, Payload}, web::{Data, Payload},
HttpResponse, HttpResponse,
}; };
use anyhow::Context;
use backend_service::{errors::ServerError, response::FlowyResponse}; use backend_service::{errors::ServerError, response::FlowyResponse};
use flowy_document_infra::protobuf::{CreateDocParams, DocIdentifier, UpdateDocParams}; use flowy_collaboration::protobuf::{CreateDocParams, DocIdentifier, UpdateDocParams};
use sqlx::PgPool; use sqlx::PgPool;
pub async fn create_handler(payload: Payload, pool: Data<PgPool>) -> Result<HttpResponse, ServerError> { pub async fn create_handler(payload: Payload, pool: Data<PgPool>) -> Result<HttpResponse, ServerError> {
let params: CreateDocParams = parse_from_payload(payload).await?; let params: CreateDocParams = parse_from_payload(payload).await?;
let _ = create_doc(&pool, params).await?;
let mut transaction = pool
.begin()
.await
.context("Failed to acquire a Postgres connection to create doc")?;
let _ = create_doc(&mut transaction, params).await?;
transaction
.commit()
.await
.context("Failed to commit SQL transaction to create doc.")?;
Ok(FlowyResponse::success().into()) Ok(FlowyResponse::success().into())
} }

View File

@ -0,0 +1,132 @@
use crate::{
services::{
doc::editor::ServerDocUser,
util::{md5, parse_from_bytes},
},
web_socket::WsClientData,
};
use actix_rt::task::spawn_blocking;
use actix_web::web::Data;
use async_stream::stream;
use backend_service::errors::{internal_error, Result, ServerError};
use flowy_collaboration::{
core::sync::{RevisionUser, ServerDocManager, SyncResponse},
entities::ws::DocumentWSDataBuilder,
protobuf::{DocumentWSData, DocumentWSDataType},
};
use flowy_collaboration::protobuf::NewDocumentUser;
use futures::stream::StreamExt;
use lib_ot::protobuf::Revision;
use sqlx::PgPool;
use std::{convert::TryInto, sync::Arc};
use tokio::sync::{mpsc, oneshot};
pub enum DocWsMsg {
ClientData {
client_data: WsClientData,
pool: Data<PgPool>,
ret: oneshot::Sender<Result<()>>,
},
}
pub struct DocWsActor {
receiver: Option<mpsc::Receiver<DocWsMsg>>,
doc_manager: Arc<ServerDocManager>,
}
impl DocWsActor {
pub fn new(receiver: mpsc::Receiver<DocWsMsg>, manager: Arc<ServerDocManager>) -> Self {
Self {
receiver: Some(receiver),
doc_manager: manager,
}
}
pub async fn run(mut self) {
let mut receiver = self
.receiver
.take()
.expect("DocActor's receiver should only take one time");
let stream = stream! {
loop {
match receiver.recv().await {
Some(msg) => yield msg,
None => break,
}
}
};
stream.for_each(|msg| self.handle_message(msg)).await;
}
async fn handle_message(&self, msg: DocWsMsg) {
match msg {
DocWsMsg::ClientData { client_data, pool, ret } => {
let _ = ret.send(self.handle_client_data(client_data, pool).await);
},
}
}
async fn handle_client_data(&self, client_data: WsClientData, pg_pool: Data<PgPool>) -> Result<()> {
let WsClientData { user, socket, data } = client_data;
let document_data = spawn_blocking(move || {
let document_data: DocumentWSData = parse_from_bytes(&data)?;
Result::Ok(document_data)
})
.await
.map_err(internal_error)??;
let user = Arc::new(ServerDocUser { user, socket, pg_pool });
match &document_data.ty {
DocumentWSDataType::Ack => Ok(()),
DocumentWSDataType::PushRev => self.handle_pushed_rev(user, document_data.data).await,
DocumentWSDataType::PullRev => Ok(()),
DocumentWSDataType::UserConnect => self.handle_user_connect(user, document_data).await,
}
}
async fn handle_user_connect(&self, user: Arc<ServerDocUser>, document_data: DocumentWSData) -> Result<()> {
let id = document_data.id.clone();
let new_user = spawn_blocking(move || parse_from_bytes::<NewDocumentUser>(&document_data.data))
.await
.map_err(internal_error)??;
user.recv(SyncResponse::Ack(DocumentWSDataBuilder::build_ack_message(
&new_user.doc_id,
&id,
)));
Ok(())
}
async fn handle_pushed_rev(&self, user: Arc<ServerDocUser>, data: Vec<u8>) -> Result<()> {
let mut revision_pb = spawn_blocking(move || {
let revision: Revision = parse_from_bytes(&data)?;
let _ = verify_md5(&revision)?;
Result::Ok(revision)
})
.await
.map_err(internal_error)??;
let revision: lib_ot::revision::Revision = (&mut revision_pb).try_into().map_err(internal_error)?;
// Create the doc if it doesn't exist
let handler = match self.doc_manager.get(&revision.doc_id).await {
None => self
.doc_manager
.create_doc(revision.clone())
.await
.map_err(internal_error)?,
Some(handler) => handler,
};
handler.apply_revision(user, revision).await.map_err(internal_error)?;
Ok(())
}
}
fn verify_md5(revision: &Revision) -> Result<()> {
if md5(&revision.delta_data) != revision.md5 {
return Err(ServerError::internal().context("Revision md5 not match"));
}
Ok(())
}

View File

@ -6,4 +6,3 @@ pub mod user;
pub(crate) mod util; pub(crate) mod util;
pub mod view; pub mod view;
pub mod workspace; pub mod workspace;
pub mod ws;

View File

@ -1,4 +1,4 @@
use crate::service::{ use crate::services::{
trash::{create_trash, delete_all_trash, delete_trash, read_trash}, trash::{create_trash, delete_all_trash, delete_trash, read_trash},
user::LoggedUser, user::LoggedUser,
util::parse_from_payload, util::parse_from_payload,
@ -13,7 +13,7 @@ use backend_service::{
errors::{invalid_params, ServerError}, errors::{invalid_params, ServerError},
response::FlowyResponse, response::FlowyResponse,
}; };
use flowy_workspace_infra::{parser::trash::TrashId, protobuf::TrashIdentifiers}; use flowy_core_data_model::{parser::trash::TrashId, protobuf::TrashIdentifiers};
use sqlx::PgPool; use sqlx::PgPool;
use uuid::Uuid; use uuid::Uuid;

View File

@ -1,6 +1,6 @@
use crate::{ use crate::{
entities::workspace::{TrashTable, TRASH_TABLE}, entities::workspace::{TrashTable, TRASH_TABLE},
service::{ services::{
app::app::{delete_app, read_app_table}, app::app::{delete_app, read_app_table},
user::LoggedUser, user::LoggedUser,
view::{delete_view, read_view_table}, view::{delete_view, read_view_table},
@ -9,7 +9,7 @@ use crate::{
}; };
use ::protobuf::ProtobufEnum; use ::protobuf::ProtobufEnum;
use backend_service::errors::ServerError; use backend_service::errors::ServerError;
use flowy_workspace_infra::protobuf::{RepeatedTrash, Trash, TrashType}; use flowy_core_data_model::protobuf::{RepeatedTrash, Trash, TrashType};
use sqlx::{postgres::PgArguments, Postgres, Row}; use sqlx::{postgres::PgArguments, Postgres, Row};
use uuid::Uuid; use uuid::Uuid;

View File

@ -1,6 +1,6 @@
use crate::{ use crate::{
entities::{token::Token, user::UserTable}, entities::{token::Token, user::UserTable},
service::user::{hash_password, verify_password, LoggedUser}, services::user::{hash_password, verify_password, LoggedUser},
sqlx_ext::{map_sqlx_error, DBTransaction, SqlBuilder}, sqlx_ext::{map_sqlx_error, DBTransaction, SqlBuilder},
}; };
use anyhow::Context; use anyhow::Context;
@ -9,14 +9,13 @@ use backend_service::{
response::FlowyResponse, response::FlowyResponse,
}; };
use chrono::Utc; use chrono::Utc;
use flowy_user_infra::{ use flowy_user_data_model::{
parser::{UserEmail, UserName, UserPassword}, parser::{UserEmail, UserName, UserPassword},
protobuf::{SignInParams, SignInResponse, SignUpParams, SignUpResponse, UpdateUserParams, UserProfile}, protobuf::{SignInParams, SignInResponse, SignUpParams, SignUpResponse, UpdateUserParams, UserProfile},
}; };
use sqlx::{PgPool, Postgres}; use sqlx::{PgPool, Postgres};
use super::AUTHORIZED_USERS; use super::AUTHORIZED_USERS;
use crate::service::user::user_default::create_default_workspace;
pub async fn sign_in(pool: &PgPool, params: SignInParams) -> Result<SignInResponse, ServerError> { pub async fn sign_in(pool: &PgPool, params: SignInParams) -> Result<SignInResponse, ServerError> {
let email = UserEmail::parse(params.email).map_err(|e| ServerError::params_invalid().context(e))?; let email = UserEmail::parse(params.email).map_err(|e| ServerError::params_invalid().context(e))?;
@ -68,7 +67,6 @@ pub async fn register_user(pool: &PgPool, params: SignUpParams) -> Result<FlowyR
let logged_user = LoggedUser::new(&response_data.user_id); let logged_user = LoggedUser::new(&response_data.user_id);
AUTHORIZED_USERS.store_auth(logged_user, true); AUTHORIZED_USERS.store_auth(logged_user, true);
let _ = create_default_workspace(&mut transaction, response_data.get_user_id()).await?;
transaction transaction
.commit() .commit()

View File

@ -7,11 +7,11 @@ use actix_web::{
use sqlx::PgPool; use sqlx::PgPool;
use backend_service::{errors::ServerError, response::FlowyResponse}; use backend_service::{errors::ServerError, response::FlowyResponse};
use flowy_user_infra::protobuf::{SignInParams, SignUpParams, UpdateUserParams}; use flowy_user_data_model::protobuf::{SignInParams, SignUpParams, UpdateUserParams};
use crate::{ use crate::{
entities::token::Token, entities::token::Token,
service::{ services::{
user::{get_user_profile, register_user, set_user_profile, sign_in, sign_out, LoggedUser}, user::{get_user_profile, register_user, set_user_profile, sign_in, sign_out, LoggedUser},
util::parse_from_payload, util::parse_from_payload,
}, },

View File

@ -1,24 +1,25 @@
use crate::{ use crate::{
service::{ services::{
app::sql_builder::NewAppSqlBuilder as AppBuilder, app::sql_builder::NewAppSqlBuilder as AppBuilder,
workspace::sql_builder::NewWorkspaceBuilder as WorkspaceBuilder, workspace::sql_builder::NewWorkspaceBuilder as WorkspaceBuilder,
}, },
sqlx_ext::{map_sqlx_error, DBTransaction}, sqlx_ext::{map_sqlx_error, DBTransaction},
}; };
use crate::service::view::{create_view_with_args, sql_builder::NewViewSqlBuilder}; use crate::services::view::{create_view_with_args, sql_builder::NewViewSqlBuilder};
use backend_service::errors::ServerError; use backend_service::errors::ServerError;
use chrono::Utc; use chrono::Utc;
use flowy_document_infra::user_default::doc_initial_string; use flowy_collaboration::core::document::default::initial_string;
use flowy_workspace_infra::protobuf::Workspace; use flowy_core_data_model::protobuf::Workspace;
use std::convert::TryInto; use std::convert::TryInto;
#[allow(dead_code)]
pub async fn create_default_workspace( pub async fn create_default_workspace(
transaction: &mut DBTransaction<'_>, transaction: &mut DBTransaction<'_>,
user_id: &str, user_id: &str,
) -> Result<Workspace, ServerError> { ) -> Result<Workspace, ServerError> {
let time = Utc::now(); let time = Utc::now();
let workspace: Workspace = flowy_workspace_infra::user_default::create_default_workspace(time) let workspace: Workspace = flowy_core_data_model::user_default::create_default_workspace(time)
.try_into() .try_into()
.unwrap(); .unwrap();
@ -41,7 +42,7 @@ pub async fn create_default_workspace(
for view in views.take_items() { for view in views.take_items() {
let (sql, args, view) = NewViewSqlBuilder::from_view(view)?.build()?; let (sql, args, view) = NewViewSqlBuilder::from_view(view)?.build()?;
let _ = create_view_with_args(transaction, sql, args, view, doc_initial_string()).await?; let _ = create_view_with_args(transaction, sql, args, view, initial_string()).await?;
} }
} }
Ok(workspace) Ok(workspace)

View File

@ -1,5 +1,5 @@
use crate::service::{ use crate::services::{
doc::manager::DocBiz, doc::manager::DocumentCore,
user::LoggedUser, user::LoggedUser,
util::parse_from_payload, util::parse_from_payload,
view::{create_view, delete_view, read_view, sql_builder::check_view_ids, update_view}, view::{create_view, delete_view, read_view, sql_builder::check_view_ids, update_view},
@ -13,7 +13,7 @@ use backend_service::{
errors::{invalid_params, ServerError}, errors::{invalid_params, ServerError},
response::FlowyResponse, response::FlowyResponse,
}; };
use flowy_workspace_infra::{ use flowy_core_data_model::{
parser::view::{ViewDesc, ViewName, ViewThumbnail}, parser::view::{ViewDesc, ViewName, ViewThumbnail},
protobuf::{CreateViewParams, QueryViewRequest, UpdateViewParams, ViewIdentifier}, protobuf::{CreateViewParams, QueryViewRequest, UpdateViewParams, ViewIdentifier},
}; };
@ -23,7 +23,7 @@ use std::sync::Arc;
pub async fn create_handler( pub async fn create_handler(
payload: Payload, payload: Payload,
pool: Data<PgPool>, pool: Data<PgPool>,
_doc_biz: Data<Arc<DocBiz>>, _doc_biz: Data<Arc<DocumentCore>>,
) -> Result<HttpResponse, ServerError> { ) -> Result<HttpResponse, ServerError> {
let params: CreateViewParams = parse_from_payload(payload).await?; let params: CreateViewParams = parse_from_payload(payload).await?;
let mut transaction = pool let mut transaction = pool

View File

@ -4,7 +4,7 @@ use crate::{
}; };
use backend_service::errors::{invalid_params, ServerError}; use backend_service::errors::{invalid_params, ServerError};
use chrono::{DateTime, NaiveDateTime, Utc}; use chrono::{DateTime, NaiveDateTime, Utc};
use flowy_workspace_infra::{ use flowy_core_data_model::{
parser::view::ViewId, parser::view::ViewId,
protobuf::{View, ViewType}, protobuf::{View, ViewType},
}; };

View File

@ -1,7 +1,7 @@
use crate::{ use crate::{
entities::workspace::{ViewTable, VIEW_TABLE}, entities::workspace::{ViewTable, VIEW_TABLE},
service::{ services::{
doc::{create_doc, delete_doc}, doc::{create_doc_with_transaction, delete_doc},
trash::read_trash_ids, trash::read_trash_ids,
user::LoggedUser, user::LoggedUser,
view::sql_builder::*, view::sql_builder::*,
@ -10,8 +10,8 @@ use crate::{
}; };
use backend_service::errors::{invalid_params, ServerError}; use backend_service::errors::{invalid_params, ServerError};
use chrono::Utc; use chrono::Utc;
use flowy_document_infra::protobuf::CreateDocParams; use flowy_collaboration::protobuf::CreateDocParams;
use flowy_workspace_infra::{ use flowy_core_data_model::{
parser::{ parser::{
app::AppId, app::AppId,
view::{ViewDesc, ViewName, ViewThumbnail}, view::{ViewDesc, ViewName, ViewThumbnail},
@ -94,7 +94,7 @@ pub(crate) async fn create_view_with_args(
let mut create_doc_params = CreateDocParams::new(); let mut create_doc_params = CreateDocParams::new();
create_doc_params.set_data(view_data); create_doc_params.set_data(view_data);
create_doc_params.set_id(view.id.clone()); create_doc_params.set_id(view.id.clone());
let _ = create_doc(transaction, create_doc_params).await?; let _ = create_doc_with_transaction(transaction, create_doc_params).await?;
Ok(view) Ok(view)
} }

View File

@ -1,4 +1,4 @@
use crate::service::{ use crate::services::{
user::LoggedUser, user::LoggedUser,
util::parse_from_payload, util::parse_from_payload,
workspace::{ workspace::{
@ -18,7 +18,7 @@ use backend_service::{
errors::{invalid_params, ServerError}, errors::{invalid_params, ServerError},
response::FlowyResponse, response::FlowyResponse,
}; };
use flowy_workspace_infra::{ use flowy_core_data_model::{
parser::workspace::{WorkspaceDesc, WorkspaceName}, parser::workspace::{WorkspaceDesc, WorkspaceName},
protobuf::{CreateWorkspaceParams, UpdateWorkspaceParams, WorkspaceIdentifier}, protobuf::{CreateWorkspaceParams, UpdateWorkspaceParams, WorkspaceIdentifier},
}; };

View File

@ -4,7 +4,7 @@ use crate::{
}; };
use backend_service::errors::{invalid_params, ServerError}; use backend_service::errors::{invalid_params, ServerError};
use chrono::{DateTime, NaiveDateTime, Utc}; use chrono::{DateTime, NaiveDateTime, Utc};
use flowy_workspace_infra::{parser::workspace::WorkspaceId, protobuf::Workspace}; use flowy_core_data_model::{parser::workspace::WorkspaceId, protobuf::Workspace};
use sqlx::postgres::PgArguments; use sqlx::postgres::PgArguments;
use uuid::Uuid; use uuid::Uuid;

View File

@ -1,12 +1,12 @@
use super::sql_builder::NewWorkspaceBuilder; use super::sql_builder::NewWorkspaceBuilder;
use crate::{ use crate::{
entities::workspace::{AppTable, WorkspaceTable, WORKSPACE_TABLE}, entities::workspace::{AppTable, WorkspaceTable, WORKSPACE_TABLE},
service::{app::app::read_app, user::LoggedUser, workspace::sql_builder::*}, services::{app::app::read_app, user::LoggedUser, workspace::sql_builder::*},
sqlx_ext::*, sqlx_ext::*,
}; };
use anyhow::Context; use anyhow::Context;
use backend_service::errors::{invalid_params, ServerError}; use backend_service::errors::{invalid_params, ServerError};
use flowy_workspace_infra::{ use flowy_core_data_model::{
parser::workspace::WorkspaceId, parser::workspace::WorkspaceId,
protobuf::{RepeatedApp, RepeatedWorkspace, Workspace}, protobuf::{RepeatedApp, RepeatedWorkspace, Workspace},
}; };

View File

@ -1,15 +1,14 @@
use crate::service::ws::WsClientData; use crate::web_socket::WsClientData;
use lib_ws::WSModule;
use lib_ws::WsModule;
use std::{collections::HashMap, sync::Arc}; use std::{collections::HashMap, sync::Arc};
pub trait WsBizHandler: Send + Sync { pub trait WsBizHandler: Send + Sync {
fn receive_data(&self, client_data: WsClientData); fn receive(&self, data: WsClientData);
} }
pub type BizHandler = Arc<dyn WsBizHandler>; pub type BizHandler = Arc<dyn WsBizHandler>;
pub struct WsBizHandlers { pub struct WsBizHandlers {
inner: HashMap<WsModule, BizHandler>, inner: HashMap<WSModule, BizHandler>,
} }
impl std::default::Default for WsBizHandlers { impl std::default::Default for WsBizHandlers {
@ -19,7 +18,7 @@ impl std::default::Default for WsBizHandlers {
impl WsBizHandlers { impl WsBizHandlers {
pub fn new() -> Self { WsBizHandlers::default() } pub fn new() -> Self { WsBizHandlers::default() }
pub fn register(&mut self, source: WsModule, handler: BizHandler) { self.inner.insert(source, handler); } pub fn register(&mut self, source: WSModule, handler: BizHandler) { self.inner.insert(source, handler); }
pub fn get(&self, source: &WsModule) -> Option<BizHandler> { self.inner.get(source).cloned() } pub fn get(&self, source: &WSModule) -> Option<BizHandler> { self.inner.get(source).cloned() }
} }

View File

@ -1,4 +1,4 @@
use crate::service::ws::WsMessageAdaptor; use crate::web_socket::WsMessageAdaptor;
use actix::{Message, Recipient}; use actix::{Message, Recipient};
use backend_service::errors::ServerError; use backend_service::errors::ServerError;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};

View File

@ -1,7 +1,7 @@
use actix::Message; use actix::Message;
use bytes::Bytes; use bytes::Bytes;
use flowy_document_infra::entities::ws::WsDocumentData; use flowy_collaboration::entities::ws::DocumentWSData;
use lib_ws::{WsMessage, WsModule}; use lib_ws::{WSMessage, WSModule};
use std::convert::TryInto; use std::convert::TryInto;
#[derive(Debug, Message, Clone)] #[derive(Debug, Message, Clone)]
@ -14,11 +14,11 @@ impl std::ops::Deref for WsMessageAdaptor {
fn deref(&self) -> &Self::Target { &self.0 } fn deref(&self) -> &Self::Target { &self.0 }
} }
impl std::convert::From<WsDocumentData> for WsMessageAdaptor { impl std::convert::From<DocumentWSData> for WsMessageAdaptor {
fn from(data: WsDocumentData) -> Self { fn from(data: DocumentWSData) -> Self {
let bytes: Bytes = data.try_into().unwrap(); let bytes: Bytes = data.try_into().unwrap();
let msg = WsMessage { let msg = WSMessage {
module: WsModule::Doc, module: WSModule::Doc,
data: bytes.to_vec(), data: bytes.to_vec(),
}; };

View File

@ -0,0 +1,63 @@
use crate::{
services::user::LoggedUser,
web_socket::{WsBizHandlers, WsClient, WsServer, WsUser},
};
use actix::Addr;
use actix_web::{
get,
web::{Data, Path, Payload},
Error,
HttpRequest,
HttpResponse,
};
use actix_web_actors::ws;
#[rustfmt::skip]
// WsClient
// ┌─────────────┐
// │ ┌────────┐ │
// wss://xxx ─────▶│ │ WsUser │ │───┐
// │ └────────┘ │ │
// └─────────────┘ │
// │
// │ ┌───────────────┐ ┌─────────────┐ ┌────────────────┐
// ├───▶│ WsBizHandlers │──▶│WsBizHandler │───▶│ WsClientData │
// │ └───────────────┘ └─────────────┘ └────────────────┘
// WsClient │ △
// ┌─────────────┐ │ │
// │ ┌────────┐ │ │ │
// wss://xxx ─────▶│ │ WsUser │ │───┘ ┌───────────────┐
// │ └────────┘ │ │ DocumentCore │
// └─────────────┘ └───────────────┘
#[get("/{token}")]
pub async fn establish_ws_connection(
request: HttpRequest,
payload: Payload,
token: Path<String>,
server: Data<Addr<WsServer>>,
biz_handlers: Data<WsBizHandlers>,
) -> Result<HttpResponse, Error> {
tracing::info!("establish_ws_connection");
match LoggedUser::from_token(token.clone()) {
Ok(user) => {
let ws_user = WsUser::new(user);
let client = WsClient::new(ws_user, server.get_ref().clone(), biz_handlers);
let result = ws::start(client, &request, payload);
match result {
Ok(response) => Ok(response),
Err(e) => {
log::error!("ws connection error: {:?}", e);
Err(e)
},
}
},
Err(e) => {
if e.is_unauthorized() {
Ok(HttpResponse::Unauthorized().json(e))
} else {
Ok(HttpResponse::BadRequest().json(e))
}
},
}
}

View File

@ -1,20 +1,18 @@
use crate::{ use crate::{
config::{HEARTBEAT_INTERVAL, PING_TIMEOUT}, config::{HEARTBEAT_INTERVAL, PING_TIMEOUT},
service::{ services::user::LoggedUser,
user::LoggedUser, web_socket::{
ws::{
entities::{Connect, Disconnect, Socket}, entities::{Connect, Disconnect, Socket},
WsBizHandlers, WsBizHandlers,
WsMessageAdaptor, WsMessageAdaptor,
WsServer, WsServer,
}, },
},
}; };
use actix::*; use actix::*;
use actix_web::web::Data; use actix_web::web::Data;
use actix_web_actors::{ws, ws::Message::Text}; use actix_web_actors::{ws, ws::Message::Text};
use bytes::Bytes; use bytes::Bytes;
use lib_ws::WsMessage; use lib_ws::WSMessage;
use std::{convert::TryFrom, sync::Arc, time::Instant}; use std::{convert::TryFrom, sync::Arc, time::Instant};
#[derive(Debug)] #[derive(Debug)]
@ -66,7 +64,7 @@ impl WsClient {
fn handle_binary_message(&self, bytes: Bytes, socket: Socket) { fn handle_binary_message(&self, bytes: Bytes, socket: Socket) {
// TODO: ok to unwrap? // TODO: ok to unwrap?
let message: WsMessage = WsMessage::try_from(bytes).unwrap(); let message: WSMessage = WSMessage::try_from(bytes).unwrap();
match self.biz_handlers.get(&message.module) { match self.biz_handlers.get(&message.module) {
None => { None => {
log::error!("Can't find the handler for {:?}", message.module); log::error!("Can't find the handler for {:?}", message.module);
@ -77,7 +75,7 @@ impl WsClient {
socket, socket,
data: Bytes::from(message.data), data: Bytes::from(message.data),
}; };
handler.receive_data(client_data); handler.receive(client_data);
}, },
} }
} }

View File

@ -1,4 +1,4 @@
use crate::service::ws::{ use crate::web_socket::{
entities::{Connect, Disconnect, Session, SessionId}, entities::{Connect, Disconnect, Session, SessionId},
WsMessageAdaptor, WsMessageAdaptor,
}; };

View File

@ -1,6 +1,6 @@
use crate::util::helper::{spawn_user_server, TestUserServer}; use crate::util::helper::{spawn_user_server, TestUserServer};
use backend_service::errors::ErrorCode; use backend_service::errors::ErrorCode;
use flowy_user_infra::entities::{SignInParams, SignUpParams, SignUpResponse, UpdateUserParams}; use flowy_user_data_model::entities::{SignInParams, SignUpParams, SignUpResponse, UpdateUserParams};
#[actix_rt::test] #[actix_rt::test]
async fn user_register() { async fn user_register() {

View File

@ -1,6 +1,6 @@
use crate::util::helper::ViewTest; use crate::util::helper::ViewTest;
use flowy_document_infra::entities::doc::DocIdentifier; use flowy_collaboration::entities::doc::DocIdentifier;
use flowy_workspace_infra::entities::view::ViewIdentifiers; use flowy_core_data_model::entities::view::ViewIdentifiers;
#[actix_rt::test] #[actix_rt::test]
async fn doc_read() { async fn doc_read() {

View File

@ -1,6 +1,6 @@
#![allow(clippy::all)] #![allow(clippy::all)]
use crate::util::helper::*; use crate::util::helper::*;
use flowy_workspace_infra::entities::{ use flowy_core_data_model::entities::{
app::{AppIdentifier, UpdateAppParams}, app::{AppIdentifier, UpdateAppParams},
trash::{TrashIdentifier, TrashIdentifiers, TrashType}, trash::{TrashIdentifier, TrashIdentifiers, TrashType},
view::{UpdateViewParams, ViewIdentifier}, view::{UpdateViewParams, ViewIdentifier},

View File

@ -1,9 +1,9 @@
#![allow(clippy::all)] #![allow(clippy::all)]
#![cfg_attr(rustfmt, rustfmt::skip)] #![cfg_attr(rustfmt, rustfmt::skip)]
use actix_web::web::Data; use actix_web::web::Data;
use backend::service::doc::{crud::update_doc, manager::DocManager}; use backend::services::doc::{crud::update_doc};
use flowy_document::services::doc::ClientDocEditor as ClientEditDocContext; use flowy_document::services::doc::edit::ClientDocEditor as ClientEditDocContext;
use flowy_test::{workspace::ViewTest, FlowyTest}; use flowy_test::{helper::ViewTest, FlowySDKTest};
use flowy_user::services::user::UserSession; use flowy_user::services::user::UserSession;
use futures_util::{stream, stream::StreamExt}; use futures_util::{stream, stream::StreamExt};
use sqlx::PgPool; use sqlx::PgPool;
@ -11,19 +11,22 @@ use std::sync::Arc;
use tokio::time::{sleep, Duration}; use tokio::time::{sleep, Duration};
// use crate::helper::*; // use crate::helper::*;
use crate::util::helper::{spawn_server, TestServer}; use crate::util::helper::{spawn_server, TestServer};
use flowy_document_infra::{entities::doc::DocIdentifier, protobuf::UpdateDocParams}; use flowy_collaboration::{entities::doc::DocIdentifier, protobuf::UpdateDocParams};
use lib_ot::core::{Attribute, Delta, Interval}; use lib_ot::rich_text::{RichTextAttribute, RichTextDelta};
use parking_lot::RwLock; use parking_lot::RwLock;
use lib_ot::core::Interval;
use flowy_collaboration::core::sync::ServerDocManager;
use flowy_net::services::ws::WsManager;
pub struct DocumentTest { pub struct DocumentTest {
server: TestServer, server: TestServer,
flowy_test: FlowyTest, flowy_test: FlowySDKTest,
} }
#[derive(Clone)] #[derive(Clone)]
pub enum DocScript { pub enum DocScript {
ClientConnectWs, ClientConnectWs,
ClientInsertText(usize, &'static str), ClientInsertText(usize, &'static str),
ClientFormatText(Interval, Attribute), ClientFormatText(Interval, RichTextAttribute),
ClientOpenDoc, ClientOpenDoc,
AssertClient(&'static str), AssertClient(&'static str),
AssertServer(&'static str, i64), AssertServer(&'static str, i64),
@ -33,7 +36,7 @@ pub enum DocScript {
impl DocumentTest { impl DocumentTest {
pub async fn new() -> Self { pub async fn new() -> Self {
let server = spawn_server().await; let server = spawn_server().await;
let flowy_test = FlowyTest::setup_with(server.client_server_config.clone()); let flowy_test = FlowySDKTest::setup_with(server.client_server_config.clone());
Self { server, flowy_test } Self { server, flowy_test }
} }
@ -49,30 +52,33 @@ impl DocumentTest {
#[derive(Clone)] #[derive(Clone)]
struct ScriptContext { struct ScriptContext {
client_edit_context: Option<Arc<ClientEditDocContext>>, client_edit_context: Option<Arc<ClientEditDocContext>>,
flowy_test: FlowyTest, client_sdk: FlowySDKTest,
client_user_session: Arc<UserSession>, client_user_session: Arc<UserSession>,
server_doc_manager: Arc<DocManager>, ws_manager: Arc<WsManager>,
server_doc_manager: Arc<ServerDocManager>,
server_pg_pool: Data<PgPool>, server_pg_pool: Data<PgPool>,
doc_id: String, doc_id: String,
} }
impl ScriptContext { impl ScriptContext {
async fn new(flowy_test: FlowyTest, server: TestServer) -> Self { async fn new(client_sdk: FlowySDKTest, server: TestServer) -> Self {
let user_session = flowy_test.sdk.user_session.clone(); let user_session = client_sdk.user_session.clone();
let doc_id = create_doc(&flowy_test).await; let ws_manager = client_sdk.ws_manager.clone();
let doc_id = create_doc(&client_sdk).await;
Self { Self {
client_edit_context: None, client_edit_context: None,
flowy_test, client_sdk,
client_user_session: user_session, client_user_session: user_session,
server_doc_manager: server.app_ctx.doc_biz.manager.clone(), ws_manager,
server_doc_manager: server.app_ctx.document_core.manager.clone(),
server_pg_pool: Data::new(server.pg_pool.clone()), server_pg_pool: Data::new(server.pg_pool.clone()),
doc_id, doc_id,
} }
} }
async fn open_doc(&mut self) { async fn open_doc(&mut self) {
let flowy_document = self.flowy_test.sdk.flowy_document.clone(); let flowy_document = self.client_sdk.flowy_document.clone();
let doc_id = self.doc_id.clone(); let doc_id = self.doc_id.clone();
let edit_context = flowy_document.open(DocIdentifier { doc_id }).await.unwrap(); let edit_context = flowy_document.open(DocIdentifier { doc_id }).await.unwrap();
@ -97,9 +103,10 @@ async fn run_scripts(context: Arc<RwLock<ScriptContext>>, scripts: Vec<DocScript
match script { match script {
DocScript::ClientConnectWs => { DocScript::ClientConnectWs => {
// sleep(Duration::from_millis(300)).await; // sleep(Duration::from_millis(300)).await;
let ws_manager = context.read().ws_manager.clone();
let user_session = context.read().client_user_session.clone(); let user_session = context.read().client_user_session.clone();
let token = user_session.token().unwrap(); let token = user_session.token().unwrap();
let _ = user_session.start_ws_connection(&token).await.unwrap(); let _ = ws_manager.start(token).await.unwrap();
}, },
DocScript::ClientOpenDoc => { DocScript::ClientOpenDoc => {
context.write().open_doc().await; context.write().open_doc().await;
@ -116,18 +123,18 @@ async fn run_scripts(context: Arc<RwLock<ScriptContext>>, scripts: Vec<DocScript
.unwrap(); .unwrap();
}, },
DocScript::AssertClient(s) => { DocScript::AssertClient(s) => {
sleep(Duration::from_millis(100)).await; sleep(Duration::from_millis(2000)).await;
let json = context.read().client_edit_context().doc_json().await.unwrap(); let json = context.read().client_edit_context().doc_json().await.unwrap();
assert_eq(s, &json); assert_eq(s, &json);
}, },
DocScript::AssertServer(s, rev_id) => { DocScript::AssertServer(_s, _rev_id) => {
sleep(Duration::from_millis(100)).await; sleep(Duration::from_millis(100)).await;
let pg_pool = context.read().server_pg_pool.clone(); // let pg_pool = context.read().server_pg_pool.clone();
let doc_manager = context.read().server_doc_manager.clone(); // let doc_manager = context.read().server_doc_manager.clone();
let edit_doc = doc_manager.get(&doc_id, pg_pool).await.unwrap().unwrap(); // let edit_doc = doc_manager.get(&doc_id).unwrap();
let json = edit_doc.document_json().await.unwrap(); // let json = edit_doc.document_json().await.unwrap();
assert_eq(s, &json); // assert_eq(s, &json);
assert_eq!(edit_doc.rev_id().await.unwrap(), rev_id); // assert_eq!(edit_doc.rev_id().await.unwrap(), rev_id);
}, },
DocScript::ServerSaveDocument(json, rev_id) => { DocScript::ServerSaveDocument(json, rev_id) => {
let pg_pool = context.read().server_pg_pool.clone(); let pg_pool = context.read().server_pg_pool.clone();
@ -150,8 +157,8 @@ async fn run_scripts(context: Arc<RwLock<ScriptContext>>, scripts: Vec<DocScript
} }
fn assert_eq(expect: &str, receive: &str) { fn assert_eq(expect: &str, receive: &str) {
let expected_delta: Delta = serde_json::from_str(expect).unwrap(); let expected_delta: RichTextDelta = serde_json::from_str(expect).unwrap();
let target_delta: Delta = serde_json::from_str(receive).unwrap(); let target_delta: RichTextDelta = serde_json::from_str(receive).unwrap();
if expected_delta != target_delta { if expected_delta != target_delta {
log::error!("✅ expect: {}", expect,); log::error!("✅ expect: {}", expect,);
@ -160,7 +167,7 @@ fn assert_eq(expect: &str, receive: &str) {
assert_eq!(target_delta, expected_delta); assert_eq!(target_delta, expected_delta);
} }
async fn create_doc(flowy_test: &FlowyTest) -> String { async fn create_doc(flowy_test: &FlowySDKTest) -> String {
let view_test = ViewTest::new(flowy_test).await; let view_test = ViewTest::new(flowy_test).await;
view_test.view.id view_test.view.id
} }

View File

@ -1,6 +1,6 @@
use crate::document::helper::{DocScript, DocumentTest}; use crate::document::edit_script::{DocScript, DocumentTest};
use flowy_document_infra::core::{Document, FlowyDoc}; use flowy_collaboration::core::document::{Document, FlowyDoc};
use lib_ot::core::{Attribute, Interval}; use lib_ot::{core::Interval, rich_text::RichTextAttribute};
#[rustfmt::skip] #[rustfmt::skip]
// ┌─────────┐ ┌─────────┐ // ┌─────────┐ ┌─────────┐
@ -51,11 +51,11 @@ async fn delta_sync_while_editing_with_attribute() {
DocScript::ClientConnectWs, DocScript::ClientConnectWs,
DocScript::ClientOpenDoc, DocScript::ClientOpenDoc,
DocScript::ClientInsertText(0, "abc"), DocScript::ClientInsertText(0, "abc"),
DocScript::ClientFormatText(Interval::new(0, 3), Attribute::Bold(true)), DocScript::ClientFormatText(Interval::new(0, 3), RichTextAttribute::Bold(true)),
DocScript::AssertClient(r#"[{"insert":"abc","attributes":{"bold":true}},{"insert":"\n"}]"#), DocScript::AssertClient(r#"[{"insert":"abc","attributes":{"bold":true}},{"insert":"\n"}]"#),
DocScript::AssertServer(r#"[{"insert":"abc","attributes":{"bold":true}},{"insert":"\n"}]"#, 2), DocScript::AssertServer(r#"[{"insert":"abc","attributes":{"bold":true}},{"insert":"\n"}]"#, 2),
DocScript::ClientInsertText(3, "efg"), DocScript::ClientInsertText(3, "efg"),
DocScript::ClientFormatText(Interval::new(3, 5), Attribute::Italic(true)), DocScript::ClientFormatText(Interval::new(3, 5), RichTextAttribute::Italic(true)),
DocScript::AssertClient(r#"[{"insert":"abc","attributes":{"bold":true}},{"insert":"ef","attributes":{"bold":true,"italic":true}},{"insert":"g","attributes":{"bold":true}},{"insert":"\n"}]"#), DocScript::AssertClient(r#"[{"insert":"abc","attributes":{"bold":true}},{"insert":"ef","attributes":{"bold":true,"italic":true}},{"insert":"g","attributes":{"bold":true}},{"insert":"\n"}]"#),
DocScript::AssertServer(r#"[{"insert":"abc","attributes":{"bold":true}},{"insert":"ef","attributes":{"bold":true,"italic":true}},{"insert":"g","attributes":{"bold":true}},{"insert":"\n"}]"#, 4), DocScript::AssertServer(r#"[{"insert":"abc","attributes":{"bold":true}},{"insert":"ef","attributes":{"bold":true,"italic":true}},{"insert":"g","attributes":{"bold":true}},{"insert":"\n"}]"#, 4),
]) ])
@ -197,7 +197,7 @@ async fn delta_sync_while_local_rev_greater_than_server_rev() {
DocScript::ClientInsertText(6, "efg"), DocScript::ClientInsertText(6, "efg"),
DocScript::ClientConnectWs, DocScript::ClientConnectWs,
DocScript::AssertClient(r#"[{"insert":"123abcefg\n"}]"#), DocScript::AssertClient(r#"[{"insert":"123abcefg\n"}]"#),
// DocScript::AssertServer(r#"[{"insert":"123abcefg\n"}]"#, 3), DocScript::AssertServer(r#"[{"insert":"123abcefg\n"}]"#, 3),
]) ])
.await; .await;
} }

View File

@ -1,2 +1,2 @@
mod edit; mod edit_script;
mod helper; mod edit_test;

View File

@ -9,10 +9,10 @@ use backend_service::{
user_request::*, user_request::*,
workspace_request::*, workspace_request::*,
}; };
use flowy_collaboration::entities::doc::{Doc, DocIdentifier};
use flowy_core_data_model::entities::prelude::*;
use flowy_document::services::server::read_doc_request; use flowy_document::services::server::read_doc_request;
use flowy_document_infra::entities::doc::{Doc, DocIdentifier}; use flowy_user_data_model::entities::*;
use flowy_user_infra::entities::*;
use flowy_workspace_infra::entities::prelude::*;
use sqlx::{Connection, Executor, PgConnection, PgPool}; use sqlx::{Connection, Executor, PgConnection, PgPool};
use uuid::Uuid; use uuid::Uuid;
@ -188,7 +188,7 @@ impl std::convert::From<TestServer> for TestUserServer {
pg_pool: server.pg_pool, pg_pool: server.pg_pool,
user_token: None, user_token: None,
user_id: None, user_id: None,
client_server_config: server.client_server_config.clone(), client_server_config: server.client_server_config,
} }
} }
} }

View File

@ -3,7 +3,7 @@
archiveVersion = 1; archiveVersion = 1;
classes = { classes = {
}; };
objectVersion = 46; objectVersion = 50;
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
@ -156,7 +156,7 @@
97C146E61CF9000F007C117D /* Project object */ = { 97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastUpgradeCheck = 1020; LastUpgradeCheck = 1300;
ORGANIZATIONNAME = ""; ORGANIZATIONNAME = "";
TargetAttributes = { TargetAttributes = {
97C146ED1CF9000F007C117D = { 97C146ED1CF9000F007C117D = {

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1020" LastUpgradeVersion = "1300"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"

View File

@ -1,7 +1,7 @@
import 'package:app_flowy/user/domain/i_auth.dart'; import 'package:app_flowy/user/domain/i_auth.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/protobuf/flowy-user-infra/protobuf.dart' show UserProfile, ErrorCode; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-user/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile, ErrorCode;
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
@ -40,7 +40,7 @@ class SignInBloc extends Bloc<SignInEvent, SignInState> {
); );
} }
SignInState stateFromCode(UserError error) { SignInState stateFromCode(FlowyError error) {
switch (ErrorCode.valueOf(error.code)!) { switch (ErrorCode.valueOf(error.code)!) {
case ErrorCode.EmailFormatInvalid: case ErrorCode.EmailFormatInvalid:
return state.copyWith(isSubmitting: false, emailError: some(error.msg), passwordError: none()); return state.copyWith(isSubmitting: false, emailError: some(error.msg), passwordError: none());
@ -67,7 +67,7 @@ abstract class SignInState with _$SignInState {
required bool isSubmitting, required bool isSubmitting,
required Option<String> passwordError, required Option<String> passwordError,
required Option<String> emailError, required Option<String> emailError,
required Option<Either<UserProfile, UserError>> successOrFail, required Option<Either<UserProfile, FlowyError>> successOrFail,
}) = _SignInState; }) = _SignInState;
factory SignInState.initial() => SignInState( factory SignInState.initial() => SignInState(

View File

@ -519,7 +519,7 @@ class _$SignInStateTearOff {
required bool isSubmitting, required bool isSubmitting,
required Option<String> passwordError, required Option<String> passwordError,
required Option<String> emailError, required Option<String> emailError,
required Option<Either<UserProfile, UserError>> successOrFail}) { required Option<Either<UserProfile, FlowyError>> successOrFail}) {
return _SignInState( return _SignInState(
email: email, email: email,
password: password, password: password,
@ -541,7 +541,7 @@ mixin _$SignInState {
bool get isSubmitting => throw _privateConstructorUsedError; bool get isSubmitting => throw _privateConstructorUsedError;
Option<String> get passwordError => throw _privateConstructorUsedError; Option<String> get passwordError => throw _privateConstructorUsedError;
Option<String> get emailError => throw _privateConstructorUsedError; Option<String> get emailError => throw _privateConstructorUsedError;
Option<Either<UserProfile, UserError>> get successOrFail => Option<Either<UserProfile, FlowyError>> get successOrFail =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@JsonKey(ignore: true) @JsonKey(ignore: true)
@ -560,7 +560,7 @@ abstract class $SignInStateCopyWith<$Res> {
bool isSubmitting, bool isSubmitting,
Option<String> passwordError, Option<String> passwordError,
Option<String> emailError, Option<String> emailError,
Option<Either<UserProfile, UserError>> successOrFail}); Option<Either<UserProfile, FlowyError>> successOrFail});
} }
/// @nodoc /// @nodoc
@ -604,7 +604,7 @@ class _$SignInStateCopyWithImpl<$Res> implements $SignInStateCopyWith<$Res> {
successOrFail: successOrFail == freezed successOrFail: successOrFail == freezed
? _value.successOrFail ? _value.successOrFail
: successOrFail // ignore: cast_nullable_to_non_nullable : successOrFail // ignore: cast_nullable_to_non_nullable
as Option<Either<UserProfile, UserError>>, as Option<Either<UserProfile, FlowyError>>,
)); ));
} }
} }
@ -622,7 +622,7 @@ abstract class _$SignInStateCopyWith<$Res>
bool isSubmitting, bool isSubmitting,
Option<String> passwordError, Option<String> passwordError,
Option<String> emailError, Option<String> emailError,
Option<Either<UserProfile, UserError>> successOrFail}); Option<Either<UserProfile, FlowyError>> successOrFail});
} }
/// @nodoc /// @nodoc
@ -668,7 +668,7 @@ class __$SignInStateCopyWithImpl<$Res> extends _$SignInStateCopyWithImpl<$Res>
successOrFail: successOrFail == freezed successOrFail: successOrFail == freezed
? _value.successOrFail ? _value.successOrFail
: successOrFail // ignore: cast_nullable_to_non_nullable : successOrFail // ignore: cast_nullable_to_non_nullable
as Option<Either<UserProfile, UserError>>, as Option<Either<UserProfile, FlowyError>>,
)); ));
} }
} }
@ -695,7 +695,7 @@ class _$_SignInState implements _SignInState {
@override @override
final Option<String> emailError; final Option<String> emailError;
@override @override
final Option<Either<UserProfile, UserError>> successOrFail; final Option<Either<UserProfile, FlowyError>> successOrFail;
@override @override
String toString() { String toString() {
@ -748,7 +748,7 @@ abstract class _SignInState implements SignInState {
required bool isSubmitting, required bool isSubmitting,
required Option<String> passwordError, required Option<String> passwordError,
required Option<String> emailError, required Option<String> emailError,
required Option<Either<UserProfile, UserError>> successOrFail}) = required Option<Either<UserProfile, FlowyError>> successOrFail}) =
_$_SignInState; _$_SignInState;
@override @override
@ -762,7 +762,7 @@ abstract class _SignInState implements SignInState {
@override @override
Option<String> get emailError => throw _privateConstructorUsedError; Option<String> get emailError => throw _privateConstructorUsedError;
@override @override
Option<Either<UserProfile, UserError>> get successOrFail => Option<Either<UserProfile, FlowyError>> get successOrFail =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@override @override
@JsonKey(ignore: true) @JsonKey(ignore: true)

View File

@ -1,8 +1,8 @@
import 'package:app_flowy/user/domain/i_auth.dart'; import 'package:app_flowy/user/domain/i_auth.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_sdk/protobuf/flowy-user-infra/protobuf.dart' show UserProfile, ErrorCode; import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile, ErrorCode;
import 'package:flowy_sdk/protobuf/flowy-user/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:app_flowy/generated/locale_keys.g.dart'; import 'package:app_flowy/generated/locale_keys.g.dart';
@ -78,7 +78,7 @@ class SignUpBloc extends Bloc<SignUpEvent, SignUpState> {
); );
} }
SignUpState stateFromCode(UserError error) { SignUpState stateFromCode(FlowyError error) {
switch (ErrorCode.valueOf(error.code)!) { switch (ErrorCode.valueOf(error.code)!) {
case ErrorCode.EmailFormatInvalid: case ErrorCode.EmailFormatInvalid:
return state.copyWith( return state.copyWith(
@ -118,7 +118,7 @@ class SignUpState with _$SignUpState {
required Option<String> passwordError, required Option<String> passwordError,
required Option<String> repeatPasswordError, required Option<String> repeatPasswordError,
required Option<String> emailError, required Option<String> emailError,
required Option<Either<UserProfile, UserError>> successOrFail, required Option<Either<UserProfile, FlowyError>> successOrFail,
}) = _SignUpState; }) = _SignUpState;
factory SignUpState.initial() => SignUpState( factory SignUpState.initial() => SignUpState(

View File

@ -707,7 +707,7 @@ class _$SignUpStateTearOff {
required Option<String> passwordError, required Option<String> passwordError,
required Option<String> repeatPasswordError, required Option<String> repeatPasswordError,
required Option<String> emailError, required Option<String> emailError,
required Option<Either<UserProfile, UserError>> successOrFail}) { required Option<Either<UserProfile, FlowyError>> successOrFail}) {
return _SignUpState( return _SignUpState(
email: email, email: email,
password: password, password: password,
@ -733,7 +733,7 @@ mixin _$SignUpState {
Option<String> get passwordError => throw _privateConstructorUsedError; Option<String> get passwordError => throw _privateConstructorUsedError;
Option<String> get repeatPasswordError => throw _privateConstructorUsedError; Option<String> get repeatPasswordError => throw _privateConstructorUsedError;
Option<String> get emailError => throw _privateConstructorUsedError; Option<String> get emailError => throw _privateConstructorUsedError;
Option<Either<UserProfile, UserError>> get successOrFail => Option<Either<UserProfile, FlowyError>> get successOrFail =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@JsonKey(ignore: true) @JsonKey(ignore: true)
@ -754,7 +754,7 @@ abstract class $SignUpStateCopyWith<$Res> {
Option<String> passwordError, Option<String> passwordError,
Option<String> repeatPasswordError, Option<String> repeatPasswordError,
Option<String> emailError, Option<String> emailError,
Option<Either<UserProfile, UserError>> successOrFail}); Option<Either<UserProfile, FlowyError>> successOrFail});
} }
/// @nodoc /// @nodoc
@ -808,7 +808,7 @@ class _$SignUpStateCopyWithImpl<$Res> implements $SignUpStateCopyWith<$Res> {
successOrFail: successOrFail == freezed successOrFail: successOrFail == freezed
? _value.successOrFail ? _value.successOrFail
: successOrFail // ignore: cast_nullable_to_non_nullable : successOrFail // ignore: cast_nullable_to_non_nullable
as Option<Either<UserProfile, UserError>>, as Option<Either<UserProfile, FlowyError>>,
)); ));
} }
} }
@ -828,7 +828,7 @@ abstract class _$SignUpStateCopyWith<$Res>
Option<String> passwordError, Option<String> passwordError,
Option<String> repeatPasswordError, Option<String> repeatPasswordError,
Option<String> emailError, Option<String> emailError,
Option<Either<UserProfile, UserError>> successOrFail}); Option<Either<UserProfile, FlowyError>> successOrFail});
} }
/// @nodoc /// @nodoc
@ -884,7 +884,7 @@ class __$SignUpStateCopyWithImpl<$Res> extends _$SignUpStateCopyWithImpl<$Res>
successOrFail: successOrFail == freezed successOrFail: successOrFail == freezed
? _value.successOrFail ? _value.successOrFail
: successOrFail // ignore: cast_nullable_to_non_nullable : successOrFail // ignore: cast_nullable_to_non_nullable
as Option<Either<UserProfile, UserError>>, as Option<Either<UserProfile, FlowyError>>,
)); ));
} }
} }
@ -917,7 +917,7 @@ class _$_SignUpState implements _SignUpState {
@override @override
final Option<String> emailError; final Option<String> emailError;
@override @override
final Option<Either<UserProfile, UserError>> successOrFail; final Option<Either<UserProfile, FlowyError>> successOrFail;
@override @override
String toString() { String toString() {
@ -980,7 +980,7 @@ abstract class _SignUpState implements SignUpState {
required Option<String> passwordError, required Option<String> passwordError,
required Option<String> repeatPasswordError, required Option<String> repeatPasswordError,
required Option<String> emailError, required Option<String> emailError,
required Option<Either<UserProfile, UserError>> successOrFail}) = required Option<Either<UserProfile, FlowyError>> successOrFail}) =
_$_SignUpState; _$_SignUpState;
@override @override
@ -998,7 +998,7 @@ abstract class _SignUpState implements SignUpState {
@override @override
Option<String> get emailError => throw _privateConstructorUsedError; Option<String> get emailError => throw _privateConstructorUsedError;
@override @override
Option<Either<UserProfile, UserError>> get successOrFail => Option<Either<UserProfile, FlowyError>> get successOrFail =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@override @override
@JsonKey(ignore: true) @JsonKey(ignore: true)

View File

@ -1,11 +1,11 @@
import 'package:flowy_sdk/protobuf/flowy-user-infra/protobuf.dart' show UserProfile; import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile;
import 'package:flowy_sdk/protobuf/flowy-user/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
part 'auth_state.freezed.dart'; part 'auth_state.freezed.dart';
@freezed @freezed
abstract class AuthState with _$AuthState { abstract class AuthState with _$AuthState {
const factory AuthState.authenticated(UserProfile userProfile) = Authenticated; const factory AuthState.authenticated(UserProfile userProfile) = Authenticated;
const factory AuthState.unauthenticated(UserError error) = Unauthenticated; const factory AuthState.unauthenticated(FlowyError error) = Unauthenticated;
const factory AuthState.initial() = _Initial; const factory AuthState.initial() = _Initial;
} }

View File

@ -23,7 +23,7 @@ class _$AuthStateTearOff {
); );
} }
Unauthenticated unauthenticated(UserError error) { Unauthenticated unauthenticated(FlowyError error) {
return Unauthenticated( return Unauthenticated(
error, error,
); );
@ -42,21 +42,21 @@ mixin _$AuthState {
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(UserProfile userProfile) authenticated, required TResult Function(UserProfile userProfile) authenticated,
required TResult Function(UserError error) unauthenticated, required TResult Function(FlowyError error) unauthenticated,
required TResult Function() initial, required TResult Function() initial,
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult Function(UserProfile userProfile)? authenticated, TResult Function(UserProfile userProfile)? authenticated,
TResult Function(UserError error)? unauthenticated, TResult Function(FlowyError error)? unauthenticated,
TResult Function()? initial, TResult Function()? initial,
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(UserProfile userProfile)? authenticated, TResult Function(UserProfile userProfile)? authenticated,
TResult Function(UserError error)? unauthenticated, TResult Function(FlowyError error)? unauthenticated,
TResult Function()? initial, TResult Function()? initial,
required TResult orElse(), required TResult orElse(),
}) => }) =>
@ -166,7 +166,7 @@ class _$Authenticated implements Authenticated {
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(UserProfile userProfile) authenticated, required TResult Function(UserProfile userProfile) authenticated,
required TResult Function(UserError error) unauthenticated, required TResult Function(FlowyError error) unauthenticated,
required TResult Function() initial, required TResult Function() initial,
}) { }) {
return authenticated(userProfile); return authenticated(userProfile);
@ -176,7 +176,7 @@ class _$Authenticated implements Authenticated {
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult Function(UserProfile userProfile)? authenticated, TResult Function(UserProfile userProfile)? authenticated,
TResult Function(UserError error)? unauthenticated, TResult Function(FlowyError error)? unauthenticated,
TResult Function()? initial, TResult Function()? initial,
}) { }) {
return authenticated?.call(userProfile); return authenticated?.call(userProfile);
@ -186,7 +186,7 @@ class _$Authenticated implements Authenticated {
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(UserProfile userProfile)? authenticated, TResult Function(UserProfile userProfile)? authenticated,
TResult Function(UserError error)? unauthenticated, TResult Function(FlowyError error)? unauthenticated,
TResult Function()? initial, TResult Function()? initial,
required TResult orElse(), required TResult orElse(),
}) { }) {
@ -245,7 +245,7 @@ abstract class $UnauthenticatedCopyWith<$Res> {
factory $UnauthenticatedCopyWith( factory $UnauthenticatedCopyWith(
Unauthenticated value, $Res Function(Unauthenticated) then) = Unauthenticated value, $Res Function(Unauthenticated) then) =
_$UnauthenticatedCopyWithImpl<$Res>; _$UnauthenticatedCopyWithImpl<$Res>;
$Res call({UserError error}); $Res call({FlowyError error});
} }
/// @nodoc /// @nodoc
@ -266,7 +266,7 @@ class _$UnauthenticatedCopyWithImpl<$Res> extends _$AuthStateCopyWithImpl<$Res>
error == freezed error == freezed
? _value.error ? _value.error
: error // ignore: cast_nullable_to_non_nullable : error // ignore: cast_nullable_to_non_nullable
as UserError, as FlowyError,
)); ));
} }
} }
@ -277,7 +277,7 @@ class _$Unauthenticated implements Unauthenticated {
const _$Unauthenticated(this.error); const _$Unauthenticated(this.error);
@override @override
final UserError error; final FlowyError error;
@override @override
String toString() { String toString() {
@ -305,7 +305,7 @@ class _$Unauthenticated implements Unauthenticated {
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(UserProfile userProfile) authenticated, required TResult Function(UserProfile userProfile) authenticated,
required TResult Function(UserError error) unauthenticated, required TResult Function(FlowyError error) unauthenticated,
required TResult Function() initial, required TResult Function() initial,
}) { }) {
return unauthenticated(error); return unauthenticated(error);
@ -315,7 +315,7 @@ class _$Unauthenticated implements Unauthenticated {
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult Function(UserProfile userProfile)? authenticated, TResult Function(UserProfile userProfile)? authenticated,
TResult Function(UserError error)? unauthenticated, TResult Function(FlowyError error)? unauthenticated,
TResult Function()? initial, TResult Function()? initial,
}) { }) {
return unauthenticated?.call(error); return unauthenticated?.call(error);
@ -325,7 +325,7 @@ class _$Unauthenticated implements Unauthenticated {
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(UserProfile userProfile)? authenticated, TResult Function(UserProfile userProfile)? authenticated,
TResult Function(UserError error)? unauthenticated, TResult Function(FlowyError error)? unauthenticated,
TResult Function()? initial, TResult Function()? initial,
required TResult orElse(), required TResult orElse(),
}) { }) {
@ -371,9 +371,9 @@ class _$Unauthenticated implements Unauthenticated {
} }
abstract class Unauthenticated implements AuthState { abstract class Unauthenticated implements AuthState {
const factory Unauthenticated(UserError error) = _$Unauthenticated; const factory Unauthenticated(FlowyError error) = _$Unauthenticated;
UserError get error => throw _privateConstructorUsedError; FlowyError get error => throw _privateConstructorUsedError;
@JsonKey(ignore: true) @JsonKey(ignore: true)
$UnauthenticatedCopyWith<Unauthenticated> get copyWith => $UnauthenticatedCopyWith<Unauthenticated> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@ -417,7 +417,7 @@ class _$_Initial implements _Initial {
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function(UserProfile userProfile) authenticated, required TResult Function(UserProfile userProfile) authenticated,
required TResult Function(UserError error) unauthenticated, required TResult Function(FlowyError error) unauthenticated,
required TResult Function() initial, required TResult Function() initial,
}) { }) {
return initial(); return initial();
@ -427,7 +427,7 @@ class _$_Initial implements _Initial {
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult Function(UserProfile userProfile)? authenticated, TResult Function(UserProfile userProfile)? authenticated,
TResult Function(UserError error)? unauthenticated, TResult Function(FlowyError error)? unauthenticated,
TResult Function()? initial, TResult Function()? initial,
}) { }) {
return initial?.call(); return initial?.call();
@ -437,7 +437,7 @@ class _$_Initial implements _Initial {
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function(UserProfile userProfile)? authenticated, TResult Function(UserProfile userProfile)? authenticated,
TResult Function(UserError error)? unauthenticated, TResult Function(FlowyError error)? unauthenticated,
TResult Function()? initial, TResult Function()? initial,
required TResult orElse(), required TResult orElse(),
}) { }) {

View File

@ -1,7 +1,7 @@
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/protobuf/flowy-user/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/protobuf.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/protobuf.dart';
import 'package:flowy_sdk/protobuf/flowy-user-infra/protobuf.dart' show UserProfile; import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class NewUser { class NewUser {
@ -14,9 +14,9 @@ class NewUser {
} }
abstract class IAuth { abstract class IAuth {
Future<Either<UserProfile, UserError>> signIn(String? email, String? password); Future<Either<UserProfile, FlowyError>> signIn(String? email, String? password);
Future<Either<UserProfile, UserError>> signUp(String? name, String? password, String? email); Future<Either<UserProfile, FlowyError>> signUp(String? name, String? password, String? email);
Future<Either<Unit, UserError>> signOut(); Future<Either<Unit, FlowyError>> signOut();
} }
abstract class IAuthRouter { abstract class IAuthRouter {

View File

@ -1,5 +1,5 @@
import 'package:flowy_sdk/protobuf/flowy-user-infra/protobuf.dart' show UserProfile; import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile;
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/protobuf.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/protobuf.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'auth_state.dart'; import 'auth_state.dart';

View File

@ -11,7 +11,6 @@ import 'package:app_flowy/workspace/application/home/home_bloc.dart';
import 'package:app_flowy/workspace/application/home/home_listen_bloc.dart'; import 'package:app_flowy/workspace/application/home/home_listen_bloc.dart';
import 'package:app_flowy/workspace/domain/i_user.dart'; import 'package:app_flowy/workspace/domain/i_user.dart';
import 'package:app_flowy/workspace/infrastructure/i_user_impl.dart'; import 'package:app_flowy/workspace/infrastructure/i_user_impl.dart';
import 'package:flowy_sdk/protobuf/flowy-user-infra/protobuf.dart' show UserProfile;
import 'package:get_it/get_it.dart'; import 'package:get_it/get_it.dart';
import 'network_monitor.dart'; import 'network_monitor.dart';
@ -34,11 +33,9 @@ class UserDepsResolver {
getIt.registerFactory<EditPannelBloc>(() => EditPannelBloc()); getIt.registerFactory<EditPannelBloc>(() => EditPannelBloc());
getIt.registerFactory<SplashBloc>(() => SplashBloc(getIt<ISplashUser>())); getIt.registerFactory<SplashBloc>(() => SplashBloc(getIt<ISplashUser>()));
getIt.registerFactoryParam<HomeListenBloc, UserProfile, void>( getIt.registerFactoryParam<HomeListenBloc, UserProfile, void>((user, _) => HomeListenBloc(
(user, _) => HomeListenBloc(
getIt<IUserListener>(param1: user), getIt<IUserListener>(param1: user),
), ));
);
getIt.registerLazySingleton<NetworkMonitor>(() => NetworkMonitor()); getIt.registerLazySingleton<NetworkMonitor>(() => NetworkMonitor());
} }

View File

@ -5,11 +5,11 @@ import 'package:app_flowy/workspace/presentation/home/home_screen.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flowy_infra/time/duration.dart'; import 'package:flowy_infra/time/duration.dart';
import 'package:flowy_infra_ui/widget/route/animation.dart'; import 'package:flowy_infra_ui/widget/route/animation.dart';
import 'package:flowy_sdk/protobuf/flowy-user-infra/protobuf.dart' show UserProfile; import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile;
import 'package:app_flowy/user/domain/i_auth.dart'; import 'package:app_flowy/user/domain/i_auth.dart';
import 'package:app_flowy/user/infrastructure/repos/auth_repo.dart'; import 'package:app_flowy/user/infrastructure/repos/auth_repo.dart';
import 'package:flowy_sdk/protobuf/flowy-user/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/protobuf.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/protobuf.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class AuthImpl extends IAuth { class AuthImpl extends IAuth {
@ -19,17 +19,17 @@ class AuthImpl extends IAuth {
}); });
@override @override
Future<Either<UserProfile, UserError>> signIn(String? email, String? password) { Future<Either<UserProfile, FlowyError>> signIn(String? email, String? password) {
return repo.signIn(email: email, password: password); return repo.signIn(email: email, password: password);
} }
@override @override
Future<Either<UserProfile, UserError>> signUp(String? name, String? password, String? email) { Future<Either<UserProfile, FlowyError>> signUp(String? name, String? password, String? email) {
return repo.signUp(name: name, password: password, email: email); return repo.signUp(name: name, password: password, email: email);
} }
@override @override
Future<Either<Unit, UserError>> signOut() { Future<Either<Unit, FlowyError>> signOut() {
return repo.signOut(); return repo.signOut();
} }
} }

View File

@ -10,8 +10,8 @@ import 'package:app_flowy/workspace/presentation/home/home_screen.dart';
import 'package:flowy_infra/time/duration.dart'; import 'package:flowy_infra/time/duration.dart';
import 'package:flowy_infra_ui/widget/route/animation.dart'; import 'package:flowy_infra_ui/widget/route/animation.dart';
import 'package:flowy_sdk/dispatch/dispatch.dart'; import 'package:flowy_sdk/dispatch/dispatch.dart';
import 'package:flowy_sdk/protobuf/flowy-user-infra/protobuf.dart' show UserProfile; import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile;
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/protobuf.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/protobuf.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
@ -24,8 +24,8 @@ class SplashUserImpl implements ISplashUser {
(userProfile) { (userProfile) {
return AuthState.authenticated(userProfile); return AuthState.authenticated(userProfile);
}, },
(userError) { (FlowyError) {
return AuthState.unauthenticated(userError); return AuthState.unauthenticated(FlowyError);
}, },
); );
}); });

View File

@ -3,7 +3,7 @@ import 'dart:async';
import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flowy_log/flowy_log.dart'; import 'package:flowy_log/flowy_log.dart';
import 'package:flowy_sdk/dispatch/dispatch.dart'; import 'package:flowy_sdk/dispatch/dispatch.dart';
import 'package:flowy_sdk/protobuf/lib-infra/protobuf.dart'; import 'package:flowy_sdk/protobuf/flowy-net/network_state.pb.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
class NetworkMonitor { class NetworkMonitor {
@ -45,7 +45,7 @@ class NetworkMonitor {
}(); }();
Log.info("Network type: $networkType"); Log.info("Network type: $networkType");
final state = NetworkState.create()..ty = networkType; final state = NetworkState.create()..ty = networkType;
UserEventUpdateNetworkType(state).send().then((result) { NetworkEventUpdateNetworkType(state).send().then((result) {
result.fold( result.fold(
(l) {}, (l) {},
(e) => Log.error(e), (e) => Log.error(e),

View File

@ -1,10 +1,10 @@
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/dispatch/dispatch.dart'; import 'package:flowy_sdk/dispatch/dispatch.dart';
import 'package:flowy_sdk/protobuf/flowy-user-infra/protobuf.dart' show SignInRequest, SignUpRequest, UserProfile; import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show SignInRequest, SignUpRequest, UserProfile;
import 'package:flowy_sdk/protobuf/flowy-user/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
class AuthRepository { class AuthRepository {
Future<Either<UserProfile, UserError>> signIn({required String? email, required String? password}) { Future<Either<UserProfile, FlowyError>> signIn({required String? email, required String? password}) {
// //
final request = SignInRequest.create() final request = SignInRequest.create()
..email = email ?? '' ..email = email ?? ''
@ -13,7 +13,7 @@ class AuthRepository {
return UserEventSignIn(request).send(); return UserEventSignIn(request).send();
} }
Future<Either<UserProfile, UserError>> signUp( Future<Either<UserProfile, FlowyError>> signUp(
{required String? name, required String? password, required String? email}) { {required String? name, required String? password, required String? email}) {
final request = SignUpRequest.create() final request = SignUpRequest.create()
..email = email ?? '' ..email = email ?? ''
@ -35,7 +35,7 @@ class AuthRepository {
// }); // });
} }
Future<Either<Unit, UserError>> signOut() { Future<Either<Unit, FlowyError>> signOut() {
return UserEventSignOut().send(); return UserEventSignOut().send();
} }
} }

View File

@ -9,8 +9,8 @@ import 'package:flowy_infra_ui/widget/rounded_button.dart';
import 'package:flowy_infra_ui/widget/rounded_input_field.dart'; import 'package:flowy_infra_ui/widget/rounded_input_field.dart';
import 'package:flowy_infra_ui/widget/spacing.dart'; import 'package:flowy_infra_ui/widget/spacing.dart';
import 'package:flowy_infra_ui/style_widget/snap_bar.dart'; import 'package:flowy_infra_ui/style_widget/snap_bar.dart';
import 'package:flowy_sdk/protobuf/flowy-user/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-user-infra/protobuf.dart' show UserProfile; import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
@ -39,7 +39,7 @@ class SignInScreen extends StatelessWidget {
); );
} }
void _handleSuccessOrFail(Either<UserProfile, UserError> result, BuildContext context) { void _handleSuccessOrFail(Either<UserProfile, FlowyError> result, BuildContext context) {
result.fold( result.fold(
(user) => router.pushWelcomeScreen(context, user), (user) => router.pushWelcomeScreen(context, user),
(error) => showSnapBar(context, error.msg), (error) => showSnapBar(context, error.msg),

View File

@ -7,8 +7,8 @@ import 'package:flowy_infra/theme.dart';
import 'package:flowy_infra_ui/widget/rounded_button.dart'; import 'package:flowy_infra_ui/widget/rounded_button.dart';
import 'package:flowy_infra_ui/widget/rounded_input_field.dart'; import 'package:flowy_infra_ui/widget/rounded_input_field.dart';
import 'package:flowy_infra_ui/widget/spacing.dart'; import 'package:flowy_infra_ui/widget/spacing.dart';
import 'package:flowy_sdk/protobuf/flowy-user/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-user-infra/protobuf.dart' show UserProfile; import 'package:flowy_sdk/protobuf/flowy-user-data-model/protobuf.dart' show UserProfile;
import 'package:flowy_infra_ui/style_widget/snap_bar.dart'; import 'package:flowy_infra_ui/style_widget/snap_bar.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
@ -36,7 +36,7 @@ class SignUpScreen extends StatelessWidget {
); );
} }
void _handleSuccessOrFail(BuildContext context, Either<UserProfile, UserError> result) { void _handleSuccessOrFail(BuildContext context, Either<UserProfile, FlowyError> result) {
result.fold( result.fold(
(user) => router.pushWelcomeScreen(context, user), (user) => router.pushWelcomeScreen(context, user),
(error) => showSnapBar(context, error.msg), (error) => showSnapBar(context, error.msg),

View File

@ -9,9 +9,8 @@ import 'package:flowy_infra_ui/widget/rounded_button.dart';
import 'package:flowy_infra_ui/widget/spacing.dart'; import 'package:flowy_infra_ui/widget/spacing.dart';
import 'package:flowy_log/flowy_log.dart'; import 'package:flowy_log/flowy_log.dart';
import 'package:flowy_sdk/dispatch/dispatch.dart'; import 'package:flowy_sdk/dispatch/dispatch.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/protobuf.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/protobuf.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-user-infra/protobuf.dart' show UserProfile;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
@ -114,7 +113,7 @@ class _SkipLogInScreenState extends State<SkipLogInScreen> {
void _openCurrentWorkspace( void _openCurrentWorkspace(
BuildContext context, BuildContext context,
UserProfile user, UserProfile user,
dartz.Either<CurrentWorkspaceSetting, WorkspaceError> workspacesOrError, dartz.Either<CurrentWorkspaceSetting, FlowyError> workspacesOrError,
) { ) {
workspacesOrError.fold( workspacesOrError.fold(
(workspaceSetting) { (workspaceSetting) {

View File

@ -3,7 +3,7 @@ import 'package:app_flowy/user/application/splash_bloc.dart';
import 'package:app_flowy/user/domain/auth_state.dart'; import 'package:app_flowy/user/domain/auth_state.dart';
import 'package:app_flowy/user/domain/i_splash.dart'; import 'package:app_flowy/user/domain/i_splash.dart';
import 'package:flowy_sdk/dispatch/dispatch.dart'; import 'package:flowy_sdk/dispatch/dispatch.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/errors.pb.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';

View File

@ -5,7 +5,7 @@ import 'package:flowy_infra/theme.dart';
import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart'; import 'package:flowy_infra_ui/style_widget/scrolling/styled_list.dart';
import 'package:flowy_infra_ui/style_widget/button.dart'; import 'package:flowy_infra_ui/style_widget/button.dart';
import 'package:flowy_infra_ui/widget/error_page.dart'; import 'package:flowy_infra_ui/widget/error_page.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/workspace_create.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_create.pb.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart'; import 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart';

View File

@ -1,8 +1,8 @@
import 'package:app_flowy/workspace/domain/i_app.dart'; import 'package:app_flowy/workspace/domain/i_app.dart';
import 'package:flowy_log/flowy_log.dart'; import 'package:flowy_log/flowy_log.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/app_create.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/view_create.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
@ -61,7 +61,7 @@ class AppBloc extends Bloc<AppEvent, AppState> {
return super.close(); return super.close();
} }
void _handleViewsChanged(Either<List<View>, WorkspaceError> result) { void _handleViewsChanged(Either<List<View>, FlowyError> result) {
result.fold( result.fold(
(views) => add(AppEvent.didReceiveViews(views)), (views) => add(AppEvent.didReceiveViews(views)),
(error) { (error) {
@ -112,7 +112,7 @@ class AppState with _$AppState {
required bool isLoading, required bool isLoading,
required List<View>? views, required List<View>? views,
View? latestCreatedView, View? latestCreatedView,
required Either<Unit, WorkspaceError> successOrFailure, required Either<Unit, FlowyError> successOrFailure,
}) = _AppState; }) = _AppState;
factory AppState.initial(App app) => AppState( factory AppState.initial(App app) => AppState(

View File

@ -1051,7 +1051,7 @@ class _$AppStateTearOff {
required bool isLoading, required bool isLoading,
required List<View>? views, required List<View>? views,
View? latestCreatedView, View? latestCreatedView,
required Either<Unit, WorkspaceError> successOrFailure}) { required Either<Unit, FlowyError> successOrFailure}) {
return _AppState( return _AppState(
app: app, app: app,
isLoading: isLoading, isLoading: isLoading,
@ -1071,7 +1071,7 @@ mixin _$AppState {
bool get isLoading => throw _privateConstructorUsedError; bool get isLoading => throw _privateConstructorUsedError;
List<View>? get views => throw _privateConstructorUsedError; List<View>? get views => throw _privateConstructorUsedError;
View? get latestCreatedView => throw _privateConstructorUsedError; View? get latestCreatedView => throw _privateConstructorUsedError;
Either<Unit, WorkspaceError> get successOrFailure => Either<Unit, FlowyError> get successOrFailure =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@JsonKey(ignore: true) @JsonKey(ignore: true)
@ -1088,7 +1088,7 @@ abstract class $AppStateCopyWith<$Res> {
bool isLoading, bool isLoading,
List<View>? views, List<View>? views,
View? latestCreatedView, View? latestCreatedView,
Either<Unit, WorkspaceError> successOrFailure}); Either<Unit, FlowyError> successOrFailure});
} }
/// @nodoc /// @nodoc
@ -1127,7 +1127,7 @@ class _$AppStateCopyWithImpl<$Res> implements $AppStateCopyWith<$Res> {
successOrFailure: successOrFailure == freezed successOrFailure: successOrFailure == freezed
? _value.successOrFailure ? _value.successOrFailure
: successOrFailure // ignore: cast_nullable_to_non_nullable : successOrFailure // ignore: cast_nullable_to_non_nullable
as Either<Unit, WorkspaceError>, as Either<Unit, FlowyError>,
)); ));
} }
} }
@ -1142,7 +1142,7 @@ abstract class _$AppStateCopyWith<$Res> implements $AppStateCopyWith<$Res> {
bool isLoading, bool isLoading,
List<View>? views, List<View>? views,
View? latestCreatedView, View? latestCreatedView,
Either<Unit, WorkspaceError> successOrFailure}); Either<Unit, FlowyError> successOrFailure});
} }
/// @nodoc /// @nodoc
@ -1182,7 +1182,7 @@ class __$AppStateCopyWithImpl<$Res> extends _$AppStateCopyWithImpl<$Res>
successOrFailure: successOrFailure == freezed successOrFailure: successOrFailure == freezed
? _value.successOrFailure ? _value.successOrFailure
: successOrFailure // ignore: cast_nullable_to_non_nullable : successOrFailure // ignore: cast_nullable_to_non_nullable
as Either<Unit, WorkspaceError>, as Either<Unit, FlowyError>,
)); ));
} }
} }
@ -1206,7 +1206,7 @@ class _$_AppState implements _AppState {
@override @override
final View? latestCreatedView; final View? latestCreatedView;
@override @override
final Either<Unit, WorkspaceError> successOrFailure; final Either<Unit, FlowyError> successOrFailure;
@override @override
String toString() { String toString() {
@ -1253,7 +1253,7 @@ abstract class _AppState implements AppState {
required bool isLoading, required bool isLoading,
required List<View>? views, required List<View>? views,
View? latestCreatedView, View? latestCreatedView,
required Either<Unit, WorkspaceError> successOrFailure}) = _$_AppState; required Either<Unit, FlowyError> successOrFailure}) = _$_AppState;
@override @override
App get app => throw _privateConstructorUsedError; App get app => throw _privateConstructorUsedError;
@ -1264,7 +1264,7 @@ abstract class _AppState implements AppState {
@override @override
View? get latestCreatedView => throw _privateConstructorUsedError; View? get latestCreatedView => throw _privateConstructorUsedError;
@override @override
Either<Unit, WorkspaceError> get successOrFailure => Either<Unit, FlowyError> get successOrFailure =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@override @override
@JsonKey(ignore: true) @JsonKey(ignore: true)

View File

@ -2,9 +2,9 @@ import 'dart:convert';
import 'package:app_flowy/workspace/domain/i_trash.dart'; import 'package:app_flowy/workspace/domain/i_trash.dart';
import 'package:app_flowy/workspace/domain/i_view.dart'; import 'package:app_flowy/workspace/domain/i_view.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/trash_create.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/view_create.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flutter_quill/flutter_quill.dart'; import 'package:flutter_quill/flutter_quill.dart';
import 'package:flowy_log/flowy_log.dart'; import 'package:flowy_log/flowy_log.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
@ -155,5 +155,5 @@ class DocState with _$DocState {
@freezed @freezed
class DocLoadState with _$DocLoadState { class DocLoadState with _$DocLoadState {
const factory DocLoadState.loading() = _Loading; const factory DocLoadState.loading() = _Loading;
const factory DocLoadState.finish(Either<Unit, WorkspaceError> successOrFail) = _Finish; const factory DocLoadState.finish(Either<Unit, FlowyError> successOrFail) = _Finish;
} }

View File

@ -909,7 +909,7 @@ class _$DocLoadStateTearOff {
return const _Loading(); return const _Loading();
} }
_Finish finish(Either<Unit, WorkspaceError> successOrFail) { _Finish finish(Either<Unit, FlowyError> successOrFail) {
return _Finish( return _Finish(
successOrFail, successOrFail,
); );
@ -924,20 +924,20 @@ mixin _$DocLoadState {
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function() loading, required TResult Function() loading,
required TResult Function(Either<Unit, WorkspaceError> successOrFail) required TResult Function(Either<Unit, FlowyError> successOrFail)
finish, finish,
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult Function()? loading, TResult Function()? loading,
TResult Function(Either<Unit, WorkspaceError> successOrFail)? finish, TResult Function(Either<Unit, FlowyError> successOrFail)? finish,
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function()? loading, TResult Function()? loading,
TResult Function(Either<Unit, WorkspaceError> successOrFail)? finish, TResult Function(Either<Unit, FlowyError> successOrFail)? finish,
required TResult orElse(), required TResult orElse(),
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@ -1016,7 +1016,7 @@ class _$_Loading implements _Loading {
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function() loading, required TResult Function() loading,
required TResult Function(Either<Unit, WorkspaceError> successOrFail) required TResult Function(Either<Unit, FlowyError> successOrFail)
finish, finish,
}) { }) {
return loading(); return loading();
@ -1026,7 +1026,7 @@ class _$_Loading implements _Loading {
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult Function()? loading, TResult Function()? loading,
TResult Function(Either<Unit, WorkspaceError> successOrFail)? finish, TResult Function(Either<Unit, FlowyError> successOrFail)? finish,
}) { }) {
return loading?.call(); return loading?.call();
} }
@ -1035,7 +1035,7 @@ class _$_Loading implements _Loading {
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function()? loading, TResult Function()? loading,
TResult Function(Either<Unit, WorkspaceError> successOrFail)? finish, TResult Function(Either<Unit, FlowyError> successOrFail)? finish,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (loading != null) { if (loading != null) {
@ -1084,7 +1084,7 @@ abstract class _Loading implements DocLoadState {
abstract class _$FinishCopyWith<$Res> { abstract class _$FinishCopyWith<$Res> {
factory _$FinishCopyWith(_Finish value, $Res Function(_Finish) then) = factory _$FinishCopyWith(_Finish value, $Res Function(_Finish) then) =
__$FinishCopyWithImpl<$Res>; __$FinishCopyWithImpl<$Res>;
$Res call({Either<Unit, WorkspaceError> successOrFail}); $Res call({Either<Unit, FlowyError> successOrFail});
} }
/// @nodoc /// @nodoc
@ -1104,7 +1104,7 @@ class __$FinishCopyWithImpl<$Res> extends _$DocLoadStateCopyWithImpl<$Res>
successOrFail == freezed successOrFail == freezed
? _value.successOrFail ? _value.successOrFail
: successOrFail // ignore: cast_nullable_to_non_nullable : successOrFail // ignore: cast_nullable_to_non_nullable
as Either<Unit, WorkspaceError>, as Either<Unit, FlowyError>,
)); ));
} }
} }
@ -1115,7 +1115,7 @@ class _$_Finish implements _Finish {
const _$_Finish(this.successOrFail); const _$_Finish(this.successOrFail);
@override @override
final Either<Unit, WorkspaceError> successOrFail; final Either<Unit, FlowyError> successOrFail;
@override @override
String toString() { String toString() {
@ -1144,7 +1144,7 @@ class _$_Finish implements _Finish {
@optionalTypeArgs @optionalTypeArgs
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function() loading, required TResult Function() loading,
required TResult Function(Either<Unit, WorkspaceError> successOrFail) required TResult Function(Either<Unit, FlowyError> successOrFail)
finish, finish,
}) { }) {
return finish(successOrFail); return finish(successOrFail);
@ -1154,7 +1154,7 @@ class _$_Finish implements _Finish {
@optionalTypeArgs @optionalTypeArgs
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult Function()? loading, TResult Function()? loading,
TResult Function(Either<Unit, WorkspaceError> successOrFail)? finish, TResult Function(Either<Unit, FlowyError> successOrFail)? finish,
}) { }) {
return finish?.call(successOrFail); return finish?.call(successOrFail);
} }
@ -1163,7 +1163,7 @@ class _$_Finish implements _Finish {
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function()? loading, TResult Function()? loading,
TResult Function(Either<Unit, WorkspaceError> successOrFail)? finish, TResult Function(Either<Unit, FlowyError> successOrFail)? finish,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (finish != null) { if (finish != null) {
@ -1205,9 +1205,9 @@ class _$_Finish implements _Finish {
} }
abstract class _Finish implements DocLoadState { abstract class _Finish implements DocLoadState {
const factory _Finish(Either<Unit, WorkspaceError> successOrFail) = _$_Finish; const factory _Finish(Either<Unit, FlowyError> successOrFail) = _$_Finish;
Either<Unit, WorkspaceError> get successOrFail => Either<Unit, FlowyError> get successOrFail =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@JsonKey(ignore: true) @JsonKey(ignore: true)
_$FinishCopyWith<_Finish> get copyWith => throw _privateConstructorUsedError; _$FinishCopyWith<_Finish> get copyWith => throw _privateConstructorUsedError;

View File

@ -1,8 +1,8 @@
import 'package:app_flowy/workspace/domain/i_share.dart'; import 'package:app_flowy/workspace/domain/i_share.dart';
import 'package:app_flowy/workspace/infrastructure/markdown/delta_markdown.dart'; import 'package:app_flowy/workspace/infrastructure/markdown/delta_markdown.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/export.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/export.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/view_create.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
@ -48,5 +48,5 @@ class DocShareEvent with _$DocShareEvent {
class DocShareState with _$DocShareState { class DocShareState with _$DocShareState {
const factory DocShareState.initial() = _Initial; const factory DocShareState.initial() = _Initial;
const factory DocShareState.loading() = _Loading; const factory DocShareState.loading() = _Loading;
const factory DocShareState.finish(Either<ExportData, WorkspaceError> successOrFail) = _Finish; const factory DocShareState.finish(Either<ExportData, FlowyError> successOrFail) = _Finish;
} }

View File

@ -434,7 +434,7 @@ class _$DocShareStateTearOff {
return const _Loading(); return const _Loading();
} }
_Finish finish(Either<ExportData, WorkspaceError> successOrFail) { _Finish finish(Either<ExportData, FlowyError> successOrFail) {
return _Finish( return _Finish(
successOrFail, successOrFail,
); );
@ -450,7 +450,7 @@ mixin _$DocShareState {
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function() initial, required TResult Function() initial,
required TResult Function() loading, required TResult Function() loading,
required TResult Function(Either<ExportData, WorkspaceError> successOrFail) required TResult Function(Either<ExportData, FlowyError> successOrFail)
finish, finish,
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@ -458,14 +458,14 @@ mixin _$DocShareState {
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult Function()? initial, TResult Function()? initial,
TResult Function()? loading, TResult Function()? loading,
TResult Function(Either<ExportData, WorkspaceError> successOrFail)? finish, TResult Function(Either<ExportData, FlowyError> successOrFail)? finish,
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial, TResult Function()? initial,
TResult Function()? loading, TResult Function()? loading,
TResult Function(Either<ExportData, WorkspaceError> successOrFail)? finish, TResult Function(Either<ExportData, FlowyError> successOrFail)? finish,
required TResult orElse(), required TResult orElse(),
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@ -549,7 +549,7 @@ class _$_Initial implements _Initial {
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function() initial, required TResult Function() initial,
required TResult Function() loading, required TResult Function() loading,
required TResult Function(Either<ExportData, WorkspaceError> successOrFail) required TResult Function(Either<ExportData, FlowyError> successOrFail)
finish, finish,
}) { }) {
return initial(); return initial();
@ -560,7 +560,7 @@ class _$_Initial implements _Initial {
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult Function()? initial, TResult Function()? initial,
TResult Function()? loading, TResult Function()? loading,
TResult Function(Either<ExportData, WorkspaceError> successOrFail)? finish, TResult Function(Either<ExportData, FlowyError> successOrFail)? finish,
}) { }) {
return initial?.call(); return initial?.call();
} }
@ -570,7 +570,7 @@ class _$_Initial implements _Initial {
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial, TResult Function()? initial,
TResult Function()? loading, TResult Function()? loading,
TResult Function(Either<ExportData, WorkspaceError> successOrFail)? finish, TResult Function(Either<ExportData, FlowyError> successOrFail)? finish,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (initial != null) { if (initial != null) {
@ -657,7 +657,7 @@ class _$_Loading implements _Loading {
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function() initial, required TResult Function() initial,
required TResult Function() loading, required TResult Function() loading,
required TResult Function(Either<ExportData, WorkspaceError> successOrFail) required TResult Function(Either<ExportData, FlowyError> successOrFail)
finish, finish,
}) { }) {
return loading(); return loading();
@ -668,7 +668,7 @@ class _$_Loading implements _Loading {
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult Function()? initial, TResult Function()? initial,
TResult Function()? loading, TResult Function()? loading,
TResult Function(Either<ExportData, WorkspaceError> successOrFail)? finish, TResult Function(Either<ExportData, FlowyError> successOrFail)? finish,
}) { }) {
return loading?.call(); return loading?.call();
} }
@ -678,7 +678,7 @@ class _$_Loading implements _Loading {
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial, TResult Function()? initial,
TResult Function()? loading, TResult Function()? loading,
TResult Function(Either<ExportData, WorkspaceError> successOrFail)? finish, TResult Function(Either<ExportData, FlowyError> successOrFail)? finish,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (loading != null) { if (loading != null) {
@ -730,7 +730,7 @@ abstract class _Loading implements DocShareState {
abstract class _$FinishCopyWith<$Res> { abstract class _$FinishCopyWith<$Res> {
factory _$FinishCopyWith(_Finish value, $Res Function(_Finish) then) = factory _$FinishCopyWith(_Finish value, $Res Function(_Finish) then) =
__$FinishCopyWithImpl<$Res>; __$FinishCopyWithImpl<$Res>;
$Res call({Either<ExportData, WorkspaceError> successOrFail}); $Res call({Either<ExportData, FlowyError> successOrFail});
} }
/// @nodoc /// @nodoc
@ -750,7 +750,7 @@ class __$FinishCopyWithImpl<$Res> extends _$DocShareStateCopyWithImpl<$Res>
successOrFail == freezed successOrFail == freezed
? _value.successOrFail ? _value.successOrFail
: successOrFail // ignore: cast_nullable_to_non_nullable : successOrFail // ignore: cast_nullable_to_non_nullable
as Either<ExportData, WorkspaceError>, as Either<ExportData, FlowyError>,
)); ));
} }
} }
@ -761,7 +761,7 @@ class _$_Finish implements _Finish {
const _$_Finish(this.successOrFail); const _$_Finish(this.successOrFail);
@override @override
final Either<ExportData, WorkspaceError> successOrFail; final Either<ExportData, FlowyError> successOrFail;
@override @override
String toString() { String toString() {
@ -791,7 +791,7 @@ class _$_Finish implements _Finish {
TResult when<TResult extends Object?>({ TResult when<TResult extends Object?>({
required TResult Function() initial, required TResult Function() initial,
required TResult Function() loading, required TResult Function() loading,
required TResult Function(Either<ExportData, WorkspaceError> successOrFail) required TResult Function(Either<ExportData, FlowyError> successOrFail)
finish, finish,
}) { }) {
return finish(successOrFail); return finish(successOrFail);
@ -802,7 +802,7 @@ class _$_Finish implements _Finish {
TResult? whenOrNull<TResult extends Object?>({ TResult? whenOrNull<TResult extends Object?>({
TResult Function()? initial, TResult Function()? initial,
TResult Function()? loading, TResult Function()? loading,
TResult Function(Either<ExportData, WorkspaceError> successOrFail)? finish, TResult Function(Either<ExportData, FlowyError> successOrFail)? finish,
}) { }) {
return finish?.call(successOrFail); return finish?.call(successOrFail);
} }
@ -812,7 +812,7 @@ class _$_Finish implements _Finish {
TResult maybeWhen<TResult extends Object?>({ TResult maybeWhen<TResult extends Object?>({
TResult Function()? initial, TResult Function()? initial,
TResult Function()? loading, TResult Function()? loading,
TResult Function(Either<ExportData, WorkspaceError> successOrFail)? finish, TResult Function(Either<ExportData, FlowyError> successOrFail)? finish,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (finish != null) { if (finish != null) {
@ -857,10 +857,10 @@ class _$_Finish implements _Finish {
} }
abstract class _Finish implements DocShareState { abstract class _Finish implements DocShareState {
const factory _Finish(Either<ExportData, WorkspaceError> successOrFail) = const factory _Finish(Either<ExportData, FlowyError> successOrFail) =
_$_Finish; _$_Finish;
Either<ExportData, WorkspaceError> get successOrFail => Either<ExportData, FlowyError> get successOrFail =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@JsonKey(ignore: true) @JsonKey(ignore: true)
_$FinishCopyWith<_Finish> get copyWith => throw _privateConstructorUsedError; _$FinishCopyWith<_Finish> get copyWith => throw _privateConstructorUsedError;

View File

@ -1,6 +1,5 @@
import 'package:app_flowy/workspace/domain/edit_context.dart'; import 'package:app_flowy/workspace/domain/edit_context.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flutter/material.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
// ignore: import_of_legacy_library_into_null_safe // ignore: import_of_legacy_library_into_null_safe
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
@ -27,8 +26,7 @@ class EditPannelBloc extends Bloc<EditPannelEvent, EditPannelState> {
@freezed @freezed
class EditPannelEvent with _$EditPannelEvent { class EditPannelEvent with _$EditPannelEvent {
const factory EditPannelEvent.startEdit(EditPannelContext context) = const factory EditPannelEvent.startEdit(EditPannelContext context) = _StartEdit;
_StartEdit;
const factory EditPannelEvent.endEdit(EditPannelContext context) = _EndEdit; const factory EditPannelEvent.endEdit(EditPannelContext context) = _EndEdit;
} }

View File

@ -1,5 +1,6 @@
import 'package:app_flowy/workspace/domain/i_user.dart'; import 'package:app_flowy/workspace/domain/i_user.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
@ -31,7 +32,7 @@ class HomeListenBloc extends Bloc<HomeListenEvent, HomeListenState> {
super.close(); super.close();
} }
void _authDidChanged(Either<Unit, UserError> errorOrNothing) { void _authDidChanged(Either<Unit, FlowyError> errorOrNothing) {
errorOrNothing.fold((_) {}, (error) { errorOrNothing.fold((_) {}, (error) {
if (error.code == ErrorCode.UserUnauthorized.value) { if (error.code == ErrorCode.UserUnauthorized.value) {
add(HomeListenEvent.unauthorized(error.msg)); add(HomeListenEvent.unauthorized(error.msg));

View File

@ -4,9 +4,8 @@ import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart';
import 'package:app_flowy/workspace/presentation/stack_page/blank/blank_page.dart'; import 'package:app_flowy/workspace/presentation/stack_page/blank/blank_page.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flowy_log/flowy_log.dart'; import 'package:flowy_log/flowy_log.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/app_create.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/app_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flutter/material.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
@ -78,7 +77,7 @@ class MenuBloc extends Bloc<MenuEvent, MenuState> {
); );
} }
void _handleAppsOrFail(Either<List<App>, WorkspaceError> appsOrFail) { void _handleAppsOrFail(Either<List<App>, FlowyError> appsOrFail) {
appsOrFail.fold( appsOrFail.fold(
(apps) => add(MenuEvent.didReceiveApps(left(apps))), (apps) => add(MenuEvent.didReceiveApps(left(apps))),
(error) => add(MenuEvent.didReceiveApps(right(error))), (error) => add(MenuEvent.didReceiveApps(right(error))),
@ -92,7 +91,7 @@ class MenuEvent with _$MenuEvent {
const factory MenuEvent.collapse() = Collapse; const factory MenuEvent.collapse() = Collapse;
const factory MenuEvent.openPage(HomeStackContext context) = OpenPage; const factory MenuEvent.openPage(HomeStackContext context) = OpenPage;
const factory MenuEvent.createApp(String name, {String? desc}) = CreateApp; const factory MenuEvent.createApp(String name, {String? desc}) = CreateApp;
const factory MenuEvent.didReceiveApps(Either<List<App>, WorkspaceError> appsOrFail) = ReceiveApps; const factory MenuEvent.didReceiveApps(Either<List<App>, FlowyError> appsOrFail) = ReceiveApps;
} }
@freezed @freezed
@ -100,7 +99,7 @@ class MenuState with _$MenuState {
const factory MenuState({ const factory MenuState({
required bool isCollapse, required bool isCollapse,
required Option<List<App>> apps, required Option<List<App>> apps,
required Either<Unit, WorkspaceError> successOrFailure, required Either<Unit, FlowyError> successOrFailure,
required HomeStackContext stackContext, required HomeStackContext stackContext,
}) = _MenuState; }) = _MenuState;

View File

@ -38,7 +38,7 @@ class _$MenuEventTearOff {
); );
} }
ReceiveApps didReceiveApps(Either<List<App>, WorkspaceError> appsOrFail) { ReceiveApps didReceiveApps(Either<List<App>, FlowyError> appsOrFail) {
return ReceiveApps( return ReceiveApps(
appsOrFail, appsOrFail,
); );
@ -57,7 +57,7 @@ mixin _$MenuEvent {
required TResult Function(HomeStackContext<dynamic, dynamic> context) required TResult Function(HomeStackContext<dynamic, dynamic> context)
openPage, openPage,
required TResult Function(String name, String? desc) createApp, required TResult Function(String name, String? desc) createApp,
required TResult Function(Either<List<App>, WorkspaceError> appsOrFail) required TResult Function(Either<List<App>, FlowyError> appsOrFail)
didReceiveApps, didReceiveApps,
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@ -67,7 +67,7 @@ mixin _$MenuEvent {
TResult Function()? collapse, TResult Function()? collapse,
TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage, TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage,
TResult Function(String name, String? desc)? createApp, TResult Function(String name, String? desc)? createApp,
TResult Function(Either<List<App>, WorkspaceError> appsOrFail)? TResult Function(Either<List<App>, FlowyError> appsOrFail)?
didReceiveApps, didReceiveApps,
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@ -77,7 +77,7 @@ mixin _$MenuEvent {
TResult Function()? collapse, TResult Function()? collapse,
TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage, TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage,
TResult Function(String name, String? desc)? createApp, TResult Function(String name, String? desc)? createApp,
TResult Function(Either<List<App>, WorkspaceError> appsOrFail)? TResult Function(Either<List<App>, FlowyError> appsOrFail)?
didReceiveApps, didReceiveApps,
required TResult orElse(), required TResult orElse(),
}) => }) =>
@ -169,7 +169,7 @@ class _$_Initial implements _Initial {
required TResult Function(HomeStackContext<dynamic, dynamic> context) required TResult Function(HomeStackContext<dynamic, dynamic> context)
openPage, openPage,
required TResult Function(String name, String? desc) createApp, required TResult Function(String name, String? desc) createApp,
required TResult Function(Either<List<App>, WorkspaceError> appsOrFail) required TResult Function(Either<List<App>, FlowyError> appsOrFail)
didReceiveApps, didReceiveApps,
}) { }) {
return initial(); return initial();
@ -182,7 +182,7 @@ class _$_Initial implements _Initial {
TResult Function()? collapse, TResult Function()? collapse,
TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage, TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage,
TResult Function(String name, String? desc)? createApp, TResult Function(String name, String? desc)? createApp,
TResult Function(Either<List<App>, WorkspaceError> appsOrFail)? TResult Function(Either<List<App>, FlowyError> appsOrFail)?
didReceiveApps, didReceiveApps,
}) { }) {
return initial?.call(); return initial?.call();
@ -195,7 +195,7 @@ class _$_Initial implements _Initial {
TResult Function()? collapse, TResult Function()? collapse,
TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage, TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage,
TResult Function(String name, String? desc)? createApp, TResult Function(String name, String? desc)? createApp,
TResult Function(Either<List<App>, WorkspaceError> appsOrFail)? TResult Function(Either<List<App>, FlowyError> appsOrFail)?
didReceiveApps, didReceiveApps,
required TResult orElse(), required TResult orElse(),
}) { }) {
@ -292,7 +292,7 @@ class _$Collapse implements Collapse {
required TResult Function(HomeStackContext<dynamic, dynamic> context) required TResult Function(HomeStackContext<dynamic, dynamic> context)
openPage, openPage,
required TResult Function(String name, String? desc) createApp, required TResult Function(String name, String? desc) createApp,
required TResult Function(Either<List<App>, WorkspaceError> appsOrFail) required TResult Function(Either<List<App>, FlowyError> appsOrFail)
didReceiveApps, didReceiveApps,
}) { }) {
return collapse(); return collapse();
@ -305,7 +305,7 @@ class _$Collapse implements Collapse {
TResult Function()? collapse, TResult Function()? collapse,
TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage, TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage,
TResult Function(String name, String? desc)? createApp, TResult Function(String name, String? desc)? createApp,
TResult Function(Either<List<App>, WorkspaceError> appsOrFail)? TResult Function(Either<List<App>, FlowyError> appsOrFail)?
didReceiveApps, didReceiveApps,
}) { }) {
return collapse?.call(); return collapse?.call();
@ -318,7 +318,7 @@ class _$Collapse implements Collapse {
TResult Function()? collapse, TResult Function()? collapse,
TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage, TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage,
TResult Function(String name, String? desc)? createApp, TResult Function(String name, String? desc)? createApp,
TResult Function(Either<List<App>, WorkspaceError> appsOrFail)? TResult Function(Either<List<App>, FlowyError> appsOrFail)?
didReceiveApps, didReceiveApps,
required TResult orElse(), required TResult orElse(),
}) { }) {
@ -440,7 +440,7 @@ class _$OpenPage implements OpenPage {
required TResult Function(HomeStackContext<dynamic, dynamic> context) required TResult Function(HomeStackContext<dynamic, dynamic> context)
openPage, openPage,
required TResult Function(String name, String? desc) createApp, required TResult Function(String name, String? desc) createApp,
required TResult Function(Either<List<App>, WorkspaceError> appsOrFail) required TResult Function(Either<List<App>, FlowyError> appsOrFail)
didReceiveApps, didReceiveApps,
}) { }) {
return openPage(context); return openPage(context);
@ -453,7 +453,7 @@ class _$OpenPage implements OpenPage {
TResult Function()? collapse, TResult Function()? collapse,
TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage, TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage,
TResult Function(String name, String? desc)? createApp, TResult Function(String name, String? desc)? createApp,
TResult Function(Either<List<App>, WorkspaceError> appsOrFail)? TResult Function(Either<List<App>, FlowyError> appsOrFail)?
didReceiveApps, didReceiveApps,
}) { }) {
return openPage?.call(context); return openPage?.call(context);
@ -466,7 +466,7 @@ class _$OpenPage implements OpenPage {
TResult Function()? collapse, TResult Function()? collapse,
TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage, TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage,
TResult Function(String name, String? desc)? createApp, TResult Function(String name, String? desc)? createApp,
TResult Function(Either<List<App>, WorkspaceError> appsOrFail)? TResult Function(Either<List<App>, FlowyError> appsOrFail)?
didReceiveApps, didReceiveApps,
required TResult orElse(), required TResult orElse(),
}) { }) {
@ -606,7 +606,7 @@ class _$CreateApp implements CreateApp {
required TResult Function(HomeStackContext<dynamic, dynamic> context) required TResult Function(HomeStackContext<dynamic, dynamic> context)
openPage, openPage,
required TResult Function(String name, String? desc) createApp, required TResult Function(String name, String? desc) createApp,
required TResult Function(Either<List<App>, WorkspaceError> appsOrFail) required TResult Function(Either<List<App>, FlowyError> appsOrFail)
didReceiveApps, didReceiveApps,
}) { }) {
return createApp(name, desc); return createApp(name, desc);
@ -619,7 +619,7 @@ class _$CreateApp implements CreateApp {
TResult Function()? collapse, TResult Function()? collapse,
TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage, TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage,
TResult Function(String name, String? desc)? createApp, TResult Function(String name, String? desc)? createApp,
TResult Function(Either<List<App>, WorkspaceError> appsOrFail)? TResult Function(Either<List<App>, FlowyError> appsOrFail)?
didReceiveApps, didReceiveApps,
}) { }) {
return createApp?.call(name, desc); return createApp?.call(name, desc);
@ -632,7 +632,7 @@ class _$CreateApp implements CreateApp {
TResult Function()? collapse, TResult Function()? collapse,
TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage, TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage,
TResult Function(String name, String? desc)? createApp, TResult Function(String name, String? desc)? createApp,
TResult Function(Either<List<App>, WorkspaceError> appsOrFail)? TResult Function(Either<List<App>, FlowyError> appsOrFail)?
didReceiveApps, didReceiveApps,
required TResult orElse(), required TResult orElse(),
}) { }) {
@ -698,7 +698,7 @@ abstract class $ReceiveAppsCopyWith<$Res> {
factory $ReceiveAppsCopyWith( factory $ReceiveAppsCopyWith(
ReceiveApps value, $Res Function(ReceiveApps) then) = ReceiveApps value, $Res Function(ReceiveApps) then) =
_$ReceiveAppsCopyWithImpl<$Res>; _$ReceiveAppsCopyWithImpl<$Res>;
$Res call({Either<List<App>, WorkspaceError> appsOrFail}); $Res call({Either<List<App>, FlowyError> appsOrFail});
} }
/// @nodoc /// @nodoc
@ -719,7 +719,7 @@ class _$ReceiveAppsCopyWithImpl<$Res> extends _$MenuEventCopyWithImpl<$Res>
appsOrFail == freezed appsOrFail == freezed
? _value.appsOrFail ? _value.appsOrFail
: appsOrFail // ignore: cast_nullable_to_non_nullable : appsOrFail // ignore: cast_nullable_to_non_nullable
as Either<List<App>, WorkspaceError>, as Either<List<App>, FlowyError>,
)); ));
} }
} }
@ -730,7 +730,7 @@ class _$ReceiveApps implements ReceiveApps {
const _$ReceiveApps(this.appsOrFail); const _$ReceiveApps(this.appsOrFail);
@override @override
final Either<List<App>, WorkspaceError> appsOrFail; final Either<List<App>, FlowyError> appsOrFail;
@override @override
String toString() { String toString() {
@ -763,7 +763,7 @@ class _$ReceiveApps implements ReceiveApps {
required TResult Function(HomeStackContext<dynamic, dynamic> context) required TResult Function(HomeStackContext<dynamic, dynamic> context)
openPage, openPage,
required TResult Function(String name, String? desc) createApp, required TResult Function(String name, String? desc) createApp,
required TResult Function(Either<List<App>, WorkspaceError> appsOrFail) required TResult Function(Either<List<App>, FlowyError> appsOrFail)
didReceiveApps, didReceiveApps,
}) { }) {
return didReceiveApps(appsOrFail); return didReceiveApps(appsOrFail);
@ -776,7 +776,7 @@ class _$ReceiveApps implements ReceiveApps {
TResult Function()? collapse, TResult Function()? collapse,
TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage, TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage,
TResult Function(String name, String? desc)? createApp, TResult Function(String name, String? desc)? createApp,
TResult Function(Either<List<App>, WorkspaceError> appsOrFail)? TResult Function(Either<List<App>, FlowyError> appsOrFail)?
didReceiveApps, didReceiveApps,
}) { }) {
return didReceiveApps?.call(appsOrFail); return didReceiveApps?.call(appsOrFail);
@ -789,7 +789,7 @@ class _$ReceiveApps implements ReceiveApps {
TResult Function()? collapse, TResult Function()? collapse,
TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage, TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage,
TResult Function(String name, String? desc)? createApp, TResult Function(String name, String? desc)? createApp,
TResult Function(Either<List<App>, WorkspaceError> appsOrFail)? TResult Function(Either<List<App>, FlowyError> appsOrFail)?
didReceiveApps, didReceiveApps,
required TResult orElse(), required TResult orElse(),
}) { }) {
@ -841,10 +841,10 @@ class _$ReceiveApps implements ReceiveApps {
} }
abstract class ReceiveApps implements MenuEvent { abstract class ReceiveApps implements MenuEvent {
const factory ReceiveApps(Either<List<App>, WorkspaceError> appsOrFail) = const factory ReceiveApps(Either<List<App>, FlowyError> appsOrFail) =
_$ReceiveApps; _$ReceiveApps;
Either<List<App>, WorkspaceError> get appsOrFail => Either<List<App>, FlowyError> get appsOrFail =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@JsonKey(ignore: true) @JsonKey(ignore: true)
$ReceiveAppsCopyWith<ReceiveApps> get copyWith => $ReceiveAppsCopyWith<ReceiveApps> get copyWith =>
@ -858,7 +858,7 @@ class _$MenuStateTearOff {
_MenuState call( _MenuState call(
{required bool isCollapse, {required bool isCollapse,
required Option<List<App>> apps, required Option<List<App>> apps,
required Either<Unit, WorkspaceError> successOrFailure, required Either<Unit, FlowyError> successOrFailure,
required HomeStackContext<dynamic, dynamic> stackContext}) { required HomeStackContext<dynamic, dynamic> stackContext}) {
return _MenuState( return _MenuState(
isCollapse: isCollapse, isCollapse: isCollapse,
@ -876,7 +876,7 @@ const $MenuState = _$MenuStateTearOff();
mixin _$MenuState { mixin _$MenuState {
bool get isCollapse => throw _privateConstructorUsedError; bool get isCollapse => throw _privateConstructorUsedError;
Option<List<App>> get apps => throw _privateConstructorUsedError; Option<List<App>> get apps => throw _privateConstructorUsedError;
Either<Unit, WorkspaceError> get successOrFailure => Either<Unit, FlowyError> get successOrFailure =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
HomeStackContext<dynamic, dynamic> get stackContext => HomeStackContext<dynamic, dynamic> get stackContext =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@ -893,7 +893,7 @@ abstract class $MenuStateCopyWith<$Res> {
$Res call( $Res call(
{bool isCollapse, {bool isCollapse,
Option<List<App>> apps, Option<List<App>> apps,
Either<Unit, WorkspaceError> successOrFailure, Either<Unit, FlowyError> successOrFailure,
HomeStackContext<dynamic, dynamic> stackContext}); HomeStackContext<dynamic, dynamic> stackContext});
} }
@ -924,7 +924,7 @@ class _$MenuStateCopyWithImpl<$Res> implements $MenuStateCopyWith<$Res> {
successOrFailure: successOrFailure == freezed successOrFailure: successOrFailure == freezed
? _value.successOrFailure ? _value.successOrFailure
: successOrFailure // ignore: cast_nullable_to_non_nullable : successOrFailure // ignore: cast_nullable_to_non_nullable
as Either<Unit, WorkspaceError>, as Either<Unit, FlowyError>,
stackContext: stackContext == freezed stackContext: stackContext == freezed
? _value.stackContext ? _value.stackContext
: stackContext // ignore: cast_nullable_to_non_nullable : stackContext // ignore: cast_nullable_to_non_nullable
@ -942,7 +942,7 @@ abstract class _$MenuStateCopyWith<$Res> implements $MenuStateCopyWith<$Res> {
$Res call( $Res call(
{bool isCollapse, {bool isCollapse,
Option<List<App>> apps, Option<List<App>> apps,
Either<Unit, WorkspaceError> successOrFailure, Either<Unit, FlowyError> successOrFailure,
HomeStackContext<dynamic, dynamic> stackContext}); HomeStackContext<dynamic, dynamic> stackContext});
} }
@ -974,7 +974,7 @@ class __$MenuStateCopyWithImpl<$Res> extends _$MenuStateCopyWithImpl<$Res>
successOrFailure: successOrFailure == freezed successOrFailure: successOrFailure == freezed
? _value.successOrFailure ? _value.successOrFailure
: successOrFailure // ignore: cast_nullable_to_non_nullable : successOrFailure // ignore: cast_nullable_to_non_nullable
as Either<Unit, WorkspaceError>, as Either<Unit, FlowyError>,
stackContext: stackContext == freezed stackContext: stackContext == freezed
? _value.stackContext ? _value.stackContext
: stackContext // ignore: cast_nullable_to_non_nullable : stackContext // ignore: cast_nullable_to_non_nullable
@ -997,7 +997,7 @@ class _$_MenuState implements _MenuState {
@override @override
final Option<List<App>> apps; final Option<List<App>> apps;
@override @override
final Either<Unit, WorkspaceError> successOrFailure; final Either<Unit, FlowyError> successOrFailure;
@override @override
final HomeStackContext<dynamic, dynamic> stackContext; final HomeStackContext<dynamic, dynamic> stackContext;
@ -1041,7 +1041,7 @@ abstract class _MenuState implements MenuState {
const factory _MenuState( const factory _MenuState(
{required bool isCollapse, {required bool isCollapse,
required Option<List<App>> apps, required Option<List<App>> apps,
required Either<Unit, WorkspaceError> successOrFailure, required Either<Unit, FlowyError> successOrFailure,
required HomeStackContext<dynamic, dynamic> stackContext}) = _$_MenuState; required HomeStackContext<dynamic, dynamic> stackContext}) = _$_MenuState;
@override @override
@ -1049,7 +1049,7 @@ abstract class _MenuState implements MenuState {
@override @override
Option<List<App>> get apps => throw _privateConstructorUsedError; Option<List<App>> get apps => throw _privateConstructorUsedError;
@override @override
Either<Unit, WorkspaceError> get successOrFailure => Either<Unit, FlowyError> get successOrFailure =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@override @override
HomeStackContext<dynamic, dynamic> get stackContext => HomeStackContext<dynamic, dynamic> get stackContext =>

View File

@ -1,8 +1,7 @@
import 'package:app_flowy/workspace/domain/i_user.dart'; import 'package:app_flowy/workspace/domain/i_user.dart';
import 'package:flowy_log/flowy_log.dart'; import 'package:flowy_log/flowy_log.dart';
import 'package:flowy_sdk/protobuf/flowy-user-infra/protobuf.dart' show UserProfile; import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/workspace_create.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
@ -40,8 +39,8 @@ class MenuUserBloc extends Bloc<MenuUserEvent, MenuUserState> {
result.fold((l) => null, (error) => Log.error(error)); result.fold((l) => null, (error) => Log.error(error));
} }
void _profileUpdated(Either<UserProfile, UserError> userOrFailed) {} void _profileUpdated(Either<UserProfile, FlowyError> userOrFailed) {}
void _workspacesUpdated(Either<List<Workspace>, WorkspaceError> workspacesOrFailed) { void _workspacesUpdated(Either<List<Workspace>, FlowyError> workspacesOrFailed) {
// fetch workspaces // fetch workspaces
// iUserImpl.fetchWorkspaces().then((result) { // iUserImpl.fetchWorkspaces().then((result) {
// result.fold( // result.fold(

View File

@ -1,8 +1,8 @@
import 'package:app_flowy/workspace/domain/i_trash.dart'; import 'package:app_flowy/workspace/domain/i_trash.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flowy_log/flowy_log.dart'; import 'package:flowy_log/flowy_log.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/trash_create.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/trash_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
part 'trash_bloc.freezed.dart'; part 'trash_bloc.freezed.dart';
@ -45,14 +45,14 @@ class TrashBloc extends Bloc<TrashEvent, TrashState> {
); );
} }
Stream<TrashState> _handleResult(Either<dynamic, WorkspaceError> result) async* { Stream<TrashState> _handleResult(Either<dynamic, FlowyError> result) async* {
yield result.fold( yield result.fold(
(l) => state.copyWith(successOrFailure: left(unit)), (l) => state.copyWith(successOrFailure: left(unit)),
(error) => state.copyWith(successOrFailure: right(error)), (error) => state.copyWith(successOrFailure: right(error)),
); );
} }
void _listenTrashUpdated(Either<List<Trash>, WorkspaceError> trashOrFailed) { void _listenTrashUpdated(Either<List<Trash>, FlowyError> trashOrFailed) {
trashOrFailed.fold( trashOrFailed.fold(
(trash) { (trash) {
add(TrashEvent.didReceiveTrash(trash)); add(TrashEvent.didReceiveTrash(trash));
@ -84,7 +84,7 @@ class TrashEvent with _$TrashEvent {
class TrashState with _$TrashState { class TrashState with _$TrashState {
const factory TrashState({ const factory TrashState({
required List<Trash> objects, required List<Trash> objects,
required Either<Unit, WorkspaceError> successOrFailure, required Either<Unit, FlowyError> successOrFailure,
}) = _TrashState; }) = _TrashState;
factory TrashState.init() => TrashState( factory TrashState.init() => TrashState(

View File

@ -980,7 +980,7 @@ class _$TrashStateTearOff {
_TrashState call( _TrashState call(
{required List<Trash> objects, {required List<Trash> objects,
required Either<Unit, WorkspaceError> successOrFailure}) { required Either<Unit, FlowyError> successOrFailure}) {
return _TrashState( return _TrashState(
objects: objects, objects: objects,
successOrFailure: successOrFailure, successOrFailure: successOrFailure,
@ -994,7 +994,7 @@ const $TrashState = _$TrashStateTearOff();
/// @nodoc /// @nodoc
mixin _$TrashState { mixin _$TrashState {
List<Trash> get objects => throw _privateConstructorUsedError; List<Trash> get objects => throw _privateConstructorUsedError;
Either<Unit, WorkspaceError> get successOrFailure => Either<Unit, FlowyError> get successOrFailure =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@JsonKey(ignore: true) @JsonKey(ignore: true)
@ -1008,7 +1008,7 @@ abstract class $TrashStateCopyWith<$Res> {
TrashState value, $Res Function(TrashState) then) = TrashState value, $Res Function(TrashState) then) =
_$TrashStateCopyWithImpl<$Res>; _$TrashStateCopyWithImpl<$Res>;
$Res call( $Res call(
{List<Trash> objects, Either<Unit, WorkspaceError> successOrFailure}); {List<Trash> objects, Either<Unit, FlowyError> successOrFailure});
} }
/// @nodoc /// @nodoc
@ -1032,7 +1032,7 @@ class _$TrashStateCopyWithImpl<$Res> implements $TrashStateCopyWith<$Res> {
successOrFailure: successOrFailure == freezed successOrFailure: successOrFailure == freezed
? _value.successOrFailure ? _value.successOrFailure
: successOrFailure // ignore: cast_nullable_to_non_nullable : successOrFailure // ignore: cast_nullable_to_non_nullable
as Either<Unit, WorkspaceError>, as Either<Unit, FlowyError>,
)); ));
} }
} }
@ -1044,7 +1044,7 @@ abstract class _$TrashStateCopyWith<$Res> implements $TrashStateCopyWith<$Res> {
__$TrashStateCopyWithImpl<$Res>; __$TrashStateCopyWithImpl<$Res>;
@override @override
$Res call( $Res call(
{List<Trash> objects, Either<Unit, WorkspaceError> successOrFailure}); {List<Trash> objects, Either<Unit, FlowyError> successOrFailure});
} }
/// @nodoc /// @nodoc
@ -1070,7 +1070,7 @@ class __$TrashStateCopyWithImpl<$Res> extends _$TrashStateCopyWithImpl<$Res>
successOrFailure: successOrFailure == freezed successOrFailure: successOrFailure == freezed
? _value.successOrFailure ? _value.successOrFailure
: successOrFailure // ignore: cast_nullable_to_non_nullable : successOrFailure // ignore: cast_nullable_to_non_nullable
as Either<Unit, WorkspaceError>, as Either<Unit, FlowyError>,
)); ));
} }
} }
@ -1083,7 +1083,7 @@ class _$_TrashState implements _TrashState {
@override @override
final List<Trash> objects; final List<Trash> objects;
@override @override
final Either<Unit, WorkspaceError> successOrFailure; final Either<Unit, FlowyError> successOrFailure;
@override @override
String toString() { String toString() {
@ -1117,12 +1117,12 @@ class _$_TrashState implements _TrashState {
abstract class _TrashState implements TrashState { abstract class _TrashState implements TrashState {
const factory _TrashState( const factory _TrashState(
{required List<Trash> objects, {required List<Trash> objects,
required Either<Unit, WorkspaceError> successOrFailure}) = _$_TrashState; required Either<Unit, FlowyError> successOrFailure}) = _$_TrashState;
@override @override
List<Trash> get objects => throw _privateConstructorUsedError; List<Trash> get objects => throw _privateConstructorUsedError;
@override @override
Either<Unit, WorkspaceError> get successOrFailure => Either<Unit, FlowyError> get successOrFailure =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@override @override
@JsonKey(ignore: true) @JsonKey(ignore: true)

View File

@ -1,6 +1,6 @@
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/view_create.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:app_flowy/workspace/domain/i_view.dart'; import 'package:app_flowy/workspace/domain/i_view.dart';
@ -56,7 +56,7 @@ class ViewBloc extends Bloc<ViewEvent, ViewState> {
); );
} }
Stream<ViewState> _handleViewDidUpdate(Either<View, WorkspaceError> result) async* { Stream<ViewState> _handleViewDidUpdate(Either<View, FlowyError> result) async* {
yield result.fold( yield result.fold(
(view) => state.copyWith(view: view, successOrFailure: left(unit)), (view) => state.copyWith(view: view, successOrFailure: left(unit)),
(error) => state.copyWith(successOrFailure: right(error)), (error) => state.copyWith(successOrFailure: right(error)),
@ -77,7 +77,7 @@ class ViewEvent with _$ViewEvent {
const factory ViewEvent.rename(String newName) = Rename; const factory ViewEvent.rename(String newName) = Rename;
const factory ViewEvent.delete() = Delete; const factory ViewEvent.delete() = Delete;
const factory ViewEvent.duplicate() = Duplicate; const factory ViewEvent.duplicate() = Duplicate;
const factory ViewEvent.viewDidUpdate(Either<View, WorkspaceError> result) = ViewDidUpdate; const factory ViewEvent.viewDidUpdate(Either<View, FlowyError> result) = ViewDidUpdate;
} }
@freezed @freezed
@ -85,7 +85,7 @@ class ViewState with _$ViewState {
const factory ViewState({ const factory ViewState({
required View view, required View view,
required bool isEditing, required bool isEditing,
required Either<Unit, WorkspaceError> successOrFailure, required Either<Unit, FlowyError> successOrFailure,
}) = _ViewState; }) = _ViewState;
factory ViewState.init(View view) => ViewState( factory ViewState.init(View view) => ViewState(

View File

@ -41,7 +41,7 @@ class _$ViewEventTearOff {
return const Duplicate(); return const Duplicate();
} }
ViewDidUpdate viewDidUpdate(Either<View, WorkspaceError> result) { ViewDidUpdate viewDidUpdate(Either<View, FlowyError> result) {
return ViewDidUpdate( return ViewDidUpdate(
result, result,
); );
@ -60,7 +60,7 @@ mixin _$ViewEvent {
required TResult Function(String newName) rename, required TResult Function(String newName) rename,
required TResult Function() delete, required TResult Function() delete,
required TResult Function() duplicate, required TResult Function() duplicate,
required TResult Function(Either<View, WorkspaceError> result) required TResult Function(Either<View, FlowyError> result)
viewDidUpdate, viewDidUpdate,
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@ -71,7 +71,7 @@ mixin _$ViewEvent {
TResult Function(String newName)? rename, TResult Function(String newName)? rename,
TResult Function()? delete, TResult Function()? delete,
TResult Function()? duplicate, TResult Function()? duplicate,
TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate, TResult Function(Either<View, FlowyError> result)? viewDidUpdate,
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@optionalTypeArgs @optionalTypeArgs
@ -81,7 +81,7 @@ mixin _$ViewEvent {
TResult Function(String newName)? rename, TResult Function(String newName)? rename,
TResult Function()? delete, TResult Function()? delete,
TResult Function()? duplicate, TResult Function()? duplicate,
TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate, TResult Function(Either<View, FlowyError> result)? viewDidUpdate,
required TResult orElse(), required TResult orElse(),
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@ -175,7 +175,7 @@ class _$Initial implements Initial {
required TResult Function(String newName) rename, required TResult Function(String newName) rename,
required TResult Function() delete, required TResult Function() delete,
required TResult Function() duplicate, required TResult Function() duplicate,
required TResult Function(Either<View, WorkspaceError> result) required TResult Function(Either<View, FlowyError> result)
viewDidUpdate, viewDidUpdate,
}) { }) {
return initial(); return initial();
@ -189,7 +189,7 @@ class _$Initial implements Initial {
TResult Function(String newName)? rename, TResult Function(String newName)? rename,
TResult Function()? delete, TResult Function()? delete,
TResult Function()? duplicate, TResult Function()? duplicate,
TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate, TResult Function(Either<View, FlowyError> result)? viewDidUpdate,
}) { }) {
return initial?.call(); return initial?.call();
} }
@ -202,7 +202,7 @@ class _$Initial implements Initial {
TResult Function(String newName)? rename, TResult Function(String newName)? rename,
TResult Function()? delete, TResult Function()? delete,
TResult Function()? duplicate, TResult Function()? duplicate,
TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate, TResult Function(Either<View, FlowyError> result)? viewDidUpdate,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (initial != null) { if (initial != null) {
@ -328,7 +328,7 @@ class _$SetEditing implements SetEditing {
required TResult Function(String newName) rename, required TResult Function(String newName) rename,
required TResult Function() delete, required TResult Function() delete,
required TResult Function() duplicate, required TResult Function() duplicate,
required TResult Function(Either<View, WorkspaceError> result) required TResult Function(Either<View, FlowyError> result)
viewDidUpdate, viewDidUpdate,
}) { }) {
return setIsEditing(isEditing); return setIsEditing(isEditing);
@ -342,7 +342,7 @@ class _$SetEditing implements SetEditing {
TResult Function(String newName)? rename, TResult Function(String newName)? rename,
TResult Function()? delete, TResult Function()? delete,
TResult Function()? duplicate, TResult Function()? duplicate,
TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate, TResult Function(Either<View, FlowyError> result)? viewDidUpdate,
}) { }) {
return setIsEditing?.call(isEditing); return setIsEditing?.call(isEditing);
} }
@ -355,7 +355,7 @@ class _$SetEditing implements SetEditing {
TResult Function(String newName)? rename, TResult Function(String newName)? rename,
TResult Function()? delete, TResult Function()? delete,
TResult Function()? duplicate, TResult Function()? duplicate,
TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate, TResult Function(Either<View, FlowyError> result)? viewDidUpdate,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (setIsEditing != null) { if (setIsEditing != null) {
@ -484,7 +484,7 @@ class _$Rename implements Rename {
required TResult Function(String newName) rename, required TResult Function(String newName) rename,
required TResult Function() delete, required TResult Function() delete,
required TResult Function() duplicate, required TResult Function() duplicate,
required TResult Function(Either<View, WorkspaceError> result) required TResult Function(Either<View, FlowyError> result)
viewDidUpdate, viewDidUpdate,
}) { }) {
return rename(newName); return rename(newName);
@ -498,7 +498,7 @@ class _$Rename implements Rename {
TResult Function(String newName)? rename, TResult Function(String newName)? rename,
TResult Function()? delete, TResult Function()? delete,
TResult Function()? duplicate, TResult Function()? duplicate,
TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate, TResult Function(Either<View, FlowyError> result)? viewDidUpdate,
}) { }) {
return rename?.call(newName); return rename?.call(newName);
} }
@ -511,7 +511,7 @@ class _$Rename implements Rename {
TResult Function(String newName)? rename, TResult Function(String newName)? rename,
TResult Function()? delete, TResult Function()? delete,
TResult Function()? duplicate, TResult Function()? duplicate,
TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate, TResult Function(Either<View, FlowyError> result)? viewDidUpdate,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (rename != null) { if (rename != null) {
@ -614,7 +614,7 @@ class _$Delete implements Delete {
required TResult Function(String newName) rename, required TResult Function(String newName) rename,
required TResult Function() delete, required TResult Function() delete,
required TResult Function() duplicate, required TResult Function() duplicate,
required TResult Function(Either<View, WorkspaceError> result) required TResult Function(Either<View, FlowyError> result)
viewDidUpdate, viewDidUpdate,
}) { }) {
return delete(); return delete();
@ -628,7 +628,7 @@ class _$Delete implements Delete {
TResult Function(String newName)? rename, TResult Function(String newName)? rename,
TResult Function()? delete, TResult Function()? delete,
TResult Function()? duplicate, TResult Function()? duplicate,
TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate, TResult Function(Either<View, FlowyError> result)? viewDidUpdate,
}) { }) {
return delete?.call(); return delete?.call();
} }
@ -641,7 +641,7 @@ class _$Delete implements Delete {
TResult Function(String newName)? rename, TResult Function(String newName)? rename,
TResult Function()? delete, TResult Function()? delete,
TResult Function()? duplicate, TResult Function()? duplicate,
TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate, TResult Function(Either<View, FlowyError> result)? viewDidUpdate,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (delete != null) { if (delete != null) {
@ -740,7 +740,7 @@ class _$Duplicate implements Duplicate {
required TResult Function(String newName) rename, required TResult Function(String newName) rename,
required TResult Function() delete, required TResult Function() delete,
required TResult Function() duplicate, required TResult Function() duplicate,
required TResult Function(Either<View, WorkspaceError> result) required TResult Function(Either<View, FlowyError> result)
viewDidUpdate, viewDidUpdate,
}) { }) {
return duplicate(); return duplicate();
@ -754,7 +754,7 @@ class _$Duplicate implements Duplicate {
TResult Function(String newName)? rename, TResult Function(String newName)? rename,
TResult Function()? delete, TResult Function()? delete,
TResult Function()? duplicate, TResult Function()? duplicate,
TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate, TResult Function(Either<View, FlowyError> result)? viewDidUpdate,
}) { }) {
return duplicate?.call(); return duplicate?.call();
} }
@ -767,7 +767,7 @@ class _$Duplicate implements Duplicate {
TResult Function(String newName)? rename, TResult Function(String newName)? rename,
TResult Function()? delete, TResult Function()? delete,
TResult Function()? duplicate, TResult Function()? duplicate,
TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate, TResult Function(Either<View, FlowyError> result)? viewDidUpdate,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (duplicate != null) { if (duplicate != null) {
@ -829,7 +829,7 @@ abstract class $ViewDidUpdateCopyWith<$Res> {
factory $ViewDidUpdateCopyWith( factory $ViewDidUpdateCopyWith(
ViewDidUpdate value, $Res Function(ViewDidUpdate) then) = ViewDidUpdate value, $Res Function(ViewDidUpdate) then) =
_$ViewDidUpdateCopyWithImpl<$Res>; _$ViewDidUpdateCopyWithImpl<$Res>;
$Res call({Either<View, WorkspaceError> result}); $Res call({Either<View, FlowyError> result});
} }
/// @nodoc /// @nodoc
@ -850,7 +850,7 @@ class _$ViewDidUpdateCopyWithImpl<$Res> extends _$ViewEventCopyWithImpl<$Res>
result == freezed result == freezed
? _value.result ? _value.result
: result // ignore: cast_nullable_to_non_nullable : result // ignore: cast_nullable_to_non_nullable
as Either<View, WorkspaceError>, as Either<View, FlowyError>,
)); ));
} }
} }
@ -861,7 +861,7 @@ class _$ViewDidUpdate implements ViewDidUpdate {
const _$ViewDidUpdate(this.result); const _$ViewDidUpdate(this.result);
@override @override
final Either<View, WorkspaceError> result; final Either<View, FlowyError> result;
@override @override
String toString() { String toString() {
@ -893,7 +893,7 @@ class _$ViewDidUpdate implements ViewDidUpdate {
required TResult Function(String newName) rename, required TResult Function(String newName) rename,
required TResult Function() delete, required TResult Function() delete,
required TResult Function() duplicate, required TResult Function() duplicate,
required TResult Function(Either<View, WorkspaceError> result) required TResult Function(Either<View, FlowyError> result)
viewDidUpdate, viewDidUpdate,
}) { }) {
return viewDidUpdate(result); return viewDidUpdate(result);
@ -907,7 +907,7 @@ class _$ViewDidUpdate implements ViewDidUpdate {
TResult Function(String newName)? rename, TResult Function(String newName)? rename,
TResult Function()? delete, TResult Function()? delete,
TResult Function()? duplicate, TResult Function()? duplicate,
TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate, TResult Function(Either<View, FlowyError> result)? viewDidUpdate,
}) { }) {
return viewDidUpdate?.call(result); return viewDidUpdate?.call(result);
} }
@ -920,7 +920,7 @@ class _$ViewDidUpdate implements ViewDidUpdate {
TResult Function(String newName)? rename, TResult Function(String newName)? rename,
TResult Function()? delete, TResult Function()? delete,
TResult Function()? duplicate, TResult Function()? duplicate,
TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate, TResult Function(Either<View, FlowyError> result)? viewDidUpdate,
required TResult orElse(), required TResult orElse(),
}) { }) {
if (viewDidUpdate != null) { if (viewDidUpdate != null) {
@ -974,10 +974,10 @@ class _$ViewDidUpdate implements ViewDidUpdate {
} }
abstract class ViewDidUpdate implements ViewEvent { abstract class ViewDidUpdate implements ViewEvent {
const factory ViewDidUpdate(Either<View, WorkspaceError> result) = const factory ViewDidUpdate(Either<View, FlowyError> result) =
_$ViewDidUpdate; _$ViewDidUpdate;
Either<View, WorkspaceError> get result => throw _privateConstructorUsedError; Either<View, FlowyError> get result => throw _privateConstructorUsedError;
@JsonKey(ignore: true) @JsonKey(ignore: true)
$ViewDidUpdateCopyWith<ViewDidUpdate> get copyWith => $ViewDidUpdateCopyWith<ViewDidUpdate> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@ -990,7 +990,7 @@ class _$ViewStateTearOff {
_ViewState call( _ViewState call(
{required View view, {required View view,
required bool isEditing, required bool isEditing,
required Either<Unit, WorkspaceError> successOrFailure}) { required Either<Unit, FlowyError> successOrFailure}) {
return _ViewState( return _ViewState(
view: view, view: view,
isEditing: isEditing, isEditing: isEditing,
@ -1006,7 +1006,7 @@ const $ViewState = _$ViewStateTearOff();
mixin _$ViewState { mixin _$ViewState {
View get view => throw _privateConstructorUsedError; View get view => throw _privateConstructorUsedError;
bool get isEditing => throw _privateConstructorUsedError; bool get isEditing => throw _privateConstructorUsedError;
Either<Unit, WorkspaceError> get successOrFailure => Either<Unit, FlowyError> get successOrFailure =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@JsonKey(ignore: true) @JsonKey(ignore: true)
@ -1021,7 +1021,7 @@ abstract class $ViewStateCopyWith<$Res> {
$Res call( $Res call(
{View view, {View view,
bool isEditing, bool isEditing,
Either<Unit, WorkspaceError> successOrFailure}); Either<Unit, FlowyError> successOrFailure});
} }
/// @nodoc /// @nodoc
@ -1050,7 +1050,7 @@ class _$ViewStateCopyWithImpl<$Res> implements $ViewStateCopyWith<$Res> {
successOrFailure: successOrFailure == freezed successOrFailure: successOrFailure == freezed
? _value.successOrFailure ? _value.successOrFailure
: successOrFailure // ignore: cast_nullable_to_non_nullable : successOrFailure // ignore: cast_nullable_to_non_nullable
as Either<Unit, WorkspaceError>, as Either<Unit, FlowyError>,
)); ));
} }
} }
@ -1064,7 +1064,7 @@ abstract class _$ViewStateCopyWith<$Res> implements $ViewStateCopyWith<$Res> {
$Res call( $Res call(
{View view, {View view,
bool isEditing, bool isEditing,
Either<Unit, WorkspaceError> successOrFailure}); Either<Unit, FlowyError> successOrFailure});
} }
/// @nodoc /// @nodoc
@ -1094,7 +1094,7 @@ class __$ViewStateCopyWithImpl<$Res> extends _$ViewStateCopyWithImpl<$Res>
successOrFailure: successOrFailure == freezed successOrFailure: successOrFailure == freezed
? _value.successOrFailure ? _value.successOrFailure
: successOrFailure // ignore: cast_nullable_to_non_nullable : successOrFailure // ignore: cast_nullable_to_non_nullable
as Either<Unit, WorkspaceError>, as Either<Unit, FlowyError>,
)); ));
} }
} }
@ -1112,7 +1112,7 @@ class _$_ViewState implements _ViewState {
@override @override
final bool isEditing; final bool isEditing;
@override @override
final Either<Unit, WorkspaceError> successOrFailure; final Either<Unit, FlowyError> successOrFailure;
@override @override
String toString() { String toString() {
@ -1150,14 +1150,14 @@ abstract class _ViewState implements ViewState {
const factory _ViewState( const factory _ViewState(
{required View view, {required View view,
required bool isEditing, required bool isEditing,
required Either<Unit, WorkspaceError> successOrFailure}) = _$_ViewState; required Either<Unit, FlowyError> successOrFailure}) = _$_ViewState;
@override @override
View get view => throw _privateConstructorUsedError; View get view => throw _privateConstructorUsedError;
@override @override
bool get isEditing => throw _privateConstructorUsedError; bool get isEditing => throw _privateConstructorUsedError;
@override @override
Either<Unit, WorkspaceError> get successOrFailure => Either<Unit, FlowyError> get successOrFailure =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@override @override
@JsonKey(ignore: true) @JsonKey(ignore: true)

View File

@ -1,8 +1,8 @@
import 'package:app_flowy/workspace/domain/i_user.dart'; import 'package:app_flowy/workspace/domain/i_user.dart';
import 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart'; import 'package:app_flowy/workspace/infrastructure/repos/user_repo.dart';
import 'package:flowy_log/flowy_log.dart'; import 'package:flowy_log/flowy_log.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/workspace_create.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/workspace_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
@ -76,7 +76,7 @@ class WelcomeBloc extends Bloc<WelcomeEvent, WelcomeState> {
); );
} }
void _workspacesUpdated(Either<List<Workspace>, WorkspaceError> workspacesOrFail) { void _workspacesUpdated(Either<List<Workspace>, FlowyError> workspacesOrFail) {
add(WelcomeEvent.workspacesReveived(workspacesOrFail)); add(WelcomeEvent.workspacesReveived(workspacesOrFail));
} }
} }
@ -87,7 +87,7 @@ class WelcomeEvent with _$WelcomeEvent {
// const factory WelcomeEvent.fetchWorkspaces() = FetchWorkspace; // const factory WelcomeEvent.fetchWorkspaces() = FetchWorkspace;
const factory WelcomeEvent.createWorkspace(String name, String desc) = CreateWorkspace; const factory WelcomeEvent.createWorkspace(String name, String desc) = CreateWorkspace;
const factory WelcomeEvent.openWorkspace(Workspace workspace) = OpenWorkspace; const factory WelcomeEvent.openWorkspace(Workspace workspace) = OpenWorkspace;
const factory WelcomeEvent.workspacesReveived(Either<List<Workspace>, WorkspaceError> workspacesOrFail) = const factory WelcomeEvent.workspacesReveived(Either<List<Workspace>, FlowyError> workspacesOrFail) =
WorkspacesReceived; WorkspacesReceived;
} }
@ -96,7 +96,7 @@ class WelcomeState with _$WelcomeState {
const factory WelcomeState({ const factory WelcomeState({
required bool isLoading, required bool isLoading,
required List<Workspace> workspaces, required List<Workspace> workspaces,
required Either<Unit, WorkspaceError> successOrFailure, required Either<Unit, FlowyError> successOrFailure,
}) = _WelcomeState; }) = _WelcomeState;
factory WelcomeState.initial() => WelcomeState( factory WelcomeState.initial() => WelcomeState(

View File

@ -35,7 +35,7 @@ class _$WelcomeEventTearOff {
} }
WorkspacesReceived workspacesReveived( WorkspacesReceived workspacesReveived(
Either<List<Workspace>, WorkspaceError> workspacesOrFail) { Either<List<Workspace>, FlowyError> workspacesOrFail) {
return WorkspacesReceived( return WorkspacesReceived(
workspacesOrFail, workspacesOrFail,
); );
@ -53,7 +53,7 @@ mixin _$WelcomeEvent {
required TResult Function(String name, String desc) createWorkspace, required TResult Function(String name, String desc) createWorkspace,
required TResult Function(Workspace workspace) openWorkspace, required TResult Function(Workspace workspace) openWorkspace,
required TResult Function( required TResult Function(
Either<List<Workspace>, WorkspaceError> workspacesOrFail) Either<List<Workspace>, FlowyError> workspacesOrFail)
workspacesReveived, workspacesReveived,
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@ -62,7 +62,7 @@ mixin _$WelcomeEvent {
TResult Function()? initial, TResult Function()? initial,
TResult Function(String name, String desc)? createWorkspace, TResult Function(String name, String desc)? createWorkspace,
TResult Function(Workspace workspace)? openWorkspace, TResult Function(Workspace workspace)? openWorkspace,
TResult Function(Either<List<Workspace>, WorkspaceError> workspacesOrFail)? TResult Function(Either<List<Workspace>, FlowyError> workspacesOrFail)?
workspacesReveived, workspacesReveived,
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@ -71,7 +71,7 @@ mixin _$WelcomeEvent {
TResult Function()? initial, TResult Function()? initial,
TResult Function(String name, String desc)? createWorkspace, TResult Function(String name, String desc)? createWorkspace,
TResult Function(Workspace workspace)? openWorkspace, TResult Function(Workspace workspace)? openWorkspace,
TResult Function(Either<List<Workspace>, WorkspaceError> workspacesOrFail)? TResult Function(Either<List<Workspace>, FlowyError> workspacesOrFail)?
workspacesReveived, workspacesReveived,
required TResult orElse(), required TResult orElse(),
}) => }) =>
@ -160,7 +160,7 @@ class _$Initial implements Initial {
required TResult Function(String name, String desc) createWorkspace, required TResult Function(String name, String desc) createWorkspace,
required TResult Function(Workspace workspace) openWorkspace, required TResult Function(Workspace workspace) openWorkspace,
required TResult Function( required TResult Function(
Either<List<Workspace>, WorkspaceError> workspacesOrFail) Either<List<Workspace>, FlowyError> workspacesOrFail)
workspacesReveived, workspacesReveived,
}) { }) {
return initial(); return initial();
@ -172,7 +172,7 @@ class _$Initial implements Initial {
TResult Function()? initial, TResult Function()? initial,
TResult Function(String name, String desc)? createWorkspace, TResult Function(String name, String desc)? createWorkspace,
TResult Function(Workspace workspace)? openWorkspace, TResult Function(Workspace workspace)? openWorkspace,
TResult Function(Either<List<Workspace>, WorkspaceError> workspacesOrFail)? TResult Function(Either<List<Workspace>, FlowyError> workspacesOrFail)?
workspacesReveived, workspacesReveived,
}) { }) {
return initial?.call(); return initial?.call();
@ -184,7 +184,7 @@ class _$Initial implements Initial {
TResult Function()? initial, TResult Function()? initial,
TResult Function(String name, String desc)? createWorkspace, TResult Function(String name, String desc)? createWorkspace,
TResult Function(Workspace workspace)? openWorkspace, TResult Function(Workspace workspace)? openWorkspace,
TResult Function(Either<List<Workspace>, WorkspaceError> workspacesOrFail)? TResult Function(Either<List<Workspace>, FlowyError> workspacesOrFail)?
workspacesReveived, workspacesReveived,
required TResult orElse(), required TResult orElse(),
}) { }) {
@ -316,7 +316,7 @@ class _$CreateWorkspace implements CreateWorkspace {
required TResult Function(String name, String desc) createWorkspace, required TResult Function(String name, String desc) createWorkspace,
required TResult Function(Workspace workspace) openWorkspace, required TResult Function(Workspace workspace) openWorkspace,
required TResult Function( required TResult Function(
Either<List<Workspace>, WorkspaceError> workspacesOrFail) Either<List<Workspace>, FlowyError> workspacesOrFail)
workspacesReveived, workspacesReveived,
}) { }) {
return createWorkspace(name, desc); return createWorkspace(name, desc);
@ -328,7 +328,7 @@ class _$CreateWorkspace implements CreateWorkspace {
TResult Function()? initial, TResult Function()? initial,
TResult Function(String name, String desc)? createWorkspace, TResult Function(String name, String desc)? createWorkspace,
TResult Function(Workspace workspace)? openWorkspace, TResult Function(Workspace workspace)? openWorkspace,
TResult Function(Either<List<Workspace>, WorkspaceError> workspacesOrFail)? TResult Function(Either<List<Workspace>, FlowyError> workspacesOrFail)?
workspacesReveived, workspacesReveived,
}) { }) {
return createWorkspace?.call(name, desc); return createWorkspace?.call(name, desc);
@ -340,7 +340,7 @@ class _$CreateWorkspace implements CreateWorkspace {
TResult Function()? initial, TResult Function()? initial,
TResult Function(String name, String desc)? createWorkspace, TResult Function(String name, String desc)? createWorkspace,
TResult Function(Workspace workspace)? openWorkspace, TResult Function(Workspace workspace)? openWorkspace,
TResult Function(Either<List<Workspace>, WorkspaceError> workspacesOrFail)? TResult Function(Either<List<Workspace>, FlowyError> workspacesOrFail)?
workspacesReveived, workspacesReveived,
required TResult orElse(), required TResult orElse(),
}) { }) {
@ -467,7 +467,7 @@ class _$OpenWorkspace implements OpenWorkspace {
required TResult Function(String name, String desc) createWorkspace, required TResult Function(String name, String desc) createWorkspace,
required TResult Function(Workspace workspace) openWorkspace, required TResult Function(Workspace workspace) openWorkspace,
required TResult Function( required TResult Function(
Either<List<Workspace>, WorkspaceError> workspacesOrFail) Either<List<Workspace>, FlowyError> workspacesOrFail)
workspacesReveived, workspacesReveived,
}) { }) {
return openWorkspace(workspace); return openWorkspace(workspace);
@ -479,7 +479,7 @@ class _$OpenWorkspace implements OpenWorkspace {
TResult Function()? initial, TResult Function()? initial,
TResult Function(String name, String desc)? createWorkspace, TResult Function(String name, String desc)? createWorkspace,
TResult Function(Workspace workspace)? openWorkspace, TResult Function(Workspace workspace)? openWorkspace,
TResult Function(Either<List<Workspace>, WorkspaceError> workspacesOrFail)? TResult Function(Either<List<Workspace>, FlowyError> workspacesOrFail)?
workspacesReveived, workspacesReveived,
}) { }) {
return openWorkspace?.call(workspace); return openWorkspace?.call(workspace);
@ -491,7 +491,7 @@ class _$OpenWorkspace implements OpenWorkspace {
TResult Function()? initial, TResult Function()? initial,
TResult Function(String name, String desc)? createWorkspace, TResult Function(String name, String desc)? createWorkspace,
TResult Function(Workspace workspace)? openWorkspace, TResult Function(Workspace workspace)? openWorkspace,
TResult Function(Either<List<Workspace>, WorkspaceError> workspacesOrFail)? TResult Function(Either<List<Workspace>, FlowyError> workspacesOrFail)?
workspacesReveived, workspacesReveived,
required TResult orElse(), required TResult orElse(),
}) { }) {
@ -553,7 +553,7 @@ abstract class $WorkspacesReceivedCopyWith<$Res> {
factory $WorkspacesReceivedCopyWith( factory $WorkspacesReceivedCopyWith(
WorkspacesReceived value, $Res Function(WorkspacesReceived) then) = WorkspacesReceived value, $Res Function(WorkspacesReceived) then) =
_$WorkspacesReceivedCopyWithImpl<$Res>; _$WorkspacesReceivedCopyWithImpl<$Res>;
$Res call({Either<List<Workspace>, WorkspaceError> workspacesOrFail}); $Res call({Either<List<Workspace>, FlowyError> workspacesOrFail});
} }
/// @nodoc /// @nodoc
@ -575,7 +575,7 @@ class _$WorkspacesReceivedCopyWithImpl<$Res>
workspacesOrFail == freezed workspacesOrFail == freezed
? _value.workspacesOrFail ? _value.workspacesOrFail
: workspacesOrFail // ignore: cast_nullable_to_non_nullable : workspacesOrFail // ignore: cast_nullable_to_non_nullable
as Either<List<Workspace>, WorkspaceError>, as Either<List<Workspace>, FlowyError>,
)); ));
} }
} }
@ -586,7 +586,7 @@ class _$WorkspacesReceived implements WorkspacesReceived {
const _$WorkspacesReceived(this.workspacesOrFail); const _$WorkspacesReceived(this.workspacesOrFail);
@override @override
final Either<List<Workspace>, WorkspaceError> workspacesOrFail; final Either<List<Workspace>, FlowyError> workspacesOrFail;
@override @override
String toString() { String toString() {
@ -619,7 +619,7 @@ class _$WorkspacesReceived implements WorkspacesReceived {
required TResult Function(String name, String desc) createWorkspace, required TResult Function(String name, String desc) createWorkspace,
required TResult Function(Workspace workspace) openWorkspace, required TResult Function(Workspace workspace) openWorkspace,
required TResult Function( required TResult Function(
Either<List<Workspace>, WorkspaceError> workspacesOrFail) Either<List<Workspace>, FlowyError> workspacesOrFail)
workspacesReveived, workspacesReveived,
}) { }) {
return workspacesReveived(workspacesOrFail); return workspacesReveived(workspacesOrFail);
@ -631,7 +631,7 @@ class _$WorkspacesReceived implements WorkspacesReceived {
TResult Function()? initial, TResult Function()? initial,
TResult Function(String name, String desc)? createWorkspace, TResult Function(String name, String desc)? createWorkspace,
TResult Function(Workspace workspace)? openWorkspace, TResult Function(Workspace workspace)? openWorkspace,
TResult Function(Either<List<Workspace>, WorkspaceError> workspacesOrFail)? TResult Function(Either<List<Workspace>, FlowyError> workspacesOrFail)?
workspacesReveived, workspacesReveived,
}) { }) {
return workspacesReveived?.call(workspacesOrFail); return workspacesReveived?.call(workspacesOrFail);
@ -643,7 +643,7 @@ class _$WorkspacesReceived implements WorkspacesReceived {
TResult Function()? initial, TResult Function()? initial,
TResult Function(String name, String desc)? createWorkspace, TResult Function(String name, String desc)? createWorkspace,
TResult Function(Workspace workspace)? openWorkspace, TResult Function(Workspace workspace)? openWorkspace,
TResult Function(Either<List<Workspace>, WorkspaceError> workspacesOrFail)? TResult Function(Either<List<Workspace>, FlowyError> workspacesOrFail)?
workspacesReveived, workspacesReveived,
required TResult orElse(), required TResult orElse(),
}) { }) {
@ -693,10 +693,10 @@ class _$WorkspacesReceived implements WorkspacesReceived {
abstract class WorkspacesReceived implements WelcomeEvent { abstract class WorkspacesReceived implements WelcomeEvent {
const factory WorkspacesReceived( const factory WorkspacesReceived(
Either<List<Workspace>, WorkspaceError> workspacesOrFail) = Either<List<Workspace>, FlowyError> workspacesOrFail) =
_$WorkspacesReceived; _$WorkspacesReceived;
Either<List<Workspace>, WorkspaceError> get workspacesOrFail => Either<List<Workspace>, FlowyError> get workspacesOrFail =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@JsonKey(ignore: true) @JsonKey(ignore: true)
$WorkspacesReceivedCopyWith<WorkspacesReceived> get copyWith => $WorkspacesReceivedCopyWith<WorkspacesReceived> get copyWith =>
@ -710,7 +710,7 @@ class _$WelcomeStateTearOff {
_WelcomeState call( _WelcomeState call(
{required bool isLoading, {required bool isLoading,
required List<Workspace> workspaces, required List<Workspace> workspaces,
required Either<Unit, WorkspaceError> successOrFailure}) { required Either<Unit, FlowyError> successOrFailure}) {
return _WelcomeState( return _WelcomeState(
isLoading: isLoading, isLoading: isLoading,
workspaces: workspaces, workspaces: workspaces,
@ -726,7 +726,7 @@ const $WelcomeState = _$WelcomeStateTearOff();
mixin _$WelcomeState { mixin _$WelcomeState {
bool get isLoading => throw _privateConstructorUsedError; bool get isLoading => throw _privateConstructorUsedError;
List<Workspace> get workspaces => throw _privateConstructorUsedError; List<Workspace> get workspaces => throw _privateConstructorUsedError;
Either<Unit, WorkspaceError> get successOrFailure => Either<Unit, FlowyError> get successOrFailure =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@JsonKey(ignore: true) @JsonKey(ignore: true)
@ -742,7 +742,7 @@ abstract class $WelcomeStateCopyWith<$Res> {
$Res call( $Res call(
{bool isLoading, {bool isLoading,
List<Workspace> workspaces, List<Workspace> workspaces,
Either<Unit, WorkspaceError> successOrFailure}); Either<Unit, FlowyError> successOrFailure});
} }
/// @nodoc /// @nodoc
@ -771,7 +771,7 @@ class _$WelcomeStateCopyWithImpl<$Res> implements $WelcomeStateCopyWith<$Res> {
successOrFailure: successOrFailure == freezed successOrFailure: successOrFailure == freezed
? _value.successOrFailure ? _value.successOrFailure
: successOrFailure // ignore: cast_nullable_to_non_nullable : successOrFailure // ignore: cast_nullable_to_non_nullable
as Either<Unit, WorkspaceError>, as Either<Unit, FlowyError>,
)); ));
} }
} }
@ -786,7 +786,7 @@ abstract class _$WelcomeStateCopyWith<$Res>
$Res call( $Res call(
{bool isLoading, {bool isLoading,
List<Workspace> workspaces, List<Workspace> workspaces,
Either<Unit, WorkspaceError> successOrFailure}); Either<Unit, FlowyError> successOrFailure});
} }
/// @nodoc /// @nodoc
@ -817,7 +817,7 @@ class __$WelcomeStateCopyWithImpl<$Res> extends _$WelcomeStateCopyWithImpl<$Res>
successOrFailure: successOrFailure == freezed successOrFailure: successOrFailure == freezed
? _value.successOrFailure ? _value.successOrFailure
: successOrFailure // ignore: cast_nullable_to_non_nullable : successOrFailure // ignore: cast_nullable_to_non_nullable
as Either<Unit, WorkspaceError>, as Either<Unit, FlowyError>,
)); ));
} }
} }
@ -835,7 +835,7 @@ class _$_WelcomeState implements _WelcomeState {
@override @override
final List<Workspace> workspaces; final List<Workspace> workspaces;
@override @override
final Either<Unit, WorkspaceError> successOrFailure; final Either<Unit, FlowyError> successOrFailure;
@override @override
String toString() { String toString() {
@ -874,7 +874,7 @@ abstract class _WelcomeState implements WelcomeState {
const factory _WelcomeState( const factory _WelcomeState(
{required bool isLoading, {required bool isLoading,
required List<Workspace> workspaces, required List<Workspace> workspaces,
required Either<Unit, WorkspaceError> successOrFailure}) = required Either<Unit, FlowyError> successOrFailure}) =
_$_WelcomeState; _$_WelcomeState;
@override @override
@ -882,7 +882,7 @@ abstract class _WelcomeState implements WelcomeState {
@override @override
List<Workspace> get workspaces => throw _privateConstructorUsedError; List<Workspace> get workspaces => throw _privateConstructorUsedError;
@override @override
Either<Unit, WorkspaceError> get successOrFailure => Either<Unit, FlowyError> get successOrFailure =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@override @override
@JsonKey(ignore: true) @JsonKey(ignore: true)

View File

@ -1,20 +1,18 @@
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/app_create.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-core-data-model/protobuf.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/view_create.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace-infra/protobuf.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
typedef AppUpdatedCallback = void Function(App app); typedef AppUpdatedCallback = void Function(App app);
typedef AppViewsChangeCallback = void Function(Either<List<View>, WorkspaceError> viewsOrFailed); typedef AppViewsChangeCallback = void Function(Either<List<View>, FlowyError> viewsOrFailed);
abstract class IApp { abstract class IApp {
Future<Either<List<View>, WorkspaceError>> getViews(); Future<Either<List<View>, FlowyError>> getViews();
Future<Either<View, WorkspaceError>> createView({required String name, String? desc, required ViewType viewType}); Future<Either<View, FlowyError>> createView({required String name, String? desc, required ViewType viewType});
Future<Either<Unit, WorkspaceError>> delete(); Future<Either<Unit, FlowyError>> delete();
Future<Either<Unit, WorkspaceError>> rename(String newName); Future<Either<Unit, FlowyError>> rename(String newName);
} }
abstract class IAppListenr { abstract class IAppListenr {

View File

@ -1,10 +1,10 @@
import 'dart:async'; import 'dart:async';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:flowy_sdk/protobuf/flowy-document-infra/doc.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-collaboration/doc.pb.dart';
import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart'; import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
abstract class IDoc { abstract class IDoc {
Future<Either<DocDelta, WorkspaceError>> readDoc(); Future<Either<DocDelta, FlowyError>> readDoc();
Future<Either<DocDelta, WorkspaceError>> composeDelta({required String json}); Future<Either<DocDelta, FlowyError>> composeDelta({required String json});
Future<Either<Unit, WorkspaceError>> closeDoc(); Future<Either<Unit, FlowyError>> closeDoc();
} }

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