diff --git a/.env b/.env index 710ffd7..be12782 100644 --- a/.env +++ b/.env @@ -1 +1,2 @@ -LISTEN_ADDR=":8080" \ No newline at end of file +LISTEN_ADDR=":8080" +DB_LOC="local.db" \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..bdd6034 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM golang:1.22 AS build-stage +WORKDIR /app +COPY go.mod go.sum ./ +RUN go mod download +COPY . /app +RUN CGO_ENABLED=0 GOOS=linux go build -o /entrypoint + +FROM gcr.io/distroless/static-debian11 AS release-stage +WORKDIR / +COPY --from=build-stage /entrypoint /entrypoint +COPY --from=build-stage /app/assets /assets +EXPOSE 8080 +ENTRYPOINT ["/entrypoint"] \ No newline at end of file diff --git a/main.go b/main.go index 8612543..012e80b 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "errors" "fmt" "log" "log/slog" @@ -17,12 +18,16 @@ import ( func main() { if err := godotenv.Load(); err != nil { - log.Fatal(err) + if errors.Is(err, os.ErrNotExist) { + slog.Info(".env not found using env") + } else { + log.Fatal(err) + } } router := chi.NewMux() - persistence, err := models.NewSQLitePersistence("local.db") + persistence, err := models.NewSQLitePersistence(os.Getenv("DB_LOC")) if err != nil { log.Fatal(err) } @@ -51,7 +56,7 @@ func main() { go scanner.Scan() - router.Use(routes.PathMiddleware, routes.AuthMiddleware) + router.Use(routes.LogMiddleware, routes.PathMiddleware, routes.AuthMiddleware) router.Handle("/*", public()) router.Get("/health", routes.Make(server.HandleHealth)) router.Get("/server/status", routes.Make(server.HandleServerStatus)) diff --git a/models/capture.go b/models/capture.go index ff0c47d..7c9bdb9 100644 --- a/models/capture.go +++ b/models/capture.go @@ -58,11 +58,15 @@ func (msl MapScoreList) BuildTable() *ResultTable { userMapRows := make(map[string]int) + rt.Header = append(rt.Header, make([]ResultTableHeader, len(msl))...) + for mapIndex, mapScore := range msl { - rt.Header = append(rt.Header, ResultTableHeader{ + reversedIndex := len(msl) - 1 - mapIndex + + rt.Header[reversedIndex+2] = ResultTableHeader{ Title: mapScore.Map, Subtitle: timediff.TimeDiff(mapScore.StartTime), - }) + } for _, score := range mapScore.ScoreList { if score.Ping > 0 { if _, ok := userMapRows[score.Name]; !ok { @@ -77,7 +81,7 @@ func (msl MapScoreList) BuildTable() *ResultTable { row := userMapRows[score.Name] rt.Rows[row].Total = rt.Rows[row].Total + score.Score - rt.Rows[row].Individual[mapIndex] = score.Score + rt.Rows[row].Individual[reversedIndex] = score.Score } } } diff --git a/routes/auth_middleware.go b/routes/auth_middleware.go index 3efa66f..379ee66 100644 --- a/routes/auth_middleware.go +++ b/routes/auth_middleware.go @@ -2,6 +2,7 @@ package routes import ( "context" + "errors" "log/slog" "net/http" @@ -27,10 +28,12 @@ func OnlyAuthenticatedMiddleware(next http.Handler) http.Handler { func AuthMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { session, err := getSession(r) - if err != nil { - slog.Error("error getting token", "err", err) - } username := "" + if err != nil { + if !errors.Is(err, http.ErrNoCookie) { + slog.Error("error getting token", "err", err) + } + } if session != nil { username = session.Username } diff --git a/routes/log_middleware.go b/routes/log_middleware.go new file mode 100644 index 0000000..20ba245 --- /dev/null +++ b/routes/log_middleware.go @@ -0,0 +1,15 @@ +package routes + +import ( + "log/slog" + "net/http" +) + +func LogMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + + slog.Info("request", "method", r.Method, "path", r.URL.Path, "origin", r.RemoteAddr) + + next.ServeHTTP(w, r) + }) +} diff --git a/script/index.ts b/script/index.ts index b019e8f..8503a52 100644 --- a/script/index.ts +++ b/script/index.ts @@ -1 +1,12 @@ import 'htmx.org' + +export function copyToClipboard(text: string): void { + navigator.clipboard.writeText(text).then( + () => { + + }, + (er) => { + console.log("failed to write to clipboard", er) + } + ) +} diff --git a/views/capture/capture.templ b/views/capture/capture.templ index b9a263d..d7163d4 100644 --- a/views/capture/capture.templ +++ b/views/capture/capture.templ @@ -25,7 +25,7 @@ templ Capture(capture *models.Capture, table models.ResultTable) {