From e849e705c30cceec3cf7336a21bed96c8a911e90 Mon Sep 17 00:00:00 2001 From: Alexander Neonxp Kiryukhin Date: Tue, 8 Oct 2024 03:43:08 +0300 Subject: Добавил рейтинг Добавил страницу топа Добавил rss/xml/json feed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/handler/rate/handler.go | 19 +++++++++++++ pkg/handler/rate/rate.go | 69 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 pkg/handler/rate/handler.go create mode 100644 pkg/handler/rate/rate.go (limited to 'pkg/handler/rate') diff --git a/pkg/handler/rate/handler.go b/pkg/handler/rate/handler.go new file mode 100644 index 0000000..1a2ecf3 --- /dev/null +++ b/pkg/handler/rate/handler.go @@ -0,0 +1,19 @@ +package rate + +import ( + "github.com/labstack/echo/v4" + "github.com/uptrace/bun" +) + +type Handler struct { + db *bun.DB +} + +// NewHandler returns new Handler. +func NewHandler(db *bun.DB) *Handler { + return &Handler{db: db} +} + +func (h *Handler) Register(g *echo.Group) { + g.POST("/:id", h.Rate) +} diff --git a/pkg/handler/rate/rate.go b/pkg/handler/rate/rate.go new file mode 100644 index 0000000..df6713f --- /dev/null +++ b/pkg/handler/rate/rate.go @@ -0,0 +1,69 @@ +package rate + +import ( + "strconv" + + "github.com/labstack/echo-contrib/session" + "github.com/labstack/echo/v4" + "sh.org.ru/pkg/model" + "sh.org.ru/pkg/tpl" +) + +func (h *Handler) Rate(c echo.Context) error { + voted, err := session.Get("votes", c) + if err != nil { + return err + } + sid := c.Param("id") + id, err := strconv.Atoi(sid) + if err != nil { + return err + } + f := new(rateForm) + if err := c.Bind(f); err != nil { + return err + } + + quote := new(model.Quote) + + if _, ok := voted.Values[id]; !ok { + voted.Values[id] = true + if err := voted.Save(c.Request(), c.Response()); err != nil { + return err + } + set := "" + switch f.Vote { + case "up": + set = "rating = rating + 1" + case "down": + set = "rating = rating - 1" + } + _, err = h.db.NewUpdate(). + Model(quote). + Where("id = ?", id). + Set(set). + Returning("*"). + Exec(c.Request().Context(), quote) + } else { + err = h.db.NewSelect(). + Model(quote). + Where("id = ?", id). + Scan(c.Request().Context(), quote) + } + if err != nil { + return err + } + + return tpl.Rate(quote, 0).Render(c.Request().Context(), c.Response()) +} + +type rateForm struct { + Vote string `form:"vote"` +} + +type voteType string + +const ( + voteUp voteType = "up" + voteDown voteType = "down" +) -- cgit v1.2.3