This commit is contained in:
@@ -302,9 +302,6 @@ func UpdateExamRoomHandler(db *gorm.DB) fiber.Handler {
|
||||
if err := db.First(&room, id).Error; err != nil {
|
||||
return c.Status(404).JSON(fiber.Map{"error": "Không tìm thấy"})
|
||||
}
|
||||
if !internalDb.ExamRoomEditable(room) {
|
||||
return c.Status(403).JSON(fiber.Map{"error": "Chỉ sửa được phòng thi ở trạng thái tạm thời"})
|
||||
}
|
||||
var req struct {
|
||||
Name *string `json:"name"`
|
||||
StartTime *string `json:"startTime"`
|
||||
@@ -315,6 +312,15 @@ func UpdateExamRoomHandler(db *gorm.DB) fiber.Handler {
|
||||
if err := c.BodyParser(&req); err != nil {
|
||||
return c.Status(400).JSON(fiber.Map{"error": "Invalid body"})
|
||||
}
|
||||
if !internalDb.ExamRoomEditable(room) {
|
||||
if room.Status == models.ExamStatusReady {
|
||||
if req.Name != nil || req.StartTime != nil || req.EndTime != nil || req.QuizURL != nil {
|
||||
return c.Status(403).JSON(fiber.Map{"error": "Chỉ sửa được cấu hình ứng dụng được phép khi phòng thi đã đẩy hoặc đang thi"})
|
||||
}
|
||||
} else {
|
||||
return c.Status(403).JSON(fiber.Map{"error": "Chỉ sửa được phòng thi ở trạng thái tạm thời hoặc đang sẵn sàng/đang thi"})
|
||||
}
|
||||
}
|
||||
if req.Name != nil {
|
||||
room.Name = strings.TrimSpace(*req.Name)
|
||||
}
|
||||
@@ -462,19 +468,42 @@ func SearchExamStudentsHandler(db *gorm.DB) fiber.Handler {
|
||||
if q == "" {
|
||||
return c.JSON(fiber.Map{"data": []any{}})
|
||||
}
|
||||
pat := "%" + q + "%"
|
||||
var ids []int64
|
||||
_ = db.Model(&models.Student{}).
|
||||
Where("full_name LIKE ? OR student_code LIKE ? OR email LIKE ?", pat, pat, pat).
|
||||
Limit(30).
|
||||
Pluck("rk_id", &ids).Error
|
||||
var classIDs []int64
|
||||
_ = db.Model(&models.Class{}).Where("class_code LIKE ? OR name LIKE ?", pat, pat).Pluck("rk_id", &classIDs).Error
|
||||
if len(classIDs) > 0 {
|
||||
var more []int64
|
||||
_ = db.Model(&models.ClassStudent{}).Where("class_rk_id IN ?", classIDs).Distinct().Pluck("student_rk_id", &more).Error
|
||||
ids = append(ids, more...)
|
||||
// Split search query by newline, comma, or semicolon
|
||||
var terms []string
|
||||
for _, line := range strings.FieldsFunc(q, func(r rune) bool {
|
||||
return r == '\n' || r == '\r' || r == ';' || r == ','
|
||||
}) {
|
||||
t := strings.TrimSpace(line)
|
||||
if t != "" {
|
||||
terms = append(terms, t)
|
||||
}
|
||||
}
|
||||
if len(terms) == 0 {
|
||||
return c.JSON(fiber.Map{"data": []any{}})
|
||||
}
|
||||
if len(terms) > 100 {
|
||||
terms = terms[:100]
|
||||
}
|
||||
|
||||
var ids []int64
|
||||
for _, term := range terms {
|
||||
pat := "%" + term + "%"
|
||||
var termIDs []int64
|
||||
_ = db.Model(&models.Student{}).
|
||||
Where("full_name LIKE ? OR student_code LIKE ? OR email LIKE ?", pat, pat, pat).
|
||||
Limit(30).
|
||||
Pluck("rk_id", &termIDs).Error
|
||||
ids = append(ids, termIDs...)
|
||||
|
||||
var classIDs []int64
|
||||
_ = db.Model(&models.Class{}).Where("class_code LIKE ? OR name LIKE ?", pat, pat).Pluck("rk_id", &classIDs).Error
|
||||
if len(classIDs) > 0 {
|
||||
var more []int64
|
||||
_ = db.Model(&models.ClassStudent{}).Where("class_rk_id IN ?", classIDs).Distinct().Pluck("student_rk_id", &more).Error
|
||||
ids = append(ids, more...)
|
||||
}
|
||||
}
|
||||
|
||||
seen := map[int64]bool{}
|
||||
uniq := make([]int64, 0)
|
||||
for _, id := range ids {
|
||||
@@ -483,12 +512,12 @@ func SearchExamStudentsHandler(db *gorm.DB) fiber.Handler {
|
||||
uniq = append(uniq, id)
|
||||
}
|
||||
}
|
||||
if len(uniq) > 40 {
|
||||
uniq = uniq[:40]
|
||||
if len(uniq) > 100 {
|
||||
uniq = uniq[:100]
|
||||
}
|
||||
var students []models.Student
|
||||
if len(uniq) > 0 {
|
||||
_ = db.Where("rk_id IN ?", uniq).Limit(40).Find(&students).Error
|
||||
_ = db.Where("rk_id IN ?", uniq).Limit(100).Find(&students).Error
|
||||
}
|
||||
type row struct {
|
||||
StudentRkID int64 `json:"studentRkId"`
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user