This commit is contained in:
2026-06-30 10:39:29 +07:00
parent aaafa6ada9
commit d9c8e3930b
28 changed files with 3040 additions and 167 deletions

View File

@@ -6,6 +6,8 @@ import (
"server/internal/db"
"server/internal/handlers"
"server/internal/mail"
"server/internal/middleware"
"server/internal/qldt"
"server/internal/syncjobs"
internalWs "server/internal/websocket"
@@ -47,6 +49,7 @@ func main() {
qldtClient := qldt.NewClient(qldtBaseURL, qldtOrigin)
classesJob := syncjobs.NewClassesSyncJob()
studentsJob := syncjobs.NewStudentsSyncJob()
mailer := mail.LoadConfigFromEnv()
app := fiber.New(fiber.Config{
AppName: "Simple Care Sync Backend",
@@ -72,54 +75,82 @@ func main() {
api := app.Group("/api")
// Dashboard Stats
api.Get("/stats", handlers.GetStatsHandler(gormDB))
// Auth công khai (management)
api.Post("/auth/provision", handlers.ProvisionStaffHandler(gormDB, mailer))
api.Post("/auth/login", handlers.LoginStaffHandler(gormDB))
api.Post("/auth/forgot-password", handlers.ForgotPasswordHandler(gormDB, mailer))
api.Post("/auth/reset-password", handlers.ResetPasswordHandler(gormDB))
// Classes endpoints
api.Get("/classes", handlers.ListClassesHandler(gormDB))
api.Get("/classes/schedules", handlers.ListActiveSchedulesHandler(gormDB))
api.Get("/classes/:rkId", handlers.GetClassHandler(gormDB))
api.Patch("/classes/:rkId/studying", handlers.PatchClassStudyingHandler(gormDB))
api.Get("/classes/:rkId/students", handlers.ListClassStudentsHandler(gormDB))
// Students endpoints
api.Get("/students", handlers.ListAllStudentsHandler(gormDB))
// Sync endpoints
api.Post("/sync/classes/start", handlers.StartClassesSyncHandler(gormDB, qldtClient, classesJob, qldtToken))
api.Get("/sync/classes/status", handlers.GetClassesSyncStatusHandler(classesJob))
api.Post("/sync/students/start", handlers.StartStudentsSyncHandler(gormDB, qldtClient, studentsJob, qldtToken))
api.Get("/sync/students/status", handlers.GetStudentsSyncStatusHandler(studentsJob))
// Learning Management endpoints
api.Get("/classes/:rkId/schedule", handlers.GetClassScheduleHandler(gormDB))
api.Post("/classes/:rkId/schedule", handlers.SaveClassScheduleHandler(gormDB))
api.Delete("/classes/:rkId/schedule", handlers.DeleteClassScheduleHandler(gormDB))
api.Get("/classes/:rkId/allowed-apps", handlers.GetAllowedAppsHandler(gormDB))
api.Post("/classes/:rkId/allowed-apps", handlers.SaveAllowedAppsHandler(gormDB))
api.Get("/app-pool", handlers.ListAppPoolHandler(gormDB))
api.Get("/wifi-pool", handlers.ListWifiPoolHandler(gormDB))
api.Get("/network/accepted-wifis", handlers.ListAcceptedWifisHandler(gormDB))
api.Post("/network/accepted-wifis", handlers.SaveAcceptedWifisHandler(gormDB))
api.Post("/network/accepted-wifis/add", handlers.AddAcceptedWifiHandler(gormDB))
api.Delete("/network/accepted-wifis/:id", handlers.DeleteAcceptedWifiHandler(gormDB))
api.Get("/classes/:rkId/session-logs", handlers.ListClassSessionLogsHandler(gormDB))
api.Get("/classes/:rkId/online-students", handlers.GetOnlineStudentsHandler(gormDB))
api.Get("/classes/:rkId/courses", handlers.GetClassCoursesHandler(gormDB, qldtClient, qldtToken))
api.Post("/classes/:rkId/schedule/apply-template", handlers.ApplyScheduleTemplateHandler(gormDB))
api.Get("/classes/:rkId/attendance", handlers.GetClassAttendanceHandler(gormDB))
api.Get("/classes/:rkId/attendance/shifts", handlers.ListAttendanceShiftsHandler(gormDB))
api.Put("/classes/:rkId/attendance/status", handlers.UpdateAttendanceStatusHandler(gormDB))
api.Post("/classes/:rkId/attendance/push-qldt", handlers.PushAttendanceToQLDTHandler(gormDB, qldtClient, qldtToken))
// Student syncing offline-resilient log
// Student client (không cần JWT staff)
api.Post("/student/sync-log", handlers.SyncStudentSessionLogHandler(gormDB))
api.Get("/student/status", handlers.GetStudentStatusHandler(gormDB))
api.Get("/student/wifi-policy", handlers.GetStudentWifiPolicyHandler(gormDB))
api.Post("/student/report-wifi", handlers.ReportWifiHandler(gormDB))
api.Post("/student/report-blocked-app", handlers.ReportBlockedAppHandler(gormDB))
api.Get("/student/chat/messages", handlers.StudentListChatHandler(gormDB))
api.Get("/student/chat/conversations", handlers.StudentListChatConversationsHandler(gormDB))
api.Post("/student/chat/messages", handlers.StudentSendChatHandler(gormDB))
// Health check (public)
api.Get("/health", func(c *fiber.Ctx) error {
return c.JSON(fiber.Map{"ok": true})
})
// Management — yêu cầu đăng nhập staff
staff := api.Group("", middleware.RequireStaff())
staff.Get("/auth/me", handlers.MeStaffHandler(gormDB))
staff.Post("/auth/change-password", handlers.ChangePasswordHandler(gormDB))
staff.Get("/stats", handlers.GetStatsHandler(gormDB))
// Classes endpoints
staff.Get("/classes", handlers.ListClassesHandler(gormDB))
staff.Get("/classes/schedules", handlers.ListActiveSchedulesHandler(gormDB))
staff.Get("/classes/:rkId", handlers.GetClassHandler(gormDB))
staff.Patch("/classes/:rkId/studying", handlers.PatchClassStudyingHandler(gormDB))
staff.Get("/classes/:rkId/students", handlers.ListClassStudentsHandler(gormDB))
// Students endpoints
staff.Get("/students", handlers.ListAllStudentsHandler(gormDB))
// Sync endpoints
staff.Post("/sync/classes/start", handlers.StartClassesSyncHandler(gormDB, qldtClient, classesJob, qldtToken))
staff.Get("/sync/classes/status", handlers.GetClassesSyncStatusHandler(classesJob))
staff.Post("/sync/students/start", handlers.StartStudentsSyncHandler(gormDB, qldtClient, studentsJob, qldtToken))
staff.Get("/sync/students/status", handlers.GetStudentsSyncStatusHandler(studentsJob))
// Learning Management endpoints
staff.Get("/classes/:rkId/schedule", handlers.GetClassScheduleHandler(gormDB))
staff.Post("/classes/:rkId/schedule", handlers.SaveClassScheduleHandler(gormDB))
staff.Delete("/classes/:rkId/schedule", handlers.DeleteClassScheduleHandler(gormDB))
staff.Get("/classes/:rkId/allowed-apps", handlers.GetAllowedAppsHandler(gormDB))
staff.Post("/classes/:rkId/allowed-apps", handlers.SaveAllowedAppsHandler(gormDB))
staff.Get("/app-pool", handlers.ListAppPoolHandler(gormDB))
staff.Get("/wifi-pool", handlers.ListWifiPoolHandler(gormDB))
staff.Get("/network/accepted-wifis", handlers.ListAcceptedWifisHandler(gormDB))
staff.Post("/network/accepted-wifis", handlers.SaveAcceptedWifisHandler(gormDB))
staff.Post("/network/accepted-wifis/add", handlers.AddAcceptedWifiHandler(gormDB))
staff.Delete("/network/accepted-wifis/:id", handlers.DeleteAcceptedWifiHandler(gormDB))
staff.Get("/classes/:rkId/session-logs", handlers.ListClassSessionLogsHandler(gormDB))
staff.Get("/classes/:rkId/online-students", handlers.GetOnlineStudentsHandler(gormDB))
staff.Get("/classes/:rkId/courses", handlers.GetClassCoursesHandler(gormDB, qldtClient, qldtToken))
staff.Post("/classes/:rkId/schedule/apply-template", handlers.ApplyScheduleTemplateHandler(gormDB))
staff.Get("/classes/:rkId/attendance", handlers.GetClassAttendanceHandler(gormDB))
staff.Get("/classes/:rkId/attendance/shifts", handlers.ListAttendanceShiftsHandler(gormDB))
staff.Put("/classes/:rkId/attendance/status", handlers.UpdateAttendanceStatusHandler(gormDB))
staff.Post("/classes/:rkId/attendance/push-qldt", handlers.PushAttendanceToQLDTHandler(gormDB, qldtClient, qldtToken))
// Chat & quản lý tài khoản
staff.Get("/chat/students", handlers.SearchChatStudentsHandler(gormDB))
staff.Get("/chat/conversations", handlers.ListChatConversationsHandler(gormDB))
staff.Get("/chat/messages/:studentRkId", handlers.ListChatMessagesHandler(gormDB))
staff.Post("/chat/messages", handlers.SendChatMessageHandler(gormDB))
staff.Get("/admin/email-domains", handlers.ListEmailDomainsHandler(gormDB))
staff.Post("/admin/email-domains", handlers.AddEmailDomainHandler(gormDB))
staff.Delete("/admin/email-domains/:id", handlers.DeleteEmailDomainHandler(gormDB))
staff.Get("/admin/staff", handlers.ListStaffHandler(gormDB))
port := getEnv("PORT", "8080")
log.Printf("Server starting on port %s...", port)