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}