mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
refactor backend dir hierarchi
This commit is contained in:
@ -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 {
|
||||||
@ -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)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use crate::service::{
|
use crate::{
|
||||||
doc::manager::DocBiz,
|
services::doc::manager::DocBiz,
|
||||||
ws::{WsBizHandlers, WsServer},
|
web_socket::{WsBizHandlers, WsServer},
|
||||||
};
|
};
|
||||||
use actix::Addr;
|
use actix::Addr;
|
||||||
use actix_web::web::Data;
|
use actix_web::web::Data;
|
||||||
|
@ -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};
|
||||||
|
@ -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;
|
||||||
|
@ -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},
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
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_workspace_infra::{
|
@ -7,7 +7,7 @@ use flowy_workspace_infra::protobuf::{AppIdentifier, CreateAppParams, UpdateAppP
|
|||||||
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,
|
@ -1,6 +1,6 @@
|
|||||||
use crate::service::{
|
use crate::{
|
||||||
doc::edit::ServerDocEditor,
|
services::doc::edit::ServerDocEditor,
|
||||||
ws::{entities::Socket, WsUser},
|
web_socket::{entities::Socket, WsUser},
|
||||||
};
|
};
|
||||||
use actix_web::web::Data;
|
use actix_web::web::Data;
|
||||||
use async_stream::stream;
|
use async_stream::stream;
|
@ -1,7 +1,9 @@
|
|||||||
use crate::service::{
|
use crate::{
|
||||||
doc::{edit::edit_actor::EditUser, update_doc},
|
services::{
|
||||||
util::md5,
|
doc::{edit::edit_actor::EditUser, update_doc},
|
||||||
ws::{entities::Socket, WsMessageAdaptor},
|
util::md5,
|
||||||
|
},
|
||||||
|
web_socket::{entities::Socket, WsMessageAdaptor},
|
||||||
};
|
};
|
||||||
use actix_web::web::Data;
|
use actix_web::web::Data;
|
||||||
use backend_service::errors::{internal_error, ServerError};
|
use backend_service::errors::{internal_error, ServerError};
|
@ -1,10 +1,10 @@
|
|||||||
use crate::service::{
|
use crate::{
|
||||||
doc::{
|
services::doc::{
|
||||||
edit::edit_actor::{EditDocActor, EditMsg},
|
edit::edit_actor::{EditDocActor, EditMsg},
|
||||||
read_doc,
|
read_doc,
|
||||||
ws_actor::{DocWsActor, DocWsMsg},
|
ws_actor::{DocWsActor, DocWsMsg},
|
||||||
},
|
},
|
||||||
ws::{entities::Socket, WsBizHandler, WsClientData, WsUser},
|
web_socket::{entities::Socket, WsBizHandler, WsClientData, WsUser},
|
||||||
};
|
};
|
||||||
use actix_web::web::Data;
|
use actix_web::web::Data;
|
||||||
use backend_service::errors::{internal_error, Result as DocResult, ServerError};
|
use backend_service::errors::{internal_error, Result as DocResult, ServerError};
|
@ -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,
|
||||||
};
|
};
|
@ -1,7 +1,9 @@
|
|||||||
use crate::service::{
|
use crate::{
|
||||||
doc::manager::{DocManager, DocOpenHandle},
|
services::{
|
||||||
util::{md5, parse_from_bytes},
|
doc::manager::{DocManager, DocOpenHandle},
|
||||||
ws::{entities::Socket, WsClientData, WsUser},
|
util::{md5, parse_from_bytes},
|
||||||
|
},
|
||||||
|
web_socket::{entities::Socket, WsClientData, WsUser},
|
||||||
};
|
};
|
||||||
use actix_rt::task::spawn_blocking;
|
use actix_rt::task::spawn_blocking;
|
||||||
use actix_web::web::Data;
|
use actix_web::web::Data;
|
@ -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;
|
|
@ -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,
|
@ -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},
|
@ -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;
|
||||||
@ -16,7 +16,7 @@ use flowy_user_infra::{
|
|||||||
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;
|
use crate::services::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 +68,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()
|
@ -11,7 +11,7 @@ use flowy_user_infra::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,
|
||||||
},
|
},
|
@ -1,18 +1,19 @@
|
|||||||
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_document_infra::user_default::doc_initial_string;
|
||||||
use flowy_workspace_infra::protobuf::Workspace;
|
use flowy_workspace_infra::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,
|
@ -1,4 +1,4 @@
|
|||||||
use crate::service::{
|
use crate::services::{
|
||||||
doc::manager::DocBiz,
|
doc::manager::DocBiz,
|
||||||
user::LoggedUser,
|
user::LoggedUser,
|
||||||
util::parse_from_payload,
|
util::parse_from_payload,
|
@ -1,6 +1,6 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
entities::workspace::{ViewTable, VIEW_TABLE},
|
entities::workspace::{ViewTable, VIEW_TABLE},
|
||||||
service::{
|
services::{
|
||||||
doc::{create_doc, delete_doc},
|
doc::{create_doc, delete_doc},
|
||||||
trash::read_trash_ids,
|
trash::read_trash_ids,
|
||||||
user::LoggedUser,
|
user::LoggedUser,
|
@ -1,4 +1,4 @@
|
|||||||
use crate::service::{
|
use crate::services::{
|
||||||
user::LoggedUser,
|
user::LoggedUser,
|
||||||
util::parse_from_payload,
|
util::parse_from_payload,
|
||||||
workspace::{
|
workspace::{
|
@ -1,7 +1,7 @@
|
|||||||
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;
|
@ -1,5 +1,4 @@
|
|||||||
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};
|
||||||
|
|
@ -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};
|
@ -1,6 +1,6 @@
|
|||||||
use crate::service::{
|
use crate::{
|
||||||
user::LoggedUser,
|
services::user::LoggedUser,
|
||||||
ws::{WsBizHandlers, WsClient, WsServer, WsUser},
|
web_socket::{WsBizHandlers, WsClient, WsServer, WsUser},
|
||||||
};
|
};
|
||||||
use actix::Addr;
|
use actix::Addr;
|
||||||
use actix_web::{
|
use actix_web::{
|
@ -1,13 +1,11 @@
|
|||||||
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::*;
|
@ -1,4 +1,4 @@
|
|||||||
use crate::service::ws::{
|
use crate::web_socket::{
|
||||||
entities::{Connect, Disconnect, Session, SessionId},
|
entities::{Connect, Disconnect, Session, SessionId},
|
||||||
WsMessageAdaptor,
|
WsMessageAdaptor,
|
||||||
};
|
};
|
@ -0,0 +1,3 @@
|
|||||||
|
mod workspace_task;
|
||||||
|
|
||||||
|
pub use workspace_task::*;
|
@ -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(())
|
||||||
|
}
|
@ -1,7 +1,7 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
entities::workspace::RepeatedWorkspace,
|
entities::workspace::RepeatedWorkspace,
|
||||||
errors::{WorkspaceError, WorkspaceResult},
|
errors::{WorkspaceError, WorkspaceResult},
|
||||||
module::WorkspaceUser,
|
module::{WorkspaceDatabase, WorkspaceUser},
|
||||||
notify::{send_dart_notification, WorkspaceNotification},
|
notify::{send_dart_notification, WorkspaceNotification},
|
||||||
services::{server::Server, AppController, TrashController, ViewController, WorkspaceController},
|
services::{server::Server, AppController, TrashController, ViewController, WorkspaceController},
|
||||||
};
|
};
|
||||||
@ -12,24 +12,25 @@ use lazy_static::lazy_static;
|
|||||||
use lib_infra::entities::network_state::NetworkType;
|
use lib_infra::entities::network_state::NetworkType;
|
||||||
use parking_lot::RwLock;
|
use parking_lot::RwLock;
|
||||||
use std::{collections::HashMap, sync::Arc};
|
use std::{collections::HashMap, sync::Arc};
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
static ref INIT_WORKSPACE: RwLock<HashMap<String, bool>> = RwLock::new(HashMap::new());
|
static ref INIT_WORKSPACE: RwLock<HashMap<String, bool>> = RwLock::new(HashMap::new());
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct FlowyCore {
|
pub struct CoreContext {
|
||||||
pub user: Arc<dyn WorkspaceUser>,
|
pub user: Arc<dyn WorkspaceUser>,
|
||||||
server: Server,
|
pub(crate) server: Server,
|
||||||
|
pub(crate) database: Arc<dyn WorkspaceDatabase>,
|
||||||
pub workspace_controller: Arc<WorkspaceController>,
|
pub workspace_controller: Arc<WorkspaceController>,
|
||||||
pub(crate) app_controller: Arc<AppController>,
|
pub(crate) app_controller: Arc<AppController>,
|
||||||
pub(crate) view_controller: Arc<ViewController>,
|
pub(crate) view_controller: Arc<ViewController>,
|
||||||
pub(crate) trash_controller: Arc<TrashController>,
|
pub(crate) trash_controller: Arc<TrashController>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FlowyCore {
|
impl CoreContext {
|
||||||
pub(crate) fn new(
|
pub(crate) fn new(
|
||||||
user: Arc<dyn WorkspaceUser>,
|
user: Arc<dyn WorkspaceUser>,
|
||||||
server: Server,
|
server: Server,
|
||||||
|
database: Arc<dyn WorkspaceDatabase>,
|
||||||
workspace_controller: Arc<WorkspaceController>,
|
workspace_controller: Arc<WorkspaceController>,
|
||||||
app_controller: Arc<AppController>,
|
app_controller: Arc<AppController>,
|
||||||
view_controller: Arc<ViewController>,
|
view_controller: Arc<ViewController>,
|
||||||
@ -42,6 +43,7 @@ impl FlowyCore {
|
|||||||
Self {
|
Self {
|
||||||
user,
|
user,
|
||||||
server,
|
server,
|
||||||
|
database,
|
||||||
workspace_controller,
|
workspace_controller,
|
||||||
app_controller,
|
app_controller,
|
||||||
view_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) {
|
pub fn network_state_changed(&self, new_type: NetworkType) {
|
||||||
match new_type {
|
match new_type {
|
||||||
NetworkType::UnknownNetworkType => {},
|
NetworkType::UnknownNetworkType => {},
|
||||||
@ -77,8 +61,6 @@ impl FlowyCore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn user_did_sign_in(&self, token: &str) -> WorkspaceResult<()> {
|
pub async fn user_did_sign_in(&self, token: &str) -> WorkspaceResult<()> {
|
||||||
// TODO: (nathan) do something here
|
|
||||||
|
|
||||||
log::debug!("workspace initialize after sign in");
|
log::debug!("workspace initialize after sign in");
|
||||||
let _ = self.init(token).await?;
|
let _ = self.init(token).await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -131,4 +113,21 @@ impl FlowyCore {
|
|||||||
let _ = self.init(&token).await?;
|
let _ = self.init(&token).await?;
|
||||||
Ok(())
|
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
frontend/rust-lib/flowy-core/src/core/event_handler.rs
Normal file
56
frontend/rust-lib/flowy-core/src/core/event_handler.rs
Normal file
@ -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)
|
||||||
|
}
|
@ -1,4 +1,5 @@
|
|||||||
mod flowy_core;
|
mod aggregate_tasks;
|
||||||
mod task;
|
mod core_context;
|
||||||
|
|
||||||
pub use flowy_core::*;
|
pub mod event_handler;
|
||||||
|
pub use core_context::*;
|
||||||
|
@ -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 +7,7 @@ use lib_dispatch::prelude::*;
|
|||||||
use lib_sqlite::ConnectionPool;
|
use lib_sqlite::ConnectionPool;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
core::FlowyCore,
|
core::{event_handler::*, CoreContext},
|
||||||
errors::WorkspaceError,
|
errors::WorkspaceError,
|
||||||
event::WorkspaceEvent,
|
event::WorkspaceEvent,
|
||||||
services::{
|
services::{
|
||||||
@ -45,7 +45,7 @@ pub fn init_core(
|
|||||||
database: Arc<dyn WorkspaceDatabase>,
|
database: Arc<dyn WorkspaceDatabase>,
|
||||||
flowy_document: Arc<FlowyDocument>,
|
flowy_document: Arc<FlowyDocument>,
|
||||||
server_config: &ClientServerConfiguration,
|
server_config: &ClientServerConfiguration,
|
||||||
) -> Arc<FlowyCore> {
|
) -> Arc<CoreContext> {
|
||||||
let server = construct_workspace_server(server_config);
|
let server = construct_workspace_server(server_config);
|
||||||
|
|
||||||
let trash_controller = Arc::new(TrashController::new(database.clone(), server.clone(), user.clone()));
|
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(
|
let workspace_controller = Arc::new(WorkspaceController::new(
|
||||||
user.clone(),
|
user.clone(),
|
||||||
database.clone(),
|
database.clone(),
|
||||||
app_controller.clone(),
|
|
||||||
view_controller.clone(),
|
|
||||||
trash_controller.clone(),
|
trash_controller.clone(),
|
||||||
server.clone(),
|
server.clone(),
|
||||||
));
|
));
|
||||||
|
|
||||||
Arc::new(FlowyCore::new(
|
Arc::new(CoreContext::new(
|
||||||
user,
|
user,
|
||||||
server,
|
server,
|
||||||
|
database,
|
||||||
workspace_controller,
|
workspace_controller,
|
||||||
app_controller,
|
app_controller,
|
||||||
view_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()
|
let mut module = Module::new()
|
||||||
.name("Flowy-Workspace")
|
.name("Flowy-Workspace")
|
||||||
.data(core.workspace_controller.clone())
|
.data(core.workspace_controller.clone())
|
||||||
.data(core.app_controller.clone())
|
.data(core.app_controller.clone())
|
||||||
.data(core.view_controller.clone())
|
.data(core.view_controller.clone())
|
||||||
.data(core.trash_controller.clone());
|
.data(core.trash_controller.clone())
|
||||||
|
.data(core.clone());
|
||||||
|
|
||||||
module = module
|
module = module
|
||||||
.event(WorkspaceEvent::CreateWorkspace, create_workspace_handler)
|
.event(WorkspaceEvent::CreateWorkspace, create_workspace_handler)
|
||||||
|
@ -241,11 +241,11 @@ fn notify_apps_changed(
|
|||||||
|
|
||||||
pub fn read_local_workspace_apps(
|
pub fn read_local_workspace_apps(
|
||||||
workspace_id: &str,
|
workspace_id: &str,
|
||||||
trash_can: Arc<TrashController>,
|
trash_controller: Arc<TrashController>,
|
||||||
conn: &SqliteConnection,
|
conn: &SqliteConnection,
|
||||||
) -> Result<RepeatedApp, WorkspaceError> {
|
) -> Result<RepeatedApp, WorkspaceError> {
|
||||||
let mut app_tables = AppTableSql::read_workspace_apps(workspace_id, false, conn)?;
|
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));
|
app_tables.retain(|app_table| !trash_ids.contains(&app_table.id));
|
||||||
|
|
||||||
let apps = app_tables.into_iter().map(|table| table.into()).collect::<Vec<App>>();
|
let apps = app_tables.into_iter().map(|table| table.into()).collect::<Vec<App>>();
|
||||||
|
@ -66,7 +66,7 @@ pub(crate) fn construct_workspace_server(
|
|||||||
config: &ClientServerConfiguration,
|
config: &ClientServerConfiguration,
|
||||||
) -> Arc<dyn WorkspaceServerAPI + Send + Sync> {
|
) -> Arc<dyn WorkspaceServerAPI + Send + Sync> {
|
||||||
if cfg!(feature = "http_server") {
|
if cfg!(feature = "http_server") {
|
||||||
Arc::new(WorkspaceServer::new(config.clone()))
|
Arc::new(WorkspaceHttpServer::new(config.clone()))
|
||||||
} else {
|
} else {
|
||||||
Arc::new(WorkspaceServerMock {})
|
Arc::new(WorkspaceServerMock {})
|
||||||
}
|
}
|
||||||
|
@ -13,15 +13,15 @@ use backend_service::{configuration::ClientServerConfiguration, middleware::*, w
|
|||||||
use flowy_workspace_infra::errors::ErrorCode;
|
use flowy_workspace_infra::errors::ErrorCode;
|
||||||
use lib_infra::future::ResultFuture;
|
use lib_infra::future::ResultFuture;
|
||||||
|
|
||||||
pub struct WorkspaceServer {
|
pub struct WorkspaceHttpServer {
|
||||||
config: ClientServerConfiguration,
|
config: ClientServerConfiguration,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WorkspaceServer {
|
impl WorkspaceHttpServer {
|
||||||
pub fn new(config: ClientServerConfiguration) -> WorkspaceServer { Self { config } }
|
pub fn new(config: ClientServerConfiguration) -> WorkspaceHttpServer { Self { config } }
|
||||||
}
|
}
|
||||||
|
|
||||||
impl WorkspaceServerAPI for WorkspaceServer {
|
impl WorkspaceServerAPI for WorkspaceHttpServer {
|
||||||
fn init(&self) {
|
fn init(&self) {
|
||||||
let mut rx = BACKEND_API_MIDDLEWARE.invalid_token_subscribe();
|
let mut rx = BACKEND_API_MIDDLEWARE.invalid_token_subscribe();
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
|
@ -6,22 +6,17 @@ use crate::{
|
|||||||
read_local_workspace_apps,
|
read_local_workspace_apps,
|
||||||
server::Server,
|
server::Server,
|
||||||
workspace::sql::{WorkspaceTable, WorkspaceTableChangeset, WorkspaceTableSql},
|
workspace::sql::{WorkspaceTable, WorkspaceTableChangeset, WorkspaceTableSql},
|
||||||
AppController,
|
|
||||||
TrashController,
|
TrashController,
|
||||||
ViewController,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
use flowy_database::SqliteConnection;
|
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 lib_infra::kv::KV;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
pub struct WorkspaceController {
|
pub struct WorkspaceController {
|
||||||
pub user: Arc<dyn WorkspaceUser>,
|
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) database: Arc<dyn WorkspaceDatabase>,
|
||||||
pub(crate) app_controller: Arc<AppController>,
|
|
||||||
pub(crate) trash_controller: Arc<TrashController>,
|
pub(crate) trash_controller: Arc<TrashController>,
|
||||||
server: Server,
|
server: Server,
|
||||||
}
|
}
|
||||||
@ -30,18 +25,12 @@ impl WorkspaceController {
|
|||||||
pub(crate) fn new(
|
pub(crate) fn new(
|
||||||
user: Arc<dyn WorkspaceUser>,
|
user: Arc<dyn WorkspaceUser>,
|
||||||
database: Arc<dyn WorkspaceDatabase>,
|
database: Arc<dyn WorkspaceDatabase>,
|
||||||
app_controller: Arc<AppController>,
|
|
||||||
view_controller: Arc<ViewController>,
|
|
||||||
trash_can: Arc<TrashController>,
|
trash_can: Arc<TrashController>,
|
||||||
server: Server,
|
server: Server,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let workspace_sql = Arc::new(WorkspaceTableSql {});
|
|
||||||
Self {
|
Self {
|
||||||
user,
|
user,
|
||||||
workspace_sql,
|
|
||||||
view_controller,
|
|
||||||
database,
|
database,
|
||||||
app_controller,
|
|
||||||
trash_controller: trash_can,
|
trash_controller: trash_can,
|
||||||
server,
|
server,
|
||||||
}
|
}
|
||||||
@ -74,7 +63,7 @@ impl WorkspaceController {
|
|||||||
// other journaling modes, EXCLUSIVE prevents other database connections from
|
// other journaling modes, EXCLUSIVE prevents other database connections from
|
||||||
// reading the database while the transaction is underway.
|
// reading the database while the transaction is underway.
|
||||||
conn.immediate_transaction::<_, WorkspaceError, _>(|| {
|
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)?;
|
let repeated_workspace = self.read_local_workspaces(None, &user_id, conn)?;
|
||||||
send_dart_notification(&token, WorkspaceNotification::UserCreateWorkspace)
|
send_dart_notification(&token, WorkspaceNotification::UserCreateWorkspace)
|
||||||
.payload(repeated_workspace)
|
.payload(repeated_workspace)
|
||||||
@ -94,7 +83,7 @@ impl WorkspaceController {
|
|||||||
let workspace_id = changeset.id.clone();
|
let workspace_id = changeset.id.clone();
|
||||||
let conn = &*self.database.db_connection()?;
|
let conn = &*self.database.db_connection()?;
|
||||||
conn.immediate_transaction::<_, WorkspaceError, _>(|| {
|
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 user_id = self.user.user_id()?;
|
||||||
let workspace = self.read_local_workspace(workspace_id.clone(), &user_id, conn)?;
|
let workspace = self.read_local_workspace(workspace_id.clone(), &user_id, conn)?;
|
||||||
send_dart_notification(&workspace_id, WorkspaceNotification::WorkspaceUpdated)
|
send_dart_notification(&workspace_id, WorkspaceNotification::WorkspaceUpdated)
|
||||||
@ -115,7 +104,7 @@ impl WorkspaceController {
|
|||||||
let token = self.user.token()?;
|
let token = self.user.token()?;
|
||||||
let conn = &*self.database.db_connection()?;
|
let conn = &*self.database.db_connection()?;
|
||||||
conn.immediate_transaction::<_, WorkspaceError, _>(|| {
|
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)?;
|
let repeated_workspace = self.read_local_workspaces(None, &user_id, conn)?;
|
||||||
send_dart_notification(&token, WorkspaceNotification::UserDeleteWorkspace)
|
send_dart_notification(&token, WorkspaceNotification::UserDeleteWorkspace)
|
||||||
.payload(repeated_workspace)
|
.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> {
|
pub(crate) async fn read_current_workspace_apps(&self) -> Result<RepeatedApp, WorkspaceError> {
|
||||||
let workspace_id = get_current_workspace()?;
|
let workspace_id = get_current_workspace()?;
|
||||||
let conn = self.database.db_connection()?;
|
let conn = self.database.db_connection()?;
|
||||||
@ -181,19 +145,17 @@ impl WorkspaceController {
|
|||||||
conn: &SqliteConnection,
|
conn: &SqliteConnection,
|
||||||
) -> Result<RepeatedWorkspace, WorkspaceError> {
|
) -> Result<RepeatedWorkspace, WorkspaceError> {
|
||||||
let workspace_id = workspace_id.to_owned();
|
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![];
|
let mut workspaces = vec![];
|
||||||
for table in workspace_tables {
|
for table in workspace_tables {
|
||||||
let apps = self.read_local_apps(&table.id, conn)?.into_inner();
|
let workspace: Workspace = table.into();
|
||||||
let mut workspace: Workspace = table.into();
|
|
||||||
workspace.apps.items = apps;
|
|
||||||
workspaces.push(workspace);
|
workspaces.push(workspace);
|
||||||
}
|
}
|
||||||
Ok(RepeatedWorkspace { items: workspaces })
|
Ok(RepeatedWorkspace { items: workspaces })
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_local_workspace(
|
pub(crate) fn read_local_workspace(
|
||||||
&self,
|
&self,
|
||||||
workspace_id: String,
|
workspace_id: String,
|
||||||
user_id: &str,
|
user_id: &str,
|
||||||
@ -218,12 +180,6 @@ impl WorkspaceController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)]
|
#[tracing::instrument(level = "debug", skip(self), err)]
|
||||||
async fn create_workspace_on_server(&self, params: CreateWorkspaceParams) -> Result<Workspace, WorkspaceError> {
|
async fn create_workspace_on_server(&self, params: CreateWorkspaceParams) -> Result<Workspace, WorkspaceError> {
|
||||||
let token = self.user.token()?;
|
let token = self.user.token()?;
|
||||||
@ -233,7 +189,7 @@ impl WorkspaceController {
|
|||||||
|
|
||||||
#[tracing::instrument(level = "debug", skip(self), err)]
|
#[tracing::instrument(level = "debug", skip(self), err)]
|
||||||
fn update_workspace_on_server(&self, params: UpdateWorkspaceParams) -> Result<(), WorkspaceError> {
|
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 {
|
tokio::spawn(async move {
|
||||||
match server.update_workspace(&token, params).await {
|
match server.update_workspace(&token, params).await {
|
||||||
Ok(_) => {},
|
Ok(_) => {},
|
||||||
@ -251,7 +207,7 @@ impl WorkspaceController {
|
|||||||
let params = WorkspaceIdentifier {
|
let params = WorkspaceIdentifier {
|
||||||
workspace_id: Some(workspace_id.to_string()),
|
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 {
|
tokio::spawn(async move {
|
||||||
match server.delete_workspace(&token, params).await {
|
match server.delete_workspace(&token, params).await {
|
||||||
Ok(_) => {},
|
Ok(_) => {},
|
||||||
@ -263,64 +219,13 @@ impl WorkspaceController {
|
|||||||
});
|
});
|
||||||
Ok(())
|
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";
|
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 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) {
|
match KV::get_str(CURRENT_WORKSPACE_ID) {
|
||||||
None => Err(WorkspaceError::record_not_found()
|
None => Err(WorkspaceError::record_not_found()
|
||||||
.context("Current workspace not found or should call open workspace first")),
|
.context("Current workspace not found or should call open workspace first")),
|
||||||
|
@ -15,14 +15,6 @@ pub(crate) async fn create_workspace_handler(
|
|||||||
data_result(detail)
|
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)]
|
#[tracing::instrument(skip(controller), err)]
|
||||||
pub(crate) async fn read_workspace_apps_handler(
|
pub(crate) async fn read_workspace_apps_handler(
|
||||||
controller: Unit<Arc<WorkspaceController>>,
|
controller: Unit<Arc<WorkspaceController>>,
|
||||||
@ -31,16 +23,6 @@ pub(crate) async fn read_workspace_apps_handler(
|
|||||||
data_result(repeated_app)
|
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)]
|
#[tracing::instrument(skip(data, controller), err)]
|
||||||
pub(crate) async fn open_workspace_handler(
|
pub(crate) async fn open_workspace_handler(
|
||||||
data: Data<QueryWorkspaceRequest>,
|
data: Data<QueryWorkspaceRequest>,
|
||||||
|
@ -13,11 +13,7 @@ use flowy_database::{
|
|||||||
pub(crate) struct WorkspaceTableSql {}
|
pub(crate) struct WorkspaceTableSql {}
|
||||||
|
|
||||||
impl WorkspaceTableSql {
|
impl WorkspaceTableSql {
|
||||||
pub(crate) fn create_workspace(
|
pub(crate) fn create_workspace(table: WorkspaceTable, conn: &SqliteConnection) -> Result<(), WorkspaceError> {
|
||||||
&self,
|
|
||||||
table: WorkspaceTable,
|
|
||||||
conn: &SqliteConnection,
|
|
||||||
) -> Result<(), WorkspaceError> {
|
|
||||||
match diesel_record_count!(workspace_table, &table.id, conn) {
|
match diesel_record_count!(workspace_table, &table.id, conn) {
|
||||||
0 => diesel_insert_table!(workspace_table, &table, conn),
|
0 => diesel_insert_table!(workspace_table, &table, conn),
|
||||||
_ => {
|
_ => {
|
||||||
@ -29,7 +25,6 @@ impl WorkspaceTableSql {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn read_workspaces(
|
pub(crate) fn read_workspaces(
|
||||||
&self,
|
|
||||||
workspace_id: Option<String>,
|
workspace_id: Option<String>,
|
||||||
user_id: &str,
|
user_id: &str,
|
||||||
conn: &SqliteConnection,
|
conn: &SqliteConnection,
|
||||||
@ -50,7 +45,6 @@ impl WorkspaceTableSql {
|
|||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
pub(crate) fn update_workspace(
|
pub(crate) fn update_workspace(
|
||||||
&self,
|
|
||||||
changeset: WorkspaceTableChangeset,
|
changeset: WorkspaceTableChangeset,
|
||||||
conn: &SqliteConnection,
|
conn: &SqliteConnection,
|
||||||
) -> Result<(), WorkspaceError> {
|
) -> Result<(), WorkspaceError> {
|
||||||
@ -59,7 +53,7 @@ impl WorkspaceTableSql {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[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);
|
diesel_delete_table!(workspace_table, workspace_id, conn);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ mod deps_resolve;
|
|||||||
pub mod module;
|
pub mod module;
|
||||||
use crate::deps_resolve::WorkspaceDepsResolver;
|
use crate::deps_resolve::WorkspaceDepsResolver;
|
||||||
use backend_service::configuration::ClientServerConfiguration;
|
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_document::module::FlowyDocument;
|
||||||
use flowy_user::{
|
use flowy_user::{
|
||||||
prelude::UserStatus,
|
prelude::UserStatus,
|
||||||
@ -66,7 +66,7 @@ pub struct FlowySDK {
|
|||||||
config: FlowySDKConfig,
|
config: FlowySDKConfig,
|
||||||
pub user_session: Arc<UserSession>,
|
pub user_session: Arc<UserSession>,
|
||||||
pub flowy_document: Arc<FlowyDocument>,
|
pub flowy_document: Arc<FlowyDocument>,
|
||||||
pub core: Arc<FlowyCore>,
|
pub core: Arc<CoreContext>,
|
||||||
pub dispatcher: Arc<EventDispatcher>,
|
pub dispatcher: Arc<EventDispatcher>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,7 +99,7 @@ impl FlowySDK {
|
|||||||
pub fn dispatcher(&self) -> Arc<EventDispatcher> { self.dispatcher.clone() }
|
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 user_status_subscribe = user_session.notifier.user_status_subscribe();
|
||||||
let network_status_subscribe = user_session.notifier.network_type_subscribe();
|
let network_status_subscribe = user_session.notifier.network_type_subscribe();
|
||||||
let cloned_core = core.clone();
|
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 {
|
while let Ok(status) = subscribe.recv().await {
|
||||||
let result = || async {
|
let result = || async {
|
||||||
match status {
|
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 {
|
while let Ok(new_type) = subscribe.recv().await {
|
||||||
core.network_state_changed(new_type);
|
core.network_state_changed(new_type);
|
||||||
}
|
}
|
||||||
@ -168,7 +168,7 @@ fn mk_core(
|
|||||||
user_session: Arc<UserSession>,
|
user_session: Arc<UserSession>,
|
||||||
flowy_document: Arc<FlowyDocument>,
|
flowy_document: Arc<FlowyDocument>,
|
||||||
server_config: &ClientServerConfiguration,
|
server_config: &ClientServerConfiguration,
|
||||||
) -> Arc<FlowyCore> {
|
) -> Arc<CoreContext> {
|
||||||
let workspace_deps = WorkspaceDepsResolver::new(user_session);
|
let workspace_deps = WorkspaceDepsResolver::new(user_session);
|
||||||
let (user, database) = workspace_deps.split_into();
|
let (user, database) = workspace_deps.split_into();
|
||||||
init_core(user, database, flowy_document, server_config)
|
init_core(user, database, flowy_document, server_config)
|
||||||
|
@ -1,19 +1,19 @@
|
|||||||
use crate::deps_resolve::DocumentDepsResolver;
|
use crate::deps_resolve::DocumentDepsResolver;
|
||||||
use backend_service::configuration::ClientServerConfiguration;
|
use backend_service::configuration::ClientServerConfiguration;
|
||||||
use flowy_core::prelude::FlowyCore;
|
use flowy_core::prelude::CoreContext;
|
||||||
use flowy_document::module::FlowyDocument;
|
use flowy_document::module::FlowyDocument;
|
||||||
use flowy_user::services::user::UserSession;
|
use flowy_user::services::user::UserSession;
|
||||||
use lib_dispatch::prelude::Module;
|
use lib_dispatch::prelude::Module;
|
||||||
use std::sync::Arc;
|
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 user_module = mk_user_module(user_session);
|
||||||
let workspace_module = mk_core_module(core);
|
let workspace_module = mk_core_module(core);
|
||||||
vec![user_module, workspace_module]
|
vec![user_module, workspace_module]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mk_user_module(user_session: Arc<UserSession>) -> Module { flowy_user::module::create(user_session) }
|
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(
|
pub fn mk_document_module(
|
||||||
user_session: Arc<UserSession>,
|
user_session: Arc<UserSession>,
|
||||||
|
@ -23,7 +23,7 @@ pub trait UserServerAPI {
|
|||||||
|
|
||||||
pub(crate) fn construct_user_server(config: &ClientServerConfiguration) -> Arc<dyn UserServerAPI + Send + Sync> {
|
pub(crate) fn construct_user_server(config: &ClientServerConfiguration) -> Arc<dyn UserServerAPI + Send + Sync> {
|
||||||
if cfg!(feature = "http_server") {
|
if cfg!(feature = "http_server") {
|
||||||
Arc::new(UserServer::new(config.clone()))
|
Arc::new(UserHttpServer::new(config.clone()))
|
||||||
} else {
|
} else {
|
||||||
Arc::new(UserServerMock {})
|
Arc::new(UserServerMock {})
|
||||||
}
|
}
|
||||||
|
@ -6,14 +6,14 @@ use crate::{
|
|||||||
use backend_service::{configuration::*, user_request::*};
|
use backend_service::{configuration::*, user_request::*};
|
||||||
use lib_infra::future::ResultFuture;
|
use lib_infra::future::ResultFuture;
|
||||||
|
|
||||||
pub struct UserServer {
|
pub struct UserHttpServer {
|
||||||
config: ClientServerConfiguration,
|
config: ClientServerConfiguration,
|
||||||
}
|
}
|
||||||
impl UserServer {
|
impl UserHttpServer {
|
||||||
pub fn new(config: ClientServerConfiguration) -> Self { Self { config } }
|
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> {
|
fn sign_up(&self, params: SignUpParams) -> ResultFuture<SignUpResponse, UserError> {
|
||||||
let url = self.config.sign_up_url();
|
let url = self.config.sign_up_url();
|
||||||
ResultFuture::new(async move {
|
ResultFuture::new(async move {
|
||||||
|
Reference in New Issue
Block a user