use utoipa::OpenApi; /// Central `OpenAPI` document registry. /// Handler functions and schemas are added here as route modules are annotated. #[derive(OpenApi)] #[openapi( info( title = "Pinakes API", version = env!("CARGO_PKG_VERSION"), description = "Media cataloging and library management API" ), paths( // analytics crate::routes::analytics::get_most_viewed, crate::routes::analytics::get_recently_viewed, crate::routes::analytics::record_event, crate::routes::analytics::get_watch_progress, crate::routes::analytics::update_watch_progress, // audit crate::routes::audit::list_audit, // auth crate::routes::auth::login, crate::routes::auth::logout, crate::routes::auth::me, crate::routes::auth::refresh, crate::routes::auth::revoke_all_sessions, crate::routes::auth::list_active_sessions, // backup crate::routes::backup::create_backup, // books crate::routes::books::get_book_metadata, crate::routes::books::list_books, crate::routes::books::list_series, crate::routes::books::get_series_books, crate::routes::books::list_authors, crate::routes::books::get_author_books, crate::routes::books::get_reading_progress, crate::routes::books::update_reading_progress, crate::routes::books::get_reading_list, // collections crate::routes::collections::create_collection, crate::routes::collections::list_collections, crate::routes::collections::get_collection, crate::routes::collections::delete_collection, crate::routes::collections::add_member, crate::routes::collections::remove_member, crate::routes::collections::get_members, // config crate::routes::config::get_config, crate::routes::config::get_ui_config, crate::routes::config::update_ui_config, crate::routes::config::update_scanning_config, crate::routes::config::add_root, crate::routes::config::remove_root, // database crate::routes::database::database_stats, crate::routes::database::vacuum_database, crate::routes::database::clear_database, // duplicates crate::routes::duplicates::list_duplicates, // enrichment crate::routes::enrichment::trigger_enrichment, crate::routes::enrichment::get_external_metadata, crate::routes::enrichment::batch_enrich, // export crate::routes::export::trigger_export, crate::routes::export::trigger_export_with_options, // health crate::routes::health::health, crate::routes::health::liveness, crate::routes::health::readiness, crate::routes::health::health_detailed, // integrity crate::routes::integrity::trigger_orphan_detection, crate::routes::integrity::trigger_verify_integrity, crate::routes::integrity::trigger_cleanup_thumbnails, crate::routes::integrity::generate_all_thumbnails, crate::routes::integrity::resolve_orphans, // jobs crate::routes::jobs::list_jobs, crate::routes::jobs::get_job, crate::routes::jobs::cancel_job, // media crate::routes::media::import_media, crate::routes::media::list_media, crate::routes::media::get_media, crate::routes::media::update_media, crate::routes::media::delete_media, crate::routes::media::open_media, crate::routes::media::import_with_options, crate::routes::media::batch_import, crate::routes::media::import_directory_endpoint, crate::routes::media::preview_directory, crate::routes::media::set_custom_field, crate::routes::media::delete_custom_field, crate::routes::media::batch_tag, crate::routes::media::delete_all_media, crate::routes::media::batch_delete, crate::routes::media::batch_add_to_collection, crate::routes::media::batch_update, crate::routes::media::get_thumbnail, crate::routes::media::get_media_count, crate::routes::media::rename_media, crate::routes::media::move_media_endpoint, crate::routes::media::batch_move_media, crate::routes::media::soft_delete_media, crate::routes::media::restore_media, crate::routes::media::list_trash, crate::routes::media::trash_info, crate::routes::media::empty_trash, crate::routes::media::permanent_delete_media, crate::routes::media::stream_media, // notes crate::routes::notes::get_backlinks, crate::routes::notes::get_outgoing_links, crate::routes::notes::get_graph, crate::routes::notes::reindex_links, crate::routes::notes::resolve_links, crate::routes::notes::get_unresolved_count, // photos crate::routes::photos::get_timeline, crate::routes::photos::get_map_photos, // playlists crate::routes::playlists::create_playlist, crate::routes::playlists::list_playlists, crate::routes::playlists::get_playlist, crate::routes::playlists::update_playlist, crate::routes::playlists::delete_playlist, crate::routes::playlists::add_item, crate::routes::playlists::remove_item, crate::routes::playlists::list_items, crate::routes::playlists::reorder_item, crate::routes::playlists::shuffle_playlist, // plugins crate::routes::plugins::list_plugins, crate::routes::plugins::get_plugin, crate::routes::plugins::install_plugin, crate::routes::plugins::uninstall_plugin, crate::routes::plugins::toggle_plugin, crate::routes::plugins::list_plugin_ui_pages, crate::routes::plugins::list_plugin_ui_widgets, crate::routes::plugins::emit_plugin_event, crate::routes::plugins::list_plugin_ui_theme_extensions, crate::routes::plugins::reload_plugin, // saved_searches crate::routes::saved_searches::create_saved_search, crate::routes::saved_searches::list_saved_searches, crate::routes::saved_searches::delete_saved_search, // scan crate::routes::scan::trigger_scan, crate::routes::scan::scan_status, // scheduled_tasks crate::routes::scheduled_tasks::list_scheduled_tasks, crate::routes::scheduled_tasks::toggle_scheduled_task, crate::routes::scheduled_tasks::run_scheduled_task_now, // search crate::routes::search::search, crate::routes::search::search_post, // shares crate::routes::shares::create_share, crate::routes::shares::list_outgoing, crate::routes::shares::list_incoming, crate::routes::shares::get_share, crate::routes::shares::update_share, crate::routes::shares::delete_share, crate::routes::shares::batch_delete, crate::routes::shares::access_shared, crate::routes::shares::get_activity, crate::routes::shares::get_notifications, crate::routes::shares::mark_notification_read, crate::routes::shares::mark_all_read, // social crate::routes::social::rate_media, crate::routes::social::get_media_ratings, crate::routes::social::add_comment, crate::routes::social::get_media_comments, crate::routes::social::add_favorite, crate::routes::social::remove_favorite, crate::routes::social::list_favorites, crate::routes::social::create_share_link, crate::routes::social::access_shared_media, // statistics crate::routes::statistics::library_statistics, // streaming crate::routes::streaming::hls_master_playlist, crate::routes::streaming::hls_variant_playlist, crate::routes::streaming::hls_segment, crate::routes::streaming::dash_manifest, crate::routes::streaming::dash_segment, // subtitles crate::routes::subtitles::list_subtitles, crate::routes::subtitles::add_subtitle, crate::routes::subtitles::delete_subtitle, crate::routes::subtitles::get_subtitle_content, crate::routes::subtitles::update_offset, // sync crate::routes::sync::register_device, crate::routes::sync::list_devices, crate::routes::sync::get_device, crate::routes::sync::update_device, crate::routes::sync::delete_device, crate::routes::sync::regenerate_token, crate::routes::sync::get_changes, crate::routes::sync::report_changes, crate::routes::sync::acknowledge_changes, crate::routes::sync::list_conflicts, crate::routes::sync::resolve_conflict, crate::routes::sync::create_upload, crate::routes::sync::upload_chunk, crate::routes::sync::get_upload_status, crate::routes::sync::complete_upload, crate::routes::sync::cancel_upload, crate::routes::sync::download_file, // tags crate::routes::tags::create_tag, crate::routes::tags::list_tags, crate::routes::tags::get_tag, crate::routes::tags::delete_tag, crate::routes::tags::tag_media, crate::routes::tags::untag_media, crate::routes::tags::get_media_tags, // transcode crate::routes::transcode::start_transcode, crate::routes::transcode::get_session, crate::routes::transcode::list_sessions, crate::routes::transcode::cancel_session, // upload crate::routes::upload::upload_file, crate::routes::upload::download_file, crate::routes::upload::move_to_managed, crate::routes::upload::managed_stats, // users 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, crate::routes::users::get_user_libraries, crate::routes::users::grant_library_access, crate::routes::users::revoke_library_access, // webhooks crate::routes::webhooks::list_webhooks, crate::routes::webhooks::test_webhook, ), components( schemas( // analytics DTOs crate::dto::UsageEventResponse, crate::dto::RecordUsageEventRequest, // audit DTOs crate::dto::AuditEntryResponse, // auth local types crate::routes::auth::SessionListResponse, crate::routes::auth::SessionInfo, // batch DTOs crate::dto::BatchTagRequest, crate::dto::BatchCollectionRequest, crate::dto::BatchDeleteRequest, crate::dto::BatchUpdateRequest, crate::dto::BatchOperationResponse, // books local types crate::routes::books::BookMetadataResponse, crate::routes::books::AuthorResponse, crate::routes::books::ReadingProgressResponse, crate::routes::books::UpdateProgressRequest, crate::routes::books::SeriesSummary, crate::routes::books::AuthorSummary, // collections DTOs crate::dto::CollectionResponse, crate::dto::CreateCollectionRequest, crate::dto::AddMemberRequest, // config DTOs crate::dto::ConfigResponse, crate::dto::ScanningConfigResponse, crate::dto::ServerConfigResponse, crate::dto::UpdateScanningRequest, crate::dto::RootDirRequest, crate::dto::UiConfigResponse, crate::dto::UpdateUiConfigRequest, // database DTOs crate::dto::DatabaseStatsResponse, // duplicate DTOs crate::dto::DuplicateGroupResponse, // enrichment DTOs crate::dto::ExternalMetadataResponse, // export local types crate::routes::export::ExportRequest, // health local types crate::routes::health::HealthResponse, crate::routes::health::DatabaseHealth, crate::routes::health::FilesystemHealth, crate::routes::health::CacheHealth, crate::routes::health::DetailedHealthResponse, crate::routes::health::JobsHealth, // integrity local types crate::routes::integrity::OrphanResolveRequest, crate::routes::integrity::VerifyIntegrityRequest, crate::routes::integrity::GenerateThumbnailsRequest, // media DTOs crate::dto::MediaResponse, crate::dto::CustomFieldResponse, crate::dto::ImportRequest, crate::dto::ImportWithOptionsRequest, crate::dto::DirectoryImportRequest, crate::dto::DirectoryPreviewResponse, crate::dto::UpdateMediaRequest, crate::dto::MoveMediaRequest, crate::dto::RenameMediaRequest, crate::dto::BatchMoveRequest, crate::dto::BatchImportRequest, crate::dto::SetCustomFieldRequest, crate::dto::MediaCountResponse, crate::dto::TrashInfoResponse, crate::dto::ImportResponse, crate::dto::TrashResponse, crate::dto::EmptyTrashResponse, crate::dto::BatchImportResponse, crate::dto::BatchImportItemResult, crate::dto::DirectoryPreviewFile, crate::dto::UpdateMediaFullRequest, crate::dto::OpenRequest, crate::dto::WatchProgressRequest, crate::dto::WatchProgressResponse, // notes local types crate::routes::notes::BacklinksResponse, crate::routes::notes::BacklinkItem, crate::routes::notes::OutgoingLinksResponse, crate::routes::notes::OutgoingLinkItem, crate::routes::notes::GraphResponse, crate::routes::notes::GraphNodeResponse, crate::routes::notes::GraphEdgeResponse, crate::routes::notes::ReindexResponse, crate::routes::notes::ResolveLinksResponse, crate::routes::notes::UnresolvedLinksResponse, // photos local types crate::routes::photos::TimelineGroup, crate::routes::photos::MapMarker, // playlists DTOs crate::dto::PlaylistResponse, crate::dto::CreatePlaylistRequest, crate::dto::UpdatePlaylistRequest, crate::dto::PlaylistItemRequest, crate::dto::ReorderPlaylistRequest, // plugins DTOs crate::dto::PluginResponse, crate::dto::InstallPluginRequest, crate::dto::TogglePluginRequest, crate::dto::PluginUiPageEntry, crate::dto::PluginUiWidgetEntry, crate::dto::PluginEventRequest, // saved_searches local types crate::routes::saved_searches::CreateSavedSearchRequest, crate::routes::saved_searches::SavedSearchResponse, // scan DTOs crate::dto::ScanRequest, crate::dto::ScanResponse, crate::dto::ScanJobResponse, crate::dto::ScanStatusResponse, // search DTOs crate::dto::SearchParams, crate::dto::SearchResponse, crate::dto::SearchRequestBody, crate::dto::PaginationParams, // sharing DTOs crate::dto::CreateShareRequest, crate::dto::UpdateShareRequest, crate::dto::ShareResponse, crate::dto::SharePermissionsRequest, crate::dto::BatchDeleteSharesRequest, crate::dto::AccessSharedRequest, crate::dto::SharedContentResponse, crate::dto::ShareActivityResponse, crate::dto::ShareNotificationResponse, // social DTOs crate::dto::RatingResponse, crate::dto::CreateRatingRequest, crate::dto::CommentResponse, crate::dto::CreateCommentRequest, crate::dto::FavoriteRequest, crate::dto::CreateShareLinkRequest, crate::dto::ShareLinkResponse, // statistics DTOs crate::dto::LibraryStatisticsResponse, crate::dto::TypeCountResponse, crate::dto::ScheduledTaskResponse, // subtitles DTOs crate::dto::SubtitleResponse, crate::dto::AddSubtitleRequest, crate::dto::UpdateSubtitleOffsetRequest, crate::dto::SubtitleListResponse, crate::dto::SubtitleTrackInfoResponse, // sync DTOs crate::dto::RegisterDeviceRequest, crate::dto::DeviceResponse, crate::dto::DeviceRegistrationResponse, crate::dto::UpdateDeviceRequest, crate::dto::GetChangesParams, crate::dto::SyncChangeResponse, crate::dto::ChangesResponse, crate::dto::ReportChangesRequest, crate::dto::ReportChangesResponse, crate::dto::AcknowledgeChangesRequest, crate::dto::ConflictResponse, crate::dto::ResolveConflictRequest, crate::dto::CreateUploadSessionRequest, crate::dto::UploadSessionResponse, crate::dto::ChunkUploadedResponse, crate::dto::MostViewedResponse, // tags DTOs crate::dto::TagResponse, crate::dto::CreateTagRequest, crate::dto::TagMediaRequest, // transcode DTOs crate::dto::TranscodeSessionResponse, crate::dto::CreateTranscodeRequest, // upload DTOs crate::dto::UploadResponse, crate::dto::ManagedStorageStatsResponse, // users DTOs crate::dto::UserResponse, crate::dto::UserLibraryResponse, crate::dto::GrantLibraryAccessRequest, crate::dto::RevokeLibraryAccessRequest, // webhooks local types crate::routes::webhooks::WebhookInfo, ) ), tags( (name = "analytics", description = "Usage analytics and viewing history"), (name = "audit", description = "Audit log entries"), (name = "auth", description = "Authentication and session management"), (name = "backup", description = "Database backup"), (name = "books", description = "Book metadata, series, authors, and reading progress"), (name = "collections", description = "Media collections"), (name = "config", description = "Server configuration"), (name = "database", description = "Database administration"), (name = "duplicates", description = "Duplicate media detection"), (name = "enrichment", description = "External metadata enrichment"), (name = "export", description = "Media library export"), (name = "health", description = "Server health checks"), (name = "integrity", description = "Library integrity checks and repairs"), (name = "jobs", description = "Background job management"), (name = "media", description = "Media item management"), (name = "notes", description = "Markdown notes link graph"), (name = "photos", description = "Photo timeline and map view"), (name = "playlists", description = "Media playlists"), (name = "plugins", description = "Plugin management"), (name = "saved_searches", description = "Saved search queries"), (name = "scan", description = "Directory scanning"), (name = "scheduled_tasks", description = "Scheduled background tasks"), (name = "search", description = "Full-text media search"), (name = "shares", description = "Media sharing and notifications"), (name = "social", description = "Ratings, comments, favorites, and share links"), (name = "statistics", description = "Library statistics"), (name = "streaming", description = "HLS and DASH adaptive streaming"), (name = "subtitles", description = "Media subtitle management"), (name = "sync", description = "Multi-device library synchronization"), (name = "tags", description = "Media tag management"), (name = "transcode", description = "Video transcoding sessions"), (name = "upload", description = "File upload and managed storage"), (name = "users", description = "User and library access management"), (name = "webhooks", description = "Webhook configuration"), ), security( ("bearer_auth" = []) ), modifiers(&SecurityAddon) )] pub struct ApiDoc; struct SecurityAddon; impl utoipa::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", utoipa::openapi::security::SecurityScheme::Http( utoipa::openapi::security::Http::new( utoipa::openapi::security::HttpAuthScheme::Bearer, ), ), ); } } }