From 728c8fa59ed130a0badae47608161f1672d0580b Mon Sep 17 00:00:00 2001 From: Aleksandr Trushkin Date: Tue, 9 Jan 2024 15:19:53 +0300 Subject: [PATCH] embed assets and minor fixes --- assets/kurious/embed.go | 13 ++++++ assets/kurious/robots.txt | 2 + cmd/kuriweb/http.go | 77 +++++++++++++++++++++++++++++++++ cmd/kuriweb/main.go | 60 ------------------------- internal/common/xcontext/log.go | 8 ++-- 5 files changed, 96 insertions(+), 64 deletions(-) create mode 100644 assets/kurious/embed.go create mode 100644 assets/kurious/robots.txt create mode 100644 cmd/kuriweb/http.go diff --git a/assets/kurious/embed.go b/assets/kurious/embed.go new file mode 100644 index 0000000..9f79499 --- /dev/null +++ b/assets/kurious/embed.go @@ -0,0 +1,13 @@ +package kurious + +import ( + "embed" + "net/http" +) + +//go:embed robots.txt static/* +var root embed.FS + +func AsHTTPFileHandler() http.Handler { + return http.FileServer(http.FS(root)) +} diff --git a/assets/kurious/robots.txt b/assets/kurious/robots.txt new file mode 100644 index 0000000..bdd47f6 --- /dev/null +++ b/assets/kurious/robots.txt @@ -0,0 +1,2 @@ +User-agent: +Disallow: / diff --git a/cmd/kuriweb/http.go b/cmd/kuriweb/http.go new file mode 100644 index 0000000..913cf7f --- /dev/null +++ b/cmd/kuriweb/http.go @@ -0,0 +1,77 @@ +package main + +import ( + "log/slog" + "net/http" + "time" + + "git.loyso.art/frx/kurious/assets/kurious" + "git.loyso.art/frx/kurious/internal/common/config" + "git.loyso.art/frx/kurious/internal/common/generator" + "git.loyso.art/frx/kurious/internal/common/xcontext" + xhttp "git.loyso.art/frx/kurious/internal/kurious/ports/http" + "github.com/gorilla/mux" +) + +func setupHTTP(cfg config.HTTP, srv xhttp.Server, log *slog.Logger) *http.Server { + router := mux.NewRouter() + + coursesAPI := srv.Courses() + + router.Use(mux.CORSMethodMiddleware(router)) + router.Use(middlewareLogger(log)) + router.HandleFunc("/updatedesc", coursesAPI.UdpateDescription).Methods(http.MethodPost) + coursesRouter := router.PathPrefix("/courses").Subrouter() + coursesRouter.HandleFunc("/", coursesAPI.List).Methods(http.MethodGet) + + courseRouter := coursesRouter.PathPrefix("/{course_id}").Subrouter() + courseRouter.HandleFunc("/", coursesAPI.Get).Methods(http.MethodGet) + courseRouter.HandleFunc("/short", coursesAPI.GetShort).Methods(http.MethodGet) + courseRouter.HandleFunc("/editdesc", coursesAPI.RenderEditDescription).Methods(http.MethodGet) + courseRouter.HandleFunc("/description", coursesAPI.UpdateCourseDescription).Methods(http.MethodPut) + + if cfg.MountLive { + fs := http.FileServer(http.Dir("./assets/kurious/static/")) + router.PathPrefix("/static/").Handler(http.StripPrefix("/static/", fs)).Methods(http.MethodGet) + + router.HandleFunc("/robots.txt", func(w http.ResponseWriter, r *http.Request) { + http.ServeFile(w, r, "./assets/kurious/robots.txt") + }).Methods(http.MethodGet) + } else { + fs := kurious.AsHTTPFileHandler() + router.PathPrefix("/").Handler(fs).Methods(http.MethodGet) + } + + return &http.Server{ + Addr: cfg.ListenAddr, + Handler: router, + } +} + +func middlewareLogger(log *slog.Logger) mux.MiddlewareFunc { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + requestID := r.Header.Get("x-request-id") + if requestID == "" { + requestID = generator.RandomInt64ID() + } + ctx = xcontext.WithLogFields(ctx, slog.String("request_id", requestID)) + + xcontext.LogInfo( + ctx, log, "incoming request", + slog.String("method", r.Method), + slog.String("path", r.URL.Path), + ) + + start := time.Now() + next.ServeHTTP(w, r.WithContext(ctx)) + elapsed := time.Since(start).Truncate(time.Millisecond) + + xcontext.LogInfo( + ctx, log, "request processed", + slog.Duration("elapsed", elapsed), + ) + }) + } +} diff --git a/cmd/kuriweb/main.go b/cmd/kuriweb/main.go index 2a1ee51..9491caf 100644 --- a/cmd/kuriweb/main.go +++ b/cmd/kuriweb/main.go @@ -12,14 +12,11 @@ import ( "git.loyso.art/frx/kurious/internal/common/client/sravni" "git.loyso.art/frx/kurious/internal/common/config" - "git.loyso.art/frx/kurious/internal/common/generator" "git.loyso.art/frx/kurious/internal/common/xcontext" "git.loyso.art/frx/kurious/internal/kurious/adapters" xhttp "git.loyso.art/frx/kurious/internal/kurious/ports/http" "git.loyso.art/frx/kurious/internal/kurious/service" "golang.org/x/sync/errgroup" - - "github.com/gorilla/mux" ) func main() { @@ -116,60 +113,3 @@ func app(ctx context.Context) error { return eg.Wait() } - -func setupHTTP(cfg config.HTTP, srv xhttp.Server, log *slog.Logger) *http.Server { - router := mux.NewRouter() - - coursesAPI := srv.Courses() - - router.Use(mux.CORSMethodMiddleware(router)) - router.Use(middlewareLogger(log)) - router.HandleFunc("/updatedesc", coursesAPI.UdpateDescription).Methods(http.MethodPost) - coursesRouter := router.PathPrefix("/courses").Subrouter() - coursesRouter.HandleFunc("/", coursesAPI.List).Methods(http.MethodGet) - - courseRouter := coursesRouter.PathPrefix("/{course_id}").Subrouter() - courseRouter.HandleFunc("/", coursesAPI.Get).Methods(http.MethodGet) - courseRouter.HandleFunc("/short", coursesAPI.GetShort).Methods(http.MethodGet) - courseRouter.HandleFunc("/editdesc", coursesAPI.RenderEditDescription).Methods(http.MethodGet) - - courseRouter.HandleFunc("/description", coursesAPI.UpdateCourseDescription).Methods(http.MethodPut) - - if cfg.MountLive { - fs := http.FileServer(http.Dir("./assets/kurious/static/")) - router.PathPrefix("/static/").Handler(http.StripPrefix("/static/", fs)) - } - - return &http.Server{ - Addr: cfg.ListenAddr, - Handler: router, - } -} - -func middlewareLogger(log *slog.Logger) mux.MiddlewareFunc { - return func(next http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - requestID := r.Header.Get("x-request-id") - if requestID == "" { - requestID = generator.RandomInt64ID() - } - ctx = xcontext.WithLogFields(ctx, slog.String("request_id", requestID)) - - xcontext.LogInfo( - ctx, log, "incoming request", - slog.String("method", r.Method), - slog.String("path", r.URL.Path), - ) - - start := time.Now() - next.ServeHTTP(w, r.WithContext(ctx)) - elapsed := time.Since(start) - - xcontext.LogInfo( - ctx, log, "request processed", - slog.Duration("elapsed", elapsed), - ) - }) - } -} diff --git a/internal/common/xcontext/log.go b/internal/common/xcontext/log.go index 5bb4e9e..35dd992 100644 --- a/internal/common/xcontext/log.go +++ b/internal/common/xcontext/log.go @@ -19,19 +19,19 @@ func WithLogFields(ctx context.Context, fields ...slog.Attr) context.Context { } func LogDebug(ctx context.Context, log *slog.Logger, msg string, attrs ...slog.Attr) { - log.LogAttrs(ctx, slog.LevelDebug, msg, append(attrs, getLogFields(ctx)...)...) + log.LogAttrs(ctx, slog.LevelDebug, msg, append(getLogFields(ctx), attrs...)...) } func LogInfo(ctx context.Context, log *slog.Logger, msg string, attrs ...slog.Attr) { - log.LogAttrs(ctx, slog.LevelInfo, msg, append(attrs, getLogFields(ctx)...)...) + log.LogAttrs(ctx, slog.LevelInfo, msg, append(getLogFields(ctx), attrs...)...) } func LogWarn(ctx context.Context, log *slog.Logger, msg string, attrs ...slog.Attr) { - log.LogAttrs(ctx, slog.LevelWarn, msg, append(attrs, getLogFields(ctx)...)...) + log.LogAttrs(ctx, slog.LevelWarn, msg, append(getLogFields(ctx), attrs...)...) } func LogError(ctx context.Context, log *slog.Logger, msg string, attrs ...slog.Attr) { - log.LogAttrs(ctx, slog.LevelError, msg, append(attrs, getLogFields(ctx)...)...) + log.LogAttrs(ctx, slog.LevelError, msg, append(getLogFields(ctx), attrs...)...) } func LogWithWarnError(ctx context.Context, log *slog.Logger, err error, msg string, attrs ...slog.Attr) {