Files
qv/cmd/web/main.go

88 lines
1.7 KiB
Go
Raw Normal View History

//go:generate oapi-codegen --config=oapi-codegen.yml openapi.yml
2024-12-27 14:38:30 +01:00
package main
2024-12-27 14:38:30 +01:00
import (
2024-12-30 23:40:52 +01:00
"code.dlmw.ch/dlmw/qv/internal/migrations"
2024-12-27 14:38:30 +01:00
"code.dlmw.ch/dlmw/qv/internal/models"
2024-12-30 22:02:15 +01:00
"context"
2024-12-27 14:38:30 +01:00
"database/sql"
_ "github.com/mattn/go-sqlite3"
"log/slog"
2024-12-27 18:03:46 +01:00
"net/http"
2024-12-27 14:38:30 +01:00
"os"
2024-12-30 22:02:15 +01:00
"os/signal"
"syscall"
2024-12-27 18:03:46 +01:00
"time"
2024-12-27 14:38:30 +01:00
)
type application struct {
2024-12-30 20:53:53 +01:00
logger *slog.Logger
elections models.ElectionModelInterface
voters models.VoterModelInterface
2024-12-27 14:38:30 +01:00
}
2024-12-27 18:03:46 +01:00
var addr = ":8080"
func main() {
2024-12-27 18:03:46 +01:00
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
2024-12-27 14:38:30 +01:00
db, err := openDb()
if err != nil {
logger.Error(err.Error())
os.Exit(1)
}
defer db.Close()
2024-12-30 23:40:52 +01:00
err = migrations.Run(db)
if err != nil {
logger.Error(err.Error())
os.Exit(1)
}
2024-12-27 14:38:30 +01:00
2024-12-27 18:03:46 +01:00
app := &application{
2024-12-30 20:53:53 +01:00
logger: logger,
elections: &models.ElectionModel{DB: db},
voters: &models.VoterModel{DB: db},
2024-12-27 14:38:30 +01:00
}
2024-12-27 18:03:46 +01:00
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,
}
2024-12-30 22:02:15 +01:00
go watchForQuitSignals(srv, logger)
if err = srv.ListenAndServe(); err != nil {
logger.Error(err.Error())
os.Exit(1)
}
}
2024-12-27 14:38:30 +01:00
func openDb() (*sql.DB, error) {
db, err := sql.Open("sqlite3", "./qv.sqlite")
if err == nil {
err = db.Ping()
2024-12-27 14:38:30 +01:00
}
return db, err
2024-12-27 14:38:30 +01:00
}
2024-12-30 22:02:15 +01:00
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)
}