diff --git a/src/bin/server.rs b/src/bin/server.rs index 98310e5..0685692 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -113,7 +113,7 @@ async fn main() -> Result<(), Box> { setup_auth(&app_state.surreal_db_client).await?; Analytics::ensure_initialized(&app_state.surreal_db_client).await?; SystemSettings::ensure_initialized(&app_state.surreal_db_client).await?; - + // app_state.surreal_db_client.drop_table::().await?; // Create Axum router let app = Router::new() .nest("/api/v1", api_routes_v1(&app_state)) diff --git a/src/server/routes/html/index.rs b/src/server/routes/html/index.rs index fe27e19..11fa8e8 100644 --- a/src/server/routes/html/index.rs +++ b/src/server/routes/html/index.rs @@ -176,88 +176,6 @@ async fn get_and_validate_text_content( Ok(text_content) } -// pub async fn delete_text_content( -// State(state): State, -// auth: AuthSession, Surreal>, -// Path(id): Path, -// ) -> Result { -// let user = match &auth.current_user { -// Some(user) => user, -// None => return Ok(Redirect::to("/").into_response()), -// }; - -// // Get TextContent from db -// let text_content = match get_item::(&state.surreal_db_client, &id) -// .await -// .map_err(|e| HtmlError::new(AppError::from(e), state.templates.clone()))? -// { -// Some(text_content) => text_content, -// None => { -// return Err(HtmlError::new( -// AppError::NotFound("No item found".to_string()), -// state.templates, -// )) -// } -// }; - -// // Validate that the user is the owner -// if text_content.user_id != user.id { -// return Err(HtmlError::new( -// AppError::Auth("You are not the owner of that content".to_string()), -// state.templates, -// )); -// } - -// // If TextContent has file_info, delete it from db and file from disk. -// if text_content.file_info.is_some() { -// FileInfo::delete_by_id( -// &text_content.file_info.unwrap().id, -// &state.surreal_db_client, -// ) -// .await -// .map_err(|e| HtmlError::new(AppError::from(e), state.templates.clone()))?; -// } - -// // Delete textcontent from db -// delete_item::(&state.surreal_db_client, &text_content.id) -// .await -// .map_err(|e| HtmlError::new(AppError::from(e), state.templates.clone()))?; - -// // Delete TextChunks -// TextChunk::delete_by_source_id(&text_content.id, &state.surreal_db_client) -// .await -// .map_err(|e| HtmlError::new(e, state.templates.clone()))?; - -// // Delete KnowledgeEntities -// KnowledgeEntity::delete_by_source_id(&text_content.id, &state.surreal_db_client) -// .await -// .map_err(|e| HtmlError::new(e, state.templates.clone()))?; - -// // Delete KnowledgeRelationships -// KnowledgeRelationship::delete_relationships_by_source_id( -// &text_content.id, -// &state.surreal_db_client, -// ) -// .await -// .map_err(|e| HtmlError::new(e, state.templates.clone()))?; - -// // Get latest text contents after updates -// let latest_text_contents = User::get_latest_text_contents(&user.id, &state.surreal_db_client) -// .await -// .map_err(|e| HtmlError::new(e, state.templates.clone()))?; - -// let output = render_block( -// "index/signed_in/recent_content.html", -// "latest_content_section", -// LatestTextContentData { -// user: user.clone(), -// latest_text_contents, -// }, -// state.templates.clone(), -// )?; - -// Ok(output.into_response()) -// } #[derive(Serialize)] pub struct ActiveJobsData { diff --git a/src/server/routes/html/ingress_form.rs b/src/server/routes/html/ingress_form.rs index 0977573..8937fba 100644 --- a/src/server/routes/html/ingress_form.rs +++ b/src/server/routes/html/ingress_form.rs @@ -20,6 +20,11 @@ use crate::{ use super::render_template; +#[derive(Serialize)] +pub struct ShowIngressFormData { + user_categories: Vec, +} + pub async fn show_ingress_form( State(state): State, auth: AuthSession, Surreal>, @@ -28,7 +33,15 @@ pub async fn show_ingress_form( return Ok(Redirect::to("/").into_response()); } - let output = render_template("ingress_form.html", {}, state.templates.clone())?; + let user_categories = User::get_user_categories(&auth.id, &state.surreal_db_client) + .await + .map_err(|e| HtmlError::new(e, state.templates.clone()))?; + + let output = render_template( + "ingress_form.html", + ShowIngressFormData { user_categories }, + state.templates.clone(), + )?; Ok(output.into_response()) } diff --git a/src/server/routes/html/knowledge/entities.rs b/src/server/routes/html/knowledge/entities.rs new file mode 100644 index 0000000..75e9ac4 --- /dev/null +++ b/src/server/routes/html/knowledge/entities.rs @@ -0,0 +1,41 @@ +use axum::{ + extract::{Path, State}, + response::{IntoResponse, Redirect}, +}; +use axum_session::Session; +use axum_session_auth::AuthSession; +use axum_session_surreal::SessionSurrealPool; +use surrealdb::{engine::any::Any, Surreal}; +use tokio::join; +use tracing::info; + +use crate::{ + error::{AppError, HtmlError}, + page_data, + server::{ + routes::html::{render_block, render_template}, + AppState, + }, + storage::{ + db::{delete_item, get_item}, + types::{ + file_info::FileInfo, job::Job, knowledge_entity::KnowledgeEntity, + knowledge_relationship::KnowledgeRelationship, text_chunk::TextChunk, + text_content::TextContent, user::User, + }, + }, +}; + +page_data!(KnowledgeEntitiesData, "todo", { + gdpr_accepted: bool, + user: Option, + latest_text_contents: Vec, + active_jobs: Vec +}); +pub async fn index_handler( + State(state): State, + auth: AuthSession, Surreal>, + session: Session>, +) -> Result { + Ok("Hi".into_response()) +} diff --git a/src/storage/types/user.rs b/src/storage/types/user.rs index b7ff3c1..4fa1ffb 100644 --- a/src/storage/types/user.rs +++ b/src/storage/types/user.rs @@ -11,6 +11,11 @@ use super::{ knowledge_entity::KnowledgeEntity, system_settings::SystemSettings, text_content::TextContent, }; +#[derive(Deserialize)] +pub struct CategoryResponse { + category: String, +} + stored_object!(User, "user", { email: String, password: String, @@ -245,4 +250,23 @@ impl User { .await?; Ok(()) } + + pub async fn get_user_categories( + user_id: &str, + db: &SurrealDbClient, + ) -> Result, AppError> { + // Query to select distinct categories for the user + let response: Vec = db + .client + .query("SELECT category FROM type::table($table_name) WHERE user_id = $user_id GROUP BY category") + .bind(("user_id", user_id.to_owned())) + .bind(("table_name", TextContent::table_name())) + .await? + .take(0)?; + + // Extract the categories from the response + let categories: Vec = response.into_iter().map(|item| item.category).collect(); + + Ok(categories) + } } diff --git a/templates/ingress_form.html b/templates/ingress_form.html index 3af6a01..589835f 100644 --- a/templates/ingress_form.html +++ b/templates/ingress_form.html @@ -8,34 +8,33 @@ -
-
-
-
{{ error }}
-
-