69 lines
1.9 KiB
Go
69 lines
1.9 KiB
Go
package db
|
|
|
|
import (
|
|
"time"
|
|
|
|
"server/internal/models"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// ExamDisplayStatus trạng thái hiển thị (tính từ DB status + thời gian).
|
|
func ExamDisplayStatus(room models.ExamRoom, now time.Time) string {
|
|
switch room.Status {
|
|
case models.ExamStatusCancelled:
|
|
return models.ExamStatusCancelled
|
|
case models.ExamStatusEnded:
|
|
return models.ExamStatusEnded
|
|
case models.ExamStatusDraft:
|
|
return models.ExamStatusDraft
|
|
case models.ExamStatusReady:
|
|
if now.After(room.EndTime) {
|
|
return models.ExamStatusEnded
|
|
}
|
|
if !now.Before(room.StartTime) {
|
|
return "active"
|
|
}
|
|
return models.ExamStatusReady
|
|
default:
|
|
return models.ExamStatusDraft
|
|
}
|
|
}
|
|
|
|
func ExamRoomEditable(room models.ExamRoom) bool {
|
|
return room.Status == models.ExamStatusDraft
|
|
}
|
|
|
|
// ExamRoomPrepEditable — chỉnh gói đề, sinh viên trước khi thi bắt đầu.
|
|
func ExamRoomPrepEditable(room models.ExamRoom, now time.Time) bool {
|
|
if room.Status == models.ExamStatusDraft {
|
|
return true
|
|
}
|
|
return room.Status == models.ExamStatusReady && now.Before(room.StartTime)
|
|
}
|
|
|
|
func ExamRoomCanUnpublish(room models.ExamRoom, now time.Time) bool {
|
|
return room.Status == models.ExamStatusReady && now.Before(room.StartTime)
|
|
}
|
|
|
|
func ExamRoomIsLive(room models.ExamRoom, now time.Time) bool {
|
|
return ExamDisplayStatus(room, now) == "active"
|
|
}
|
|
|
|
func ExamRoomCanCancel(room models.ExamRoom, now time.Time) bool {
|
|
return ExamRoomIsLive(room, now)
|
|
}
|
|
|
|
// ExamRoomCanExtend — gia hạn giờ kết thúc khi phòng đang thi.
|
|
func ExamRoomCanExtend(room models.ExamRoom, now time.Time) bool {
|
|
return ExamRoomIsLive(room, now)
|
|
}
|
|
|
|
// ProcessExamRoomLifecycle đánh dấu phòng ready đã quá giờ kết thúc.
|
|
func ProcessExamRoomLifecycle(db *gorm.DB) {
|
|
now := time.Now()
|
|
_ = db.Model(&models.ExamRoom{}).
|
|
Where("status = ? AND end_time < ?", models.ExamStatusReady, now).
|
|
Update("status", models.ExamStatusEnded).Error
|
|
}
|