3 Commits

Author SHA1 Message Date
david 77cfb709d8 feat: add graceful shutdown on SIGINT/SIGTERM 2026-03-07 14:33:30 +01:00
david aae68ba20e fix: format code with gofmt 2026-03-07 04:36:52 +01:00
david 8883cdcb86 chore: add /api to gitignore 2026-03-07 03:50:47 +01:00
5 changed files with 42 additions and 16 deletions
+1
View File
@@ -4,6 +4,7 @@ data/
*.db-shm
*.db-wal
apocapoc-api
/api
dist/
bin/
.internal-notes/
+27 -2
View File
@@ -1,11 +1,15 @@
package main
import (
"context"
"fmt"
"log"
"net/http"
"os"
"os/signal"
"strconv"
"strings"
"syscall"
"time"
"apocapoc-api/internal/application/commands"
@@ -155,11 +159,32 @@ func main() {
router := httpInfra.NewRouter(cfg.AppURL, habitHandlers, authHandlers, statsHandlers, healthHandlers, userHandlers, exportHandlers, syncHandlers, jwtService, translator)
addr := fmt.Sprintf("0.0.0.0:%s", cfg.Port)
logger.Info().Str("address", addr).Msg("Server starting")
server := &http.Server{
Addr: addr,
Handler: router,
}
if err := http.ListenAndServe(addr, router); err != nil {
shutdown := make(chan os.Signal, 1)
signal.Notify(shutdown, syscall.SIGINT, syscall.SIGTERM)
go func() {
logger.Info().Str("address", addr).Msg("Server starting")
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
logger.Fatal().Err(err).Msg("Server failed")
}
}()
<-shutdown
logger.Info().Msg("Shutting down gracefully...")
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
if err := server.Shutdown(ctx); err != nil {
logger.Fatal().Err(err).Msg("Server forced to shutdown")
}
logger.Info().Msg("Server stopped")
}
func parseJWTExpiry(expiry string) (int, error) {