From 25ee1d32997836f3407c1a737145ebde614d1f93 Mon Sep 17 00:00:00 2001 From: William P Date: Thu, 27 Mar 2025 21:07:33 -0400 Subject: [PATCH] methods for creating and getting users --- api/api.go | 8 +++++++ api/db.go | 10 ++++---- api/user.go | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 5 deletions(-) diff --git a/api/api.go b/api/api.go index 958fbf4..2114e1c 100644 --- a/api/api.go +++ b/api/api.go @@ -47,6 +47,14 @@ func Start() { r.Post("/new", NewMessage) }) + r.Route("/users", func(r chi.Router) { + r.Route("/{userID}", func(r chi.Router) { + r.Use(UserCtx) // Load user + r.Get("/", GetUser) + }) + r.Post("/new", NewUser) + }) + if *routes { fmt.Println(docgen.MarkdownRoutesDoc(r, docgen.MarkdownOpts{ ProjectPath: "git.dubyatp.xyz/chat-api-server", diff --git a/api/db.go b/api/db.go index 2d6cae3..06e3af5 100644 --- a/api/db.go +++ b/api/db.go @@ -100,7 +100,7 @@ func dbGetAllMessages() ([]*Message, error) { return result, nil } -func dbAddUser(id int64, name string) error { +func dbAddUser(user *User) error { currentData := db.ExecDB("users") if currentData == nil { return fmt.Errorf("error reading users database") @@ -111,12 +111,12 @@ func dbAddUser(id int64, name string) error { return fmt.Errorf("users data is in an unexpected format") } - user := map[string]interface{}{ - "ID": float64(id), // JSON numbers are float64 by default - "Name": name, + dbUser := map[string]interface{}{ + "ID": user.ID, + "Name": user.Name, } - users = append(users, user) + users = append(users, dbUser) return db.WriteDB("users", users) } diff --git a/api/user.go b/api/user.go index c75f3dd..3009a60 100644 --- a/api/user.go +++ b/api/user.go @@ -1,13 +1,81 @@ package api import ( + "context" + "net/http" + + "github.com/go-chi/chi/v5" + "github.com/go-chi/render" "github.com/google/uuid" ) +func UserCtx(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var user *User + var err error + + if userID := chi.URLParam(r, "userID"); userID != "" { + user, err = dbGetUser(userID) + } else { + render.Render(w, r, ErrNotFound) + return + } + if err != nil { + render.Render(w, r, ErrNotFound) + return + } + + ctx := context.WithValue(r.Context(), userKey{}, user) + next.ServeHTTP(w, r.WithContext(ctx)) + }) +} + +func GetUser(w http.ResponseWriter, r *http.Request) { + user, ok := r.Context().Value(userKey{}).(*User) + if !ok || user == nil { + render.Render(w, r, ErrNotFound) + return + } + + if err := render.Render(w, r, NewUserPayloadResponse(user)); err != nil { + render.Render(w, r, ErrRender(err)) + return + } +} + func newUserID() string { return "user_" + uuid.New().String() } +func NewUser(w http.ResponseWriter, r *http.Request) { + err := r.ParseMultipartForm(64 << 10) + if err != nil { + http.Error(w, "Unable to parse form", http.StatusBadRequest) + return + } + + newUserName := r.FormValue("name") + + newUser := User{ + ID: newUserID(), + Name: newUserName, + } + + err = dbAddUser(&newUser) + if err != nil { + render.Render(w, r, ErrRender(err)) + return + } + + render.Render(w, r, NewUserPayloadResponse(&newUser)) +} + +func (u *UserPayload) Render(w http.ResponseWriter, r *http.Request) error { + return nil +} + +type userKey struct{} + type User struct { ID string `json:"id"` Name string `json:"name"`