Browse Source

refactor backend dir hierarchi

appflowy 3 years ago
parent
commit
8457682092
62 changed files with 247 additions and 314 deletions
  1. 8 7
      backend/src/application.rs
  2. 3 3
      backend/src/context.rs
  3. 1 1
      backend/src/entities/token.rs
  4. 2 1
      backend/src/lib.rs
  5. 1 1
      backend/src/middleware/auth_middleware.rs
  6. 2 2
      backend/src/services/app/app.rs
  7. 0 0
      backend/src/services/app/mod.rs
  8. 1 1
      backend/src/services/app/router.rs
  9. 0 0
      backend/src/services/app/sql_builder.rs
  10. 0 0
      backend/src/services/doc/crud.rs
  11. 3 3
      backend/src/services/doc/edit/edit_actor.rs
  12. 6 4
      backend/src/services/doc/edit/editor.rs
  13. 0 0
      backend/src/services/doc/edit/mod.rs
  14. 3 3
      backend/src/services/doc/manager.rs
  15. 0 0
      backend/src/services/doc/mod.rs
  16. 1 1
      backend/src/services/doc/router.rs
  17. 6 4
      backend/src/services/doc/ws_actor.rs
  18. 0 0
      backend/src/services/log.rs
  19. 0 1
      backend/src/services/mod.rs
  20. 0 0
      backend/src/services/trash/mod.rs
  21. 1 1
      backend/src/services/trash/router.rs
  22. 1 1
      backend/src/services/trash/trash.rs
  23. 2 3
      backend/src/services/user/auth.rs
  24. 0 0
      backend/src/services/user/logged_user.rs
  25. 0 0
      backend/src/services/user/mod.rs
  26. 1 1
      backend/src/services/user/router.rs
  27. 3 2
      backend/src/services/user/user_default.rs
  28. 0 0
      backend/src/services/user/utils.rs
  29. 0 0
      backend/src/services/util.rs
  30. 0 0
      backend/src/services/view/mod.rs
  31. 1 1
      backend/src/services/view/router.rs
  32. 0 0
      backend/src/services/view/sql_builder.rs
  33. 1 1
      backend/src/services/view/view.rs
  34. 0 0
      backend/src/services/workspace/mod.rs
  35. 1 1
      backend/src/services/workspace/router.rs
  36. 0 0
      backend/src/services/workspace/sql_builder.rs
  37. 1 1
      backend/src/services/workspace/workspace.rs
  38. 1 2
      backend/src/web_socket/biz_handler.rs
  39. 1 1
      backend/src/web_socket/entities/connect.rs
  40. 0 0
      backend/src/web_socket/entities/message.rs
  41. 0 0
      backend/src/web_socket/entities/mod.rs
  42. 0 0
      backend/src/web_socket/mod.rs
  43. 3 3
      backend/src/web_socket/router.rs
  44. 6 8
      backend/src/web_socket/ws_client.rs
  45. 1 1
      backend/src/web_socket/ws_server.rs
  46. 3 0
      frontend/rust-lib/flowy-core/src/core/aggregate_tasks/mod.rs
  47. 60 0
      frontend/rust-lib/flowy-core/src/core/aggregate_tasks/workspace_task.rs
  48. 24 25
      frontend/rust-lib/flowy-core/src/core/core_context.rs
  49. 56 0
      frontend/rust-lib/flowy-core/src/core/event_handler.rs
  50. 4 3
      frontend/rust-lib/flowy-core/src/core/mod.rs
  51. 0 69
      frontend/rust-lib/flowy-core/src/core/task.rs
  52. 7 7
      frontend/rust-lib/flowy-core/src/module.rs
  53. 2 2
      frontend/rust-lib/flowy-core/src/services/app/controller.rs
  54. 1 1
      frontend/rust-lib/flowy-core/src/services/server/mod.rs
  55. 4 4
      frontend/rust-lib/flowy-core/src/services/server/server_api.rs
  56. 10 105
      frontend/rust-lib/flowy-core/src/services/workspace/controller.rs
  57. 0 18
      frontend/rust-lib/flowy-core/src/services/workspace/event_handler.rs
  58. 2 8
      frontend/rust-lib/flowy-core/src/services/workspace/sql.rs
  59. 6 6
      frontend/rust-lib/flowy-sdk/src/lib.rs
  60. 3 3
      frontend/rust-lib/flowy-sdk/src/module.rs
  61. 1 1
      frontend/rust-lib/flowy-user/src/services/server/mod.rs
  62. 3 3
      frontend/rust-lib/flowy-user/src/services/server/server_api.rs

+ 8 - 7
backend/src/application.rs

@@ -1,9 +1,8 @@
-use std::{net::TcpListener, time::Duration};
-
 use actix::Actor;
 use actix_identity::{CookieIdentityPolicy, IdentityService};
 use actix_web::{dev::Server, middleware, web, web::Data, App, HttpServer, Scope};
 use sqlx::{postgres::PgPoolOptions, PgPool};
+use std::{net::TcpListener, time::Duration};
 use tokio::time::interval;
 
 use crate::{
@@ -13,16 +12,15 @@ use crate::{
         Settings,
     },
     context::AppContext,
-    service::{
+    services::{
         app::router as app,
         doc::router as doc,
         trash::router as trash,
         user::router as user,
         view::router as view,
         workspace::router as workspace,
-        ws,
-        ws::WsServer,
     },
+    web_socket::WsServer,
 };
 
 pub struct Application {
@@ -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 {
     // 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::get().to(trash::read_handler))
         )
+        .service(web::resource("/sync")
+            .route(web::post().to(trash::create_handler))
+        )
         // password
         .service(web::resource("/password_change")
             .route(web::post().to(user::change_password))
@@ -131,7 +132,7 @@ fn user_scope() -> Scope {
 }
 
 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")
         .build();
     let pg_pool = get_connection_pool(&configuration.database)

+ 3 - 3
backend/src/context.rs

@@ -1,6 +1,6 @@
-use crate::service::{
-    doc::manager::DocBiz,
-    ws::{WsBizHandlers, WsServer},
+use crate::{
+    services::doc::manager::DocBiz,
+    web_socket::{WsBizHandlers, WsServer},
 };
 use actix::Addr;
 use actix_web::web::Data;

+ 1 - 1
backend/src/entities/token.rs

@@ -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 backend_service::configuration::HEADER_TOKEN;
 use futures::future::{ready, Ready};

+ 2 - 1
backend/src/lib.rs

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

+ 1 - 1
backend/src/middleware/auth_middleware.rs

@@ -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_web::{
     dev::{ServiceRequest, ServiceResponse},

+ 2 - 2
backend/src/service/app/app.rs → backend/src/services/app/app.rs

@@ -1,10 +1,10 @@
 use crate::{
     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},
 };
 
-use crate::service::trash::read_trash_ids;
+use crate::services::trash::read_trash_ids;
 use backend_service::errors::{invalid_params, ServerError};
 use chrono::Utc;
 use flowy_workspace_infra::{

+ 0 - 0
backend/src/service/app/mod.rs → backend/src/services/app/mod.rs


+ 1 - 1
backend/src/service/app/router.rs → backend/src/services/app/router.rs

@@ -7,7 +7,7 @@ use flowy_workspace_infra::protobuf::{AppIdentifier, CreateAppParams, UpdateAppP
 use protobuf::Message;
 use sqlx::PgPool;
 
-use crate::service::{
+use crate::services::{
     app::{
         app::{create_app, delete_app, read_app, update_app},
         sql_builder::check_app_id,

+ 0 - 0
backend/src/service/app/sql_builder.rs → backend/src/services/app/sql_builder.rs


+ 0 - 0
backend/src/service/doc/crud.rs → backend/src/services/doc/crud.rs


+ 3 - 3
backend/src/service/doc/edit/edit_actor.rs → backend/src/services/doc/edit/edit_actor.rs

@@ -1,6 +1,6 @@
-use crate::service::{
-    doc::edit::ServerDocEditor,
-    ws::{entities::Socket, WsUser},
+use crate::{
+    services::doc::edit::ServerDocEditor,
+    web_socket::{entities::Socket, WsUser},
 };
 use actix_web::web::Data;
 use async_stream::stream;

+ 6 - 4
backend/src/service/doc/edit/editor.rs → backend/src/services/doc/edit/editor.rs

@@ -1,7 +1,9 @@
-use crate::service::{
-    doc::{edit::edit_actor::EditUser, update_doc},
-    util::md5,
-    ws::{entities::Socket, WsMessageAdaptor},
+use crate::{
+    services::{
+        doc::{edit::edit_actor::EditUser, update_doc},
+        util::md5,
+    },
+    web_socket::{entities::Socket, WsMessageAdaptor},
 };
 use actix_web::web::Data;
 use backend_service::errors::{internal_error, ServerError};

+ 0 - 0
backend/src/service/doc/edit/mod.rs → backend/src/services/doc/edit/mod.rs


+ 3 - 3
backend/src/service/doc/manager.rs → backend/src/services/doc/manager.rs

@@ -1,10 +1,10 @@
-use crate::service::{
-    doc::{
+use crate::{
+    services::doc::{
         edit::edit_actor::{EditDocActor, EditMsg},
         read_doc,
         ws_actor::{DocWsActor, DocWsMsg},
     },
-    ws::{entities::Socket, WsBizHandler, WsClientData, WsUser},
+    web_socket::{entities::Socket, WsBizHandler, WsClientData, WsUser},
 };
 use actix_web::web::Data;
 use backend_service::errors::{internal_error, Result as DocResult, ServerError};

+ 0 - 0
backend/src/service/doc/mod.rs → backend/src/services/doc/mod.rs


+ 1 - 1
backend/src/service/doc/router.rs → backend/src/services/doc/router.rs

@@ -1,4 +1,4 @@
-use crate::service::{
+use crate::services::{
     doc::{create_doc, read_doc, update_doc},
     util::parse_from_payload,
 };

+ 6 - 4
backend/src/service/doc/ws_actor.rs → backend/src/services/doc/ws_actor.rs

@@ -1,7 +1,9 @@
-use crate::service::{
-    doc::manager::{DocManager, DocOpenHandle},
-    util::{md5, parse_from_bytes},
-    ws::{entities::Socket, WsClientData, WsUser},
+use crate::{
+    services::{
+        doc::manager::{DocManager, DocOpenHandle},
+        util::{md5, parse_from_bytes},
+    },
+    web_socket::{entities::Socket, WsClientData, WsUser},
 };
 use actix_rt::task::spawn_blocking;
 use actix_web::web::Data;

+ 0 - 0
backend/src/service/log/mod.rs → backend/src/services/log.rs


+ 0 - 1
backend/src/service/mod.rs → backend/src/services/mod.rs

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

+ 0 - 0
backend/src/service/trash/mod.rs → backend/src/services/trash/mod.rs


+ 1 - 1
backend/src/service/trash/router.rs → backend/src/services/trash/router.rs

@@ -1,4 +1,4 @@
-use crate::service::{
+use crate::services::{
     trash::{create_trash, delete_all_trash, delete_trash, read_trash},
     user::LoggedUser,
     util::parse_from_payload,

+ 1 - 1
backend/src/service/trash/trash.rs → backend/src/services/trash/trash.rs

@@ -1,6 +1,6 @@
 use crate::{
     entities::workspace::{TrashTable, TRASH_TABLE},
-    service::{
+    services::{
         app::app::{delete_app, read_app_table},
         user::LoggedUser,
         view::{delete_view, read_view_table},

+ 2 - 3
backend/src/service/user/auth.rs → backend/src/services/user/auth.rs

@@ -1,6 +1,6 @@
 use crate::{
     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},
 };
 use anyhow::Context;
@@ -16,7 +16,7 @@ use flowy_user_infra::{
 use sqlx::{PgPool, Postgres};
 
 use super::AUTHORIZED_USERS;
-use crate::service::user::user_default::create_default_workspace;
+use crate::services::user::user_default::create_default_workspace;
 
 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))?;
@@ -68,7 +68,6 @@ pub async fn register_user(pool: &PgPool, params: SignUpParams) -> Result<FlowyR
 
     let logged_user = LoggedUser::new(&response_data.user_id);
     AUTHORIZED_USERS.store_auth(logged_user, true);
-    let _ = create_default_workspace(&mut transaction, response_data.get_user_id()).await?;
 
     transaction
         .commit()

+ 0 - 0
backend/src/service/user/logged_user.rs → backend/src/services/user/logged_user.rs


+ 0 - 0
backend/src/service/user/mod.rs → backend/src/services/user/mod.rs


+ 1 - 1
backend/src/service/user/router.rs → backend/src/services/user/router.rs

@@ -11,7 +11,7 @@ use flowy_user_infra::protobuf::{SignInParams, SignUpParams, UpdateUserParams};
 
 use crate::{
     entities::token::Token,
-    service::{
+    services::{
         user::{get_user_profile, register_user, set_user_profile, sign_in, sign_out, LoggedUser},
         util::parse_from_payload,
     },

+ 3 - 2
backend/src/service/user/user_default.rs → backend/src/services/user/user_default.rs

@@ -1,18 +1,19 @@
 use crate::{
-    service::{
+    services::{
         app::sql_builder::NewAppSqlBuilder as AppBuilder,
         workspace::sql_builder::NewWorkspaceBuilder as WorkspaceBuilder,
     },
     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 chrono::Utc;
 use flowy_document_infra::user_default::doc_initial_string;
 use flowy_workspace_infra::protobuf::Workspace;
 use std::convert::TryInto;
 
+#[allow(dead_code)]
 pub async fn create_default_workspace(
     transaction: &mut DBTransaction<'_>,
     user_id: &str,

+ 0 - 0
backend/src/service/user/utils.rs → backend/src/services/user/utils.rs


+ 0 - 0
backend/src/service/util.rs → backend/src/services/util.rs


+ 0 - 0
backend/src/service/view/mod.rs → backend/src/services/view/mod.rs


+ 1 - 1
backend/src/service/view/router.rs → backend/src/services/view/router.rs

@@ -1,4 +1,4 @@
-use crate::service::{
+use crate::services::{
     doc::manager::DocBiz,
     user::LoggedUser,
     util::parse_from_payload,

+ 0 - 0
backend/src/service/view/sql_builder.rs → backend/src/services/view/sql_builder.rs


+ 1 - 1
backend/src/service/view/view.rs → backend/src/services/view/view.rs

@@ -1,6 +1,6 @@
 use crate::{
     entities::workspace::{ViewTable, VIEW_TABLE},
-    service::{
+    services::{
         doc::{create_doc, delete_doc},
         trash::read_trash_ids,
         user::LoggedUser,

+ 0 - 0
backend/src/service/workspace/mod.rs → backend/src/services/workspace/mod.rs


+ 1 - 1
backend/src/service/workspace/router.rs → backend/src/services/workspace/router.rs

@@ -1,4 +1,4 @@
-use crate::service::{
+use crate::services::{
     user::LoggedUser,
     util::parse_from_payload,
     workspace::{

+ 0 - 0
backend/src/service/workspace/sql_builder.rs → backend/src/services/workspace/sql_builder.rs


+ 1 - 1
backend/src/service/workspace/workspace.rs → backend/src/services/workspace/workspace.rs

@@ -1,7 +1,7 @@
 use super::sql_builder::NewWorkspaceBuilder;
 use crate::{
     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::*,
 };
 use anyhow::Context;

+ 1 - 2
backend/src/service/ws/biz_handler.rs → backend/src/web_socket/biz_handler.rs

@@ -1,5 +1,4 @@
-use crate::service::ws::WsClientData;
-
+use crate::web_socket::WsClientData;
 use lib_ws::WsModule;
 use std::{collections::HashMap, sync::Arc};
 

+ 1 - 1
backend/src/service/ws/entities/connect.rs → backend/src/web_socket/entities/connect.rs

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

+ 0 - 0
backend/src/service/ws/entities/message.rs → backend/src/web_socket/entities/message.rs


+ 0 - 0
backend/src/service/ws/entities/mod.rs → backend/src/web_socket/entities/mod.rs


+ 0 - 0
backend/src/service/ws/mod.rs → backend/src/web_socket/mod.rs


+ 3 - 3
backend/src/service/ws/router.rs → backend/src/web_socket/router.rs

@@ -1,6 +1,6 @@
-use crate::service::{
-    user::LoggedUser,
-    ws::{WsBizHandlers, WsClient, WsServer, WsUser},
+use crate::{
+    services::user::LoggedUser,
+    web_socket::{WsBizHandlers, WsClient, WsServer, WsUser},
 };
 use actix::Addr;
 use actix_web::{

+ 6 - 8
backend/src/service/ws/ws_client.rs → backend/src/web_socket/ws_client.rs

@@ -1,13 +1,11 @@
 use crate::{
     config::{HEARTBEAT_INTERVAL, PING_TIMEOUT},
-    service::{
-        user::LoggedUser,
-        ws::{
-            entities::{Connect, Disconnect, Socket},
-            WsBizHandlers,
-            WsMessageAdaptor,
-            WsServer,
-        },
+    services::user::LoggedUser,
+    web_socket::{
+        entities::{Connect, Disconnect, Socket},
+        WsBizHandlers,
+        WsMessageAdaptor,
+        WsServer,
     },
 };
 use actix::*;

+ 1 - 1
backend/src/service/ws/ws_server.rs → backend/src/web_socket/ws_server.rs

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

+ 3 - 0
frontend/rust-lib/flowy-core/src/core/aggregate_tasks/mod.rs

@@ -0,0 +1,3 @@
+mod workspace_task;
+
+pub use workspace_task::*;

+ 60 - 0
frontend/rust-lib/flowy-core/src/core/aggregate_tasks/workspace_task.rs

@@ -0,0 +1,60 @@
+use crate::{
+    core::CoreContext,
+    errors::WorkspaceError,
+    notify::{send_dart_notification, WorkspaceNotification},
+    services::workspace::sql::{WorkspaceTable, WorkspaceTableSql},
+};
+use flowy_workspace_infra::entities::workspace::WorkspaceIdentifier;
+use lib_dispatch::prelude::Unit;
+use std::sync::Arc;
+
+#[tracing::instrument(level = "debug", skip(core), err)]
+pub fn read_workspaces_on_server(
+    core: Unit<Arc<CoreContext>>,
+    user_id: String,
+    params: WorkspaceIdentifier,
+) -> Result<(), WorkspaceError> {
+    let (token, server) = (core.user.token()?, core.server.clone());
+    let app_ctrl = core.app_controller.clone();
+    let view_ctrl = core.view_controller.clone();
+    let conn = core.database.db_connection()?;
+
+    tokio::spawn(async move {
+        // Opti: handle the error and retry?
+        let workspaces = server.read_workspace(&token, params).await?;
+        let _ = (&*conn).immediate_transaction::<_, WorkspaceError, _>(|| {
+            tracing::debug!("Save {} workspace", workspaces.len());
+            for workspace in &workspaces.items {
+                let m_workspace = workspace.clone();
+                let apps = m_workspace.apps.clone().into_inner();
+                let workspace_table = WorkspaceTable::new(m_workspace, &user_id);
+
+                let _ = WorkspaceTableSql::create_workspace(workspace_table, &*conn)?;
+                tracing::debug!("Save {} apps", apps.len());
+                for app in apps {
+                    let views = app.belongings.clone().into_inner();
+                    match app_ctrl.save_app(app, &*conn) {
+                        Ok(_) => {},
+                        Err(e) => log::error!("create app failed: {:?}", e),
+                    }
+
+                    tracing::debug!("Save {} views", views.len());
+                    for view in views {
+                        match view_ctrl.save_view(view, &*conn) {
+                            Ok(_) => {},
+                            Err(e) => log::error!("create view failed: {:?}", e),
+                        }
+                    }
+                }
+            }
+            Ok(())
+        })?;
+
+        send_dart_notification(&token, WorkspaceNotification::WorkspaceListUpdated)
+            .payload(workspaces)
+            .send();
+        Result::<(), WorkspaceError>::Ok(())
+    });
+
+    Ok(())
+}

+ 24 - 25
frontend/rust-lib/flowy-core/src/core/flowy_core.rs → frontend/rust-lib/flowy-core/src/core/core_context.rs

@@ -1,7 +1,7 @@
 use crate::{
     entities::workspace::RepeatedWorkspace,
     errors::{WorkspaceError, WorkspaceResult},
-    module::WorkspaceUser,
+    module::{WorkspaceDatabase, WorkspaceUser},
     notify::{send_dart_notification, WorkspaceNotification},
     services::{server::Server, AppController, TrashController, ViewController, WorkspaceController},
 };
@@ -12,24 +12,25 @@ use lazy_static::lazy_static;
 use lib_infra::entities::network_state::NetworkType;
 use parking_lot::RwLock;
 use std::{collections::HashMap, sync::Arc};
-
 lazy_static! {
     static ref INIT_WORKSPACE: RwLock<HashMap<String, bool>> = RwLock::new(HashMap::new());
 }
 
-pub struct FlowyCore {
+pub struct CoreContext {
     pub user: Arc<dyn WorkspaceUser>,
-    server: Server,
+    pub(crate) server: Server,
+    pub(crate) database: Arc<dyn WorkspaceDatabase>,
     pub workspace_controller: Arc<WorkspaceController>,
     pub(crate) app_controller: Arc<AppController>,
     pub(crate) view_controller: Arc<ViewController>,
     pub(crate) trash_controller: Arc<TrashController>,
 }
 
-impl FlowyCore {
+impl CoreContext {
     pub(crate) fn new(
         user: Arc<dyn WorkspaceUser>,
         server: Server,
+        database: Arc<dyn WorkspaceDatabase>,
         workspace_controller: Arc<WorkspaceController>,
         app_controller: Arc<AppController>,
         view_controller: Arc<ViewController>,
@@ -42,6 +43,7 @@ impl FlowyCore {
         Self {
             user,
             server,
+            database,
             workspace_controller,
             app_controller,
             view_controller,
@@ -49,24 +51,6 @@ impl FlowyCore {
         }
     }
 
-    async fn init(&self, token: &str) -> Result<(), WorkspaceError> {
-        if let Some(is_init) = INIT_WORKSPACE.read().get(token) {
-            if *is_init {
-                return Ok(());
-            }
-        }
-        log::debug!("Start initializing flowy core");
-        INIT_WORKSPACE.write().insert(token.to_owned(), true);
-        let _ = self.server.init();
-        let _ = self.workspace_controller.init()?;
-        let _ = self.app_controller.init()?;
-        let _ = self.view_controller.init()?;
-        let _ = self.trash_controller.init()?;
-        log::debug!("Finish initializing core");
-
-        Ok(())
-    }
-
     pub fn network_state_changed(&self, new_type: NetworkType) {
         match new_type {
             NetworkType::UnknownNetworkType => {},
@@ -77,8 +61,6 @@ impl FlowyCore {
     }
 
     pub async fn user_did_sign_in(&self, token: &str) -> WorkspaceResult<()> {
-        // TODO: (nathan) do something here
-
         log::debug!("workspace initialize after sign in");
         let _ = self.init(token).await?;
         Ok(())
@@ -131,4 +113,21 @@ impl FlowyCore {
         let _ = self.init(&token).await?;
         Ok(())
     }
+
+    async fn init(&self, token: &str) -> Result<(), WorkspaceError> {
+        if let Some(is_init) = INIT_WORKSPACE.read().get(token) {
+            if *is_init {
+                return Ok(());
+            }
+        }
+        log::debug!("Start initializing flowy core");
+        INIT_WORKSPACE.write().insert(token.to_owned(), true);
+        let _ = self.workspace_controller.init()?;
+        let _ = self.app_controller.init()?;
+        let _ = self.view_controller.init()?;
+        let _ = self.trash_controller.init()?;
+        log::debug!("Finish initializing core");
+
+        Ok(())
+    }
 }

+ 56 - 0
frontend/rust-lib/flowy-core/src/core/event_handler.rs

@@ -0,0 +1,56 @@
+use crate::{
+    core::{aggregate_tasks::read_workspaces_on_server, CoreContext},
+    errors::WorkspaceError,
+    services::{get_current_workspace, read_local_workspace_apps},
+};
+use flowy_workspace_infra::entities::{
+    view::View,
+    workspace::{CurrentWorkspaceSetting, QueryWorkspaceRequest, RepeatedWorkspace, WorkspaceIdentifier},
+};
+use lib_dispatch::prelude::{data_result, Data, DataResult, Unit};
+use std::{convert::TryInto, sync::Arc};
+
+#[tracing::instrument(skip(data, core), err)]
+pub(crate) async fn read_workspaces_handler(
+    data: Data<QueryWorkspaceRequest>,
+    core: Unit<Arc<CoreContext>>,
+) -> DataResult<RepeatedWorkspace, WorkspaceError> {
+    let params: WorkspaceIdentifier = data.into_inner().try_into()?;
+    let user_id = core.user.user_id()?;
+    let conn = &*core.database.db_connection()?;
+    let workspace_controller = core.workspace_controller.clone();
+
+    let trash_controller = core.trash_controller.clone();
+    let workspaces = conn.immediate_transaction::<_, WorkspaceError, _>(|| {
+        let mut workspaces = workspace_controller.read_local_workspaces(params.workspace_id.clone(), &user_id, conn)?;
+        for workspace in workspaces.iter_mut() {
+            let apps = read_local_workspace_apps(&workspace.id, trash_controller.clone(), conn)?.into_inner();
+            workspace.apps.items = apps;
+        }
+        Ok(workspaces)
+    })?;
+
+    let _ = read_workspaces_on_server(core, user_id, params);
+
+    data_result(workspaces)
+}
+
+#[tracing::instrument(skip(core), err)]
+pub async fn read_cur_workspace_handler(
+    core: Unit<Arc<CoreContext>>,
+) -> DataResult<CurrentWorkspaceSetting, WorkspaceError> {
+    let workspace_id = get_current_workspace()?;
+    let user_id = core.user.user_id()?;
+    let params = WorkspaceIdentifier {
+        workspace_id: Some(workspace_id.clone()),
+    };
+    let conn = &*core.database.db_connection()?;
+    let workspace = core
+        .workspace_controller
+        .read_local_workspace(workspace_id, &user_id, conn)?;
+
+    let latest_view: Option<View> = core.view_controller.latest_visit_view().unwrap_or(None);
+    let setting = CurrentWorkspaceSetting { workspace, latest_view };
+    let _ = read_workspaces_on_server(core, user_id, params);
+    data_result(setting)
+}

+ 4 - 3
frontend/rust-lib/flowy-core/src/core/mod.rs

@@ -1,4 +1,5 @@
-mod flowy_core;
-mod task;
+mod aggregate_tasks;
+mod core_context;
 
-pub use flowy_core::*;
+pub mod event_handler;
+pub use core_context::*;

+ 0 - 69
frontend/rust-lib/flowy-core/src/core/task.rs

@@ -1,69 +0,0 @@
-use crate::{errors::WorkspaceError, services::WorkspaceController};
-use flowy_workspace_infra::entities::workspace::{QueryWorkspaceRequest, RepeatedWorkspace, WorkspaceIdentifier};
-use lib_dispatch::prelude::{data_result, Data, DataResult, Unit};
-use std::{convert::TryInto, sync::Arc};
-
-#[tracing::instrument(skip(data, controller), err)]
-pub(crate) async fn read_workspaces_handler(
-    data: Data<QueryWorkspaceRequest>,
-    controller: Unit<Arc<WorkspaceController>>,
-) -> DataResult<RepeatedWorkspace, WorkspaceError> {
-    let params: WorkspaceIdentifier = data.into_inner().try_into()?;
-    let user_id = controller.user.user_id()?;
-    let workspaces = controller.read_local_workspaces(
-        params.workspace_id.clone(),
-        &user_id,
-        &*controller.database.db_connection()?,
-    )?;
-    let _ = controller.read_workspaces_on_server(user_id, params);
-
-    data_result(workspaces)
-}
-
-// #[tracing::instrument(level = "debug", skip(self), err)]
-// fn read_workspaces_on_server(&self, user_id: String, params:
-// WorkspaceIdentifier) -> Result<(), WorkspaceError> {     let (token, server)
-// = self.token_with_server()?;     let workspace_sql =
-// self.workspace_sql.clone();     let app_ctrl = self.app_controller.clone();
-//     let view_ctrl = self.view_controller.clone();
-//     let conn = self.database.db_connection()?;
-//     tokio::spawn(async move {
-//         // Opti: handle the error and retry?
-//         let workspaces = server.read_workspace(&token, params).await?;
-//         let _ = (&*conn).immediate_transaction::<_, WorkspaceError, _>(|| {
-//             tracing::debug!("Save {} workspace", workspaces.len());
-//             for workspace in &workspaces.items {
-//                 let m_workspace = workspace.clone();
-//                 let apps = m_workspace.apps.clone().into_inner();
-//                 let workspace_table = WorkspaceTable::new(m_workspace,
-// &user_id);
-//
-//                 let _ = workspace_sql.create_workspace(workspace_table,
-// &*conn)?;                 tracing::debug!("Save {} apps", apps.len());
-//                 for app in apps {
-//                     let views = app.belongings.clone().into_inner();
-//                     match app_ctrl.save_app(app, &*conn) {
-//                         Ok(_) => {},
-//                         Err(e) => log::error!("create app failed: {:?}", e),
-//                     }
-//
-//                     tracing::debug!("Save {} views", views.len());
-//                     for view in views {
-//                         match view_ctrl.save_view(view, &*conn) {
-//                             Ok(_) => {},
-//                             Err(e) => log::error!("create view failed: {:?}",
-// e),                         }
-//                     }
-//                 }
-//             }
-//             Ok(())
-//         })?;
-//
-//         send_dart_notification(&token,
-// WorkspaceNotification::WorkspaceListUpdated)             .payload(workspaces)
-//             .send();
-//         Result::<(), WorkspaceError>::Ok(())
-//     });
-//
-//     Ok(())
-// }

+ 7 - 7
frontend/rust-lib/flowy-core/src/module.rs

@@ -7,7 +7,7 @@ use lib_dispatch::prelude::*;
 use lib_sqlite::ConnectionPool;
 
 use crate::{
-    core::FlowyCore,
+    core::{event_handler::*, CoreContext},
     errors::WorkspaceError,
     event::WorkspaceEvent,
     services::{
@@ -45,7 +45,7 @@ pub fn init_core(
     database: Arc<dyn WorkspaceDatabase>,
     flowy_document: Arc<FlowyDocument>,
     server_config: &ClientServerConfiguration,
-) -> Arc<FlowyCore> {
+) -> Arc<CoreContext> {
     let server = construct_workspace_server(server_config);
 
     let trash_controller = Arc::new(TrashController::new(database.clone(), server.clone(), user.clone()));
@@ -68,15 +68,14 @@ pub fn init_core(
     let workspace_controller = Arc::new(WorkspaceController::new(
         user.clone(),
         database.clone(),
-        app_controller.clone(),
-        view_controller.clone(),
         trash_controller.clone(),
         server.clone(),
     ));
 
-    Arc::new(FlowyCore::new(
+    Arc::new(CoreContext::new(
         user,
         server,
+        database,
         workspace_controller,
         app_controller,
         view_controller,
@@ -84,13 +83,14 @@ pub fn init_core(
     ))
 }
 
-pub fn create(core: Arc<FlowyCore>) -> Module {
+pub fn create(core: Arc<CoreContext>) -> Module {
     let mut module = Module::new()
         .name("Flowy-Workspace")
         .data(core.workspace_controller.clone())
         .data(core.app_controller.clone())
         .data(core.view_controller.clone())
-        .data(core.trash_controller.clone());
+        .data(core.trash_controller.clone())
+        .data(core.clone());
 
     module = module
         .event(WorkspaceEvent::CreateWorkspace, create_workspace_handler)

+ 2 - 2
frontend/rust-lib/flowy-core/src/services/app/controller.rs

@@ -241,11 +241,11 @@ fn notify_apps_changed(
 
 pub fn read_local_workspace_apps(
     workspace_id: &str,
-    trash_can: Arc<TrashController>,
+    trash_controller: Arc<TrashController>,
     conn: &SqliteConnection,
 ) -> Result<RepeatedApp, WorkspaceError> {
     let mut app_tables = AppTableSql::read_workspace_apps(workspace_id, false, conn)?;
-    let trash_ids = trash_can.trash_ids(conn)?;
+    let trash_ids = trash_controller.trash_ids(conn)?;
     app_tables.retain(|app_table| !trash_ids.contains(&app_table.id));
 
     let apps = app_tables.into_iter().map(|table| table.into()).collect::<Vec<App>>();

+ 1 - 1
frontend/rust-lib/flowy-core/src/services/server/mod.rs

@@ -66,7 +66,7 @@ pub(crate) fn construct_workspace_server(
     config: &ClientServerConfiguration,
 ) -> Arc<dyn WorkspaceServerAPI + Send + Sync> {
     if cfg!(feature = "http_server") {
-        Arc::new(WorkspaceServer::new(config.clone()))
+        Arc::new(WorkspaceHttpServer::new(config.clone()))
     } else {
         Arc::new(WorkspaceServerMock {})
     }

+ 4 - 4
frontend/rust-lib/flowy-core/src/services/server/server_api.rs

@@ -13,15 +13,15 @@ use backend_service::{configuration::ClientServerConfiguration, middleware::*, w
 use flowy_workspace_infra::errors::ErrorCode;
 use lib_infra::future::ResultFuture;
 
-pub struct WorkspaceServer {
+pub struct WorkspaceHttpServer {
     config: ClientServerConfiguration,
 }
 
-impl WorkspaceServer {
-    pub fn new(config: ClientServerConfiguration) -> WorkspaceServer { Self { config } }
+impl WorkspaceHttpServer {
+    pub fn new(config: ClientServerConfiguration) -> WorkspaceHttpServer { Self { config } }
 }
 
-impl WorkspaceServerAPI for WorkspaceServer {
+impl WorkspaceServerAPI for WorkspaceHttpServer {
     fn init(&self) {
         let mut rx = BACKEND_API_MIDDLEWARE.invalid_token_subscribe();
         tokio::spawn(async move {

+ 10 - 105
frontend/rust-lib/flowy-core/src/services/workspace/controller.rs

@@ -6,22 +6,17 @@ use crate::{
         read_local_workspace_apps,
         server::Server,
         workspace::sql::{WorkspaceTable, WorkspaceTableChangeset, WorkspaceTableSql},
-        AppController,
         TrashController,
-        ViewController,
     },
 };
 use flowy_database::SqliteConnection;
-use flowy_workspace_infra::entities::{app::RepeatedApp, view::View, workspace::*};
+use flowy_workspace_infra::entities::{app::RepeatedApp, workspace::*};
 use lib_infra::kv::KV;
 use std::sync::Arc;
 
 pub struct WorkspaceController {
     pub user: Arc<dyn WorkspaceUser>,
-    pub(crate) workspace_sql: Arc<WorkspaceTableSql>,
-    pub(crate) view_controller: Arc<ViewController>,
     pub(crate) database: Arc<dyn WorkspaceDatabase>,
-    pub(crate) app_controller: Arc<AppController>,
     pub(crate) trash_controller: Arc<TrashController>,
     server: Server,
 }
@@ -30,18 +25,12 @@ impl WorkspaceController {
     pub(crate) fn new(
         user: Arc<dyn WorkspaceUser>,
         database: Arc<dyn WorkspaceDatabase>,
-        app_controller: Arc<AppController>,
-        view_controller: Arc<ViewController>,
         trash_can: Arc<TrashController>,
         server: Server,
     ) -> Self {
-        let workspace_sql = Arc::new(WorkspaceTableSql {});
         Self {
             user,
-            workspace_sql,
-            view_controller,
             database,
-            app_controller,
             trash_controller: trash_can,
             server,
         }
@@ -74,7 +63,7 @@ impl WorkspaceController {
         // other journaling modes, EXCLUSIVE prevents other database connections from
         // reading the database while the transaction is underway.
         conn.immediate_transaction::<_, WorkspaceError, _>(|| {
-            self.workspace_sql.create_workspace(workspace_table, conn)?;
+            WorkspaceTableSql::create_workspace(workspace_table, conn)?;
             let repeated_workspace = self.read_local_workspaces(None, &user_id, conn)?;
             send_dart_notification(&token, WorkspaceNotification::UserCreateWorkspace)
                 .payload(repeated_workspace)
@@ -94,7 +83,7 @@ impl WorkspaceController {
         let workspace_id = changeset.id.clone();
         let conn = &*self.database.db_connection()?;
         conn.immediate_transaction::<_, WorkspaceError, _>(|| {
-            let _ = self.workspace_sql.update_workspace(changeset, conn)?;
+            let _ = WorkspaceTableSql::update_workspace(changeset, conn)?;
             let user_id = self.user.user_id()?;
             let workspace = self.read_local_workspace(workspace_id.clone(), &user_id, conn)?;
             send_dart_notification(&workspace_id, WorkspaceNotification::WorkspaceUpdated)
@@ -115,7 +104,7 @@ impl WorkspaceController {
         let token = self.user.token()?;
         let conn = &*self.database.db_connection()?;
         conn.immediate_transaction::<_, WorkspaceError, _>(|| {
-            let _ = self.workspace_sql.delete_workspace(workspace_id, conn)?;
+            let _ = WorkspaceTableSql::delete_workspace(workspace_id, conn)?;
             let repeated_workspace = self.read_local_workspaces(None, &user_id, conn)?;
             send_dart_notification(&token, WorkspaceNotification::UserDeleteWorkspace)
                 .payload(repeated_workspace)
@@ -140,31 +129,6 @@ impl WorkspaceController {
         }
     }
 
-    pub(crate) async fn read_workspaces(
-        &self,
-        params: WorkspaceIdentifier,
-    ) -> Result<RepeatedWorkspace, WorkspaceError> {
-        let user_id = self.user.user_id()?;
-        let workspaces =
-            self.read_local_workspaces(params.workspace_id.clone(), &user_id, &*self.database.db_connection()?)?;
-        let _ = self.read_workspaces_on_server(user_id, params);
-        Ok(workspaces)
-    }
-
-    pub(crate) async fn read_current_workspace(&self) -> Result<CurrentWorkspaceSetting, WorkspaceError> {
-        let workspace_id = get_current_workspace()?;
-        let user_id = self.user.user_id()?;
-        let params = WorkspaceIdentifier {
-            workspace_id: Some(workspace_id.clone()),
-        };
-        let workspace = self.read_local_workspace(workspace_id, &user_id, &*self.database.db_connection()?)?;
-
-        let latest_view: Option<View> = self.view_controller.latest_visit_view().unwrap_or(None);
-        let setting = CurrentWorkspaceSetting { workspace, latest_view };
-        let _ = self.read_workspaces_on_server(user_id, params)?;
-        Ok(setting)
-    }
-
     pub(crate) async fn read_current_workspace_apps(&self) -> Result<RepeatedApp, WorkspaceError> {
         let workspace_id = get_current_workspace()?;
         let conn = self.database.db_connection()?;
@@ -181,19 +145,17 @@ impl WorkspaceController {
         conn: &SqliteConnection,
     ) -> Result<RepeatedWorkspace, WorkspaceError> {
         let workspace_id = workspace_id.to_owned();
-        let workspace_tables = self.workspace_sql.read_workspaces(workspace_id, user_id, conn)?;
+        let workspace_tables = WorkspaceTableSql::read_workspaces(workspace_id, user_id, conn)?;
 
         let mut workspaces = vec![];
         for table in workspace_tables {
-            let apps = self.read_local_apps(&table.id, conn)?.into_inner();
-            let mut workspace: Workspace = table.into();
-            workspace.apps.items = apps;
+            let workspace: Workspace = table.into();
             workspaces.push(workspace);
         }
         Ok(RepeatedWorkspace { items: workspaces })
     }
 
-    fn read_local_workspace(
+    pub(crate) fn read_local_workspace(
         &self,
         workspace_id: String,
         user_id: &str,
@@ -218,12 +180,6 @@ impl WorkspaceController {
 }
 
 impl WorkspaceController {
-    fn token_with_server(&self) -> Result<(String, Server), WorkspaceError> {
-        let token = self.user.token()?;
-        let server = self.server.clone();
-        Ok((token, server))
-    }
-
     #[tracing::instrument(level = "debug", skip(self), err)]
     async fn create_workspace_on_server(&self, params: CreateWorkspaceParams) -> Result<Workspace, WorkspaceError> {
         let token = self.user.token()?;
@@ -233,7 +189,7 @@ impl WorkspaceController {
 
     #[tracing::instrument(level = "debug", skip(self), err)]
     fn update_workspace_on_server(&self, params: UpdateWorkspaceParams) -> Result<(), WorkspaceError> {
-        let (token, server) = self.token_with_server()?;
+        let (token, server) = (self.user.token()?, self.server.clone());
         tokio::spawn(async move {
             match server.update_workspace(&token, params).await {
                 Ok(_) => {},
@@ -251,7 +207,7 @@ impl WorkspaceController {
         let params = WorkspaceIdentifier {
             workspace_id: Some(workspace_id.to_string()),
         };
-        let (token, server) = self.token_with_server()?;
+        let (token, server) = (self.user.token()?, self.server.clone());
         tokio::spawn(async move {
             match server.delete_workspace(&token, params).await {
                 Ok(_) => {},
@@ -263,64 +219,13 @@ impl WorkspaceController {
         });
         Ok(())
     }
-
-    #[tracing::instrument(level = "debug", skip(self), err)]
-    pub(crate) fn read_workspaces_on_server(
-        &self,
-        user_id: String,
-        params: WorkspaceIdentifier,
-    ) -> Result<(), WorkspaceError> {
-        let (token, server) = self.token_with_server()?;
-        let workspace_sql = self.workspace_sql.clone();
-        let app_ctrl = self.app_controller.clone();
-        let view_ctrl = self.view_controller.clone();
-        let conn = self.database.db_connection()?;
-        tokio::spawn(async move {
-            // Opti: handle the error and retry?
-            let workspaces = server.read_workspace(&token, params).await?;
-            let _ = (&*conn).immediate_transaction::<_, WorkspaceError, _>(|| {
-                tracing::debug!("Save {} workspace", workspaces.len());
-                for workspace in &workspaces.items {
-                    let m_workspace = workspace.clone();
-                    let apps = m_workspace.apps.clone().into_inner();
-                    let workspace_table = WorkspaceTable::new(m_workspace, &user_id);
-
-                    let _ = workspace_sql.create_workspace(workspace_table, &*conn)?;
-                    tracing::debug!("Save {} apps", apps.len());
-                    for app in apps {
-                        let views = app.belongings.clone().into_inner();
-                        match app_ctrl.save_app(app, &*conn) {
-                            Ok(_) => {},
-                            Err(e) => log::error!("create app failed: {:?}", e),
-                        }
-
-                        tracing::debug!("Save {} views", views.len());
-                        for view in views {
-                            match view_ctrl.save_view(view, &*conn) {
-                                Ok(_) => {},
-                                Err(e) => log::error!("create view failed: {:?}", e),
-                            }
-                        }
-                    }
-                }
-                Ok(())
-            })?;
-
-            send_dart_notification(&token, WorkspaceNotification::WorkspaceListUpdated)
-                .payload(workspaces)
-                .send();
-            Result::<(), WorkspaceError>::Ok(())
-        });
-
-        Ok(())
-    }
 }
 
 const CURRENT_WORKSPACE_ID: &str = "current_workspace_id";
 
 fn set_current_workspace(workspace_id: &str) { KV::set_str(CURRENT_WORKSPACE_ID, workspace_id.to_owned()); }
 
-fn get_current_workspace() -> Result<String, WorkspaceError> {
+pub fn get_current_workspace() -> Result<String, WorkspaceError> {
     match KV::get_str(CURRENT_WORKSPACE_ID) {
         None => Err(WorkspaceError::record_not_found()
             .context("Current workspace not found or should call open workspace first")),

+ 0 - 18
frontend/rust-lib/flowy-core/src/services/workspace/event_handler.rs

@@ -15,14 +15,6 @@ pub(crate) async fn create_workspace_handler(
     data_result(detail)
 }
 
-#[tracing::instrument(skip(controller), err)]
-pub(crate) async fn read_cur_workspace_handler(
-    controller: Unit<Arc<WorkspaceController>>,
-) -> DataResult<CurrentWorkspaceSetting, WorkspaceError> {
-    let workspace = controller.read_current_workspace().await?;
-    data_result(workspace)
-}
-
 #[tracing::instrument(skip(controller), err)]
 pub(crate) async fn read_workspace_apps_handler(
     controller: Unit<Arc<WorkspaceController>>,
@@ -31,16 +23,6 @@ pub(crate) async fn read_workspace_apps_handler(
     data_result(repeated_app)
 }
 
-#[tracing::instrument(skip(data, controller), err)]
-pub(crate) async fn read_workspaces_handler(
-    data: Data<QueryWorkspaceRequest>,
-    controller: Unit<Arc<WorkspaceController>>,
-) -> DataResult<RepeatedWorkspace, WorkspaceError> {
-    let params: WorkspaceIdentifier = data.into_inner().try_into()?;
-    let workspaces = controller.read_workspaces(params).await?;
-    data_result(workspaces)
-}
-
 #[tracing::instrument(skip(data, controller), err)]
 pub(crate) async fn open_workspace_handler(
     data: Data<QueryWorkspaceRequest>,

+ 2 - 8
frontend/rust-lib/flowy-core/src/services/workspace/sql.rs

@@ -13,11 +13,7 @@ use flowy_database::{
 pub(crate) struct WorkspaceTableSql {}
 
 impl WorkspaceTableSql {
-    pub(crate) fn create_workspace(
-        &self,
-        table: WorkspaceTable,
-        conn: &SqliteConnection,
-    ) -> Result<(), WorkspaceError> {
+    pub(crate) fn create_workspace(table: WorkspaceTable, conn: &SqliteConnection) -> Result<(), WorkspaceError> {
         match diesel_record_count!(workspace_table, &table.id, conn) {
             0 => diesel_insert_table!(workspace_table, &table, conn),
             _ => {
@@ -29,7 +25,6 @@ impl WorkspaceTableSql {
     }
 
     pub(crate) fn read_workspaces(
-        &self,
         workspace_id: Option<String>,
         user_id: &str,
         conn: &SqliteConnection,
@@ -50,7 +45,6 @@ impl WorkspaceTableSql {
 
     #[allow(dead_code)]
     pub(crate) fn update_workspace(
-        &self,
         changeset: WorkspaceTableChangeset,
         conn: &SqliteConnection,
     ) -> Result<(), WorkspaceError> {
@@ -59,7 +53,7 @@ impl WorkspaceTableSql {
     }
 
     #[allow(dead_code)]
-    pub(crate) fn delete_workspace(&self, workspace_id: &str, conn: &SqliteConnection) -> Result<(), WorkspaceError> {
+    pub(crate) fn delete_workspace(workspace_id: &str, conn: &SqliteConnection) -> Result<(), WorkspaceError> {
         diesel_delete_table!(workspace_table, workspace_id, conn);
         Ok(())
     }

+ 6 - 6
frontend/rust-lib/flowy-sdk/src/lib.rs

@@ -3,7 +3,7 @@ mod deps_resolve;
 pub mod module;
 use crate::deps_resolve::WorkspaceDepsResolver;
 use backend_service::configuration::ClientServerConfiguration;
-use flowy_core::{errors::WorkspaceError, module::init_core, prelude::FlowyCore};
+use flowy_core::{errors::WorkspaceError, module::init_core, prelude::CoreContext};
 use flowy_document::module::FlowyDocument;
 use flowy_user::{
     prelude::UserStatus,
@@ -66,7 +66,7 @@ pub struct FlowySDK {
     config: FlowySDKConfig,
     pub user_session: Arc<UserSession>,
     pub flowy_document: Arc<FlowyDocument>,
-    pub core: Arc<FlowyCore>,
+    pub core: Arc<CoreContext>,
     pub dispatcher: Arc<EventDispatcher>,
 }
 
@@ -99,7 +99,7 @@ impl FlowySDK {
     pub fn dispatcher(&self) -> Arc<EventDispatcher> { self.dispatcher.clone() }
 }
 
-fn _init(dispatch: &EventDispatcher, user_session: Arc<UserSession>, core: Arc<FlowyCore>) {
+fn _init(dispatch: &EventDispatcher, user_session: Arc<UserSession>, core: Arc<CoreContext>) {
     let user_status_subscribe = user_session.notifier.user_status_subscribe();
     let network_status_subscribe = user_session.notifier.network_type_subscribe();
     let cloned_core = core.clone();
@@ -113,7 +113,7 @@ fn _init(dispatch: &EventDispatcher, user_session: Arc<UserSession>, core: Arc<F
     });
 }
 
-async fn _listen_user_status(mut subscribe: broadcast::Receiver<UserStatus>, core: Arc<FlowyCore>) {
+async fn _listen_user_status(mut subscribe: broadcast::Receiver<UserStatus>, core: Arc<CoreContext>) {
     while let Ok(status) = subscribe.recv().await {
         let result = || async {
             match status {
@@ -141,7 +141,7 @@ async fn _listen_user_status(mut subscribe: broadcast::Receiver<UserStatus>, cor
     }
 }
 
-async fn _listen_network_status(mut subscribe: broadcast::Receiver<NetworkType>, core: Arc<FlowyCore>) {
+async fn _listen_network_status(mut subscribe: broadcast::Receiver<NetworkType>, core: Arc<CoreContext>) {
     while let Ok(new_type) = subscribe.recv().await {
         core.network_state_changed(new_type);
     }
@@ -168,7 +168,7 @@ fn mk_core(
     user_session: Arc<UserSession>,
     flowy_document: Arc<FlowyDocument>,
     server_config: &ClientServerConfiguration,
-) -> Arc<FlowyCore> {
+) -> Arc<CoreContext> {
     let workspace_deps = WorkspaceDepsResolver::new(user_session);
     let (user, database) = workspace_deps.split_into();
     init_core(user, database, flowy_document, server_config)

+ 3 - 3
frontend/rust-lib/flowy-sdk/src/module.rs

@@ -1,19 +1,19 @@
 use crate::deps_resolve::DocumentDepsResolver;
 use backend_service::configuration::ClientServerConfiguration;
-use flowy_core::prelude::FlowyCore;
+use flowy_core::prelude::CoreContext;
 use flowy_document::module::FlowyDocument;
 use flowy_user::services::user::UserSession;
 use lib_dispatch::prelude::Module;
 use std::sync::Arc;
 
-pub fn mk_modules(core: Arc<FlowyCore>, user_session: Arc<UserSession>) -> Vec<Module> {
+pub fn mk_modules(core: Arc<CoreContext>, user_session: Arc<UserSession>) -> Vec<Module> {
     let user_module = mk_user_module(user_session);
     let workspace_module = mk_core_module(core);
     vec![user_module, workspace_module]
 }
 
 fn mk_user_module(user_session: Arc<UserSession>) -> Module { flowy_user::module::create(user_session) }
-fn mk_core_module(core: Arc<FlowyCore>) -> Module { flowy_core::module::create(core) }
+fn mk_core_module(core: Arc<CoreContext>) -> Module { flowy_core::module::create(core) }
 
 pub fn mk_document_module(
     user_session: Arc<UserSession>,

+ 1 - 1
frontend/rust-lib/flowy-user/src/services/server/mod.rs

@@ -23,7 +23,7 @@ pub trait UserServerAPI {
 
 pub(crate) fn construct_user_server(config: &ClientServerConfiguration) -> Arc<dyn UserServerAPI + Send + Sync> {
     if cfg!(feature = "http_server") {
-        Arc::new(UserServer::new(config.clone()))
+        Arc::new(UserHttpServer::new(config.clone()))
     } else {
         Arc::new(UserServerMock {})
     }

+ 3 - 3
frontend/rust-lib/flowy-user/src/services/server/server_api.rs

@@ -6,14 +6,14 @@ use crate::{
 use backend_service::{configuration::*, user_request::*};
 use lib_infra::future::ResultFuture;
 
-pub struct UserServer {
+pub struct UserHttpServer {
     config: ClientServerConfiguration,
 }
-impl UserServer {
+impl UserHttpServer {
     pub fn new(config: ClientServerConfiguration) -> Self { Self { config } }
 }
 
-impl UserServerAPI for UserServer {
+impl UserServerAPI for UserHttpServer {
     fn sign_up(&self, params: SignUpParams) -> ResultFuture<SignUpResponse, UserError> {
         let url = self.config.sign_up_url();
         ResultFuture::new(async move {