Files
qv/cmd/web/main.go
2025-01-13 20:06:55 +01:00

86 lines
1.7 KiB
Go

//go:build !integration
//go:generate oapi-codegen --config=oapi-codegen.yml openapi.yml
package main
import (
"code.dlmw.ch/dlmw/qv/internal/migrations"
"code.dlmw.ch/dlmw/qv/internal/models"
"context"
"database/sql"
_ "github.com/mattn/go-sqlite3"
"log/slog"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
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 = migrations.Run(db)
if err != nil {
logger.Error(err.Error())
os.Exit(1)
}
app := &application{
logger: logger,
elections: &models.ElectionModel{DB: db},
voters: &models.VoterModel{DB: db},
votes: &models.VoteModel{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?_foreign_keys=on")
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)
}