From b9d7902acb90009ece3bb038b0b5de35b1fa1885 Mon Sep 17 00:00:00 2001 From: appflowy Date: Fri, 9 Jul 2021 23:31:44 +0800 Subject: [PATCH] config user db and user session --- .idea/appflowy_client.iml | 4 +- .../flowy_sdk/example/macos/Podfile.lock | 10 +-- rust-lib/Cargo.toml | 4 +- rust-lib/{flowy-db => flowy-database}/.env | 0 .../{flowy-db => flowy-database}/Cargo.toml | 4 +- .../{flowy-db => flowy-database}/diesel.toml | 0 .../migrations/.gitkeep | 0 .../2021-07-09-063045_flowy-user/down.sql | 0 .../2021-07-09-063045_flowy-user/up.sql | 0 rust-lib/flowy-database/src/errors.rs | 16 ++++ rust-lib/flowy-database/src/lib.rs | 29 +++++++ .../src/schema.rs | 0 rust-lib/flowy-db/src/database.rs | 17 ---- rust-lib/flowy-db/src/errors.rs | 16 ---- rust-lib/flowy-db/src/lib.rs | 15 ---- rust-lib/flowy-infra/src/lib.rs | 13 --- rust-lib/flowy-infra/src/sqlite/mod.rs | 5 -- rust-lib/flowy-sdk/src/lib.rs | 8 +- rust-lib/flowy-sdk/src/module.rs | 13 ++- .../{flowy-infra => flowy-sqlite}/Cargo.toml | 2 +- .../sqlite => flowy-sqlite/src}/database.rs | 6 +- .../src/errors.rs | 0 rust-lib/flowy-sqlite/src/lib.rs | 9 ++ rust-lib/flowy-sqlite/src/mod.rs | 1 + .../src/sqlite => flowy-sqlite/src}/pool.rs | 0 rust-lib/flowy-user/Cargo.toml | 3 +- rust-lib/flowy-user/src/domain/database.rs | 28 ------ rust-lib/flowy-user/src/domain/mod.rs | 4 +- rust-lib/flowy-user/src/domain/user_db.rs | 87 +++++++++++++++++++ .../flowy-user/src/domain/user_session.rs | 48 ++++++++++ rust-lib/flowy-user/src/errors.rs | 14 ++- rust-lib/flowy-user/src/handlers/auth.rs | 11 ++- rust-lib/flowy-user/src/module.rs | 10 ++- 33 files changed, 255 insertions(+), 122 deletions(-) rename rust-lib/{flowy-db => flowy-database}/.env (100%) rename rust-lib/{flowy-db => flowy-database}/Cargo.toml (83%) rename rust-lib/{flowy-db => flowy-database}/diesel.toml (100%) rename rust-lib/{flowy-db => flowy-database}/migrations/.gitkeep (100%) rename rust-lib/{flowy-db => flowy-database}/migrations/2021-07-09-063045_flowy-user/down.sql (100%) rename rust-lib/{flowy-db => flowy-database}/migrations/2021-07-09-063045_flowy-user/up.sql (100%) create mode 100644 rust-lib/flowy-database/src/errors.rs create mode 100644 rust-lib/flowy-database/src/lib.rs rename rust-lib/{flowy-db => flowy-database}/src/schema.rs (100%) delete mode 100644 rust-lib/flowy-db/src/database.rs delete mode 100644 rust-lib/flowy-db/src/errors.rs delete mode 100644 rust-lib/flowy-db/src/lib.rs delete mode 100644 rust-lib/flowy-infra/src/lib.rs delete mode 100644 rust-lib/flowy-infra/src/sqlite/mod.rs rename rust-lib/{flowy-infra => flowy-sqlite}/Cargo.toml (92%) rename rust-lib/{flowy-infra/src/sqlite => flowy-sqlite/src}/database.rs (79%) rename rust-lib/{flowy-infra => flowy-sqlite}/src/errors.rs (100%) create mode 100644 rust-lib/flowy-sqlite/src/lib.rs create mode 100644 rust-lib/flowy-sqlite/src/mod.rs rename rust-lib/{flowy-infra/src/sqlite => flowy-sqlite/src}/pool.rs (100%) delete mode 100644 rust-lib/flowy-user/src/domain/database.rs create mode 100644 rust-lib/flowy-user/src/domain/user_db.rs create mode 100644 rust-lib/flowy-user/src/domain/user_session.rs diff --git a/.idea/appflowy_client.iml b/.idea/appflowy_client.iml index 6d9312f7fb..5797d19e1e 100644 --- a/.idea/appflowy_client.iml +++ b/.idea/appflowy_client.iml @@ -16,8 +16,8 @@ - - + + diff --git a/app_flowy/packages/flowy_sdk/example/macos/Podfile.lock b/app_flowy/packages/flowy_sdk/example/macos/Podfile.lock index dd86b1d5b4..bae4dc3578 100644 --- a/app_flowy/packages/flowy_sdk/example/macos/Podfile.lock +++ b/app_flowy/packages/flowy_sdk/example/macos/Podfile.lock @@ -1,5 +1,5 @@ PODS: - - flowy_infra (0.0.1): + - flowy_sqlite (0.0.1): - FlutterMacOS - flowy_sdk (0.0.1): - FlutterMacOS @@ -9,15 +9,15 @@ PODS: - FlutterMacOS DEPENDENCIES: - - flowy_infra (from `Flutter/ephemeral/.symlinks/plugins/flowy_infra/macos`) + - flowy_sqlite (from `Flutter/ephemeral/.symlinks/plugins/flowy_sqlite/macos`) - flowy_sdk (from `Flutter/ephemeral/.symlinks/plugins/flowy_sdk/macos`) - FlutterMacOS (from `Flutter/ephemeral/.symlinks/flutter/darwin-x64`) - path_provider (from `Flutter/ephemeral/.symlinks/plugins/path_provider/macos`) - path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`) EXTERNAL SOURCES: - flowy_infra: - :path: Flutter/ephemeral/.symlinks/plugins/flowy_infra/macos + flowy_sqlite: + :path: Flutter/ephemeral/.symlinks/plugins/flowy_sqlite/macos flowy_sdk: :path: Flutter/ephemeral/.symlinks/plugins/flowy_sdk/macos FlutterMacOS: @@ -28,7 +28,7 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos SPEC CHECKSUMS: - flowy_infra: 6638deea1ca0baeef75156d16236123d4703161d + flowy_sqlite: 6638deea1ca0baeef75156d16236123d4703161d flowy_sdk: 12d2c047ed260a0aa8788a0b9616da46e2312025 FlutterMacOS: 15bea8a44d2fa024068daa0140371c020b4b6ff9 path_provider: e0848572d1d38b9a7dd099e79cf83f5b7e2cde9f diff --git a/rust-lib/Cargo.toml b/rust-lib/Cargo.toml index 482c6924dc..8cb3a7822f 100644 --- a/rust-lib/Cargo.toml +++ b/rust-lib/Cargo.toml @@ -8,8 +8,8 @@ members = [ "flowy-ast", "flowy-derive", "flowy-test", - "flowy-infra", - "flowy-db", + "flowy-sqlite", + "flowy-database", ] [profile.dev] diff --git a/rust-lib/flowy-db/.env b/rust-lib/flowy-database/.env similarity index 100% rename from rust-lib/flowy-db/.env rename to rust-lib/flowy-database/.env diff --git a/rust-lib/flowy-db/Cargo.toml b/rust-lib/flowy-database/Cargo.toml similarity index 83% rename from rust-lib/flowy-db/Cargo.toml rename to rust-lib/flowy-database/Cargo.toml index 0c625e10a8..38aec9f419 100644 --- a/rust-lib/flowy-db/Cargo.toml +++ b/rust-lib/flowy-database/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "flowy-db" +name = "flowy-database" version = "0.1.0" edition = "2018" @@ -9,4 +9,4 @@ edition = "2018" diesel = {version = "1.4.7", features = ["sqlite"]} diesel_derives = {version = "1.4.1", features = ["sqlite"]} diesel_migrations = {version = "1.4.0", features = ["sqlite"]} -flowy-infra = {path = "../flowy-infra"} \ No newline at end of file +flowy-sqlite = {path = "../flowy-sqlite" } \ No newline at end of file diff --git a/rust-lib/flowy-db/diesel.toml b/rust-lib/flowy-database/diesel.toml similarity index 100% rename from rust-lib/flowy-db/diesel.toml rename to rust-lib/flowy-database/diesel.toml diff --git a/rust-lib/flowy-db/migrations/.gitkeep b/rust-lib/flowy-database/migrations/.gitkeep similarity index 100% rename from rust-lib/flowy-db/migrations/.gitkeep rename to rust-lib/flowy-database/migrations/.gitkeep diff --git a/rust-lib/flowy-db/migrations/2021-07-09-063045_flowy-user/down.sql b/rust-lib/flowy-database/migrations/2021-07-09-063045_flowy-user/down.sql similarity index 100% rename from rust-lib/flowy-db/migrations/2021-07-09-063045_flowy-user/down.sql rename to rust-lib/flowy-database/migrations/2021-07-09-063045_flowy-user/down.sql diff --git a/rust-lib/flowy-db/migrations/2021-07-09-063045_flowy-user/up.sql b/rust-lib/flowy-database/migrations/2021-07-09-063045_flowy-user/up.sql similarity index 100% rename from rust-lib/flowy-db/migrations/2021-07-09-063045_flowy-user/up.sql rename to rust-lib/flowy-database/migrations/2021-07-09-063045_flowy-user/up.sql diff --git a/rust-lib/flowy-database/src/errors.rs b/rust-lib/flowy-database/src/errors.rs new file mode 100644 index 0000000000..0688df0fb5 --- /dev/null +++ b/rust-lib/flowy-database/src/errors.rs @@ -0,0 +1,16 @@ +use flowy_sqlite::Error; +use std::io; + +#[derive(Debug)] +pub enum DataBaseError { + InitError(String), + IOError(String), +} + +impl std::convert::From for DataBaseError { + fn from(error: flowy_sqlite::Error) -> Self { DataBaseError::InitError(format!("{:?}", error)) } +} + +impl std::convert::From for DataBaseError { + fn from(error: io::Error) -> Self { DataBaseError::IOError(format!("{:?}", error)) } +} diff --git a/rust-lib/flowy-database/src/lib.rs b/rust-lib/flowy-database/src/lib.rs new file mode 100644 index 0000000000..e011a1aa71 --- /dev/null +++ b/rust-lib/flowy-database/src/lib.rs @@ -0,0 +1,29 @@ +mod errors; +mod schema; + +#[macro_use] +extern crate diesel; +#[macro_use] +extern crate diesel_derives; +#[macro_use] +extern crate diesel_migrations; + +pub use errors::*; +pub use flowy_sqlite::{DBConnection, DataBase}; + +use diesel_migrations::*; +use flowy_sqlite::PoolConfig; +use std::path::Path; + +embed_migrations!("../flowy-database/migrations/"); +pub const DB_NAME: &str = "flowy-database.db"; + +pub fn init(storage_path: &str) -> Result { + if !Path::new(storage_path).exists() { + std::fs::create_dir_all(storage_path)?; + } + + let pool_config = PoolConfig::default(); + let database = DataBase::new(storage_path, DB_NAME, pool_config)?; + Ok(database) +} diff --git a/rust-lib/flowy-db/src/schema.rs b/rust-lib/flowy-database/src/schema.rs similarity index 100% rename from rust-lib/flowy-db/src/schema.rs rename to rust-lib/flowy-database/src/schema.rs diff --git a/rust-lib/flowy-db/src/database.rs b/rust-lib/flowy-db/src/database.rs deleted file mode 100644 index 19baa7f115..0000000000 --- a/rust-lib/flowy-db/src/database.rs +++ /dev/null @@ -1,17 +0,0 @@ -use crate::errors::FlowyDBError; -use diesel_migrations::*; -use flowy_infra::sqlite::*; -use std::path::Path; - -embed_migrations!("../flowy-db/migrations/"); -pub const DB_NAME: &str = "flowy-database.db"; - -pub fn init(storage_path: &str) -> Result { - if !Path::new(storage_path).exists() { - std::fs::create_dir_all(storage_path)?; - } - - let pool_config = PoolConfig::default(); - let database = DataBase::new(storage_path, DB_NAME, pool_config)?; - Ok(database) -} diff --git a/rust-lib/flowy-db/src/errors.rs b/rust-lib/flowy-db/src/errors.rs deleted file mode 100644 index f7c23d5fb4..0000000000 --- a/rust-lib/flowy-db/src/errors.rs +++ /dev/null @@ -1,16 +0,0 @@ -use flowy_infra::Error; -use std::io; - -#[derive(Debug)] -pub enum FlowyDBError { - InitError(String), - IOError(String), -} - -impl std::convert::From for FlowyDBError { - fn from(error: flowy_infra::Error) -> Self { FlowyDBError::InitError(format!("{:?}", error)) } -} - -impl std::convert::From for FlowyDBError { - fn from(error: io::Error) -> Self { FlowyDBError::IOError(format!("{:?}", error)) } -} diff --git a/rust-lib/flowy-db/src/lib.rs b/rust-lib/flowy-db/src/lib.rs deleted file mode 100644 index 29e65f3a95..0000000000 --- a/rust-lib/flowy-db/src/lib.rs +++ /dev/null @@ -1,15 +0,0 @@ -mod database; -mod errors; -mod schema; - -#[macro_use] -extern crate diesel; -#[macro_use] -extern crate diesel_derives; -#[macro_use] -extern crate diesel_migrations; - -pub use flowy_infra::sqlite::DataBase; - -pub use database::init; -pub use errors::*; diff --git a/rust-lib/flowy-infra/src/lib.rs b/rust-lib/flowy-infra/src/lib.rs deleted file mode 100644 index 86c7ff9ae4..0000000000 --- a/rust-lib/flowy-infra/src/lib.rs +++ /dev/null @@ -1,13 +0,0 @@ -#[allow(deprecated, clippy::large_enum_variant)] -mod errors; -pub mod sqlite; - -pub use errors::{Error, ErrorKind, Result}; - -#[cfg(test)] -mod tests { - #[test] - fn it_works() { - assert_eq!(2 + 2, 4); - } -} diff --git a/rust-lib/flowy-infra/src/sqlite/mod.rs b/rust-lib/flowy-infra/src/sqlite/mod.rs deleted file mode 100644 index f016f01d04..0000000000 --- a/rust-lib/flowy-infra/src/sqlite/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -mod database; -mod pool; - -pub use database::*; -pub use pool::*; diff --git a/rust-lib/flowy-sdk/src/lib.rs b/rust-lib/flowy-sdk/src/lib.rs index 4359ea3360..a317eaed00 100644 --- a/rust-lib/flowy-sdk/src/lib.rs +++ b/rust-lib/flowy-sdk/src/lib.rs @@ -3,6 +3,7 @@ pub use module::*; use flowy_dispatch::prelude::*; use module::build_modules; + pub struct FlowySDK {} impl FlowySDK { @@ -10,6 +11,11 @@ impl FlowySDK { pub fn init(path: &str) { tracing::trace!("🔥 Root path: {}", path); - EventDispatch::construct(|| build_modules()); + + let config = ModuleConfig { + root: path.to_string(), + }; + + EventDispatch::construct(|| build_modules(config)); } } diff --git a/rust-lib/flowy-sdk/src/module.rs b/rust-lib/flowy-sdk/src/module.rs index 2c5cd39e72..3426eb85f1 100644 --- a/rust-lib/flowy-sdk/src/module.rs +++ b/rust-lib/flowy-sdk/src/module.rs @@ -1,3 +1,14 @@ use flowy_dispatch::prelude::Module; +use flowy_user::prelude::user_session::{UserSession, UserSessionConfig}; +use std::sync::Arc; -pub fn build_modules() -> Vec { vec![flowy_user::module::create()] } +pub struct ModuleConfig { + pub root: String, +} + +pub fn build_modules(config: ModuleConfig) -> Vec { + let user_config = UserSessionConfig::new(&config.root); + let user_session = Arc::new(UserSession::new(user_config)); + + vec![flowy_user::module::create(user_session)] +} diff --git a/rust-lib/flowy-infra/Cargo.toml b/rust-lib/flowy-sqlite/Cargo.toml similarity index 92% rename from rust-lib/flowy-infra/Cargo.toml rename to rust-lib/flowy-sqlite/Cargo.toml index 19c0e20977..2bc441fffb 100644 --- a/rust-lib/flowy-infra/Cargo.toml +++ b/rust-lib/flowy-sqlite/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "flowy-infra" +name = "flowy-sqlite" version = "0.1.0" edition = "2018" diff --git a/rust-lib/flowy-infra/src/sqlite/database.rs b/rust-lib/flowy-sqlite/src/database.rs similarity index 79% rename from rust-lib/flowy-infra/src/sqlite/database.rs rename to rust-lib/flowy-sqlite/src/database.rs index 7b31f9cf68..82a5c9d3b5 100644 --- a/rust-lib/flowy-infra/src/sqlite/database.rs +++ b/rust-lib/flowy-sqlite/src/database.rs @@ -1,6 +1,6 @@ use crate::{ errors::*, - sqlite::pool::{ConnectionManager, ConnectionPool, PoolConfig}, + pool::{ConnectionManager, ConnectionPool, PoolConfig}, }; use r2d2::PooledConnection; @@ -9,6 +9,8 @@ pub struct DataBase { pool: ConnectionPool, } +pub type DBConnection = PooledConnection; + impl DataBase { pub fn new(dir: &str, name: &str, pool_config: PoolConfig) -> Result { let uri = db_file_uri(dir, name); @@ -18,7 +20,7 @@ impl DataBase { pub fn get_uri(&self) -> &str { &self.uri } - pub fn get_conn(&self) -> Result> { + pub fn get_connection(&self) -> Result { let conn = self.pool.get()?; Ok(conn) } diff --git a/rust-lib/flowy-infra/src/errors.rs b/rust-lib/flowy-sqlite/src/errors.rs similarity index 100% rename from rust-lib/flowy-infra/src/errors.rs rename to rust-lib/flowy-sqlite/src/errors.rs diff --git a/rust-lib/flowy-sqlite/src/lib.rs b/rust-lib/flowy-sqlite/src/lib.rs new file mode 100644 index 0000000000..6fa25ab88d --- /dev/null +++ b/rust-lib/flowy-sqlite/src/lib.rs @@ -0,0 +1,9 @@ +mod database; +#[allow(deprecated, clippy::large_enum_variant)] +mod errors; +mod pool; + +pub use database::*; +pub use pool::*; + +pub use errors::{Error, ErrorKind, Result}; diff --git a/rust-lib/flowy-sqlite/src/mod.rs b/rust-lib/flowy-sqlite/src/mod.rs new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/rust-lib/flowy-sqlite/src/mod.rs @@ -0,0 +1 @@ + diff --git a/rust-lib/flowy-infra/src/sqlite/pool.rs b/rust-lib/flowy-sqlite/src/pool.rs similarity index 100% rename from rust-lib/flowy-infra/src/sqlite/pool.rs rename to rust-lib/flowy-sqlite/src/pool.rs diff --git a/rust-lib/flowy-user/Cargo.toml b/rust-lib/flowy-user/Cargo.toml index 4c0911f977..00819ddbfa 100644 --- a/rust-lib/flowy-user/Cargo.toml +++ b/rust-lib/flowy-user/Cargo.toml @@ -10,7 +10,8 @@ derive_more = {version = "0.99", features = ["display"]} flowy-dispatch = { path = "../flowy-dispatch" } flowy-log = { path = "../flowy-log" } flowy-derive = { path = "../flowy-derive" } -flowy-db = { path = "../flowy-db" } +flowy-database = { path = "../flowy-database" } +flowy-sqlite = { path = "../flowy-sqlite" } tracing = { version = "0.1", features = ["log"] } bytes = "1.0" diff --git a/rust-lib/flowy-user/src/domain/database.rs b/rust-lib/flowy-user/src/domain/database.rs deleted file mode 100644 index 6ed38c0e5d..0000000000 --- a/rust-lib/flowy-user/src/domain/database.rs +++ /dev/null @@ -1,28 +0,0 @@ -use crate::errors::UserError; -use flowy_db::DataBase; -use lazy_static::lazy_static; -use std::sync::{ - atomic::{AtomicBool, Ordering}, - RwLock, -}; - -lazy_static! { - pub static ref DB: RwLock> = RwLock::new(None); -} - -static DB_INIT: AtomicBool = AtomicBool::new(false); - -pub fn init_user_db(dir: &str) -> Result<(), UserError> { - let database = flowy_db::init(dir)?; - *(DB.write()?) = Some(database); - Ok(()) -} - -#[cfg(test)] -mod tests { - use super::*; - #[test] - fn init_db_test() { - // init_user_db(".").unwrap(); - } -} diff --git a/rust-lib/flowy-user/src/domain/mod.rs b/rust-lib/flowy-user/src/domain/mod.rs index 36989ea156..72d7ee6bd4 100644 --- a/rust-lib/flowy-user/src/domain/mod.rs +++ b/rust-lib/flowy-user/src/domain/mod.rs @@ -1,4 +1,4 @@ pub use user::*; - -mod database; pub mod user; +pub mod user_db; +pub mod user_session; diff --git a/rust-lib/flowy-user/src/domain/user_db.rs b/rust-lib/flowy-user/src/domain/user_db.rs new file mode 100644 index 0000000000..532ccdce41 --- /dev/null +++ b/rust-lib/flowy-user/src/domain/user_db.rs @@ -0,0 +1,87 @@ +use crate::errors::UserError; +use flowy_database::{DBConnection, DataBase}; +use lazy_static::lazy_static; +use std::{ + cell::RefCell, + sync::{ + atomic::{AtomicBool, Ordering}, + RwLock, + }, +}; + +thread_local! { + static USER_ID: RefCell> = RefCell::new(None); +} +fn set_user_id(user_id: Option) { + USER_ID.with(|id| { + *id.borrow_mut() = user_id; + }); +} +fn get_user_id() -> Option { USER_ID.with(|id| id.borrow().clone()) } + +static IS_USER_DB_INIT: AtomicBool = AtomicBool::new(false); + +lazy_static! { + static ref USER_DB_INNER: RwLock> = RwLock::new(None); +} + +pub(crate) struct UserDB { + db_dir: String, +} + +impl UserDB { + pub(crate) fn new(db_dir: &str) -> Self { + Self { + db_dir: db_dir.to_owned(), + } + } + + fn open_user_db(&self, user_id: &str) -> Result<(), UserError> { + let user_dir = format!("{}/{}", self.db_dir, user_id); + let database = flowy_database::init(&user_dir)?; + let mut write_guard = USER_DB_INNER.write()?; + set_user_id(Some(user_id.to_owned())); + *(write_guard) = Some(database); + IS_USER_DB_INIT.store(true, Ordering::SeqCst); + Ok(()) + } + + pub(crate) fn close_user_db(&mut self) -> Result<(), UserError> { + let mut write_guard = USER_DB_INNER.write()?; + *write_guard = None; + set_user_id(None); + IS_USER_DB_INIT.store(false, Ordering::SeqCst); + Ok(()) + } + + pub(crate) fn get_connection(&self, user_id: &str) -> Result { + if !IS_USER_DB_INIT.load(Ordering::SeqCst) { + let _ = self.open_user_db(user_id); + } + + let thread_user_id = get_user_id(); + if thread_user_id != Some(user_id.to_owned()) { + let msg = format!( + "DataBase owner does not match. origin: {:?}, current: {}", + thread_user_id, user_id + ); + log::error!("{}", msg); + return Err(UserError::DBConnection(msg)); + } + + let read_guard = USER_DB_INNER.read()?; + match read_guard.as_ref() { + None => Err(UserError::DBNotInit), + Some(database) => Ok(database.get_connection()?), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn init_db_test() { + // init_user_db(".").unwrap(); + } +} diff --git a/rust-lib/flowy-user/src/domain/user_session.rs b/rust-lib/flowy-user/src/domain/user_session.rs new file mode 100644 index 0000000000..2f8aa0a2cb --- /dev/null +++ b/rust-lib/flowy-user/src/domain/user_session.rs @@ -0,0 +1,48 @@ +use crate::{domain::user_db::UserDB, errors::UserError}; +use flowy_sqlite::DBConnection; +use lazy_static::lazy_static; +use std::sync::RwLock; + +lazy_static! { + pub static ref CURRENT_USER_ID: RwLock> = RwLock::new(None); +} +fn get_current_user_id() -> Result, UserError> { + match CURRENT_USER_ID.read() { + Ok(read_guard) => Ok((*read_guard).clone()), + Err(e) => { + log::error!("Get current user id failed: {:?}", e); + Err(e.into()) + }, + } +} + +pub struct UserSessionConfig { + root_dir: String, +} + +impl UserSessionConfig { + pub fn new(root_dir: &str) -> Self { + Self { + root_dir: root_dir.to_owned(), + } + } +} + +pub struct UserSession { + db: UserDB, + config: UserSessionConfig, +} + +impl UserSession { + pub fn new(config: UserSessionConfig) -> Self { + let db = UserDB::new(&config.root_dir); + Self { db, config } + } + + pub fn get_db_connection(&self) -> Result { + match get_current_user_id()? { + None => Err(UserError::UserNotLogin), + Some(user_id) => self.db.get_connection(&user_id), + } + } +} diff --git a/rust-lib/flowy-user/src/errors.rs b/rust-lib/flowy-user/src/errors.rs index c75abcf501..171bf24d6d 100644 --- a/rust-lib/flowy-user/src/errors.rs +++ b/rust-lib/flowy-user/src/errors.rs @@ -1,15 +1,23 @@ +use flowy_database::DataBaseError; use std::sync::PoisonError; #[derive(Debug)] pub enum UserError { - DBInitFail(String), + DBInit(String), + DBNotInit, + UserNotLogin, + DBConnection(String), PoisonError(String), } -impl std::convert::From for UserError { - fn from(error: flowy_db::FlowyDBError) -> Self { UserError::DBInitFail(format!("{:?}", error)) } +impl std::convert::From for UserError { + fn from(error: DataBaseError) -> Self { UserError::DBInit(format!("{:?}", error)) } } impl std::convert::From> for UserError { fn from(error: PoisonError) -> Self { UserError::PoisonError(format!("{:?}", error)) } } + +impl std::convert::From for UserError { + fn from(e: flowy_sqlite::Error) -> Self { UserError::DBConnection(format!("{:?}", e)) } +} diff --git a/rust-lib/flowy-user/src/handlers/auth.rs b/rust-lib/flowy-user/src/handlers/auth.rs index e2e3b99673..ccf6aec459 100644 --- a/rust-lib/flowy-user/src/handlers/auth.rs +++ b/rust-lib/flowy-user/src/handlers/auth.rs @@ -1,6 +1,6 @@ -use crate::domain::user::*; +use crate::domain::{user::*, user_session::UserSession}; use flowy_dispatch::prelude::*; -use std::convert::TryInto; +use std::{convert::TryInto, sync::Arc}; // tracing instrument 👉🏻 https://docs.rs/tracing/0.1.26/tracing/attr.instrument.html #[tracing::instrument( @@ -19,12 +19,15 @@ pub async fn user_sign_in(data: Data) -> ResponseResult) -> ResponseResult { +pub async fn user_sign_up( + data: Data, + session: ModuleData>, +) -> ResponseResult { let _params: SignUpParams = data.into_inner().try_into()?; // TODO: user sign up diff --git a/rust-lib/flowy-user/src/module.rs b/rust-lib/flowy-user/src/module.rs index eb0a8b0d62..4985026e3b 100644 --- a/rust-lib/flowy-user/src/module.rs +++ b/rust-lib/flowy-user/src/module.rs @@ -1,10 +1,16 @@ use flowy_dispatch::prelude::*; -use crate::{event::UserEvent, handlers::*}; +use crate::{ + domain::{user_db::*, user_session::UserSession}, + event::UserEvent, + handlers::*, +}; +use std::sync::Arc; -pub fn create() -> Module { +pub fn create(user_session: Arc) -> Module { Module::new() .name("Flowy-User") + .data(user_session) .event(UserEvent::SignIn, user_sign_in) .event(UserEvent::SignUp, user_sign_up) }