package main import ( "log" "a301_server/internal/announcement" "a301_server/internal/auth" "a301_server/internal/download" "a301_server/pkg/config" "a301_server/pkg/database" "a301_server/routes" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" "github.com/gofiber/fiber/v2/middleware/logger" ) func main() { config.Load() if err := database.ConnectMySQL(); err != nil { log.Fatalf("MySQL 연결 실패: %v", err) } log.Println("MySQL 연결 성공") // AutoMigrate database.DB.AutoMigrate(&auth.User{}, &announcement.Announcement{}, &download.Info{}) if err := database.ConnectRedis(); err != nil { log.Fatalf("Redis 연결 실패: %v", err) } log.Println("Redis 연결 성공") // 의존성 주입 authRepo := auth.NewRepository(database.DB) authSvc := auth.NewService(authRepo, database.RDB) authHandler := auth.NewHandler(authSvc) // 초기 admin 계정 생성 if err := authSvc.EnsureAdmin(config.C.AdminUsername, config.C.AdminPassword); err != nil { log.Printf("admin 계정 생성 실패: %v", err) } else { log.Printf("admin 계정 확인 완료: %s", config.C.AdminUsername) } annRepo := announcement.NewRepository(database.DB) annSvc := announcement.NewService(annRepo) annHandler := announcement.NewHandler(annSvc) dlRepo := download.NewRepository(database.DB) dlSvc := download.NewService(dlRepo, config.C.GameDir) dlHandler := download.NewHandler(dlSvc, config.C.BaseURL) app := fiber.New(fiber.Config{ StreamRequestBody: true, }) app.Use(logger.New()) app.Use(cors.New(cors.Config{ AllowOrigins: "https://a301.tolelom.xyz", AllowHeaders: "Origin, Content-Type, Authorization", AllowMethods: "GET, POST, PUT, DELETE", })) routes.Register(app, authHandler, annHandler, dlHandler) log.Fatal(app.Listen(":" + config.C.AppPort)) }