api/routes/modules/assignments/interpreter/delete.rs
1use axum::{
2 Json,
3 extract::{Path, State},
4 http::StatusCode,
5 response::IntoResponse,
6};
7use db::models::assignment_interpreter;
8use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter};
9use serde_json::json;
10use util::state::AppState;
11
12/// DELETE /api/modules/{module_id}/assignments/{assignment_id}/interpreter
13///
14/// Delete the interpreter for a specific assignment. Only accessible by lecturers assigned to the module.
15///
16/// ### Path Parameters
17/// - `module_id` (i64): The ID of the module containing the assignment
18/// - `assignment_id` (i64): The ID of the assignment whose interpreter is to be deleted
19///
20/// ### Responses
21///
22/// - `200 OK`
23/// ```json
24/// {
25/// "success": true,
26/// "message": "Interpreter removed successfully"
27/// }
28/// ```
29///
30/// - `404 Not Found`
31/// ```json
32/// {
33/// "success": false,
34/// "message": "No interpreter found for assignment <assignment_id>"
35/// }
36/// ```
37///
38/// - `500 Internal Server Error`
39/// ```json
40/// {
41/// "success": false,
42/// "message": "<database error details>"
43/// }
44/// ```
45pub async fn delete_interpreter(
46 State(app_state): State<AppState>,
47 Path((_module_id, assignment_id)): Path<(i64, i64)>,
48) -> impl IntoResponse {
49 let db = app_state.db();
50
51 // Find the interpreter(s) for this assignment
52 let interpreters = match assignment_interpreter::Entity::find()
53 .filter(assignment_interpreter::Column::AssignmentId.eq(assignment_id))
54 .all(db)
55 .await
56 {
57 Ok(models) => models,
58 Err(err) => {
59 return (
60 StatusCode::INTERNAL_SERVER_ERROR,
61 Json(json!({
62 "success": false,
63 "message": format!("Database error: {:?}", err)
64 })),
65 );
66 }
67 };
68
69 if interpreters.is_empty() {
70 return (
71 StatusCode::NOT_FOUND,
72 Json(json!({
73 "success": false,
74 "message": format!("No interpreter found for assignment {}", assignment_id)
75 })),
76 );
77 }
78
79 // Delete each interpreter file and DB record
80 for interpreter in interpreters {
81 let _ = interpreter.delete_file_only(); // ignore file deletion errors
82 let am: assignment_interpreter::ActiveModel = interpreter.into();
83 let _ = am.delete(db).await; // ignore DB deletion errors for now
84 }
85
86 (
87 StatusCode::OK,
88 Json(json!({
89 "success": true,
90 "message": "Interpreter removed successfully"
91 })),
92 )
93}