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}