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/
+29 -4
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")
if err := http.ListenAndServe(addr, router); err != nil {
logger.Fatal().Err(err).Msg("Server failed")
server := &http.Server{
Addr: addr,
Handler: router,
}
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) {
@@ -13,9 +13,9 @@ import (
)
type mockHabitRepoForBatch struct {
habits map[string]*entities.Habit
createFunc func(ctx context.Context, habit *entities.Habit) error
updateFunc func(ctx context.Context, habit *entities.Habit) error
habits map[string]*entities.Habit
createFunc func(ctx context.Context, habit *entities.Habit) error
updateFunc func(ctx context.Context, habit *entities.Habit) error
softDeleteFunc func(ctx context.Context, id string) error
}
+6 -6
View File
@@ -124,12 +124,12 @@ type SyncHabitDTO struct {
}
type SyncHabitEntryDTO struct {
ID string `json:"id"`
HabitID string `json:"habit_id"`
ScheduledDate time.Time `json:"scheduled_date"`
CompletedAt time.Time `json:"completed_at"`
Value *float64 `json:"value,omitempty"`
UpdatedAt time.Time `json:"updated_at"`
ID string `json:"id"`
HabitID string `json:"habit_id"`
ScheduledDate time.Time `json:"scheduled_date"`
CompletedAt time.Time `json:"completed_at"`
Value *float64 `json:"value,omitempty"`
UpdatedAt time.Time `json:"updated_at"`
}
type HabitChangesDTO struct {
@@ -13,9 +13,9 @@ import (
)
type SyncHandlers struct {
getSyncChangesHandler *queries.GetSyncChangesHandler
applySyncBatchHandler *commands.ApplySyncBatchHandler
translator *i18n.Translator
getSyncChangesHandler *queries.GetSyncChangesHandler
applySyncBatchHandler *commands.ApplySyncBatchHandler
translator *i18n.Translator
}
func NewSyncHandlers(