core v1
This commit is contained in:
@@ -3,7 +3,9 @@ package handlers
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
internalDb "server/internal/db"
|
||||
"server/internal/models"
|
||||
"server/internal/qldt"
|
||||
"server/internal/syncjobs"
|
||||
@@ -126,31 +128,8 @@ func ListClassesHandler(db *gorm.DB) fiber.Handler {
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Failed to query classes: " + err.Error()})
|
||||
}
|
||||
|
||||
// Kéo danh sách Courses cho các lớp
|
||||
var classIDs []int64
|
||||
for _, r := range rows {
|
||||
classIDs = append(classIDs, r.RkID)
|
||||
}
|
||||
|
||||
coursesByClass := map[int64][]courseRefItem{}
|
||||
if len(classIDs) > 0 {
|
||||
var links []models.ClassCourseLink
|
||||
if err := db.Where("class_rk_id IN ?", classIDs).Order("course_order asc").Find(&links).Error; err == nil {
|
||||
for _, link := range links {
|
||||
coursesByClass[link.ClassRkID] = append(coursesByClass[link.ClassRkID], courseRefItem{
|
||||
CourseRkID: link.CourseRkID,
|
||||
CourseName: link.CourseName,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
out := make([]classItem, 0, len(rows))
|
||||
for _, r := range rows {
|
||||
courses := coursesByClass[r.RkID]
|
||||
if courses == nil {
|
||||
courses = []courseRefItem{}
|
||||
}
|
||||
out = append(out, classItem{
|
||||
RkID: r.RkID,
|
||||
Name: r.Name,
|
||||
@@ -163,7 +142,7 @@ func ListClassesHandler(db *gorm.DB) fiber.Handler {
|
||||
SystemCode: r.SystemCode,
|
||||
SystemName: r.SystemName,
|
||||
IsStudying: r.IsStudying,
|
||||
Courses: courses,
|
||||
Courses: []courseRefItem{},
|
||||
})
|
||||
}
|
||||
|
||||
@@ -176,6 +155,48 @@ func ListClassesHandler(db *gorm.DB) fiber.Handler {
|
||||
}
|
||||
}
|
||||
|
||||
// GET /api/classes/:rkId - Lấy thông tin chi tiết một lớp học
|
||||
func GetClassHandler(db *gorm.DB) fiber.Handler {
|
||||
return func(c *fiber.Ctx) error {
|
||||
rkID, err := strconv.ParseInt(c.Params("rkId"), 10, 64)
|
||||
if err != nil {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid class rkId"})
|
||||
}
|
||||
|
||||
var row models.Class
|
||||
if err := db.Where("rk_id = ?", rkID).First(&row).Error; err != nil {
|
||||
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{"error": "Class not found"})
|
||||
}
|
||||
|
||||
coursesOut := []courseRefItem{}
|
||||
if cached, err := internalDb.ListClassCourses(db, rkID); err == nil {
|
||||
for _, co := range cached {
|
||||
coursesOut = append(coursesOut, courseRefItem{
|
||||
CourseRkID: co.ID,
|
||||
CourseName: co.Name,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
out := classItem{
|
||||
RkID: row.RkID,
|
||||
Name: row.Name,
|
||||
ClassCode: row.ClassCode,
|
||||
Type: row.Type,
|
||||
StudentCount: row.StudentCount,
|
||||
SpecializeRkID: row.SpecializeRkID,
|
||||
SpecializeName: row.SpecializeName,
|
||||
SystemRkID: row.SystemRkID,
|
||||
SystemCode: row.SystemCode,
|
||||
SystemName: row.SystemName,
|
||||
IsStudying: row.IsStudying,
|
||||
Courses: coursesOut,
|
||||
}
|
||||
|
||||
return c.JSON(out)
|
||||
}
|
||||
}
|
||||
|
||||
// Handler cập nhật trạng thái đang học (isStudying) của lớp học
|
||||
func PatchClassStudyingHandler(db *gorm.DB) fiber.Handler {
|
||||
return func(c *fiber.Ctx) error {
|
||||
@@ -200,6 +221,45 @@ func PatchClassStudyingHandler(db *gorm.DB) fiber.Handler {
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
|
||||
}
|
||||
|
||||
if body.IsStudying {
|
||||
// 1. Kiểm tra xem lớp đã cấu hình app được phép chưa
|
||||
var appConfig models.ClassAllowedApp
|
||||
errApp := db.Where("class_rk_id = ?", rkID).First(&appConfig).Error
|
||||
if errApp == gorm.ErrRecordNotFound || strings.TrimSpace(appConfig.Keywords) == "" {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Không thể kích hoạt trạng thái đang học: Lớp chưa được cấu hình danh sách ứng dụng cho phép."})
|
||||
}
|
||||
|
||||
// 2. Kiểm tra xem có trong giờ học không
|
||||
var schedules []models.ClassSchedule
|
||||
errSched := db.Where("class_rk_id = ?", rkID).Find(&schedules).Error
|
||||
inSchedule := false
|
||||
if errSched == nil && len(schedules) > 0 {
|
||||
now := time.Now()
|
||||
goWeekday := now.Weekday()
|
||||
var scheduleDay int
|
||||
if goWeekday == time.Sunday {
|
||||
scheduleDay = 6
|
||||
} else {
|
||||
scheduleDay = int(goWeekday) - 1
|
||||
}
|
||||
currMin := now.Hour()*60 + now.Minute()
|
||||
for _, s := range schedules {
|
||||
if s.DayOfWeek == scheduleDay {
|
||||
startMin := parseTimeMinutes(s.StartTime)
|
||||
endMin := parseTimeMinutes(s.EndTime)
|
||||
if currMin >= startMin && currMin <= endMin {
|
||||
inSchedule = true
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if !inSchedule {
|
||||
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Không thể kích hoạt trạng thái đang học: Hiện tại ngoài giờ học theo lịch đã cài đặt."})
|
||||
}
|
||||
}
|
||||
|
||||
cl.IsStudying = body.IsStudying
|
||||
if err := db.Save(&cl).Error; err != nil {
|
||||
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Failed to update class: " + err.Error()})
|
||||
@@ -236,7 +296,32 @@ func ListClassStudentsHandler(db *gorm.DB) fiber.Handler {
|
||||
}
|
||||
}
|
||||
|
||||
return c.JSON(fiber.Map{"data": students, "total": len(students)})
|
||||
type studentRow struct {
|
||||
ID uint `json:"id"`
|
||||
RkID int64 `json:"rkId"`
|
||||
StudentCode string `json:"studentCode"`
|
||||
FullName string `json:"fullName"`
|
||||
Phone *string `json:"phone"`
|
||||
Email string `json:"email"`
|
||||
Avatar string `json:"avatar"`
|
||||
}
|
||||
out := make([]studentRow, 0, len(students))
|
||||
for _, st := range students {
|
||||
row := studentRow{
|
||||
ID: st.ID,
|
||||
RkID: st.RkID,
|
||||
StudentCode: st.StudentCode,
|
||||
FullName: st.FullName,
|
||||
Phone: st.Phone,
|
||||
Email: st.Email,
|
||||
}
|
||||
if st.Avatar != nil {
|
||||
row.Avatar = *st.Avatar
|
||||
}
|
||||
out = append(out, row)
|
||||
}
|
||||
|
||||
return c.JSON(fiber.Map{"data": out, "total": len(out)})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user