//go:generate oapi-codegen --config=oapi-codegen.yml openapi.yml package main import ( db2 "code.dlmw.ch/dlmw/qv/internal/db" "code.dlmw.ch/dlmw/qv/internal/models" "context" "database/sql" _ "github.com/mattn/go-sqlite3" "log/slog" "net/http" "os" "os/signal" "syscall" "time" ) type application struct { logger *slog.Logger elections models.ElectionModelInterface } var addr = ":8080" func main() { logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) db, err := openDb() if err != nil { logger.Error(err.Error()) os.Exit(1) } defer db.Close() err = db2.RunMigrations(db) if err != nil { logger.Error(err.Error()) os.Exit(1) } app := &application{ logger: logger, elections: &models.ElectionModel{DB: db}, } logger.Info("Starting server", "addr", addr) srv := &http.Server{ Addr: addr, Handler: app.routes(), ErrorLog: slog.NewLogLogger(logger.Handler(), slog.LevelError), IdleTimeout: time.Minute, ReadTimeout: 5 * time.Second, WriteTimeout: 10 * time.Second, } go watchForQuitSignals(srv, logger) if err = srv.ListenAndServe(); err != nil { logger.Error(err.Error()) os.Exit(1) } } func openDb() (*sql.DB, error) { db, err := sql.Open("sqlite3", "./qv.sqlite") if err == nil { err = db.Ping() } return db, err } func watchForQuitSignals(srv *http.Server, logger *slog.Logger) { quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() s := <-quit logger.Info("caught signal", "signal", s.String()) srv.Shutdown(ctx) os.Exit(0) }