From 4e7f91d098905a4f991ed3f75eb7965fba68a378 Mon Sep 17 00:00:00 2001 From: Tigor Hutasuhut Date: Fri, 3 May 2024 10:27:03 +0700 Subject: [PATCH] subreddit-add: enhanced subreddit check and add form --- api/reddit/check_subreddit.go | 13 +++- api/subreddits_check.go | 17 +++++ server/routes/subreddit_check.go | 33 ++++++++- views/subredditsview/addview/addview.templ | 72 ++---------------- .../addview/subreddit_name_input.templ | 73 +++++++++++++++++++ .../addview/subreddit_type_input.templ | 27 +++++++ 6 files changed, 166 insertions(+), 69 deletions(-) create mode 100644 views/subredditsview/addview/subreddit_name_input.templ create mode 100644 views/subredditsview/addview/subreddit_type_input.templ diff --git a/api/reddit/check_subreddit.go b/api/reddit/check_subreddit.go index 062c8b8..10ad0f7 100644 --- a/api/reddit/check_subreddit.go +++ b/api/reddit/check_subreddit.go @@ -39,7 +39,18 @@ func (reddit *Reddit) CheckSubreddit(ctx context.Context, params CheckSubredditP defer resp.Body.Close() if resp.StatusCode == http.StatusNotFound { - return actual, errs.Wrapw(err, "user or subreddit not found", "url", url, "params", params).Code(http.StatusNotFound) + var msg string + if params.SubredditType == SubredditTypeUser { + msg = "user not found" + } + if params.SubredditType == SubredditTypeSub { + msg = "subreddit not found" + } + return actual, errs.Wrapw(err, msg, "url", url, "params", params).Code(http.StatusNotFound) + } + + if params.SubredditType == SubredditTypeUser && resp.StatusCode == http.StatusOK { + return params.Subreddit, nil } if resp.StatusCode >= 400 { diff --git a/api/subreddits_check.go b/api/subreddits_check.go index 8fb0a98..9bab42c 100644 --- a/api/subreddits_check.go +++ b/api/subreddits_check.go @@ -4,6 +4,8 @@ import ( "context" "github.com/tigorlazuardi/redmage/api/reddit" + "github.com/tigorlazuardi/redmage/models" + "github.com/tigorlazuardi/redmage/pkg/errs" ) type SubredditCheckParam = reddit.CheckSubredditParams @@ -14,3 +16,18 @@ func (api *API) SubredditCheck(ctx context.Context, params SubredditCheckParam) return api.reddit.CheckSubreddit(ctx, params) } + +func (api *API) SubredditRegistered(ctx context.Context, params SubredditCheckParam) (registered bool, err error) { + ctx, span := tracer.Start(ctx, "*API.SubredditRegistered") + defer span.End() + + registered, err = models.Subreddits.Query(ctx, api.db, + models.SelectWhere.Subreddits.Name.EQ(params.Subreddit), + models.SelectWhere.Subreddits.Subtype.EQ(int32(params.SubredditType)), + ).Exists() + if err != nil { + return registered, errs.Wrapw(err, "failed to check subreddit registered state", "params", params) + } + + return registered, err +} diff --git a/server/routes/subreddit_check.go b/server/routes/subreddit_check.go index d2ca2c5..a70d027 100644 --- a/server/routes/subreddit_check.go +++ b/server/routes/subreddit_check.go @@ -52,6 +52,11 @@ func (routes *Routes) SubredditCheckHTMX(rw http.ResponseWriter, r *http.Request name := r.FormValue("name") data.Value = name + var subtype reddit.SubredditType + _ = subtype.Parse(r.FormValue("type")) + + data.Type = subtype + if name == "" { if err := addview.SubredditInputForm(data).Render(r.Context(), rw); err != nil { log.New(r.Context()).Err(err).Error("failed to render subreddit input form") @@ -62,12 +67,9 @@ func (routes *Routes) SubredditCheckHTMX(rw http.ResponseWriter, r *http.Request ctx, span := tracer.Start(r.Context(), "*Routes.SubredditCheckHTMX") defer span.End() - var t reddit.SubredditType - _ = t.Parse(r.FormValue("type")) - params := api.SubredditCheckParam{ Subreddit: name, - SubredditType: t, + SubredditType: subtype, } actual, err := routes.API.SubredditCheck(ctx, params) @@ -81,7 +83,30 @@ func (routes *Routes) SubredditCheckHTMX(rw http.ResponseWriter, r *http.Request } return } + params.Subreddit = actual data.Value = actual + + exist, err := routes.API.SubredditRegistered(ctx, params) + if err != nil { + log.New(ctx).Err(err).Error("failed to check subreddit") + code, message := errs.HTTPMessage(err) + rw.WriteHeader(code) + data.Error = message + if err := addview.SubredditInputForm(data).Render(r.Context(), rw); err != nil { + log.New(r.Context()).Err(err).Error("failed to render subreddit input form") + } + return + } + + if exist { + rw.WriteHeader(http.StatusNotFound) + data.Error = "subreddit already registered" + if err := addview.SubredditInputForm(data).Render(r.Context(), rw); err != nil { + log.New(r.Context()).Err(err).Error("failed to render subreddit input form") + } + return + } + data.Valid = true if err := addview.SubredditInputForm(data).Render(r.Context(), rw); err != nil { diff --git a/views/subredditsview/addview/addview.templ b/views/subredditsview/addview/addview.templ index 0a41353..f6f1d2c 100644 --- a/views/subredditsview/addview/addview.templ +++ b/views/subredditsview/addview/addview.templ @@ -2,7 +2,6 @@ package addview import "github.com/tigorlazuardi/redmage/views" import "github.com/tigorlazuardi/redmage/views/components" -import "github.com/tigorlazuardi/redmage/views/utils" templ Addview(c *views.Context) { @components.Doctype() { @@ -19,73 +18,18 @@ templ AddviewContent(c *views.Context) { @components.Container() {

Add Subreddit

-
+ +
} } - -type SubredditInputData struct { - Value string - Error string - Valid bool -} - -templ SubredditInputForm(data SubredditInputData) { -
- Subreddit Name -
- @subredditInputField("/htmx/subreddits/check", data) -
- - if data.Valid { - Subreddit / User target is valid - } else { - { data.Error } - } - -
-} - -templ subredditInputField(target string, data SubredditInputData) { - -} diff --git a/views/subredditsview/addview/subreddit_name_input.templ b/views/subredditsview/addview/subreddit_name_input.templ new file mode 100644 index 0000000..11033b5 --- /dev/null +++ b/views/subredditsview/addview/subreddit_name_input.templ @@ -0,0 +1,73 @@ +package addview + +import "github.com/tigorlazuardi/redmage/views/components" +import "github.com/tigorlazuardi/redmage/views/utils" +import "github.com/tigorlazuardi/redmage/api/reddit" + +type SubredditInputData struct { + Value string + Error string + Valid bool + Type reddit.SubredditType +} + +templ SubredditInputForm(data SubredditInputData) { +
+ Subreddit Name +
+ @subredditInputField("/htmx/subreddits/check", data) +
+ + if data.Valid { + if data.Type == reddit.SubredditTypeUser { + Username target is valid + } else { + Subreddit is valid + } + } else { + { data.Error } + } + +
+} + +templ subredditInputField(target string, data SubredditInputData) { + +} diff --git a/views/subredditsview/addview/subreddit_type_input.templ b/views/subredditsview/addview/subreddit_type_input.templ new file mode 100644 index 0000000..7efe583 --- /dev/null +++ b/views/subredditsview/addview/subreddit_type_input.templ @@ -0,0 +1,27 @@ +package addview + +type SubredditTypeData struct { + Value string +} + +templ SubredditTypeInput(data SubredditTypeData) { +
+ Subreddit Type +
+ +
+ +}