api/routes/modules/announcements/mod.rs
1//! # Announcement Routes Module
2//!
3//! Defines and wires up routes for the `/api/modules/{module_id}/announcements` endpoint group.
4//!
5//! ## Structure
6//! - `post.rs` — POST handlers (e.g., create announcement)
7//! - `get.rs` — GET handlers (e.g., list announcements)
8//! - `put.rs` — PUT handlers (e.g., edit announcement)
9//! - `delete.rs` — DELETE handlers (e.g., remove announcement)
10//! - `common.rs` — shared helpers and utilities
11//!
12//! ## Usage
13//! Call `announcement_routes(app_state)` to get a configured `Router` for announcements
14//! to be mounted under a module in the main app.
15
16use axum::{middleware::from_fn_with_state, Router};
17use util::state::AppState;
18use axum::routing::{post, delete, put, get};
19use post::create_announcement;
20use delete::delete_announcement;
21use put::edit_announcement;
22use get::{get_announcements, get_announcement};
23use crate::auth::guards::require_lecturer_or_assistant_lecturer;
24
25pub mod post;
26pub mod get;
27pub mod delete;
28pub mod put;
29pub mod common;
30
31
32
33/// Builds the `/announcements` route group for a specific module.
34///
35/// Routes:
36/// - POST `/` → create announcement (lecturer or assistant lecturer only)
37/// - GET `/` → list announcements
38/// - GET `/{announcement_id}` → get single announcement (with author id & username)
39/// - PUT `/{announcement_id}` → edit announcement (lecturer or assistant lecturer only)
40/// - DELETE `/{announcement_id}` → delete announcement (lecturer or assistant lecturer only)
41pub fn announcement_routes(app_state: AppState) -> Router<AppState> {
42 Router::new()
43 .route("/",post(create_announcement).route_layer(from_fn_with_state(app_state.clone(), require_lecturer_or_assistant_lecturer)))
44 .route("/{announcement_id}",delete(delete_announcement).route_layer(from_fn_with_state(app_state.clone(), require_lecturer_or_assistant_lecturer)))
45 .route("/{announcement_id}",put(edit_announcement).route_layer(from_fn_with_state(app_state.clone(), require_lecturer_or_assistant_lecturer)))
46 .route("/", get(get_announcements))
47 .route("/{announcement_id}", get(get_announcement))
48}