api/routes/modules/assignments/
mod.rs1use crate::auth::guards::{
14 require_assigned_to_module, require_lecturer_or_assistant_lecturer, require_ready_assignment,
15};
16use axum::{
17 Router,
18 middleware::from_fn_with_state,
19 routing::{delete, get, post, put},
20};
21use config::config_routes;
22use delete::{bulk_delete_assignments, delete_assignment};
23use files::files_routes;
24use get::{get_assignment, get_assignment_readiness, get_assignment_stats, get_assignments};
25use interpreter::interpreter_routes;
26use mark_allocator::mark_allocator_routes;
27use memo_output::memo_output_routes;
28use plagiarism::plagiarism_routes;
29use post::create_assignment;
30use put::{bulk_update_assignments, close_assignment, edit_assignment, open_assignment};
31use submissions::submission_routes;
32use tasks::tasks_routes;
33use tickets::ticket_routes;
34use util::state::AppState;
35
36pub mod common;
37pub mod config;
38pub mod delete;
39pub mod files;
40pub mod get;
41pub mod interpreter;
42pub mod mark_allocator;
43pub mod memo_output;
44pub mod plagiarism;
45pub mod post;
46pub mod put;
47pub mod submissions;
48pub mod tasks;
49pub mod tickets;
50
51pub fn assignment_routes(app_state: AppState) -> Router<AppState> {
79 Router::new()
80 .route("/", post(create_assignment).route_layer(from_fn_with_state(app_state.clone(), require_lecturer_or_assistant_lecturer)))
81 .route("/", get(get_assignments).route_layer(from_fn_with_state(app_state.clone(), require_assigned_to_module)))
82 .route("/{assignment_id}", get(get_assignment).route_layer(from_fn_with_state(app_state.clone(), require_assigned_to_module)))
83 .route("/{assignment_id}", put(edit_assignment).route_layer(from_fn_with_state(app_state.clone(), require_lecturer_or_assistant_lecturer)))
84 .route("/{assignment_id}", delete(delete_assignment).route_layer(from_fn_with_state(app_state.clone(), require_lecturer_or_assistant_lecturer)))
85 .route("/{assignment_id}/open", put(open_assignment).route_layer(from_fn_with_state(app_state.clone(), require_lecturer_or_assistant_lecturer)).route_layer(from_fn_with_state(app_state.clone(), require_ready_assignment)))
86 .route("/{assignment_id}/close", put(close_assignment).layer(from_fn_with_state(app_state.clone(), require_lecturer_or_assistant_lecturer)).route_layer(from_fn_with_state(app_state.clone(), require_ready_assignment)))
87 .route("/bulk", delete(bulk_delete_assignments).layer(from_fn_with_state(app_state.clone(), require_lecturer_or_assistant_lecturer)))
88 .route("/bulk", put(bulk_update_assignments).layer(from_fn_with_state(app_state.clone(), require_lecturer_or_assistant_lecturer)))
89 .route("/{assignment_id}/stats", get(get_assignment_stats).route_layer(from_fn_with_state(app_state.clone(), require_lecturer_or_assistant_lecturer)))
90 .route("/{assignment_id}/readiness", get(get_assignment_readiness).route_layer(from_fn_with_state(app_state.clone(), require_assigned_to_module)))
91 .nest("/{assignment_id}/tasks", tasks_routes().route_layer(from_fn_with_state(app_state.clone(), require_lecturer_or_assistant_lecturer)))
92 .nest("/{assignment_id}/config", config_routes().layer(from_fn_with_state(app_state.clone(), require_lecturer_or_assistant_lecturer)))
93 .nest("/{assignment_id}/memo_output", memo_output_routes().layer(from_fn_with_state(app_state.clone(), require_lecturer_or_assistant_lecturer)))
94 .nest("/{assignment_id}/mark_allocator", mark_allocator_routes().route_layer(from_fn_with_state(app_state.clone(), require_lecturer_or_assistant_lecturer)))
95 .nest("/{assignment_id}/submissions", submission_routes(app_state.clone()).route_layer(from_fn_with_state(app_state.clone(), require_assigned_to_module)))
96 .nest("/{assignment_id}/files", files_routes(app_state.clone()))
97 .nest("/{assignment_id}/interpreter",interpreter_routes(app_state.clone()))
98 .nest("/{assignment_id}/tickets",ticket_routes(app_state.clone()).route_layer(from_fn_with_state(app_state.clone(),require_assigned_to_module)))
99 .nest("/{assignment_id}/plagiarism",plagiarism_routes().route_layer(from_fn_with_state(app_state.clone(),require_assigned_to_module,)).route_layer(from_fn_with_state(app_state.clone(),require_lecturer_or_assistant_lecturer)))
100}