@ -137,6 +137,62 @@ pub fn build_router(state: AppState, config: &AppConfig) -> Router {
app
app
}
}
/// Build a lightweight router for integration tests.
///
/// Skips static file serving (SPA fallback) and TraceLayer to avoid
/// issues with `oneshot()` in test environments.
pub fn build_test_router ( state : AppState , config : & AppConfig ) -> Router {
let api_routes = Router ::new ( )
. route ( "/auth/register" , post ( handlers ::auth ::register ) )
. route ( "/auth/login" , post ( handlers ::auth ::login ) )
. route ( "/auth/verify" , get ( handlers ::auth ::verify_get ) )
. route ( "/auth/verify" , post ( handlers ::auth ::verify_post ) )
. route ( "/auth/logout" , post ( handlers ::auth ::logout ) )
. route ( "/auth/me" , get ( handlers ::auth ::me ) )
. route ( "/settings" , get ( handlers ::settings ::get_settings ) )
. route ( "/settings" , put ( handlers ::settings ::update_settings ) )
. route ( "/sources" , get ( handlers ::sources ::list ) )
. route ( "/sources" , post ( handlers ::sources ::create ) )
. route ( "/sources/{id}" , delete ( handlers ::sources ::delete ) )
. route ( "/sources/bulk" , post ( handlers ::sources ::bulk_import ) )
. route ( "/sources/import-csv" , post ( handlers ::sources ::import_csv ) )
. route ( "/sources/export-csv" , get ( handlers ::sources ::export_csv ) )
. route ( "/user/api-keys" , get ( handlers ::api_keys ::list ) )
. route ( "/user/api-keys" , post ( handlers ::api_keys ::create ) )
. route ( "/user/api-keys/{provider}" , delete ( handlers ::api_keys ::delete ) )
. route ( "/user/api-keys/{provider}/test" , post ( handlers ::api_keys ::test_key ) )
. route ( "/user/api-keys/export" , post ( handlers ::api_keys ::export_keys ) )
. route ( "/syntheses/generate" , post ( handlers ::generation ::trigger_generate ) )
. route ( "/syntheses/generate/{job_id}/progress" , get ( handlers ::generation ::progress_stream ) )
. route ( "/article-history" , get ( handlers ::article_history ::list_history ) . delete ( handlers ::article_history ::clear_history ) )
. route ( "/syntheses/{id}/provenance" , get ( handlers ::article_history ::get_provenance ) )
. route ( "/llm-logs/{job_id}" , get ( handlers ::llm_logs ::get_logs ) )
. route ( "/syntheses" , get ( handlers ::syntheses ::list ) )
. route ( "/syntheses/{id}" , get ( handlers ::syntheses ::get ) )
. route ( "/syntheses/{id}" , delete ( handlers ::syntheses ::delete ) )
. route ( "/syntheses/{id}/send-email" , post ( handlers ::syntheses ::send_email ) )
. route ( "/syntheses/{id}/export/markdown" , get ( handlers ::syntheses ::export_markdown ) )
. route ( "/syntheses/{id}/export/pdf" , get ( handlers ::syntheses ::export_pdf ) )
. route ( "/config/providers" , get ( handlers ::config ::list_enabled_providers ) )
. route ( "/admin/providers" , get ( handlers ::admin ::list_providers ) )
. route ( "/admin/providers" , post ( handlers ::admin ::create_provider ) )
. route ( "/admin/providers/{id}" , put ( handlers ::admin ::update_provider ) )
. route ( "/admin/providers/{id}" , delete ( handlers ::admin ::delete_provider ) )
. route ( "/admin/rate-limits" , get ( handlers ::admin ::list_rate_limits ) )
. route ( "/admin/rate-limits/{provider_name}" , put ( handlers ::admin ::update_rate_limit ) )
. route ( "/admin/users" , get ( handlers ::admin ::list_users ) )
. route ( "/admin/users/{id}/role" , put ( handlers ::admin ::update_user_role ) )
. route ( "/health" , get ( handlers ::health ::health_check ) )
. layer ( axum_mw ::from_fn ( csrf ::csrf_check ) ) ;
let api = Router ::new ( ) . nest ( "/api/v1" , api_routes ) ;
Router ::new ( )
. merge ( api )
. with_state ( state )
. layer ( DefaultBodyLimit ::max ( 1024 * 1024 ) )
}
/// Build the CORS layer based on configuration.
/// Build the CORS layer based on configuration.
///
///
/// Allows the configured `APP_URL` as origin, with credentials (cookies).
/// Allows the configured `APP_URL` as origin, with credentials (cookies).