api/routes/modules/assignments/tickets/
mod.rs

1//! Ticket routes module.
2//!
3//! Provides the `/tickets` route group with full CRUD and nested message functionality.
4//!
5//! Routes include:
6//! - Create, open, close, delete, and get tickets
7//! - List all tickets
8//! - Nested routes for ticket messages
9//!
10//! Access control is enforced via middleware guards for ticket ownership, lecturer, or admin roles.
11
12use axum::{Router, routing::{post, put, delete, get}};
13use util::state::AppState;
14pub mod post;
15pub mod put;
16pub mod delete;
17pub mod get;
18pub mod ticket_messages;
19pub mod common;
20use post::create_ticket;
21use put::{open_ticket, close_ticket};
22use delete::delete_ticket;
23use get::{get_ticket, get_tickets};
24use ticket_messages::ticket_message_routes;
25
26/// Builds and returns the `/tickets` route group for a given ticket context.
27///
28/// Routes:
29/// - `POST   /tickets`                  → Create a new ticket
30/// - `PUT    /tickets/{ticket_id}/open` → Reopen a closed ticket
31/// - `PUT    /tickets/{ticket_id}/close`→ Close an open ticket
32/// - `DELETE /tickets/{ticket_id}`      → Delete a ticket
33/// - `GET    /tickets/{ticket_id}`      → Get details of a ticket
34/// - `GET    /tickets`                  → List all tickets
35///
36/// Nested routes:
37/// - Ticket messages routes → `/{ticket_id}/messages` handled by `ticket_message_routes`
38pub fn ticket_routes(app_state: AppState) -> Router<AppState> {
39    Router::new()
40        .route("/", post(create_ticket))
41        .route("/{ticket_id}/close", put(close_ticket))
42        .route("/{ticket_id}/open", put(open_ticket))
43        .route("/{ticket_id}", delete(delete_ticket))
44        .route("/{ticket_id}", get(get_ticket))
45        .route("/", get(get_tickets))
46        .nest("/{ticket_id}/messages", ticket_message_routes(app_state.clone()))
47}