diff --git a/src/core/shared/models/mod.rs b/src/core/shared/models/mod.rs index 228fce26..6379848a 100644 --- a/src/core/shared/models/mod.rs +++ b/src/core/shared/models/mod.rs @@ -43,7 +43,7 @@ pub use super::schema::{ }; #[cfg(feature = "rbac")] -pub use super::schema::kb_group_associations; +pub use super::schema::kb::{kb_collections, kb_group_associations}; pub use botlib::message_types::MessageType; pub use botlib::models::{ApiResponse, Attachment, BotResponse, Session, Suggestion, UserMessage}; diff --git a/src/core/shared/schema/kb.rs b/src/core/shared/schema/kb.rs new file mode 100644 index 00000000..eca8da7d --- /dev/null +++ b/src/core/shared/schema/kb.rs @@ -0,0 +1,36 @@ +use crate::core::shared::schema::core::bots; +use crate::core::shared::schema::core::rbac_groups; +use crate::core::shared::schema::core::users; + +diesel::table! { + kb_collections (id) { + id -> Uuid, + bot_id -> Uuid, + name -> Text, + folder_path -> Text, + qdrant_collection -> Text, + document_count -> Int4, + created_at -> Timestamptz, + updated_at -> Timestamptz, + } +} + +diesel::table! { + kb_group_associations (id) { + id -> Uuid, + kb_id -> Uuid, + group_id -> Uuid, + granted_by -> Nullable, + granted_at -> Timestamptz, + } +} + +diesel::joinable!(kb_collections -> bots (bot_id)); +diesel::joinable!(kb_group_associations -> kb_collections (kb_id)); +diesel::joinable!(kb_group_associations -> rbac_groups (group_id)); +diesel::joinable!(kb_group_associations -> users (granted_by)); + +diesel::allow_tables_to_appear_in_same_query!( + kb_collections, + kb_group_associations, +); diff --git a/src/core/shared/schema/mod.rs b/src/core/shared/schema/mod.rs index 1c8924fc..e1882b53 100644 --- a/src/core/shared/schema/mod.rs +++ b/src/core/shared/schema/mod.rs @@ -73,6 +73,11 @@ pub mod research; #[cfg(feature = "research")] pub use self::research::*; +#[cfg(feature = "rbac")] +pub mod kb; +#[cfg(feature = "rbac")] +pub use self::kb::*; + #[cfg(feature = "learn")] pub mod learn; #[cfg(feature = "learn")] diff --git a/src/core/shared/schema/research.rs b/src/core/shared/schema/research.rs index 8b23df21..e4bee1c9 100644 --- a/src/core/shared/schema/research.rs +++ b/src/core/shared/schema/research.rs @@ -1,5 +1,6 @@ use crate::core::shared::schema::core::{bots, organizations}; use crate::core::shared::schema::core::{rbac_groups, users}; +use crate::core::shared::schema::kb::{kb_collections, kb_group_associations}; diesel::table! { kb_documents (id) { @@ -20,19 +21,6 @@ diesel::table! { } } -diesel::table! { - kb_collections (id) { - id -> Uuid, - bot_id -> Uuid, - name -> Text, - folder_path -> Text, - qdrant_collection -> Text, - document_count -> Int4, - created_at -> Timestamptz, - updated_at -> Timestamptz, - } -} - diesel::table! { user_kb_associations (id) { id -> Text, @@ -151,20 +139,6 @@ diesel::table! { } } -diesel::table! { - kb_group_associations (id) { - id -> Uuid, - kb_id -> Uuid, - group_id -> Uuid, - granted_by -> Nullable, - granted_at -> Timestamptz, - } -} - -diesel::joinable!(kb_collections -> bots (bot_id)); -diesel::joinable!(kb_group_associations -> kb_collections (kb_id)); -diesel::joinable!(kb_group_associations -> rbac_groups (group_id)); -diesel::joinable!(kb_group_associations -> users (granted_by)); diesel::joinable!(research_projects -> organizations (org_id)); diesel::joinable!(research_projects -> bots (bot_id)); diesel::joinable!(research_sources -> research_projects (project_id)); diff --git a/src/directory/groups/kbs.rs b/src/directory/groups/kbs.rs index e171961c..0cbb3b99 100644 --- a/src/directory/groups/kbs.rs +++ b/src/directory/groups/kbs.rs @@ -30,7 +30,7 @@ pub async fn get_group_kbs( let mut db_conn = conn.get().map_err(|e| format!("DB error: {e}"))?; // 1. Get all KBs from kb_collections - use crate::core::shared::models::schema::kb_collections; + use crate::core::shared::models::kb_collections; let all_kbs = kb_collections::table .select(( kb_collections::id, @@ -41,7 +41,7 @@ pub async fn get_group_kbs( .map_err(|e| format!("KB query error: {e}"))?; // 2. Get associated KB IDs for this group - use crate::core::shared::models::schema::kb_group_associations; + use crate::core::shared::models::kb_group_associations; let associated_ids: Vec = kb_group_associations::table .filter(kb_group_associations::group_id.eq(group_id)) .select(kb_group_associations::kb_id) @@ -216,7 +216,7 @@ pub async fn toggle_group_kb( let conn = state.conn.clone(); let result = tokio::task::spawn_blocking(move || -> Result { let mut db_conn = conn.get().map_err(|e| format!("DB error: {e}"))?; - use crate::core::shared::models::schema::kb_group_associations; + use crate::core::shared::models::kb_group_associations; let existing = kb_group_associations::table .filter(kb_group_associations::kb_id.eq(kb_id)) diff --git a/src/llm/mod.rs b/src/llm/mod.rs index 3df0f086..49616311 100644 --- a/src/llm/mod.rs +++ b/src/llm/mod.rs @@ -11,6 +11,7 @@ pub mod episodic_memory; pub mod glm; pub mod hallucination_detector; pub mod llm_models; +#[cfg(feature = "llm")] pub mod local; pub mod observability; pub mod rate_limiter; diff --git a/src/settings/rbac.rs b/src/settings/rbac.rs index 60c2697a..d3715750 100644 --- a/src/settings/rbac.rs +++ b/src/settings/rbac.rs @@ -18,11 +18,6 @@ use serde::{Deserialize, Serialize}; use std::sync::Arc; use uuid::Uuid; -#[cfg(feature = "rbac")] -use crate::settings::rbac_kb::{ - assign_kb_to_group, get_accessible_kbs_for_user, get_kb_groups, remove_kb_from_group, -}; - pub fn configure_rbac_routes() -> Router> { Router::new() diff --git a/src/settings/rbac_kb.rs b/src/settings/rbac_kb.rs index 613c59b3..a1422cc0 100644 --- a/src/settings/rbac_kb.rs +++ b/src/settings/rbac_kb.rs @@ -134,7 +134,7 @@ pub async fn assign_kb_to_group( let now = Utc::now(); let result = tokio::task::spawn_blocking(move || -> Result<(), String> { let mut db_conn = conn.get().map_err(|e| format!("DB error: {e}"))?; - use crate::core::shared::models::schema::kb_group_associations; + use crate::core::shared::models::kb_group_associations; let existing: Option = kb_group_associations::table .filter(kb_group_associations::kb_id.eq(kb_id)) .filter(kb_group_associations::group_id.eq(group_id)) @@ -183,7 +183,7 @@ pub async fn remove_kb_from_group( let conn = state.conn.clone(); let result = tokio::task::spawn_blocking(move || -> Result<(), String> { let mut db_conn = conn.get().map_err(|e| format!("DB error: {e}"))?; - use crate::core::shared::models::schema::kb_group_associations; + use crate::core::shared::models::kb_group_associations; diesel::delete( kb_group_associations::table .filter(kb_group_associations::kb_id.eq(kb_id))