Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: I22c7237877862acbf931ce4c662bd2816a6a6964
486 lines
21 KiB
Rust
486 lines
21 KiB
Rust
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,
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
}
|