use crate::handlers;
use crate::server::AppState;
use axum::{
routing::{get, post},
Router,
};
use oxirs_core::rdf_store::ConcreteStore;
use std::sync::Arc;
pub fn build_jena_router(state: Arc<AppState>, concrete: Arc<ConcreteStore>) -> Router {
let sparql_routes: Router = Router::new()
.route(
"/sparql",
get(handlers::query_handler_get).post(handlers::query_handler_post),
)
.route(
"/{dataset}/sparql",
get(handlers::query_handler_get).post(handlers::query_handler_post),
)
.route(
"/{dataset}/query",
get(handlers::query_handler_get).post(handlers::query_handler_post),
)
.route("/update", post(handlers::sparql_refactored::update_handler))
.route(
"/{dataset}/update",
post(handlers::sparql_refactored::update_handler),
)
.with_state(state.clone());
let admin_routes: Router = Router::new()
.route("/$/ping", get(jena_ping_handler))
.route("/$/server", get(handlers::admin::server_info))
.route("/$/stats", get(handlers::admin::server_stats))
.route("/$/datasets", get(handlers::admin::list_datasets))
.with_state(state);
let store_routes: Router = Router::new()
.route(
"/data",
get(handlers::gsp::read::handle_gsp_get::<ConcreteStore>)
.head(handlers::gsp::read::handle_gsp_head::<ConcreteStore>)
.put(handlers::gsp::write::handle_gsp_put::<ConcreteStore>)
.post(handlers::gsp::write::handle_gsp_post::<ConcreteStore>)
.delete(handlers::gsp::write::handle_gsp_delete::<ConcreteStore>)
.options(handlers::gsp::read::handle_gsp_options),
)
.route(
"/{dataset}/data",
get(handlers::gsp::read::handle_gsp_get::<ConcreteStore>)
.head(handlers::gsp::read::handle_gsp_head::<ConcreteStore>)
.put(handlers::gsp::write::handle_gsp_put::<ConcreteStore>)
.post(handlers::gsp::write::handle_gsp_post::<ConcreteStore>)
.delete(handlers::gsp::write::handle_gsp_delete::<ConcreteStore>)
.options(handlers::gsp::read::handle_gsp_options),
)
.route(
"/upload",
post(handlers::upload::handle_upload::<ConcreteStore>),
)
.route(
"/{dataset}/upload",
post(handlers::upload::handle_upload::<ConcreteStore>),
)
.route(
"/patch",
post(handlers::patch::handle_patch::<ConcreteStore>),
)
.route(
"/{dataset}/patch",
post(handlers::patch::handle_patch::<ConcreteStore>),
)
.with_state(concrete);
Router::new()
.merge(sparql_routes)
.merge(admin_routes)
.merge(store_routes)
}
async fn jena_ping_handler() -> impl axum::response::IntoResponse {
use axum::http::header::CONTENT_TYPE;
let body = chrono::Utc::now().to_rfc3339();
([(CONTENT_TYPE, "text/plain; charset=utf-8")], body)
}
pub fn build_minimal_app_state(
store: crate::store::Store,
config: crate::config::ServerConfig,
) -> AppState {
AppState {
store,
config,
auth_service: None,
metrics_service: None,
performance_service: None,
query_optimizer: None,
subscription_manager: None,
federation_manager: None,
streaming_manager: None,
concurrency_manager: None,
memory_manager: None,
batch_executor: None,
stream_manager: None,
dataset_manager: None,
security_auditor: None,
ddos_protector: None,
load_balancer: None,
edge_cache_manager: None,
performance_profiler: None,
notification_manager: None,
backup_manager: None,
recovery_manager: None,
disaster_recovery: None,
certificate_rotation: None,
http2_manager: None,
http3_manager: None,
adaptive_execution_engine: None,
rebac_manager: None,
prefix_store: Arc::new(handlers::PrefixStore::new()),
task_manager: Arc::new(handlers::TaskManager::new()),
request_logger: Arc::new(handlers::RequestLogger::new()),
startup_time: std::time::Instant::now(),
system_monitor: Arc::new(parking_lot::Mutex::new(sysinfo::System::new())),
#[cfg(feature = "rate-limit")]
rate_limiter: None,
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::config::ServerConfig;
use crate::store::Store;
#[test]
fn test_build_minimal_app_state() {
let store = Store::new().expect("store");
let config = ServerConfig::default();
let state = build_minimal_app_state(store, config);
assert!(state.metrics_service.is_none());
assert!(state.auth_service.is_none());
}
#[tokio::test]
async fn test_build_jena_router_constructable() {
let store = Store::new().expect("store");
let config = ServerConfig::default();
let state = Arc::new(build_minimal_app_state(store, config));
let concrete = Arc::new(ConcreteStore::new().expect("concrete"));
let _router = build_jena_router(state, concrete);
}
}