diff --git a/src/cmd/server/handler/feeds.go b/src/cmd/server/handler/feeds.go index e214c4b..4424795 100644 --- a/src/cmd/server/handler/feeds.go +++ b/src/cmd/server/handler/feeds.go @@ -2,33 +2,38 @@ package handler import ( "context" - "encoding/json" - "io" + "fmt" "net/http" + "net/url" "show-rss/src/feeds" ) func (h Handler) feeds(w http.ResponseWriter, r *http.Request) error { switch r.Method { case http.MethodPost: - return h.feedsPost(r.Context(), r.Body) + if err := r.ParseForm(); err != nil { + return err + } + return h.feedsPost(r.Context(), r.Form) default: http.NotFound(w, r) } return nil } -func (h Handler) feedsPost(ctx context.Context, r io.Reader) error { - var req struct { - URL string - Cron string - Pattern string - WebhookMethod string - WebhookURL string - WebhookBody string - } - if err := json.NewDecoder(r).Decode(&req); err != nil { - return err +func (h Handler) feedsPost(ctx context.Context, form url.Values) error { + var req feeds.Version + for k, v := range map[string]*string{ + "url": &req.URL, + "cron": &req.Cron, + "pattern": &req.Pattern, + "webhookMethod": &req.WebhookMethod, + "webhookURL": &req.WebhookURL, + "webhookBody": &req.WebhookBody, + } { + if *v = form.Get(k); *v == "" { + return fmt.Errorf("no ?%s in %s", k, form.Encode()) + } } _, err := feeds.Insert(ctx, req.URL, req.Cron, req.Pattern, req.WebhookMethod, req.WebhookURL, req.WebhookBody) diff --git a/src/cmd/server/handler/feeds_test.go b/src/cmd/server/handler/feeds_test.go index 6dc90a7..c42ab8d 100644 --- a/src/cmd/server/handler/feeds_test.go +++ b/src/cmd/server/handler/feeds_test.go @@ -4,6 +4,7 @@ import ( "context" "net/http" "net/http/httptest" + "net/url" "show-rss/src/cmd/server/handler" "show-rss/src/db" "show-rss/src/feeds" @@ -16,16 +17,17 @@ func TestFeeds(t *testing.T) { h := handler.New(ctx) t.Run("happy", func(t *testing.T) { + body := make(url.Values) + body.Set("url", "url") + body.Set("cron", "cron") + body.Set("pattern", "pattern") + body.Set("webhookMethod", "wmethod") + body.Set("webhookURL", "wurl") + body.Set("webhookBody", "wbody") w := httptest.NewRecorder() - r := httptest.NewRequest(http.MethodPost, "/v1/feeds", strings.NewReader(`{ - "url": "url", - "cron": "cron", - "pattern": "pattern", - "webhookMethod": "wmethod", - "webhookURL": "wurl", - "webhookBody": "wbody" - }`)) + r := httptest.NewRequest(http.MethodPost, "/v1/feeds", strings.NewReader(body.Encode())) r = r.WithContext(ctx) + r.Header.Set("Content-Type", "application/x-www-form-urlencoded") h.ServeHTTP(w, r) if w.Code != http.StatusOK { t.Errorf("(%d) %s", w.Code, w.Body.Bytes())