From a92db047138a5a0f9c235713e5cf66b681674787 Mon Sep 17 00:00:00 2001 From: axolotlmaid Date: Wed, 25 Sep 2024 18:22:51 +0100 Subject: [PATCH] feat: add incrementing visitor counter --- internal/handler/visitor.go | 5 ++++- internal/model/model.go | 5 +++++ internal/service/visitor.go | 36 ++++++++++++++++++++++++++++++++---- 3 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 internal/model/model.go diff --git a/internal/handler/visitor.go b/internal/handler/visitor.go index c9d77b6..998fdb6 100644 --- a/internal/handler/visitor.go +++ b/internal/handler/visitor.go @@ -14,5 +14,8 @@ func HandleGetVisitorCounter(w http.ResponseWriter, r *http.Request) { } func HandlePatchVisitorCounter(w http.ResponseWriter, r *http.Request) { - w.Write([]byte("hello world")) + data := service.IncrementVisitorCounter() + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(data) } diff --git a/internal/model/model.go b/internal/model/model.go new file mode 100644 index 0000000..8dd5297 --- /dev/null +++ b/internal/model/model.go @@ -0,0 +1,5 @@ +package model + +type Success struct { + Success bool `json:"success"` +} diff --git a/internal/service/visitor.go b/internal/service/visitor.go index 757ace4..7403f51 100644 --- a/internal/service/visitor.go +++ b/internal/service/visitor.go @@ -10,28 +10,56 @@ import ( "backend/internal/model" ) +const path = "./data/visitor.json" + func GetVisitorCounter() model.VisitorCounter { var data model.VisitorCounter - path := filepath.Join(".", "data", "visitor.json") jsonFile, err := os.Open(path) if err != nil { - slog.Warn("File not found or unable to open", slog.Any("error", err), slog.Any("file", path)) + slog.Warn("File not found or unable to open", slog.Any("error", err), slog.Any("path", path)) return data } defer jsonFile.Close() bytes, err := io.ReadAll(jsonFile) if err != nil { - slog.Error("Error reading file", slog.Any("error", err), slog.Any("file", path)) + slog.Error("Error reading file", slog.Any("error", err), slog.Any("path", path)) return data } err = json.Unmarshal(bytes, &data) if err != nil { - slog.Error("Error unmarshalling JSON", slog.Any("error", err), slog.Any("file", path)) + slog.Error("Error unmarshalling JSON", slog.Any("error", err), slog.Any("path", path)) return data } return data } + +func IncrementVisitorCounter() model.Success { + data := GetVisitorCounter() + data.Counter++ + + err := os.MkdirAll(filepath.Dir(path), 0755) + if err != nil { + slog.Error("Unable to create directory", slog.Any("error", err), slog.Any("path", filepath.Dir(path))) + return model.Success{} + } + + jsonString, err := json.Marshal(data) + if err != nil { + slog.Error("Error marshalling JSON", slog.Any("error", err), slog.Any("path", path)) + return model.Success{} + } + + err = os.WriteFile(path, jsonString, 0644) + if err != nil { + slog.Error("Error writing to file", slog.Any("error", err), slog.Any("path", path)) + return model.Success{} + } + + return model.Success{ + Success: true, + } +}