aboutsummaryrefslogtreecommitdiff
path: root/pkg/handler/add.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/handler/add.go')
-rw-r--r--pkg/handler/add.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/pkg/handler/add.go b/pkg/handler/add.go
new file mode 100644
index 0000000..a6a5ced
--- /dev/null
+++ b/pkg/handler/add.go
@@ -0,0 +1,60 @@
+package handler
+
+import (
+ "net/http"
+
+ "github.com/labstack/echo/v4"
+ "github.com/ssoda/captcha"
+ "sh.org.ru/pkg/model"
+ "sh.org.ru/pkg/tpl"
+)
+
+func (h *Handler) AddQuote(c echo.Context) error {
+ cid := captcha.New()
+ form := &tpl.AddQuoteForm{
+ CaptchaID: cid,
+ }
+ return tpl.
+ AddQuotePage(form, "").
+ Render(c.Request().Context(), c.Response())
+}
+
+func (h *Handler) AddQuotePost(c echo.Context) error {
+ form := &tpl.AddQuoteForm{}
+ if err := c.Bind(form); err != nil {
+ return err
+ }
+ if form.CaptchaValue == "" {
+ return formError(form, c, "Неверный код")
+ }
+ if !captcha.VerifyString(form.CaptchaID, form.CaptchaValue) {
+ return formError(form, c, "Неверный код")
+ }
+
+ if len(form.Quote) < 10 {
+ return formError(form, c, "Цитата слишком короткая")
+ }
+
+ q := &model.Quote{
+ Quote: form.Quote,
+ Approved: false,
+ Archive: false,
+ }
+ if _, err := h.DB.NewInsert().Model(q).Exec(c.Request().Context()); err != nil {
+ return err
+ }
+
+ return c.Redirect(http.StatusFound, "/add/success")
+}
+
+func (h *Handler) AddQuoteSuccess(c echo.Context) error {
+ return tpl.AddQuoteSuccessPage().Render(c.Request().Context(), c.Response())
+}
+
+func formError(form *tpl.AddQuoteForm, c echo.Context, err string) error {
+ form.CaptchaID = captcha.New()
+ form.CaptchaValue = ""
+ return tpl.
+ AddQuotePage(form, err).
+ Render(c.Request().Context(), c.Response())
+}