diff --git a/internal/handler/visitor.go b/internal/handler/visitor.go new file mode 100644 index 0000000..c9d77b6 --- /dev/null +++ b/internal/handler/visitor.go @@ -0,0 +1,18 @@ +package handler + +import ( + "backend/internal/service" + "encoding/json" + "net/http" +) + +func HandleGetVisitorCounter(w http.ResponseWriter, r *http.Request) { + data := service.GetVisitorCounter() + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(data) +} + +func HandlePatchVisitorCounter(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("hello world")) +} diff --git a/internal/model/visitor.go b/internal/model/visitor.go new file mode 100644 index 0000000..e8d5393 --- /dev/null +++ b/internal/model/visitor.go @@ -0,0 +1,5 @@ +package model + +type VisitorCounter struct { + Counter uint32 `json:"counter"` +} diff --git a/internal/server/router.go b/internal/server/router.go index 01f4c78..cde73e8 100644 --- a/internal/server/router.go +++ b/internal/server/router.go @@ -8,6 +8,8 @@ import ( "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" + + "backend/internal/handler" ) func NewRouter() { @@ -24,6 +26,9 @@ func NewRouter() { http.Redirect(w, r, "https://axolotlmaid.com", http.StatusPermanentRedirect) }) + r.Get("/visitor-counter", handler.HandleGetVisitorCounter) + r.Patch("/visitor-counter", handler.HandlePatchVisitorCounter) + slog.Info("Starting server", slog.Any("port", os.Getenv("PORT"))) http.ListenAndServe(":"+os.Getenv("PORT"), r) } diff --git a/internal/service/visitor.go b/internal/service/visitor.go new file mode 100644 index 0000000..99c014a --- /dev/null +++ b/internal/service/visitor.go @@ -0,0 +1,30 @@ +package service + +import ( + "encoding/json" + "io" + "log/slog" + "os" + "path/filepath" + + "backend/internal/model" +) + +func GetVisitorCounter() model.VisitorCounter { + path := filepath.Join(".", "data", "visitor.json") + jsonFile, err := os.Open(path) + if err != nil { + slog.Warn("File not found!", slog.Any("file", path)) + return model.VisitorCounter{} + } + + bytes, _ := io.ReadAll(jsonFile) + + var data model.VisitorCounter + err = json.Unmarshal(bytes, &data) + if err != nil { + slog.Error("Error unmarshalling JSON", slog.Any("error", err), slog.Any("file", path)) + } + + return data +}