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-ticket-demo", Name: "Support Ticket System", Description: "A sample of a robust support ticket system with the option to OAuth for database access. Authenticated users will be able to see other user created tickets. Guest mode will store tickets locally in your browser.", HostedOn: "Home Server", LinkGitea: "https://git.kokopi.dev/kokopi/personal-support-ticket-system", LinkGithub: "https://github.com/kokopi-dev/personal-support-ticket-system", TechTags: []string{"typescript", "react", "fastify", "tailwindcss", "sqlite", "vite", "bun"}, }, { Url: "/projects/dotfiles", Name: "Linux Dotfiles", Description: "Configurations for Linux", HostedOn: "", LinkGitea: "https://git.kokopi.dev/kokopi/dotfiles", LinkGithub: "https://github.com/kokopi-dev/dotfiles", TechTags: []string{"Linux", "Lua", "Bash", "Python"}, }, } r.GET("/projects", func(c *gin.Context) { page := pages.ProjectPage(projects) page.Render(c.Request.Context(), c.Writer) }) r.GET("/projects/dotfiles", func(c *gin.Context) { page := pages.Dotfiles() 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() ginEnv := os.Getenv("GIN_ENV") if ginEnv == "debug" { router.SetTrustedProxies(nil) } else { 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") }