package router import ( "database/sql" "net/http" "git.godopu.com/lab/landing_page/backend/internal/handlers" "git.godopu.com/lab/landing_page/backend/internal/httpx" "git.godopu.com/lab/landing_page/backend/internal/repository" "github.com/gin-gonic/gin" ) func SetupRouter(db *sql.DB, corsOrigins ...string) *gin.Engine { r := gin.Default() allowOrigin := "*" if len(corsOrigins) > 0 && corsOrigins[0] != "" { allowOrigin = corsOrigins[0] } // CORS Middleware r.Use(func(c *gin.Context) { c.Writer.Header().Set("Access-Control-Allow-Origin", allowOrigin) c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") c.Writer.Header().Set("Access-Control-Allow-Headers", "Origin, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization") if c.Request.Method == "OPTIONS" { c.AbortWithStatus(http.StatusNoContent) return } c.Next() }) // Repositories homeRepo := repository.NewHomeRepository(db) membersRepo := repository.NewMembersRepository(db) pubsRepo := repository.NewPublicationsRepository(db) lecturesRepo := repository.NewLecturesRepository(db) standardsRepo := repository.NewStandardizationRepository(db) // Handlers homeHandler := handlers.NewHomeHandler(homeRepo) membersHandler := handlers.NewMembersHandler(membersRepo) pubsHandler := handlers.NewPublicationsHandler(pubsRepo) lecturesHandler := handlers.NewLecturesHandler(lecturesRepo) standardsHandler := handlers.NewStandardizationHandler(standardsRepo) // API v1 Group v1 := r.Group("/api/v1") { v1.GET("/health", func(c *gin.Context) { httpx.OK(c, gin.H{"status": "ok", "service": "anl-backend-api"}) }) // Home v1.GET("/research-projects", homeHandler.GetResearchProjects) v1.GET("/research-areas", homeHandler.GetResearchAreas) v1.GET("/stats/summary", homeHandler.GetStatsSummary) // Members & Alumni v1.GET("/members", membersHandler.GetMembers) v1.GET("/alumni", membersHandler.GetAlumni) // Publications & Patents v1.GET("/publications", pubsHandler.GetPublications) v1.GET("/publications/highlights", pubsHandler.GetHighlights) v1.GET("/patents", pubsHandler.GetPatents) // Lectures v1.GET("/semesters", lecturesHandler.GetSemesters) // Standardization v1.GET("/standards-bodies", standardsHandler.GetStandardsBodies) } return r }