package main import ( "log" "os" "server/internal/db" "server/internal/handlers" "server/internal/qldt" "server/internal/syncjobs" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" "github.com/joho/godotenv" ) func main() { // Nạp file env nếu có if err := godotenv.Load(); err != nil { log.Println("Note: .env file not found or couldn't be loaded, using system environments.") } // Đọc cấu hình database dbHost := getEnv("DB_HOST", "127.0.0.1") dbPort := getEnv("DB_PORT", "3306") dbUser := getEnv("DB_USER", "naruto") dbPass := getEnv("DB_PASSWORD", "29121999aA@") dbName := getEnv("DB_NAME", "simple_care") // Đọc token và link QLĐT qldtToken := getEnv("QLDT_TOKEN", "") qldtBaseURL := getEnv("QLDT_BASE_URL", "https://apiportal.rikkei.edu.vn") qldtOrigin := getEnv("QLDT_ORIGIN", "https://qldt.rikkei.edu.vn") if qldtToken == "" { log.Println("WARNING: QLDT_TOKEN is empty! Sync features will fail until QLDT_TOKEN is configured in environment.") } // 1. Kết nối DB & Chạy Migration gormDB, err := db.ConnectDB(dbHost, dbPort, dbUser, dbPass, dbName) if err != nil { log.Fatalf("Database connection failed: %v", err) } if err := db.AutoMigrate(gormDB); err != nil { log.Fatalf("Database migration failed: %v", err) } // 2. Tạo Client QLĐT & Sync Jobs qldtClient := qldt.NewClient(qldtBaseURL, qldtOrigin) classesJob := syncjobs.NewClassesSyncJob() studentsJob := syncjobs.NewStudentsSyncJob() // 3. Khởi tạo Fiber Web Server app := fiber.New(fiber.Config{ AppName: "Simple Care Sync Backend", }) // Bật CORS để Client có thể gọi API mà không bị chặn app.Use(cors.New(cors.Config{ AllowOrigins: "*", AllowHeaders: "Origin, Content-Type, Accept, Authorization", AllowMethods: "GET, POST, PATCH, PUT, DELETE, OPTIONS", })) // 4. Setup Routes api := app.Group("/api") // Dashboard Stats api.Get("/stats", handlers.GetStatsHandler(gormDB)) // Classes endpoints api.Get("/classes", handlers.ListClassesHandler(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)) // Chạy app ở port 8080 port := getEnv("PORT", "8080") log.Printf("Server starting on port %s...", port) if err := app.Listen(":" + port); err != nil { log.Fatalf("Failed to start web server: %v", err) } } func getEnv(key, defaultVal string) string { if val := os.Getenv(key); val != "" { return val } return defaultVal }