1use std::sync::Arc;
2
3use axum::routing::{delete, get, post, put};
4use axum::{Extension, Router};
5use tower_http::cors::CorsLayer;
6use tower_http::trace::TraceLayer;
7
8use crate::config::settings::Settings;
9use crate::http::handlers;
10use crate::store::db::Database;
11
12pub fn create_router(
14 db: Arc<Database>,
15 embeddings: Option<Arc<crate::embeddings::engine::EmbeddingEngine>>,
16) -> Router {
17 Router::new()
18 .route("/", get(handlers::dashboard))
19 .route("/favicon.ico", get(handlers::favicon))
20 .route("/health", get(handlers::health))
21 .route("/api/v1/memories", get(handlers::list_memories))
22 .route("/api/v1/memories", post(handlers::create_memory))
23 .route("/api/v1/memories/search", post(handlers::search_memories))
24 .route("/api/v1/memories/similar", post(handlers::similar_memories))
25 .route("/api/v1/memories/:id", get(handlers::get_memory))
26 .route("/api/v1/memories/:id", put(handlers::update_memory))
27 .route("/api/v1/memories/:id", delete(handlers::delete_memory))
28 .route(
29 "/api/v1/memories/:id/relations",
30 get(handlers::get_relations),
31 )
32 .route(
33 "/api/v1/memories/:id/relations",
34 post(handlers::create_relation),
35 )
36 .route(
37 "/api/v1/relations/:relation_id",
38 delete(handlers::delete_relation),
39 )
40 .route("/api/v1/stats", get(handlers::get_stats))
41 .route("/api/v1/projects", get(handlers::list_projects))
42 .route("/api/v1/sessions/start", post(handlers::start_session))
43 .route("/api/v1/sessions/:id/end", post(handlers::end_session))
44 .route("/api/v1/sessions/active", get(handlers::get_active_session))
45 .route("/api/v1/context", get(handlers::get_context))
46 .route("/api/v1/export", get(handlers::export_memories))
47 .route("/api/v1/import", post(handlers::import_memories))
48 .route("/api/v1/doctor", get(handlers::run_doctor))
49 .route(
50 "/api/v1/embeddings/reindex",
51 post(handlers::reindex_embeddings),
52 )
53 .route("/api/v1/memories/batch", post(handlers::batch_save))
54 .route("/api/v1/audit", get(handlers::get_audit))
55 .route("/api/v1/deduplicate", post(handlers::deduplicate))
56 .route("/api/v1/feedback", post(handlers::add_feedback))
57 .route("/api/v1/deprecate", post(handlers::deprecate))
58 .route("/api/v1/graph", get(handlers::get_graph))
59 .route("/api/v1/summarize", get(handlers::get_summarize))
60 .route("/api/v1/inject-context", get(handlers::inject_context))
61 .route("/api/v1/forget-project", post(handlers::forget_project))
62 .route("/api/v1/health", get(handlers::get_health))
63 .route("/api/v1/remind", get(handlers::get_remind))
64 .route("/api/v1/tag-suggest", post(handlers::tag_suggest))
65 .route("/api/v1/knowledge-gaps", get(handlers::get_knowledge_gaps))
66 .route(
67 "/api/v1/memories/:id/encrypt",
68 post(handlers::encrypt_memory),
69 )
70 .route(
71 "/api/v1/memories/:id/decrypt",
72 post(handlers::decrypt_memory),
73 )
74 .route("/api/v1/keys", get(handlers::list_keys))
75 .route("/api/v1/keys", post(handlers::add_key))
76 .route("/api/v1/keys/:id", delete(handlers::remove_key))
77 .route("/api/v1/keys/status", get(handlers::keys_status))
78 .route("/api/v1/sync/hello", post(handlers::sync_hello))
79 .route("/api/v1/sync/pull", post(handlers::sync_pull))
80 .route("/api/v1/sync/push", post(handlers::sync_push))
81 .route("/api/v1/cloud/enroll", post(handlers::cloud_enroll))
82 .route("/api/v1/cloud/sync", post(handlers::cloud_sync))
83 .route("/api/v1/cloud/status", get(handlers::cloud_status))
84 .layer(Extension(embeddings))
85 .layer(Extension(Arc::new(Settings::load().unwrap_or_default())))
86 .layer(CorsLayer::permissive())
87 .layer(TraceLayer::new_for_http())
88 .with_state(db)
89}