this/server/router.rs
1//! Router builder utilities for link routes
2
3use crate::links::handlers::{
4 create_link, delete_link, get_link, get_link_by_route, list_available_links, list_links,
5 update_link, AppState,
6};
7use axum::{routing::get, Router};
8
9/// Build link routes from configuration
10///
11/// These routes are generic and work for all entities using semantic route_names:
12/// - GET /links/{link_id} - Get a specific link by ID
13/// - GET /{entity_type}/{entity_id}/{route_name} - List links (e.g., /users/123/cars-owned)
14/// - GET /{source_type}/{source_id}/{route_name}/{target_id} - Get a specific link (e.g., /users/123/cars-owned/456)
15/// - POST /{source_type}/{source_id}/{route_name}/{target_id} - Create link (e.g., /users/123/cars-owned/456)
16/// - PUT /{source_type}/{source_id}/{route_name}/{target_id} - Update link metadata
17/// - DELETE /{source_type}/{source_id}/{route_name}/{target_id} - Delete link
18/// - GET /{entity_type}/{entity_id}/links - List available link types
19///
20/// The route_name (e.g., "cars-owned", "cars-driven") is resolved to the appropriate
21/// link_type (e.g., "owner", "driver") automatically by the LinkRouteRegistry.
22pub fn build_link_routes(state: AppState) -> Router {
23 Router::new()
24 .route("/links/{link_id}", get(get_link))
25 .route("/{entity_type}/{entity_id}/{route_name}", get(list_links))
26 .route(
27 "/{source_type}/{source_id}/{route_name}/{target_id}",
28 get(get_link_by_route)
29 .post(create_link)
30 .put(update_link)
31 .delete(delete_link),
32 )
33 .route(
34 "/{entity_type}/{entity_id}/links",
35 get(list_available_links),
36 )
37 .with_state(state)
38}