Files
qv/cmd/web/main.go

86 lines
1.7 KiB
Go
Raw Normal View History

2024-12-31 15:29:19 +01:00
//go:build !integration
//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
)
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},
2025-01-08 13:57:49 +01:00
votes: &models.VoteModel{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),
2025-01-13 19:58:42 +01:00
IdleTimeout: 6 * time.Minute,
2024-12-27 18:03:46 +01:00
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) {
2024-12-31 00:06:19 +01:00
db, err := sql.Open("sqlite3", "./qv.sqlite?_foreign_keys=on")
if err == nil {
err = db.Ping()
2024-12-27 14:38:30 +01:00
}
2024-12-30 23:47:40 +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)
}