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 ListUsers(w http.ResponseWriter, r *http.Request) { dbUsers, err := dbGetAllUsers() if err != nil { render.Render(w, r, ErrRender(err)) return } if err := render.RenderList(w, r, NewUserListResponse(dbUsers)); 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"` } type UserPayload struct { *User }