~xenrox/10man-api

35a47d888280cf8dba1cced13fbbf08d92e23f79 — Thorben Günther 8 months ago 8da2d42
Use "log/slog" for logging
5 files changed, 43 insertions(+), 22 deletions(-)

M go.mod
M go.sum
M graph/resolver.go
M graph/schema.resolvers.go
M server.go
M go.mod => go.mod +1 -1
@@ 4,7 4,7 @@ go 1.21.0

require (
	git.sr.ht/~emersion/go-scfg v0.0.0-20230601130942-e042ab15616e
	git.xenrox.net/~xenrox/go-log v0.0.0-20230813141354-3cf86abf0512
	git.xenrox.net/~xenrox/go-utils v0.0.0-20230813142628-a8bdc9211a98
	github.com/99designs/gqlgen v0.17.36
	github.com/lib/pq v1.10.9
	github.com/vektah/gqlparser/v2 v2.5.8

M go.sum => go.sum +2 -2
@@ 1,7 1,7 @@
git.sr.ht/~emersion/go-scfg v0.0.0-20230601130942-e042ab15616e h1:42zyo0ZFxHGkysM1B9EM7PnQNO0TEzPm+bw/2Zontyg=
git.sr.ht/~emersion/go-scfg v0.0.0-20230601130942-e042ab15616e/go.mod h1:ybgvEJTIx5XbaspSviB3KNa6OdPmAZqDoSud7z8fFlw=
git.xenrox.net/~xenrox/go-log v0.0.0-20230813141354-3cf86abf0512 h1:v0gWNdBBvmPICyx29lm6zosPQzLyAZLxSn8hjaaWV2E=
git.xenrox.net/~xenrox/go-log v0.0.0-20230813141354-3cf86abf0512/go.mod h1:d98WFDHGpxaEThKue5CfGtr9OrWgbaApprt3GH+OM4s=
git.xenrox.net/~xenrox/go-utils v0.0.0-20230813142628-a8bdc9211a98 h1:c6B8yMLiPWj8Fqp3AeLBB86gKhdz2hfgAupaNpmMRMo=
git.xenrox.net/~xenrox/go-utils v0.0.0-20230813142628-a8bdc9211a98/go.mod h1:BM4sMPD0fqFB6eG1T/7rGgEUiqZsMpHvq4PGE861Sfk=
github.com/99designs/gqlgen v0.17.36 h1:u/o/rv2SZ9s5280dyUOOrkpIIkr/7kITMXYD3rkJ9go=
github.com/99designs/gqlgen v0.17.36/go.mod h1:6RdyY8puhCoWAQVr2qzF2OMVfudQzc8ACxzpzluoQm4=
github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8=

M graph/resolver.go => graph/resolver.go +3 -2
@@ 3,9 3,10 @@ package graph
//go:generate go run github.com/99designs/gqlgen generate

import (
	"log/slog"

	"git.xenrox.net/~xenrox/10man-api/config"
	"git.xenrox.net/~xenrox/10man-api/database"
	"git.xenrox.net/~xenrox/go-log"
)

// This file will not be regenerated automatically.


@@ 15,7 16,7 @@ import (
type Resolver struct {
	DB     *database.DB
	Config *config.Config
	Logger *log.Logger
	Logger *slog.Logger
}

func (r *Resolver) playersInQueue() (int, error) {

M graph/schema.resolvers.go => graph/schema.resolvers.go +12 -5
@@ 11,6 11,7 @@ import (
	"errors"
	"fmt"
	"io"
	"log/slog"
	"math/rand"
	"net/http"
	"time"


@@ 74,7 75,9 @@ func (r *mutationResolver) CreateUser(ctx context.Context, input model.NewUser) 
		return "", database.CheckErrorCode(err)
	}

	r.Logger.Infof("Created user %q (SteamID %s, Elo %d).", name, input.SteamID, elo.Elo)
	r.Logger.Info("Created user",
		slog.String("ID", input.SteamID),
		slog.Int("elo", elo.Elo))
	return "Created", nil
}



@@ 90,7 93,9 @@ func (r *mutationResolver) DeleteUser(ctx context.Context, id int) (string, erro
		return "", err
	}

	r.Logger.Infof("Deleted user %q (SteamID %s)", name, steamID)
	r.Logger.Info("Deleted user",
		slog.String("name", name),
		slog.String("ID", steamID))
	return "Deleted", nil
}



@@ 163,7 168,9 @@ func (r *mutationResolver) UpdateUser(ctx context.Context, id int, input model.U
		return nil, err
	}

	r.Logger.Infof("Updated user with ID %d: %v", id, input)
	r.Logger.Info("Updated user",
		slog.Int("ID", id),
		slog.Any("input", input))
	return &user, nil
}



@@ 424,8 431,8 @@ func (r *mutationResolver) FinishMatch(ctx context.Context, winner string) (stri
	if err != nil {
		return "FinishFail", err
	}
	r.Logger.Infof("%s won the match.", winner)
	r.Logger.Debugf("Team 1 got %d Elo, Team 2 got %d Elo.", delta1, delta2)
	r.Logger.Info(fmt.Sprintf("%s won the match.", winner))
	r.Logger.Debug(fmt.Sprintf("Team 1 got %d Elo, Team 2 got %d Elo.", delta1, delta2))

	return "FinishSuccess", nil
}

M server.go => server.go +25 -12
@@ 2,6 2,8 @@ package main

import (
	"flag"
	"fmt"
	"log/slog"
	"net/http"
	"os"
	"os/signal"


@@ 11,7 13,7 @@ import (
	"git.xenrox.net/~xenrox/10man-api/database"
	"git.xenrox.net/~xenrox/10man-api/graph"
	"git.xenrox.net/~xenrox/10man-api/graph/generated"
	"git.xenrox.net/~xenrox/go-log"
	"git.xenrox.net/~xenrox/go-utils/logging"
	"github.com/99designs/gqlgen/graphql/handler"
	"github.com/99designs/gqlgen/graphql/playground"
)


@@ 24,20 26,25 @@ func main() {
	sigs := make(chan os.Signal, 1)
	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

	logger := log.NewDefaultLogger()

	cfg, err := config.ReadConfig(configPath)
	if err != nil {
		logger.Fatalf("config: %v", err)
		slog.Error("Failed to read config",
			slog.String("error", err.Error()))
		os.Exit(1)
	}

	if err := logger.SetLevelFromString(cfg.LogLevel); err != nil {
		logger.Errorf("config: %v", err)
	logger, err := logging.New(cfg.LogLevel, "text", os.Stderr)
	if err != nil {
		slog.Error("Failed to create logger",
			slog.String("error", err.Error()))
		os.Exit(1)
	}

	db, err := database.Open(cfg.DBConnectionString)
	if err != nil {
		logger.Fatal(err)
		logger.Error("Failed to open database connection",
			slog.String("error", err.Error()))
		os.Exit(1)
	}

	srv := handler.NewDefaultServer(generated.NewExecutableSchema(generated.Config{


@@ 50,20 57,26 @@ func main() {

	if cfg.EnablePlayground {
		http.Handle("/", playground.Handler("GraphQL playground", "/query"))
		logger.Infof("connect to http://%s/ for GraphQL playground", cfg.HTTPAddress)
		logger.Info(fmt.Sprintf("connect to http://%s/ for GraphQL playground", cfg.HTTPAddress))
	}
	http.Handle("/query", srv)

	go func() {
		logger.Fatal(http.ListenAndServe(cfg.HTTPAddress, nil))
		err = http.ListenAndServe(cfg.HTTPAddress, nil)
		if err != nil {
			logger.Error("Failed to start HTTP server",
				slog.String("error", err.Error()))
			os.Exit(1)
		}
	}()

	shutdown(<-sigs, db, logger)
}

func shutdown(sig os.Signal, db *database.DB, logger *log.Logger) {
func shutdown(sig os.Signal, db *database.DB, logger *slog.Logger) {
	logger.Info("Shutting down")
	if err := db.DB.Close(); err != nil {
		logger.Fatalf("shutdown: %v", err)
		logger.Error("Failed to close database connection",
			slog.String("error", err.Error()))
	}
	logger.Info("API was shut down")
}