this/server/
router.rs

1//! Router builder utilities for link routes
2
3use crate::links::handlers::{
4    create_link, create_linked_entity, delete_link, get_link, get_link_by_route,
5    list_available_links, list_links, 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/// - POST /{entity_type}/{entity_id}/{route_name} - Create new entity + link (entity + metadata in body)
15/// - GET /{source_type}/{source_id}/{route_name}/{target_id} - Get a specific link (e.g., /users/123/cars-owned/456)
16/// - POST /{source_type}/{source_id}/{route_name}/{target_id} - Create link between existing entities
17/// - PUT /{source_type}/{source_id}/{route_name}/{target_id} - Update link metadata
18/// - DELETE /{source_type}/{source_id}/{route_name}/{target_id} - Delete link
19/// - GET /{entity_type}/{entity_id}/links - List available link types
20///
21/// The route_name (e.g., "cars-owned", "cars-driven") is resolved to the appropriate
22/// link_type (e.g., "owner", "driver") automatically by the LinkRouteRegistry.
23pub fn build_link_routes(state: AppState) -> Router {
24    Router::new()
25        .route("/links/{link_id}", get(get_link))
26        .route(
27            "/{entity_type}/{entity_id}/{route_name}",
28            get(list_links).post(create_linked_entity),
29        )
30        .route(
31            "/{source_type}/{source_id}/{route_name}/{target_id}",
32            get(get_link_by_route)
33                .post(create_link)
34                .put(update_link)
35                .delete(delete_link),
36        )
37        .route(
38            "/{entity_type}/{entity_id}/links",
39            get(list_available_links),
40        )
41        .with_state(state)
42}