diff --git a/app.go b/app.go index 76e48a9224144b03c4a70d631bda3fdf1364bd6b..403e270422f26d61dcd91fe0d8cdc393d2728ddd 100644 --- a/app.go +++ b/app.go @@ -1,7 +1,9 @@ package main import ( + "fmt" "log" + "os" "time" "github.com/gofiber/fiber/v2" @@ -9,7 +11,7 @@ import ( "github.com/gofiber/fiber/v2/middleware/limiter" ) -func serve() error { +func serve(sig chan os.Signal) error { app := fiber.New() // cors @@ -38,5 +40,14 @@ func serve() error { return c.Next() }) + // graceful shutdown + go func() { + <-sig + log.Println("shutting down") + if err := app.Shutdown(); err != nil { + fmt.Printf("cannot shutdown: %v", err) + } + }() + return app.Listen(conf[listenAddr]) } diff --git a/main.go b/main.go index 64f6fd7857849f80d7031dd0c06b3e7e35c30011..71568b38cac62ffa41087ed52a9fdbdd7593bb51 100644 --- a/main.go +++ b/main.go @@ -2,11 +2,11 @@ package main import ( "log" - "regexp" + "os" + "os/signal" + "syscall" ) -var emailRegex = regexp.MustCompile(`^[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,4}$`) - func main() { if err := InitDB(conf[dbPath]); err != nil { @@ -15,8 +15,11 @@ func main() { defer CloseDB() - if err := serve(); err != nil { - log.Printf("cannot serve: %s", err) + sig := make(chan os.Signal, 1) + signal.Notify(sig, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP) + + if err := serve(sig); err != nil { + log.Printf("cannot serve: %v", err) } log.Println("application exit") diff --git a/register.go b/register.go index de99ce9b9d86d2729a07acbd249743e7c8e62ff3..afe37f52222b2282ae1662cd4c9173f128ef8104 100644 --- a/register.go +++ b/register.go @@ -2,17 +2,21 @@ package main import ( "log" + "regexp" "github.com/gofiber/fiber/v2" ) +var emailRegexp = regexp.MustCompile(`^[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,4}$`) + +type registration struct { + Email string `json:"email"` +} + // Waitlist registration route func routeRegister(app *fiber.App) { app.Post("/register", func(c *fiber.Ctx) error { - type Request struct { - Email string `json:"email"` - } - req := new(Request) + req := new(registration) if err := c.BodyParser(req); err != nil { log.Printf("Invalid request body: %v", err) @@ -22,7 +26,7 @@ func routeRegister(app *fiber.App) { } // Validate email format - if !emailRegex.MatchString(req.Email) { + if !emailRegexp.MatchString(req.Email) { log.Printf("Invalid email format: %s", req.Email) return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "message": "Invalid email format",