Files
k-photos/crates/presentation/src/routes.rs
Gabriel Kaszewski ef64e86439 feat: serve derivative files via GET /assets/{id}/derivatives/{profile}
- ReadDerivativeHandler queries DerivativeRepository + FileStoragePort
- Profile URL param: thumbnail, thumbnail_large, web_optimized, video_sd
- Immutable cache headers (derivatives don't change once generated)
- Wired into bootstrap catalog service builder
2026-05-31 21:10:58 +02:00

75 lines
2.9 KiB
Rust

use crate::{
handlers::{albums, assets, auth, health, processing, sharing, sidecar, storage},
openapi::openapi_router,
state::AppState,
};
use axum::{
Router,
routing::{delete, get, post, put},
};
pub fn api_v1_router() -> Router<AppState> {
Router::new()
// auth
.route("/auth/register", post(auth::register))
.route("/auth/login", post(auth::login))
.route("/auth/me", get(auth::me))
// albums
.route("/albums", post(albums::create_album))
.route("/albums/{id}", get(albums::get_album))
.route("/albums/{id}/entries", post(albums::add_entry))
.route(
"/albums/{id}/entries/{asset_id}",
delete(albums::remove_entry),
)
// assets
.route("/assets/ingest", post(assets::ingest))
.route("/assets/register", post(assets::register_asset))
.route("/assets/timeline", get(assets::timeline))
.route("/assets/{id}", get(assets::get_asset))
.route("/assets/{id}/metadata", put(assets::update_metadata))
.route("/assets/{id}/file", get(assets::serve_file))
.route(
"/assets/{id}/derivatives/{profile}",
get(assets::serve_derivative),
)
.route("/assets/{id}/tags", post(assets::tag_asset))
// sharing
.route("/sharing", post(sharing::share_resource))
.route("/sharing/links", post(sharing::generate_link))
.route("/sharing/{id}", delete(sharing::revoke))
.route("/sharing/access/{token}", get(sharing::access_by_token))
// storage
.route("/storage/volumes", post(storage::register_volume))
.route(
"/storage/library-paths",
post(storage::register_library_path),
)
.route("/storage/quota", get(storage::check_quota))
// sidecar
.route("/sidecar/export/{asset_id}", post(sidecar::export_sidecar))
.route("/sidecar/detect-changes", post(sidecar::detect_changes))
.route("/sidecar/import/{asset_id}", post(sidecar::import_sidecar))
.route(
"/sidecar/resolve/{asset_id}",
post(sidecar::resolve_conflict),
)
.route("/sidecar/full-export", post(sidecar::full_export))
.route("/sidecar/full-import", post(sidecar::full_import))
// processing
.route("/jobs", post(processing::enqueue_job))
.route("/jobs/{id}/start", post(processing::start_job))
.route("/jobs/{id}/complete", post(processing::complete_job))
.route("/jobs/{id}/fail", post(processing::fail_job))
.route("/jobs/batches/{id}", get(processing::batch_progress))
.route("/plugins", post(processing::manage_plugin))
.route("/pipelines", post(processing::configure_pipeline))
}
pub fn app_router() -> Router<AppState> {
Router::new()
.route("/health", get(health::health))
.nest("/api/v1", api_v1_router())
.merge(openapi_router())
}