- Implement standalone Go backend API server using Gin and pure-Go SQLite (modernc.org/sqlite) - Add 11-table schema DDL migrations (000001_init.up.sql) based on DATA_TABLE.md - Add seed data ingestion tool (cmd/seed) and static TypeScript content exporter (cmd/export-content) - Add configuration loader (internal/config) supporting environment variables and .env files (HOST, PORT, DB_PATH, GIN_MODE, CORS_ALLOW_ORIGINS, AUTO_MIGRATE) - Add lightweight multi-stage Dockerfile and docker-compose.yml with persistent SQLite volume - Add comprehensive architecture specification (ARCHITECTURE.md) and REST API interface specification (API_INTERFACE.md) - Harmonize frontend publications page to consume isHighlight flag from database-synced content
77 lines
2.3 KiB
Go
77 lines
2.3 KiB
Go
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
|
|
}
|