backend/
router.rs

1use std::sync::Arc;
2
3use axum::{
4    Router, middleware,
5    routing::{get, post},
6};
7
8use crate::{
9    AppState,
10    cookie::validation::{validate_admin, validate_token},
11    handlers::{
12        auth::{
13            check_admin_exists, create_user, delete_user, get_current_user, get_user_by_id, get_users, login, logout,
14            setup_initial_admin, update_user,
15        },
16        ticket::{create_ticket, delete_ticket, edit_ticket, get_ticket_by_id, get_tickets},
17    },
18};
19
20/// Creates the complete router with all API endpoints.
21///
22/// The router is organized in layers for proper middleware application. Uses [`AppState`]
23/// for shared application context across all routes.
24///
25/// ## Route Layers (from most to least restricted):
26///
27/// ### Admin-Only Routes (requires admin privilege + valid token)
28/// - `GET /api/tickets/{id}` - Get specific ticket details (via `get_ticket_by_id`)
29/// - `DELETE /api/tickets/{id}` - Delete a ticket (via `delete_ticket`)
30/// - `PATCH /api/tickets/{id}` - Update ticket status (via `edit_ticket`)
31/// - `POST /api/register` - Create a new user (via `create_user`)
32/// - `GET /api/users` - List all users (via `get_users`)
33/// - `GET /api/users/{id}` - Get user details (via `get_user_by_id`)
34/// - `DELETE /api/users/{id}` - Delete a user (via `delete_user`)
35/// - `PATCH /api/users/{id}` - Update user details (via `update_user`)
36///
37/// ### Protected Routes (requires valid token)
38/// - `GET /api/tickets` - List all tickets (via `get_tickets`)
39/// - `POST /api/tickets/create` - Create a new ticket (via `create_ticket`)
40/// - `GET /api/logout` - Logout user (via `logout`)
41/// - `GET /api/users/current` - Get current authenticated user (via `get_current_user`)
42///
43/// ### Public Routes (no authentication required)
44/// - `POST /api/login` - User login (via `login`)
45/// - `GET /api/check-admin` - Check if admin exists (via `check_admin_exists`)
46/// - `POST /api/setup-admin` - Create initial admin account (via `setup_initial_admin`)
47///
48/// # Middleware Stack
49/// - Admin routes have `validate_admin` middleware
50/// - Protected routes have `validate_token` middleware
51/// - Public routes have no authentication requirements
52pub fn create_router(state: Arc<AppState>) -> Router {
53    let admin_routes = Router::new()
54        .route(
55            "/api/tickets/{id}",
56            get(get_ticket_by_id)
57                .delete(delete_ticket)
58                .patch(edit_ticket),
59        )
60        .route("/api/register", post(create_user))
61        .route("/api/users", get(get_users))
62        .route(
63            "/api/users/{id}",
64            get(get_user_by_id).delete(delete_user).patch(update_user),
65        )
66        .layer(middleware::from_fn_with_state(
67            state.clone(),
68            validate_admin,
69        ));
70
71    let protected_routes = Router::new()
72        .merge(admin_routes)
73        .route("/api/tickets", get(get_tickets))
74        .route("/api/tickets/create", post(create_ticket))
75        .route("/api/logout", get(logout))
76        .route("/api/users/current", get(get_current_user))
77        .layer(middleware::from_fn_with_state(
78            state.clone(),
79            validate_token,
80        ));
81
82    Router::new()
83        .merge(protected_routes)
84        .route("/api/login", post(login))
85        .route("/api/check-admin", get(check_admin_exists))
86        .route("/api/setup-admin", post(setup_initial_admin))
87        .with_state(state)
88}