# API Documentation :::spoiler 目錄 [toc] ::: ## feature/login ### 登入 - **URL**: `/login` - **Method**: `POST` - **說明**: 用戶登入,取得 JWT Token - **參數**: - **POST**: - `username` (string): 用戶名稱 - `password` (string): 密碼 - **身份權限**: - **老師**: 可登入 - **學生**: 可登入 - **Headers**: 無 - **成功回應**: - **Code**: 200 - **Content**: ```json { "access_token": "JWT_TOKEN", "user": { "id": 1, "username": "teacher1", "name": "Teacher One" } } ``` - **例外回應**: - **Case 1** - **Condition**: 缺少 `username` 或 `password` - **Code**: 400 - **Content**: ```json { "message": "Username and password are required." } ``` - **Case 2** - **Condition**: 用戶名或密碼無效 - **Code**: 401 - **Content**: ```json { "message": "Invalid username or password." } ``` - **錯誤回應**: - **Code**: 401 Unauthorized - **Content**: ```json { "message": "Invalid username or password." } ``` ### 取得使用者資料 - **URL**: `/user` - **Method**: `GET` - **說明**: 透過 JWT token 取得當前登入使用者的詳細資訊 - **參數**: - **GET**: 無 - **身份權限**: - **老師**: 可用 - **學生**: 可用 - **Headers**: - `Authorization`: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "user": { "id": 1, "username": "teacher1", "name": "Teacher One" } } ``` - **例外回應**: - **Case 1** - **Condition**: Token 無效 - **Code**: 400 - **Content**: ```json { "message": "Invalid token." } ``` - **Case 2** - **Condition**: 用戶不存在 - **Code**: 404 - **Content**: ```json { "message": "User not found." } ``` ### 更新使用者資料 - **URL**: `/user` - **Method**: `PUT` - **說明**: 更新當前登入使用者的資料 - **參數**: - **PUT**: - 可選字段如 `password` (string) - **身份權限**: - **老師**: 可用 - **學生**: 可用 - **Headers**: - `Authorization`: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "user": { "id": 1, "username": "teacher1", "name": "Teacher One" } } ``` - **例外回應**: - **Case 1** - **Condition**: Token 無效 - **Code**: 400 - **Content**: ```json { "message": "Invalid token." } ``` - **Case 2** - **Condition**: 用戶不存在 - **Code**: 404 - **Content**: ```json { "message": "User not found." } ``` ### 刪除學生 - **URL**: `/students/<int:student_id>` - **Method**: `DELETE` - **說明**: 刪除指定學生資料 - **參數**: - **URL Path**: - `student_id` (int): 學生的唯一識別碼 - **身份權限**: - **老師**: 可用 - **學生**: 禁止 - **Headers**: - `Authorization`: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "message": "Student with ID 1 has been deleted." } ``` - **例外回應**: - **Case 1** - **Condition**: 用戶不是老師 - **Code**: 403 - **Content**: ```json { "message": "Access forbidden: Teachers only." } ``` - **Case 2** - **Condition**: 學生不存在 - **Code**: 404 - **Content**: ```json { "message": "Student not found." } ``` ## feature/course-info ### 取得課程資訊 - **URL**: `/getCourseInfo/<int:course_id>` - **Method**: `GET` - **說明**: 根據課程 ID 獲取課程的詳細資訊 - **參數**: - **URL Path**: - `course_id` (int): 課程 ID - **身份權限**: - **老師**: 可用 - **學生**: 可用 - **Headers**: 無 - **成功回應**: - **Code**: 200 - **Content**: ```json { "id": 1, "name": "Math", "teacher_id": 1, "weekday": "Monday", "semester": "Fall 2024" } ``` - **例外回應**: - **Case 1** - **Condition**: 課程不存在 - **Code**: 404 - **Content**: ```json { "error": "Course not found" } ``` ### 查詢教師課堂 - **URL**: `/courses` - **Method**: `GET` - **說明**: 取得當前登入教師的所有課程 - **參數**: - **GET**: 無 - **身份權限**: - **老師**: 可用 - **學生**: 禁止 - **Headers**: - `Authorization`: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json "courses": [ { "archive": false, "id": 2, "is_favorite": true, "name": "電子學", "semester": "113-1", "teacher_id": 2, "teacher_name": "張諭騰", "teacher_username": "ytchang", "weekday": "Thur" }, { "archive": false, "id": 6, "is_favorite": true, "name": "類比積體電路導論", "semester": "113-1", "teacher_id": 2, "teacher_name": "張諭騰", "teacher_username": "ytchang", "weekday": "Thu" }, { "archive": false, "id": 7, "is_favorite": true, "name": "電機專題製作", "semester": "113-1", "teacher_id": 2, "teacher_name": "張諭騰", "teacher_username": "ytchang", "weekday": "Fri" } ] ``` - **例外回應**: - **Case 1** - **Condition**: 用戶不是老師 - **Code**: 403 - **Content**: ```json { "message": "Access forbidden: Teachers only." } ``` - **Case 2** - **Condition**: 教師不存在 - **Code**: 404 - **Content**: ```json { "message": "Teacher not found." } ``` ### 上傳課程圖片(目前有 bug (11/24)) - **URL**: `/upload/<int:course_id>` - **Method**: `POST` - **說明**: 上傳並驗證課程圖片,僅支援 JPEG 和 PNG 格式,並限制圖片大小及解析度 - **參數**: - **URL Path**: - `course_id` (int): 課程 ID - **POST**: - `image` (File): 上傳的圖片檔案 - **身份權限**: - **老師**: 可用 - **學生**: 禁止 - **Headers**: 無 - **成功回應**: - **Code**: 200 - **Content**: ```json { "success": "Image uploaded and linked to course successfully" } ``` - **例外回應**: - **Case 1** - **Condition**: 課程不存在 - **Code**: 404 - **Content**: ```json { "error": "Course not found" } ``` - **Case 2** - **Condition**: 圖片格式不支援或大小不符合要求 - **Code**: 400 - **Content**: ```json { "error": "Invalid image type, only JPEG and PNG are allowed" } ``` ### 取得課程圖片 - **URL**: `/get_image/<int:course_id>` - **Method**: `GET` - **說明**: 獲取指定課程的圖片 - **參數**: - **URL Path**: - `course_id` (int): 課程 ID - **身份權限**: - **老師**: 可用 - **學生**: 可用 - **Headers**: 無 - **成功回應**: - **Code**: 200 - **Content**: 課程圖片 - **例外回應**: - **Case 1** - **Condition**: 圖片不存在 - **Code**: 404 - **Content**: ```json { "error": "Image not found" } ``` ### 切換收藏課程 - **URL**: `/toggle_favorite/<int:course_id>` - **Method**: `PUT` - **說明**: 切換課程收藏 - **參數**: - **URL Path**: - `course_id` (int): 課程 ID - **身份權限**: - **老師**: 可用 - **學生**: 禁止 - **Headers**: - `Authorization`: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "success": "Course favorite toggled" } ``` - **例外回應**: - **Case 1** - **Condition**: 課程不存在 - **Code**: 404 - **Content**: ```json { "error": "Course not found or not owned by teacher" } ``` ### 取得收藏課程 - **URL**: `/favorites` - **Method**: `GET` - **說明**: 獲取當前教師標記為收藏的課程列表 - **參數**: - **GET**: 無 - **身份權限**: - **老師**: 可用 - **學生**: 禁止 - **Headers**: - `Authorization`: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "favorites": [ { "id": 1, "name": "Math", "teacher_id": 1 } ] } ``` - **例外回應**: - **Case 1** - **Condition**: 教師不存在 - **Code**: 404 - **Content**: ```json { "message": "User not found." } ``` ### 更新課程資料 - **URL**: `/courses/<int:course_id>` - **Method**: `PUT` - **說明**: 更新指定課程的相關資訊 - **參數**: - **URL Path**: - `course_id` (int): 課程 ID - **PUT**: - `name` (string, optional): 課程名稱 - `teacher_id` (int, optional): 教師 ID - `weekday` (string, optional): 上課日 - `semester` (string, optional): 學期 - `archive` (boolean, optional): 是否封存 - `image_id` (int, optional): 課程圖片 ID - `is_favorite` (boolean, optional): 是否標記為收藏 - **身份權限**: - **老師**: 可用 - **學生**: 禁止 - **Headers**: - `Authorization`: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "message": "Course updated successfully" } ``` - **例外回應**: - **Case 1** - **Condition**: 課程不存在 - **Code**: 404 - **Content**: ```json { "message": "Course not found." } ``` - **Case 2** - **Condition**: 權限不足 - **Code**: 403 - **Content**: ```json { "message": "Access forbidden: Only the owner teacher can edit this course." } ``` ### 取得課程每週資訊 - **URL**: `/getSections/<int:course_id>` - **Method**: `GET` - **說明**: 獲取課程的每週課程資訊 - **參數**: - **URL Path**: - `course_id` (int): 課程 ID - **身份權限**: - **老師**: 可用 - **學生**: 可用 - **Headers**: 無 - **成功回應**: - **Code**: 200 - **Content**: ```json "sections": [ { "content": "測試資料", "course_id": 1, "end_date": "2024-10-08T10:00:00", "id": 21, "name": "Week 1", "publish_date": "2024-09-30T12:00:00", "sequence": 1, "start_date": "2024-10-08T08:00:00" }, { "content": "測試資料", "course_id": 1, "end_date": "2024-10-15T10:00:00", "id": 22, "name": "Week 2", "publish_date": "2024-10-07T12:00:00", "sequence": 2, "start_date": "2024-10-15T08:00:00" } ] ``` - **例外回應**: - **Case 1** - **Condition**: 課程不存在 - **Code**: 404 - **Content**: ```json { "error": "Course not found" } ``` ### 獲取課程學生名單 - **URL**: `/getStudents/<int:course_id>` - **Method**: `GET` - **說明**: 獲取指定課程的學生列表 - **參數**: - **URL Path**: - `course_id` (int): 課程 ID - **身份權限**: - **老師**: 可用 - **學生**: 禁止 - **Headers**: 無 - **成功回應**: - **Code**: 200 - **Content**: ```json { "students": [ { "id": 1, "username": "student1", "name": "Student One" }, { "id": 2, "username": "student2", "name": "Student Two" } ] } ``` - **例外回應**: - **Case 1** - **Condition**: 課程不存在 - **Code**: 404 - **Content**: ```json { "error": "Course not found" } ``` ## feature/file-upload ### 上傳 PDF 檔案 - **URL**: `/api/upload_pdf` - **Method**: `POST` - **說明**: 上傳 PDF 檔案,並儲存相關資訊到資料庫 - **參數**: - **POST**: - `file` (File): 上傳的 PDF 文件 - `course_id` (int): 課程 ID - **身份權限**: - **老師**: 可用 - **學生**: 可用 - **Headers**: - `Authorization`: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "file_id": 1, "message": "PDF file uploaded successfully", "filename": "example.pdf" } ``` - **例外回應**: - **Case 1** - **Condition**: 缺少 `course_id` - **Code**: 400 - **Content**: ```json { "error": "Course ID is required" } ``` - **Case 2** - **Condition**: 未選擇檔案或非 PDF 格式 - **Code**: 400 - **Content**: ```json { "error": "Only PDF files are allowed" } ``` ### 上傳多類型檔案 - **URL**: `/api/upload_various_file` - **Method**: `POST` - **說明**: 上傳多種類型的檔案(如圖片、文字檔) - **參數**: - **POST**: - `file` (File): 上傳的檔案 - `class_id` (int): 班級 ID - **身份權限**: - **老師**: 可用 - **學生**: 可用 - **Headers**: - `Authorization`: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "message": "File uploaded successfully", "filename": "example.txt" } ``` - **例外回應**: - **Case 1** - **Condition**: 缺少 `class_id` - **Code**: 400 - **Content**: ```json { "error": "Class ID is required" } ``` - **Case 2** - **Condition**: 未選擇檔案 - **Code**: 400 - **Content**: ```json { "error": "No selected file" } ``` ### 下載檔案 - **URL**: `/api/download/<filename>` - **Method**: `GET` - **說明**: 下載指定課程的檔案 - **參數**: - **URL Path**: - `filename` (string): 檔案名稱 - **GET**: - `class_id` (int): 班級 ID - **身份權限**: - **老師**: 可用 - **學生**: 可用 - **Headers**: - `Authorization`: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: 下載的檔案內容 - **例外回應**: - **Case 1** - **Condition**: 檔案不存在 - **Code**: 404 - **Content**: ```json { "error": "File not found" } ``` - **Case 2** - **Condition**: 權限不足 - **Code**: 403 - **Content**: ```json { "error": "Access forbidden" } ``` ## feature/register ### 註冊 (測試用) - **URL**: `/register` - **Method**: `POST` - **說明**: 處理新使用者的註冊請求。支援教師和學生兩種帳號類型,並檢查帳號名稱是否重複、密碼格式是否符合要求,以及課程是否存在。 - **參數**: - **Body**: - `username` (`String`, 必填): 使用者名稱 - `password` (`String`, 必填): 密碼,至少 8 個字元 - `user_type` (`String`, 必填): 帳號類型,值為 `"teacher"` 或 `"student"` - `name` (`String`, 必填): 教師或學生的姓名 - `course` (`String`, 必填): 課程名稱 - `group` (`Integer`, 選填): 僅對學生適用,學生的組別號碼,預設為 1 - **身份權限**: - **老師**: 可用 - **學生**: 可用 - **Headers**: 無 - **成功回應**: - **Code**: 201 - **Content**: ```json { "message": "User registered successfully." } ``` - **例外回應**: - **Case 1** - **Condition**: `username` 已存在於系統中 - **Code**: 400 - **Content**: ```json { "message": "Username already exists." } ``` - **Case 2** - **Condition**: `password` 長度小於 8 個字元 - **Code**: 400 - **Content**: ```json { "message": "Password must be at least 8 characters long." } ``` - **Case 3** - **Condition**: `course` 不存在於系統中 - **Code**: 400 - **Content**: ```json { "message": "Course not found." } ``` - **Case 4** - **Condition**: `user_type` 為 `teacher`,但收到 `group` 欄位 - **Code**: 400 - **Content**: ```json { "message": "only user_type is student have group." } ``` - **Case 5** - **Condition**: 伺服器內部發生錯誤 - **Code**: 500 - **Content**: ```json { "message": "Error message describing the issue." } ``` ## feature/LLM ### 開始對話 - **URL**: `/start_conversation` - **Method**: `POST` - **說明**: 為教師建立新的對話 - **參數**: - **POST**: - `course_id` (int): 課程 ID - `course_section` (int): 課程資訊的序列號碼 - **身份權限**: - **老師**: 可用 - **學生**: 禁止 - **Headers**: - `Authorization`: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "uuid": "conversation-uuid-12345" } ``` - **例外回應**: - **Case 1** - **Condition**: Token 無效 - **Code**: 400 - **Content**: ```json { "message": "Invalid token." } ``` - **Case 2** - **Condition**: 用戶非老師 - **Code**: 403 - **Content**: ```json { "message": "Access forbidden: Teachers only." } ``` ### 對話 - **URL**: `/chat/<string:conversation_uuid>` - **Method**: `POST` - **說明**: 在指定對話中傳送訊息並獲取回應 - **參數**: - **URL Path**: - `conversation_uuid` (string): 對話的唯一識別碼 - **POST**: - `user_input` (string): 用戶輸入的訊息 - `file_id` (int, optional): 文件的唯一識別碼(如需要從文件中提取內容) - **身份權限**: - **老師**: 可用 - **學生**: 禁止 - **Headers**: - `Authorization`: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "answer": "AI 回應的內容" } ``` - **例外回應**: - **Case 1** - **Condition**: UUID 無效或未提供 - **Code**: 400 - **Content**: ```json { "message": "The UUID of conversation is invalid." } ``` - **Case 2** - **Condition**: 權限不足 - **Code**: 401 - **Content**: ```json { "message": "Not authorized." } ``` --- ### 取得對話歷史 - **URL**: `/conversation /<string:conversation_uuid>` - **Method**: `GET` - **說明**: 獲取指定對話的歷史記錄 - **參數**: - **URL Path**: - `conversation_uuid` (string): 對話的唯一識別碼 - **身份權限**: - **老師**: 可用 - **學生**: 禁止 - **Headers**: - `Authorization`: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "uuid": "conversation-uuid-12345", "history": [ { "id": 1, "sender": "user", "message": "用戶訊息內容", "sent_at": "2024-11-22 10:30:00" }, { "id": 2, "sender": "assistant", "message": "AI 回應內容", "sent_at": "2024-11-22 10:31:00" } ] } ``` - **例外回應**: - **Case 1** - **Condition**: UUID 無效或未提供 - **Code**: 400 - **Content**: ```json { "message": "The UUID of conversation is invalid." } ``` - **Case 2** - **Condition**: 權限不足 - **Code**: 401 - **Content**: ```json { "message": "Not authorized." } ``` ### 列出對話 - **URL**: `/list_conversations` - **Method**: `GET` - **說明**: 列出當前教師的所有對話 - **參數**: - **GET**: 無 - **身份權限**: - **老師**: 可用 - **學生**: 禁止 - **Headers**: - `Authorization`: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "conversations": [ { "course_name": "軟體工程", "course_section": "Week 1", "uuid": "conversation-uuid-12345", "summary": "對話摘要內容", "created_at": "2024-11-22 10:00:00" } ] } ``` - **例外回應**: - **Case 1** - **Condition**: 用戶非老師 - **Code**: 403 - **Content**: ```json { "message": "Access forbidden: Teachers only." } ``` ## feature/assignments ### 新增作業 - **URL**: `/assignments` - **Method**: `POST` - **說明**: 教師新增作業,並可附帶檔案。 - **參數**: - **POST**: - `title` (`String`, 必填): 作業標題 - `description` (`String`, 選填): 作業描述 - `due_date` (`Datetime`, 必填): 截止期限 - `course_id` (`Integer`, 必填): 作業對應課程 - `files` (`list`, 選填): 檔案鏈結 - **身份權限**: - **老師**: 可用 - **學生**: 禁止 - **Headers**: - **Authorization**: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "message": "Assignment created successfully.", "assignment": { "id": 1, "title": "作業標題", "description": "作業描述", "due_date": "2024-11-30T23:59:59", "created_date": "2024-11-23T12:00:00", "modified_date": "2024-11-23T12:00:00", "files": ["https://example.com/file1.pdf", "https://example.com/file2.docx"] } } ``` - **例外回應**: - **Case 1** - **Condition**: 用戶非老師 - **Code**: 403 - **Content**: ```json { "message": "Only teachers can create assignments." } ``` - **Case 2** - **Condition**: 輸入資料缺失 - **Code**: 400 - **Content**: ```json { "message": "Missing required field: 'title'" } ``` ### 查詢作業 - **URL**: `/assignments/<int:course_id>` - **Method**: `GET` - **說明**: 查詢指定課程的所有作業。 - **參數**: - **URL Path**: - `course_id` (int): 課程 ID - **身份權限**: - **老師**: 可用 - **學生**: 可用 - **Headers**: - **Authorization**: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "assignments": [ { "id": 1, "title": "作業標題", "description": "作業描述", "due_date": "2024-11-30T23:59:59", "created_date": "2024-11-23T12:00:00", "modified_date": "2024-11-23T12:00:00", "files": ["https://example.com/file1.pdf"] } ] } ``` ### 修改作業 - **URL**: `/assignments/<int:assignment_id>` - **Method**: `PUT` - **說明**: 教師修改指定作業資料與附帶檔案。 - **參數**: - **URL Path**: - `assignment_id` (int): 作業 ID` - **PUT**: - `title` (`String`, 必填): 作業標題 - `description` (`String`, 選填): 作業描述 - `due_date` (`Datetime`, 必填): 截止期限 - `files` (`list`, 選填): 檔案鏈結 - **身份權限**: - **老師**: 可用 - **學生**: 禁止 - **Headers**: - **Authorization**: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "message": "Assignment updated successfully." } ``` - **例外回應**: - **Case 1** - **Condition**: 用戶非老師 - **Code**: 403 - **Content**: ```json { "message": "Only teachers can update assignments." } ``` - **Case 2** - **Condition**: 輸入資料缺失 - **Code**: 400 - **Content**: ```json { "message": "Invalid data." } ``` ### 刪除作業 - **URL**: `/assignments/<int:assignment_id>` - **Method**: `DELETE` - **說明**: 教師刪除指定作業。 - **參數**: - **URL Path**: - `assignment_id` (int): 作業 ID - **身份權限**: - **老師**: 可用 - **學生**: 禁止 - **Headers**: - **Authorization**: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "message": "Assignment deleted successfully." } ``` - **例外回應**: - **Case 1** - **Condition**: 用戶非老師 - **Code**: 403 - **Content**: ```json { "message": "Only teachers can delete assignments." } ``` ## feature/submissions ### 查詢作業 - **URL**:`/assignments/<int:course_id>` - **Method**:`GET` - **說明**: 查詢指定課程的所有作業 - **參數**: - **URL Path**: - `course_id`(int): 課程 ID - **身份權限**: - **老師**: 可用 - **學生**: 可用 - **Headers**: - **Authorization**: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "assignments": [ { "id": 1, "title": "作業標題", "description": "作業描述", "due_date": "2024-11-30T23:59:59", "created_date": "2024-11-23T12:00:00", "modified_date": "2024-11-23T12:00:00", "files": ["https://example.com/file1.pdf"] } ] } ``` ### 學生繳交作業 - **URL**:`/submissions` - **Method**:`POST` - **說明**: 學生繳交指定課程的作業 - **參數**: - **POST**: - `assignment_id` (`Integer`, 必填): 作業 ID - `description` (`String`, 選填): 作業描述 - `files` (`list`, 選填): 檔案鏈結 - **身份權限**: - **老師**: 禁用 - **學生**: 可用 - **Headers**: - **Authorization**: Bearer Token - **成功回應**: - **Code**: 201 - **Content**: ```json { "message": "Submission created successfully." } ``` - **例外回應**: - Code: 400 (缺少必要欄位) - **Content**: ```json { "message": "Missing required field: assignment_id" } ``` - Code: 500 (伺服器錯誤) - **Content**: ```json { "Error creating submission: <error details>" } ``` ### 修改繳交的作業 - **URL**: `/submissions/<int:submission_id>` - **Method**: `PUT` - **說明**: 學生修改已繳交的作業。 - **參數**: - **URL Path**: - `submission_id` (int, 必填): 作業提交的 ID - **PUT**: - `description` (String, 選填): 新的作業描述。 - `files` (List, 選填): 替換的檔案 URL 列表。 - **身份權限**: - **老師**: 禁止 - **學生**: 可用(僅能修改自己的作業) - **Headers**: - **Authorization**: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "message": "Submission updated successfully." } ``` - **例外回應**: - **Code**: 404 (提交不存在或無權限) - **Content**: ```json { "message": "Submission not found or permission denied." } ``` - **Code**: 500 (伺服器錯誤) - **Content**: ```json { "message": "Error updating submission: <error details>" } ``` ### 新增評分 - **URL**: `/submissions/<int:submission_id>/grade` - **Method**: `POST` - **說明**: 教師為指定的作業提交新增評分和評語。 - **參數**: - **URL Path**: - `submission_id` (int, 必填): 作業提交的 ID - **POST**: - `score` (Number, 必填): 評分,應為數字 (整數或浮點數)。 - `feedback` (String, 選填): 評語。 - **身份權限**: - **老師**: 可用 - **學生**: 禁止 - **Headers**: - **Authorization**: Bearer Token - **成功回應**: - **Code**: 201 - **Content**: ```json { "message": "Submission graded successfully.", "submission": { "submission_id": 123, "assignment_id": 1, "student_id": 456, "score": 90, "feedback": "Well done!", "submitted_at": "2024-11-22T10:00:00" } } ``` - **例外回應**: - **Case 1** - **Condition**: 用戶非老師 - **Code**: 403 - **Content**: ```json { "message": "Only teachers can add grades." } ``` - **Case 2** - **Condition**: 提交的評分資料缺失或格式錯誤 - **Code**: 400 - **Content**: ```json { "message": "Score must be provided and should be a number." } ``` - **Case 3** - **Condition**: 作業提交已經被評分 - **Code**: 400 - **Content**: ```json { "message": "Grade already exists. Use the update API to modify the grade." } ``` ### 更新評分 - **URL**: `/submissions/<int:submission_id>/grade` - **Method**: `PUT` - **說明**: 教師更新指定的作業提交的評分和評語。 - **參數**: - **URL Path**: - `submission_id` (int, 必填): 作業提交的 ID - **PUT**: - `score` (Number, 必填): 新評分,應為數字 (整數或浮點數)。 - `feedback` (String, 選填): 新評語。 - **身份權限**: - **老師**: 可用 - **學生**: 禁止 - **Headers**: - **Authorization**: Bearer Token - **成功回應**: - **Code**: 200 - **Content**: ```json { "message": "Submission grade updated successfully.", "submission": { "submission_id": 123, "assignment_id": 1, "student_id": 456, "score": 95, "feedback": "Excellent improvement!", "submitted_at": "2024-11-22T10:00:00" } } ``` - **例外回應**: - **Case 1** - **Condition**: 用戶非老師 - **Code**: 403 - **Content**: ```json { "message": "Only teachers can update grades." } ``` - **Case 2** - **Condition**: 提交的評分資料缺失或格式錯誤 - **Code**: 400 - **Content**: ```json { "message": "Score must be provided and should be a number." } ``` - **Case 3** - **Condition**: 評分不存在 - **Code**: 400 - **Content**: ```json { "message": "Grade does not exist. Use the add API to create a grade." } ```