100 lines
3.0 KiB
Go
100 lines
3.0 KiB
Go
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
|
|
}
|