feat: Implement semantic search and smart note linking with embedding generation, vector storage, and link persistence.

This commit is contained in:
2025-12-25 23:59:11 +01:00
parent 4cb398869d
commit 178d59540e
19 changed files with 2501 additions and 49 deletions

View File

@@ -1,3 +1,4 @@
use notes_infra::factory::{EmbeddingProvider, VectorProvider};
use std::env;
/// Server configuration
@@ -9,6 +10,8 @@ pub struct Config {
pub session_secret: String,
pub cors_allowed_origins: Vec<String>,
pub allow_registration: bool,
pub embedding_provider: EmbeddingProvider,
pub vector_provider: VectorProvider,
}
impl Default for Config {
@@ -21,6 +24,11 @@ impl Default for Config {
.to_string(),
cors_allowed_origins: vec!["http://localhost:5173".to_string()],
allow_registration: true,
embedding_provider: EmbeddingProvider::FastEmbed,
vector_provider: VectorProvider::Qdrant {
url: "http://localhost:6334".to_string(),
collection: "notes".to_string(),
},
}
}
}
@@ -56,6 +64,19 @@ impl Config {
.map(|s| s.to_lowercase() == "true")
.unwrap_or(true);
let embedding_provider = match env::var("EMBEDDING_PROVIDER").unwrap_or_default().as_str() {
// Future: "ollama" => EmbeddingProvider::Ollama(...),
_ => EmbeddingProvider::FastEmbed,
};
let vector_provider = match env::var("VECTOR_PROVIDER").unwrap_or_default().as_str() {
// Future: "postgres" => ...
_ => VectorProvider::Qdrant {
url: env::var("QDRANT_URL").unwrap_or_else(|_| "http://localhost:6334".to_string()),
collection: env::var("QDRANT_COLLECTION").unwrap_or_else(|_| "notes".to_string()),
},
};
Self {
host,
port,
@@ -63,6 +84,8 @@ impl Config {
session_secret,
cors_allowed_origins,
allow_registration,
embedding_provider,
vector_provider,
}
}
}

View File

@@ -55,7 +55,9 @@ impl IntoResponse for ApiError {
DomainError::Unauthorized(_) => StatusCode::FORBIDDEN,
DomainError::RepositoryError(_) => StatusCode::INTERNAL_SERVER_ERROR,
DomainError::RepositoryError(_) | DomainError::InfrastructureError(_) => {
StatusCode::INTERNAL_SERVER_ERROR
}
};
(