This commit is contained in:
@@ -49,28 +49,23 @@ func validateExamRoomForPublish(db *gorm.DB, room *models.ExamRoom) []string {
|
||||
if strings.TrimSpace(room.AllowedApps) == "" {
|
||||
issues = append(issues, "Chưa cấu hình ứng dụng được phép khi thi")
|
||||
}
|
||||
var paperCount int64
|
||||
_ = db.Model(&models.ExamPaper{}).Where("exam_room_id = ?", room.ID).Count(&paperCount).Error
|
||||
if paperCount == 0 {
|
||||
issues = append(issues, "Chưa có gói đề (PDF + tài nguyên)")
|
||||
}
|
||||
var students []models.ExamRoomStudent
|
||||
_ = db.Where("exam_room_id = ?", room.ID).Find(&students).Error
|
||||
if len(students) == 0 {
|
||||
issues = append(issues, "Chưa có sinh viên trong phòng thi")
|
||||
}
|
||||
unassigned := 0
|
||||
for _, s := range students {
|
||||
if s.AssignedPaperID == nil {
|
||||
unassigned++
|
||||
}
|
||||
}
|
||||
if unassigned > 0 {
|
||||
issues = append(issues, fmt.Sprintf("Còn %d sinh viên chưa được chia gói đề", unassigned))
|
||||
}
|
||||
return issues
|
||||
}
|
||||
|
||||
func canModifyExamPapers(db *gorm.DB, room models.ExamRoom) bool {
|
||||
if room.Status != models.ExamStatusDraft && room.Status != models.ExamStatusReady {
|
||||
return false
|
||||
}
|
||||
var sentCount int64
|
||||
_ = db.Model(&models.ExamRoomStudent{}).Where("exam_room_id = ? AND paper_sent_at IS NOT NULL", room.ID).Count(&sentCount).Error
|
||||
return sentCount == 0
|
||||
}
|
||||
|
||||
// ProcessScheduledExamSends gửi đề đã hẹn giờ — gọi định kỳ từ main.
|
||||
func ProcessScheduledExamSends(db *gorm.DB) {
|
||||
internalDb.ProcessExamRoomLifecycle(db)
|
||||
@@ -617,9 +612,8 @@ func UploadExamPaperHandler(db *gorm.DB) fiber.Handler {
|
||||
if err := db.First(&room, roomID).Error; err != nil {
|
||||
return c.Status(404).JSON(fiber.Map{"error": "Không tìm thấy"})
|
||||
}
|
||||
now := time.Now()
|
||||
if !internalDb.ExamRoomPrepEditable(room, now) {
|
||||
return c.Status(403).JSON(fiber.Map{"error": "Chỉ thêm gói đề khi phòng tạm thời hoặc sẵn sàng (trước giờ thi)"})
|
||||
if !canModifyExamPapers(db, room) {
|
||||
return c.Status(403).JSON(fiber.Map{"error": "Không thể thêm gói đề khi đề đã được gửi cho sinh viên hoặc phòng thi đã kết thúc"})
|
||||
}
|
||||
form, err := c.MultipartForm()
|
||||
if err != nil {
|
||||
@@ -724,8 +718,8 @@ func UploadExamPaperResourceHandler(db *gorm.DB) fiber.Handler {
|
||||
if err := db.First(&room, roomID).Error; err != nil {
|
||||
return c.Status(404).JSON(fiber.Map{"error": "Không tìm thấy phòng"})
|
||||
}
|
||||
if !internalDb.ExamRoomPrepEditable(room, time.Now()) {
|
||||
return c.Status(403).JSON(fiber.Map{"error": "Phòng thi đã bắt đầu — không thể thêm tài nguyên"})
|
||||
if !canModifyExamPapers(db, room) {
|
||||
return c.Status(403).JSON(fiber.Map{"error": "Không thể thêm tài nguyên khi đề đã được gửi cho sinh viên hoặc phòng thi đã kết thúc"})
|
||||
}
|
||||
var paper models.ExamPaper
|
||||
if err := db.Where("id = ? AND exam_room_id = ?", paperID, roomID).First(&paper).Error; err != nil {
|
||||
@@ -771,14 +765,12 @@ func DeleteExamPaperHandler(db *gorm.DB) fiber.Handler {
|
||||
if err := db.First(&room, roomID).Error; err != nil {
|
||||
return c.Status(404).JSON(fiber.Map{"error": "Không tìm thấy"})
|
||||
}
|
||||
if !internalDb.ExamRoomPrepEditable(room, time.Now()) {
|
||||
return c.Status(403).JSON(fiber.Map{"error": "Phòng thi đã bắt đầu — không thể xóa gói đề"})
|
||||
}
|
||||
var assigned int64
|
||||
_ = db.Model(&models.ExamRoomStudent{}).Where("exam_room_id = ? AND assigned_paper_id = ?", roomID, paperID).Count(&assigned).Error
|
||||
if assigned > 0 {
|
||||
return c.Status(403).JSON(fiber.Map{"error": "Gói đề đã được gán cho sinh viên — không thể xóa"})
|
||||
if !canModifyExamPapers(db, room) {
|
||||
return c.Status(403).JSON(fiber.Map{"error": "Không thể xóa gói đề khi đề đã được gửi cho sinh viên hoặc phòng thi đã kết thúc"})
|
||||
}
|
||||
// Clear student assignments for this paper first
|
||||
_ = db.Model(&models.ExamRoomStudent{}).Where("exam_room_id = ? AND assigned_paper_id = ?", roomID, paperID).Update("assigned_paper_id", nil).Error
|
||||
|
||||
_ = os.RemoveAll(filepath.Join(examRoomDir(roomID), "papers", fmt.Sprintf("%d", paperID)))
|
||||
_ = db.Where("exam_paper_id = ?", paperID).Delete(&models.ExamPaperResource{}).Error
|
||||
_ = db.Where("id = ? AND exam_room_id = ?", paperID, roomID).Delete(&models.ExamPaper{}).Error
|
||||
@@ -797,8 +789,8 @@ func RandomAssignExamPapersHandler(db *gorm.DB) fiber.Handler {
|
||||
if err := db.First(&room, roomID).Error; err != nil {
|
||||
return c.Status(404).JSON(fiber.Map{"error": "Không tìm thấy"})
|
||||
}
|
||||
if !internalDb.ExamRoomPrepEditable(room, time.Now()) {
|
||||
return c.Status(403).JSON(fiber.Map{"error": "Chỉ chia gói đề khi phòng tạm thời hoặc sẵn sàng (trước giờ thi)"})
|
||||
if !canModifyExamPapers(db, room) {
|
||||
return c.Status(403).JSON(fiber.Map{"error": "Không thể chia gói đề khi đề đã được gửi cho sinh viên hoặc phòng thi đã kết thúc"})
|
||||
}
|
||||
var papers []models.ExamPaper
|
||||
if err := db.Where("exam_room_id = ?", roomID).Order("sort_order asc, id asc").Find(&papers).Error; err != nil || len(papers) == 0 {
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user