using Entities.Contracts; using Entities.DTO; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using TechHelper.Server.Services; using System.Security.Claims; using TechHelper.Services; namespace TechHelper.Server.Controllers { [Route("api/exam")] [ApiController] [Authorize] public class ExamController : ControllerBase { private readonly IExamService _examService; private readonly UserManager _userManager; public ExamController(IExamService examService, UserManager userManager) { _examService = examService; _userManager = userManager; } /// /// 创建一个新的考试/作业。 /// /// 考试/作业的数据传输对象。 /// 新创建的考试/作业信息或错误信息。 [HttpPost("add")] public async Task AddExam([FromBody] AssignmentDto examDto) { var user = await _userManager.FindByEmailAsync(User.Identity.Name); if (user == null) return NotFound("没有找到用户"); examDto.CreatorId = user.Id; var result = await _examService.CreateExamAsync(examDto); if (result.Status) { return StatusCode(201, result.Result); } else { return BadRequest(result.Message); } } /// /// 提交作业。 /// /// 提交的数据传输对象。 /// 提交结果或错误信息。 [HttpPost("submission")] public async Task SubmissionAssignment([FromBody] SubmissionDto submissionDto) { var result = await _examService.SubmissionAssignment(submissionDto); if (result.Status) { return Ok(result.Result); } else { return BadRequest(result.Message); } } /// /// 根据ID获取考试/作业详情。 /// /// 考试/作业ID。 /// 考试/作业详情或未找到错误。 [HttpGet("{id:guid}")] public async Task GetExamById(Guid id) { var result = await _examService.GetAsync(id); if (result.Status) { if (result.Result == null) { return NotFound("未找到指定的考试/作业。"); } return Ok(result.Result); } else { if (result.Message.Contains("未找到") || result.Message.Contains("not found", StringComparison.OrdinalIgnoreCase)) { return NotFound(result.Message); } return BadRequest(result.Message); } } /// /// 获取所有考试/作业的预览信息(教师获取自己创建的,学生获取自己需要提交的)。 /// /// 考试/作业预览列表或错误信息。 [HttpGet("getAllPreview")] public async Task GetAllExamPreview() { var user = await _userManager.FindByEmailAsync(User.Identity.Name); if (user == null) return NotFound("没有找到用户"); ApiResponse result; if (User.IsInRole("Teacher")) { result = await _examService.GetAllExamPreviewsAsync(user.Id); } else if (User.IsInRole("Student")) { result = await _examService.GetAllSubmissionAsync(user.Id); } else { return Forbid("你没有查看考试预览的权限。"); } if (result.Status) { return Ok(result.Result); } else { return BadRequest(result.Message); } } /// /// 获取学生的所有提交记录。 /// /// 提交记录列表或错误信息。 [HttpGet("getAllSubmissions")] [Authorize(Roles = "Student")] public async Task GetAllSubmission() { var user = await _userManager.FindByEmailAsync(User.Identity.Name); if (user == null) return NotFound("没有找到用户"); var result = await _examService.GetAllSubmissionAsync(user.Id); if (result.Status) { return Ok(result.Result); } else { return BadRequest(result.Message); } } /// /// 逻辑删除指定ID的考试/作业。 /// /// 要删除的考试/作业ID。 /// 操作结果。 [HttpDelete("delete/{id:guid}")] [Authorize(Roles = "Teacher")] public async Task DeleteAsync(Guid id) { var deleteResult = await _examService.DeleteAsync(id); if (deleteResult.Status) { return NoContent(); } else { if (deleteResult.Message.Contains("未找到") || deleteResult.Message.Contains("not found", StringComparison.OrdinalIgnoreCase)) { return NotFound(deleteResult.Message); } return BadRequest(deleteResult.Message); } } /// /// 为指定学生指派作业 /// /// /// [HttpPost("assignmentExamToStudent")] [Authorize(Roles = "Teacher")] public async Task AssignmentExamToStudent([FromBody] AssigExamToStudentsDto AETSdto) { var result = await _examService.AssignmentToStudentsAsync(AETSdto); if (result.Status) { return Ok(result.Result); } else { return BadRequest(result.Message); } } /// /// 为所有学生指派作业 /// /// /// [HttpPost("assignmentExamToStudent/{id:guid}")] [Authorize(Roles = "Teacher")] public async Task AssignmentExamToAllStudentsAsync(Guid id) { var user = await _userManager.FindByEmailAsync(User.Identity.Name ?? ""); var result = await _examService.AssignmentToAllStudentsAsync(id, user.Id); if (result.Status) { return Ok(result.Result); } else { return BadRequest(result.Message); } } } }