use utoipa::{OpenApi, Modify}; use utoipa::openapi::security::{SecurityScheme, HttpAuthScheme, Http}; use utoipa_swagger_ui::SwaggerUi; use axum::Router; use std::sync::Arc; use crate::{ models::{ CreateUser, LoginRequest, LoginResponse, UserResponse, UpdateUser, DocumentResponse, SearchRequest, SearchResponse, EnhancedDocumentResponse, SettingsResponse, UpdateSettings, SearchMode, SearchSnippet, HighlightRange, FacetItem, SearchFacetsResponse, Notification, NotificationSummary, CreateNotification, Source, SourceResponse, CreateSource, UpdateSource, SourceWithStats, WebDAVSourceConfig, LocalFolderSourceConfig, S3SourceConfig, WebDAVCrawlEstimate, WebDAVTestConnection, WebDAVConnectionResult, WebDAVSyncStatus, ProcessedImage, CreateProcessedImage, IgnoredFileResponse, IgnoredFilesQuery, DocumentListResponse, DocumentOcrResponse, DocumentOperationResponse, BulkDeleteResponse, PaginationInfo, DocumentDuplicatesResponse }, routes::{ metrics::{ SystemMetrics, DatabaseMetrics, OcrMetrics, DocumentMetrics, UserMetrics, GeneralSystemMetrics }, labels::{ Label, CreateLabel, UpdateLabel, LabelAssignment, LabelQuery, BulkUpdateRequest as LabelBulkUpdateRequest }, documents::BulkDeleteRequest }, AppState, }; #[derive(OpenApi)] #[openapi( paths( // Auth endpoints crate::routes::auth::register, crate::routes::auth::login, crate::routes::auth::me, // Document endpoints crate::routes::documents::upload_document, crate::routes::documents::list_documents, crate::routes::documents::get_document_by_id, crate::routes::documents::delete_document, crate::routes::documents::bulk_delete_documents, crate::routes::documents::download_document, crate::routes::documents::view_document, crate::routes::documents::get_document_thumbnail, crate::routes::documents::get_document_ocr, crate::routes::documents::get_processed_image, crate::routes::documents::retry_ocr, crate::routes::documents::get_failed_ocr_documents, crate::routes::documents::get_user_duplicates, // Labels endpoints crate::routes::labels::get_labels, crate::routes::labels::create_label, crate::routes::labels::get_label, crate::routes::labels::update_label, crate::routes::labels::delete_label, crate::routes::labels::get_document_labels, crate::routes::labels::update_document_labels, crate::routes::labels::add_document_label, crate::routes::labels::remove_document_label, crate::routes::labels::bulk_update_document_labels, // Search endpoints crate::routes::search::search_documents, crate::routes::search::enhanced_search_documents, crate::routes::search::get_search_facets, // Settings endpoints crate::routes::settings::get_settings, crate::routes::settings::update_settings, // User endpoints crate::routes::users::list_users, crate::routes::users::create_user, crate::routes::users::get_user, crate::routes::users::update_user, crate::routes::users::delete_user, // Queue endpoints crate::routes::queue::get_queue_stats, crate::routes::queue::requeue_failed, crate::routes::queue::get_ocr_status, crate::routes::queue::pause_ocr_processing, crate::routes::queue::resume_ocr_processing, // Metrics endpoints crate::routes::metrics::get_system_metrics, // Notifications endpoints crate::routes::notifications::get_notifications, crate::routes::notifications::get_notification_summary, crate::routes::notifications::mark_notification_read, crate::routes::notifications::mark_all_notifications_read, crate::routes::notifications::delete_notification, // Sources endpoints crate::routes::sources::list_sources, crate::routes::sources::create_source, crate::routes::sources::get_source, crate::routes::sources::update_source, crate::routes::sources::delete_source, crate::routes::sources::trigger_sync, crate::routes::sources::stop_sync, crate::routes::sources::test_connection, crate::routes::sources::estimate_crawl, crate::routes::sources::estimate_crawl_with_config, crate::routes::sources::test_connection_with_config, // WebDAV endpoints crate::routes::webdav::start_webdav_sync, crate::routes::webdav::cancel_webdav_sync, crate::routes::webdav::get_webdav_sync_status, crate::routes::webdav::test_webdav_connection, crate::routes::webdav::estimate_webdav_crawl, // Ignored files endpoints crate::routes::ignored_files::list_ignored_files, crate::routes::ignored_files::get_ignored_file, crate::routes::ignored_files::delete_ignored_file, crate::routes::ignored_files::bulk_delete_ignored_files, crate::routes::ignored_files::get_ignored_files_stats, // Health check crate::health_check, ), components( schemas( CreateUser, LoginRequest, LoginResponse, UserResponse, UpdateUser, DocumentResponse, SearchRequest, SearchResponse, EnhancedDocumentResponse, SettingsResponse, UpdateSettings, SearchMode, SearchSnippet, HighlightRange, FacetItem, SearchFacetsResponse, Notification, NotificationSummary, CreateNotification, Source, SourceResponse, CreateSource, UpdateSource, SourceWithStats, WebDAVSourceConfig, LocalFolderSourceConfig, S3SourceConfig, WebDAVCrawlEstimate, WebDAVTestConnection, WebDAVConnectionResult, WebDAVSyncStatus, ProcessedImage, CreateProcessedImage, IgnoredFileResponse, IgnoredFilesQuery, crate::routes::ignored_files::BulkDeleteIgnoredFilesRequest, crate::routes::ignored_files::IgnoredFilesStats, crate::routes::ignored_files::SourceTypeCount, SystemMetrics, DatabaseMetrics, OcrMetrics, DocumentMetrics, UserMetrics, GeneralSystemMetrics, // Labels schemas Label, CreateLabel, UpdateLabel, LabelAssignment, LabelQuery, LabelBulkUpdateRequest, // Document schemas BulkDeleteRequest, DocumentListResponse, DocumentOcrResponse, DocumentOperationResponse, BulkDeleteResponse, PaginationInfo, DocumentDuplicatesResponse ) ), tags( (name = "auth", description = "Authentication endpoints"), (name = "documents", description = "Document management endpoints"), (name = "labels", description = "Document labeling and categorization endpoints"), (name = "search", description = "Document search endpoints"), (name = "settings", description = "User settings endpoints"), (name = "users", description = "User management endpoints"), (name = "queue", description = "OCR queue management endpoints"), (name = "metrics", description = "System metrics and monitoring endpoints"), (name = "notifications", description = "User notification endpoints"), (name = "sources", description = "Document source management endpoints"), (name = "webdav", description = "WebDAV synchronization endpoints"), (name = "ignored_files", description = "Ignored files management endpoints"), (name = "health", description = "Health check endpoint"), ), modifiers(&SecurityAddon), info( title = "Readur API", version = "0.1.0", description = "Document management and OCR processing API", contact( name = "Readur Team", email = "support@readur.dev" ) ), servers( (url = "/api", description = "API base path") ) )] pub struct ApiDoc; struct SecurityAddon; impl Modify for SecurityAddon { fn modify(&self, openapi: &mut utoipa::openapi::OpenApi) { if let Some(components) = openapi.components.as_mut() { components.add_security_scheme( "bearer_auth", SecurityScheme::Http(Http::new(HttpAuthScheme::Bearer)) ) } } } pub fn create_swagger_router() -> Router> { SwaggerUi::new("/swagger-ui") .url("/api-docs/openapi.json", ApiDoc::openapi()) .into() }