diff --git a/.idea/dataSources.local.xml b/.idea/dataSources.local.xml
new file mode 100644
index 0000000..f3f4054
--- /dev/null
+++ b/.idea/dataSources.local.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+ "
+
+
+ master_key
+ no-auth
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml
new file mode 100644
index 0000000..04513d7
--- /dev/null
+++ b/.idea/dataSources.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ sqlite.xerial
+ true
+ org.sqlite.JDBC
+ jdbc:sqlite:$PROJECT_DIR$/db.sqlite
+ $ProjectFileDir$
+
+
+
\ No newline at end of file
diff --git a/.idea/dataSources/26059583-0fdb-4f6f-ad11-10388e9658c2.xml b/.idea/dataSources/26059583-0fdb-4f6f-ad11-10388e9658c2.xml
new file mode 100644
index 0000000..1694b35
--- /dev/null
+++ b/.idea/dataSources/26059583-0fdb-4f6f-ad11-10388e9658c2.xml
@@ -0,0 +1,1923 @@
+
+
+
+
+ 3.45.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+ window
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+ 1
+ 1
+
+
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ window
+
+
+ window
+
+
+
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+
+
+ window
+
+
+
+ 1
+
+
+ window
+
+
+ 1
+
+
+ 1
+ 1
+
+
+
+
+
+ 1
+
+
+ 1
+
+
+ window
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ window
+
+
+ 1
+ window
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ window
+
+
+ 1
+ window
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+ 1
+
+
+ window
+
+
+ window
+
+
+
+ window
+
+
+ window
+
+
+ window
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ aggregate
+
+
+ 1
+
+
+
+
+
+ 1
+ 1
+
+
+ window
+
+
+ aggregate
+
+
+ 1
+ 1
+
+
+ window
+
+
+ 1
+
+
+ aggregate
+
+
+ window
+
+
+ window
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+
+
+ window
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+ 1
+
+
+
+ 1
+
+
+ 1
+
+
+
+
+ window
+
+
+ 1
+
+
+ 1
+
+
+
+
+
+ 1
+
+
+ window
+
+
+ 1
+
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+
+ 1
+
+
+
+ aggregate
+
+
+
+ 1
+ 1
+
+
+ window
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ window
+
+
+ 1
+
+
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+
+
+ window
+
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ 1
+ 1
+
+
+ 1
+
+
+ 1
+
+
+ aggregate
+
+
+ aggregate
+
+
+ 1
+
+
+ 1
+ 2025-07-31.16:26:29
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ 2
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+ R
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ 1
+ BIGINT|0s
+
+
+ 1
+ 2
+ TEXT|0s
+
+
+ CURRENT_TIMESTAMP
+ 1
+ 3
+ TIMESTAMP|0s
+
+
+ 1
+ 4
+ BOOLEAN|0s
+
+
+ 1
+ 5
+ BLOB|0s
+
+
+ 1
+ 6
+ BIGINT|0s
+
+
+ version
+ 1
+ 1
+
+
+ version
+ 1
+ sqlite_autoindex__sqlx_migrations_1
+
+
+ 1
+ 1
+ TEXT|0s
+
+
+ 1
+ 2
+ TEXT|0s
+
+
+ 3
+ TEXT|0s
+
+
+ 1
+ 4
+ TEXT|0s
+
+
+ 1
+ 5
+ TEXT|0s
+
+
+ 1
+ 6
+ TEXT|0s
+
+
+ 1
+ 7
+ TEXT|0s
+
+
+ sub_server_id
+ id
+ sub_server
+
+
+ id
+ 1
+ 1
+
+
+ sub_server_id
+
+
+ id
+ 1
+ sqlite_autoindex_channel_1
+
+
+ 1
+ 1
+ TEXT|0s
+
+
+ 1
+ 2
+ TEXT|0s
+
+
+ 1
+ 3
+ TEXT|0s
+
+
+ 1
+ 4
+ TEXT|0s
+
+
+ 1
+ 5
+ TEXT|0s
+
+
+ 1
+ 6
+ TEXT|0s
+
+
+ author_id
+ id
+ user
+
+
+ channel_id
+ id
+ channel
+
+
+ id
+ 1
+ 1
+
+
+ author_id
+
+
+ channel_id
+
+
+ id
+ 1
+ sqlite_autoindex_message_1
+
+
+ 1
+ TEXT|0s
+
+
+ 2
+ TEXT|0s
+
+
+ 3
+ TEXT|0s
+
+
+ 4
+ INT|0s
+
+
+ 5
+ TEXT|0s
+
+
+ 1
+ 1
+ TEXT|0s
+
+
+ 1
+ 2
+ TEXT|0s
+
+
+ 3
+ TEXT|0s
+
+
+ 1
+ 4
+ TEXT|0s
+
+
+ 1
+ 5
+ TEXT|0s
+
+
+ 1
+ 6
+ TEXT|0s
+
+
+ owner_id
+ id
+ user
+
+
+ id
+ 1
+ 1
+
+
+ id
+ 1
+ sqlite_autoindex_sub_server_1
+
+
+ 1
+ 1
+ TEXT|0s
+
+
+ 1
+ 2
+ TEXT|0s
+
+
+ 1
+ 3
+ TEXT|0s
+
+
+ 1
+ 4
+ TEXT|0s
+
+
+ 5
+ TEXT|0s
+
+
+ sub_server_id
+ id
+ sub_server
+
+
+ user_id
+ id
+ user
+
+
+ id
+ 1
+ 1
+
+
+ sub_server_id
+user_id
+ 1
+ 1
+
+
+ sub_server_id
+
+
+ user_id
+
+
+ id
+ 1
+ sqlite_autoindex_sub_server_user_1
+
+
+ sub_server_id
+user_id
+ sqlite_autoindex_sub_server_user_2
+
+
+ 1
+ 1
+ TEXT|0s
+
+
+ 1
+ 2
+ TEXT|0s
+
+
+ 3
+ TEXT|0s
+
+
+ 4
+ TEXT|0s
+
+
+ 1
+ 5
+ TEXT|0s
+
+
+ 1
+ 6
+ TEXT|0s
+
+
+ id
+ 1
+ 1
+
+
+ username
+ 1
+ 1
+
+
+ id
+ 1
+ sqlite_autoindex_user_1
+
+
+ username
+ sqlite_autoindex_user_2
+
+
+
\ No newline at end of file
diff --git a/.idea/dataSources/26059583-0fdb-4f6f-ad11-10388e9658c2/storage_v2/_src_/schema/main.uQUzAA.meta b/.idea/dataSources/26059583-0fdb-4f6f-ad11-10388e9658c2/storage_v2/_src_/schema/main.uQUzAA.meta
new file mode 100644
index 0000000..8dab49c
--- /dev/null
+++ b/.idea/dataSources/26059583-0fdb-4f6f-ad11-10388e9658c2/storage_v2/_src_/schema/main.uQUzAA.meta
@@ -0,0 +1,2 @@
+#n:main
+! [0, 0, null, null, -2147483648, -2147483648]
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 751c48a..155cd37 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -15,7 +15,18 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
@@ -68,8 +79,13 @@
"org.rust.cargo.project.model.impl.CargoExternalSystemProjectAware.subscribe.first.balloon": "",
"org.rust.first.attach.projects": "true",
"run.code.analysis.last.selected.profile": "pProject Default",
- "settings.editor.selected.configurable": "terminal",
+ "settings.editor.selected.configurable": "ml.llm.LLMProjectConfigurable",
"vue.rearranger.settings.migration": "true"
+ },
+ "keyToStringList": {
+ "DatabaseDriversLRU": [
+ "sqlite"
+ ]
}
}
@@ -141,6 +157,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -199,4 +228,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/network/http_routes/mod.rs b/src/network/http_routes/mod.rs
index c608bfe..7c930d7 100644
--- a/src/network/http_routes/mod.rs
+++ b/src/network/http_routes/mod.rs
@@ -2,4 +2,5 @@ pub mod user;
pub mod channel;
pub mod message;
pub mod websocket;
-pub mod master;
\ No newline at end of file
+pub mod master;
+mod sub_server;
\ No newline at end of file
diff --git a/src/network/http_routes/sub_server.rs b/src/network/http_routes/sub_server.rs
new file mode 100644
index 0000000..e69de29
diff --git a/src/store/repositories/channel_repository.rs b/src/store/repositories/channel_repository.rs
index 8da7be1..b734873 100644
--- a/src/store/repositories/channel_repository.rs
+++ b/src/store/repositories/channel_repository.rs
@@ -2,6 +2,7 @@ use std::sync::Arc;
use sqlx::SqlitePool;
use uuid::Uuid;
use crate::store::models::channel::Channel;
+use crate::store::models::Message;
use crate::store::store_service::StoreService;
use crate::utils::shared_store::SharedArcMap;
@@ -71,7 +72,7 @@ impl ChannelRepository {
}
pub async fn delete(&self, id: Uuid) -> Result {
- let rows_affected = sqlx::query("DELETE FROM sub_server WHERE id = ?")
+ let rows_affected = sqlx::query("DELETE FROM channel WHERE id = ?")
.bind(&id)
.execute(&self.store.db)
.await?
@@ -84,17 +85,13 @@ impl ChannelRepository {
Ok(false)
}
}
+}
- // Pour initialiser le cache depuis la DB
- pub async fn load_all_from_db(&self) -> Result<(), sqlx::Error> {
- let servers: Vec = sqlx::query_as("SELECT * FROM sub_server")
+impl ChannelRepository {
+ // getters (db)
+ pub async fn db_all(&self) -> Result, sqlx::Error> {
+ sqlx::query_as("SELECT * FROM channel")
.fetch_all(&self.store.db)
- .await?;
-
- for server in servers {
- self.store.channels.insert(server.id, server);
- }
-
- Ok(())
+ .await
}
}
\ No newline at end of file
diff --git a/src/store/repositories/link_sub_server_user_repository.rs b/src/store/repositories/link_sub_server_user_repository.rs
index d49e5f4..c3b423b 100644
--- a/src/store/repositories/link_sub_server_user_repository.rs
+++ b/src/store/repositories/link_sub_server_user_repository.rs
@@ -63,5 +63,13 @@ impl LinkSubServerUserRepository {
Ok(through)
}
-
+}
+
+impl LinkSubServerUserRepository {
+ // getters (db)
+ pub async fn db_all(&self) -> Result, sqlx::Error> {
+ sqlx::query_as("SELECT * FROM sub_server_users")
+ .fetch_all(&self.store.db)
+ .await
+ }
}
diff --git a/src/store/repositories/message_repository.rs b/src/store/repositories/message_repository.rs
index 2a3bc06..971da80 100644
--- a/src/store/repositories/message_repository.rs
+++ b/src/store/repositories/message_repository.rs
@@ -18,8 +18,7 @@ impl MessageRepository {
}
impl MessageRepository {
- // getters
-
+ // getters (caches)
}
impl MessageRepository {
@@ -50,7 +49,6 @@ impl MessageRepository {
.bind(&message.id)
.execute(&self.store.db)
.await?;
-
Ok(())
}
@@ -67,4 +65,13 @@ impl MessageRepository {
Ok(false)
}
}
+}
+
+impl MessageRepository {
+ // getters (db)
+ pub async fn db_all(&self) -> Result, sqlx::Error> {
+ sqlx::query_as("SELECT * FROM message")
+ .fetch_all(&self.store.db)
+ .await
+ }
}
\ No newline at end of file
diff --git a/src/store/repositories/sub_server_repository.rs b/src/store/repositories/sub_server_repository.rs
index aff1e67..4396367 100644
--- a/src/store/repositories/sub_server_repository.rs
+++ b/src/store/repositories/sub_server_repository.rs
@@ -1,6 +1,7 @@
use std::sync::Arc;
use sqlx::SqlitePool;
use uuid::Uuid;
+use crate::store::models::Channel;
use crate::store::models::sub_server::SubServer;
use crate::store::store_service::StoreService;
use crate::utils::shared_store::SharedArcMap;
@@ -79,17 +80,13 @@ impl SubServerRepository {
Ok(false)
}
}
+}
- // Pour initialiser le cache depuis la DB
- pub async fn load_all_from_db(&self) -> Result<(), sqlx::Error> {
- let servers: Vec = sqlx::query_as("SELECT * FROM sub_server")
+impl SubServerRepository {
+ // getters (db)
+ pub async fn db_all(&self) -> Result, sqlx::Error> {
+ sqlx::query_as("SELECT * FROM sub_server")
.fetch_all(&self.store.db)
- .await?;
-
- for server in servers {
- self.store.sub_servers.insert(server.id, server);
- }
-
- Ok(())
+ .await
}
}
\ No newline at end of file
diff --git a/src/store/repositories/user_repository.rs b/src/store/repositories/user_repository.rs
index 9b251ea..4241b5b 100644
--- a/src/store/repositories/user_repository.rs
+++ b/src/store/repositories/user_repository.rs
@@ -2,19 +2,18 @@ use std::sync::Arc;
use sqlx::SqlitePool;
use uuid::Uuid;
use crate::store::models::user::User;
+use crate::store::store_service::StoreService;
use crate::utils::shared_store::SharedArcMap;
#[derive(Clone)]
pub struct UserRepository {
- db: SqlitePool,
- cache: SharedArcMap
+ store: StoreService,
}
impl UserRepository {
- pub fn new(db: SqlitePool, cache: SharedArcMap) -> Self {
+ pub fn new(store: StoreService) -> Self {
Self {
- db,
- cache
+ store
}
}
}
@@ -22,11 +21,11 @@ impl UserRepository {
impl UserRepository {
// getters
pub async fn all(&self) -> Vec> {
- self.cache.values().collect()
+ self.store.users.values().collect()
}
pub async fn get(&self, id: Uuid) -> Option> {
- self.cache.get(&id)
+ self.store.users.get(&id)
}
}
@@ -40,12 +39,12 @@ impl UserRepository {
.bind(&user.username)
.bind(&user.pub_key)
.bind(&user.created_at)
- .execute(&self.db)
+ .execute(&self.store.db)
.await?;
// ajouter au cache
let arc_server = Arc::new(user.clone());
- self.cache.insert_arc(user.id, arc_server.clone());
+ self.store.users.insert_arc(user.id, arc_server.clone());
Ok(arc_server)
}
@@ -57,11 +56,11 @@ impl UserRepository {
.bind(&user.username)
.bind(&user.pub_key)
.bind(&user.id)
- .execute(&self.db)
+ .execute(&self.store.db)
.await?;
// Mettre à jour le cache
- self.cache.insert(user.id, user.clone());
+ self.store.users.insert(user.id, user.clone());
Ok(())
}
@@ -69,28 +68,24 @@ impl UserRepository {
pub async fn delete(&self, id: Uuid) -> Result {
let rows_affected = sqlx::query("DELETE FROM user WHERE id = ?")
.bind(&id)
- .execute(&self.db)
+ .execute(&self.store.db)
.await?
.rows_affected();
if rows_affected > 0 {
- self.cache.remove(&id);
+ self.store.users.remove(&id);
Ok(true)
} else {
Ok(false)
}
}
+}
- // Pour initialiser le cache depuis la DB
- pub async fn load_all_from_db(&self) -> Result<(), sqlx::Error> {
- let servers: Vec = sqlx::query_as("SELECT * FROM user")
- .fetch_all(&self.db)
- .await?;
-
- for server in servers {
- self.cache.insert(server.id, server);
- }
-
- Ok(())
+impl UserRepository {
+ // getters (db)
+ pub async fn db_all(&self) -> Result, sqlx::Error> {
+ sqlx::query_as("SELECT * FROM user")
+ .fetch_all(&self.store.db)
+ .await
}
}
\ No newline at end of file
diff --git a/src/store/store_service.rs b/src/store/store_service.rs
index 5b5b4fd..4fda879 100644
--- a/src/store/store_service.rs
+++ b/src/store/store_service.rs
@@ -1,3 +1,4 @@
+use std::collections::HashMap;
use std::sync::Arc;
use uuid::Uuid;
use sqlx::{AnyPool, SqlitePool};
@@ -28,9 +29,9 @@ pub struct StoreService {
pub sub_servers: SharedArcMap,
pub channels: SharedArcMap,
pub sub_server_users: SharedArcVec,
-
}
+
impl StoreService {
pub async fn new(database_url: &str) -> Result {
let connection_url = Self::normalize_database_url(database_url);
@@ -38,9 +39,9 @@ impl StoreService {
let db = SqlitePool::connect(&connection_url).await?;
- sqlx::migrate!("./src/store/migrations").run(&db).await?;
+ // sqlx::migrate!("./src/store/migrations").run(&db).await?;
- let service = Self {
+ let mut service = Self {
db,
users: SharedArcMap::new(),
sub_servers: SharedArcMap::new(),
@@ -55,43 +56,56 @@ impl StoreService {
}
async fn load_all_caches(&self) -> Result<(), sqlx::Error> {
- // Users
- let users: Vec = sqlx::query_as("SELECT * FROM user")
- .fetch_all(&self.db)
- .await?;
- for user in users {
- self.users.insert(user.id, user);
- }
+ let sub_server_rep = SubServerRepository::new(self.clone());
+ let user_rep = UserRepository::new(self.clone());
+ let channel_rep = ChannelRepository::new(self.clone());
+ let link_sub_server_user_rep = LinkSubServerUserRepository::new(self.clone());
- // SubServers
- let sub_servers: Vec = sqlx::query_as("SELECT * FROM sub_server")
- .fetch_all(&self.db)
- .await?;
- for sub_server in sub_servers {
- self.sub_servers.insert(sub_server.id, sub_server);
- }
+ // sub_servers
+ let sub_servers = sub_server_rep.db_all().await?;
+ self.sub_servers.insert_batch_with_key(sub_servers, |sub_server| sub_server.id);
+
+ // Users
+ let users = user_rep.db_all().await?;
+ self.users.insert_batch_with_key(users, |user| user.id);
// Channels
- let channels: Vec = sqlx::query_as("SELECT * FROM channel")
- .fetch_all(&self.db)
- .await?;
- for channel in channels {
- self.channels.insert(channel.id, channel);
- }
+ let channels = channel_rep.db_all().await?;
+ self.channels.insert_batch_with_key(channels, |channel| channel.id);
// Relations N-N
- let relations: Vec = sqlx::query_as("SELECT * FROM sub_server_user")
- .fetch_all(&self.db)
- .await?;
- for relation in relations {
- self.sub_server_users.push(relation);
- }
+ let relations: Vec = link_sub_server_user_rep.db_all().await?;
+ self.sub_server_users.extend(relations);
Ok(())
}
}
+impl StoreService {
+ // Getters repositories
+ pub fn user_repository(&self) -> UserRepository {
+ UserRepository::new(self.clone())
+ }
+
+ pub fn sub_server_repository(&self) -> SubServerRepository {
+ SubServerRepository::new(self.clone())
+ }
+
+ pub fn channel_repository(&self) -> ChannelRepository {
+ ChannelRepository::new(self.clone())
+ }
+
+ pub fn message_repository(&self) -> MessageRepository {
+ MessageRepository::new(self.clone())
+ }
+
+ pub fn sub_server_user_repository(&self) -> LinkSubServerUserRepository {
+ LinkSubServerUserRepository::new(self.clone())
+ }
+
+}
+
impl StoreService {
// ===== HELPERS =====
/// ✅ Normalise l'URL pour supporter différentes bases de données
diff --git a/src/utils/shared_store.rs b/src/utils/shared_store.rs
index 190b403..820057c 100644
--- a/src/utils/shared_store.rs
+++ b/src/utils/shared_store.rs
@@ -707,6 +707,38 @@ where
let map_ref = self.inner.load_full();
map_ref.values().cloned().collect::>().into_iter()
}
+
+ /// Insert une collection entière de paires clé-valeur
+ pub fn insert_batch(&self, items: I)
+ where
+ I: IntoIterator- ,
+ {
+ let current = self.inner.load_full();
+ let mut new_map = current.as_ref().clone();
+
+ for (key, value) in items {
+ new_map.insert(key, value);
+ }
+
+ self.inner.store(Arc::new(new_map));
+ }
+
+ /// Insert une collection de valeurs avec une fonction pour extraire la clé
+ pub fn insert_batch_with_key(&self, items: I, key_fn: F)
+ where
+ I: IntoIterator
- ,
+ F: Fn(&V) -> K,
+ {
+ let current = self.inner.load_full();
+ let mut new_map = current.as_ref().clone();
+
+ for value in items {
+ let key = key_fn(&value);
+ new_map.insert(key, value);
+ }
+
+ self.inner.store(Arc::new(new_map));
+ }
}
// Clone gratuit (juste Arc::clone)
@@ -1059,8 +1091,41 @@ where
let map_ref = self.inner.load_full();
map_ref.iter().map(|(k, v)| (k.clone(), v.clone())).collect::>().into_iter()
}
+
+ /// Insert une collection entière de paires clé-valeur
+ pub fn insert_batch(&self, items: I)
+ where
+ I: IntoIterator
- ,
+ {
+ let current = self.inner.load_full();
+ let mut new_map = current.as_ref().clone();
+
+ for (key, value) in items {
+ new_map.insert(key, Arc::new(value));
+ }
+
+ self.inner.store(Arc::new(new_map));
+ }
+
+ /// Insert une collection de valeurs avec une fonction pour extraire la clé
+ pub fn insert_batch_with_key(&self, items: I, key_fn: F)
+ where
+ I: IntoIterator
- ,
+ F: Fn(&V) -> K,
+ {
+ let current = self.inner.load_full();
+ let mut new_map = current.as_ref().clone();
+
+ for value in items {
+ let key = key_fn(&value);
+ new_map.insert(key, Arc::new(value));
+ }
+
+ self.inner.store(Arc::new(new_map));
+ }
}
+
// ===== IMPLÉMENTATIONS CLONE =====
impl Clone for SharedArcVec {