From f4399555b495d23e39e013dec6c03270da01efd0 Mon Sep 17 00:00:00 2001 From: Tigor Hutasuhut Date: Fri, 3 May 2024 11:59:44 +0700 Subject: [PATCH] subreddit-add: added cron scheduler input --- server/routes/routes.go | 1 + server/routes/subreddit_check.go | 2 +- server/routes/subreddit_validate_schedule.go | 53 ++++++++++++ views/subredditsview/addview/addview.templ | 3 + .../addview/subreddit_schedule_input.templ | 81 +++++++++++++++++++ 5 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 server/routes/subreddit_validate_schedule.go create mode 100644 views/subredditsview/addview/subreddit_schedule_input.templ diff --git a/server/routes/routes.go b/server/routes/routes.go index 46d51ca..ac2bdef 100644 --- a/server/routes/routes.go +++ b/server/routes/routes.go @@ -60,6 +60,7 @@ func (routes *Routes) registerHTMXRoutes(router chi.Router) { router.Post("/subreddits/start", routes.SubredditStartDownloadHTMX) router.Post("/subreddits/check", routes.SubredditCheckHTMX) + router.Get("/subreddits/validate/schedule", routes.SubredditValidateScheduleHTMX) } func (routes *Routes) registerWWWRoutes(router chi.Router) { diff --git a/server/routes/subreddit_check.go b/server/routes/subreddit_check.go index a70d027..962e8c5 100644 --- a/server/routes/subreddit_check.go +++ b/server/routes/subreddit_check.go @@ -99,7 +99,7 @@ func (routes *Routes) SubredditCheckHTMX(rw http.ResponseWriter, r *http.Request } if exist { - rw.WriteHeader(http.StatusNotFound) + rw.WriteHeader(http.StatusConflict) 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") diff --git a/server/routes/subreddit_validate_schedule.go b/server/routes/subreddit_validate_schedule.go new file mode 100644 index 0000000..7703658 --- /dev/null +++ b/server/routes/subreddit_validate_schedule.go @@ -0,0 +1,53 @@ +package routes + +import ( + "fmt" + "net/http" + "strconv" + "time" + + "github.com/tigorlazuardi/redmage/pkg/log" + "github.com/tigorlazuardi/redmage/views/subredditsview/addview" +) + +func (routes *Routes) SubredditValidateScheduleHTMX(rw http.ResponseWriter, r *http.Request) { + ctx, span := tracer.Start(r.Context(), "*Routes.SubredditValidateScheduleHTMX") + defer span.End() + + var data addview.ScheduleInputData + + enabled, _ := strconv.Atoi(r.FormValue("enable_schedule")) + data.Disabled = enabled == 0 + data.Value = r.FormValue("schedule") + + if data.Value == "" { + if err := addview.ScheduleInput(data).Render(ctx, rw); err != nil { + log.New(ctx).Err(err).Error("failed to render schedule input") + } + return + } + + if data.Disabled { + if err := addview.ScheduleInput(data).Render(ctx, rw); err != nil { + log.New(ctx).Err(err).Error("failed to render schedule input") + } + return + } + + scheduler, err := cronParser.Parse(data.Value) + if err != nil { + data.Error = fmt.Sprintf("Invalid schedule format: %s", err.Error()) + if err := addview.ScheduleInput(data).Render(ctx, rw); err != nil { + log.New(ctx).Err(err).Error("failed to render schedule input") + } + return + } + + next := scheduler.Next(time.Now()) + + data.Valid = fmt.Sprintf("Schedule is valid. Next run at: %s", next.Format("Monday, _2 January 2006 15:04:05 MST")) + + if err := addview.ScheduleInput(data).Render(ctx, rw); err != nil { + log.New(ctx).Err(err).Error("failed to render schedule input") + } +} diff --git a/views/subredditsview/addview/addview.templ b/views/subredditsview/addview/addview.templ index f6f1d2c..dbcc63e 100644 --- a/views/subredditsview/addview/addview.templ +++ b/views/subredditsview/addview/addview.templ @@ -29,6 +29,9 @@ templ AddviewContent(c *views.Context) { +
+ @scheduleInputContainer() +
} diff --git a/views/subredditsview/addview/subreddit_schedule_input.templ b/views/subredditsview/addview/subreddit_schedule_input.templ new file mode 100644 index 0000000..3f6cd7c --- /dev/null +++ b/views/subredditsview/addview/subreddit_schedule_input.templ @@ -0,0 +1,81 @@ +package addview + +import "github.com/tigorlazuardi/redmage/views/utils" + +type ScheduleInputData struct { + Value string + Error string + Valid string + Disabled bool +} + +templ scheduleInputContainer() { + @ScheduleInput(ScheduleInputData{}) + +} + +templ ScheduleInput(data ScheduleInputData) { +
+ + if data.Disabled { + + } else { + + } +
+ + if data.Valid != "" { + { data.Valid } + } else { + { data.Error } + } + +
+
+}