package main import ( "context" "log" "net/http" "os" "os/signal" "personal-site/constants" "personal-site/handlers" "personal-site/pages" "syscall" "time" "github.com/gin-gonic/gin" "github.com/joho/godotenv" ) func setupRoutesAndMiddleware() *gin.Engine { r := gin.Default() r.Static("/static", "./static") r.GET("/", func(c *gin.Context) { page := pages.Index() page.Render(c.Request.Context(), c.Writer) }) var projects = []constants.Project{ { Url: "https://derrickgee.dev/projects/support-tickets", Name: "Project One", Description: "A simple Go Gin + Templ app demonstrating the project pattern.", TechTags: []string{"Typescript", "Javascript", "React", "Express"}, }, { Url: "https://derrickgee.dev/projects/support-tickets", Name: "Project Two", Description: "A simple Go Gin + Templ app demonstrating the project pattern.", TechTags: []string{"Go", "Bash"}, }, } r.GET("/projects", func(c *gin.Context) { page := pages.ProjectPage(projects) page.Render(c.Request.Context(), c.Writer) }) r.NoRoute(handlers.NotFoundHandler) return r } func init() { if err := godotenv.Load(); err != nil { log.Println("No .env file found") } else { log.Println(".env loaded successfully") } } func main() { router := setupRoutesAndMiddleware() // dev env router.SetTrustedProxies(nil) // prod env // router.SetTrustedProxies([]string{"127.0.0.1"}) // router.TrustedPlatform = gin.PlatformCloudflare srv := &http.Server{ Addr: ":3500", Handler: router, } go func() { log.Println("Server starting on :3500") if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatal("Failed to start server:", err) } }() quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("Shutting down server...") ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := srv.Shutdown(ctx); err != nil { log.Fatal("Server forced to shutdown:", err) } log.Println("Server exited") }