Skip to content

Commit

Permalink
chore: refactor postcard handlers to use core.RequestEvent and improv…
Browse files Browse the repository at this point in the history
…e form handling
  • Loading branch information
blackfyre committed Feb 7, 2025
1 parent 1b7ff3a commit 61fa226
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 48 deletions.
13 changes: 6 additions & 7 deletions handlers/postcards/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,25 @@ package postcards

import (
"github.com/blackfyre/wga/utils"
"github.com/labstack/echo/v5"
"github.com/microcosm-cc/bluemonday"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/core"
)

func RegisterPostcardHandlers(app *pocketbase.PocketBase, p *bluemonday.Policy) {
app.OnBeforeServe().Add(func(e *core.ServeEvent) error {
e.Router.GET("postcard/send", func(c echo.Context) error {
app.OnServe().BindFunc(func(e *core.ServeEvent) error {
e.Router.GET("postcard/send", func(c *core.RequestEvent) error {
return sendPostcard(app, c)
}, utils.IsHtmxRequestMiddleware)
}).BindFunc(utils.IsHtmxRequestMiddleware)

e.Router.GET("postcards", func(c echo.Context) error {
e.Router.GET("postcards", func(c *core.RequestEvent) error {

return viewPostcard(app, c)
})

e.Router.POST("postcards", func(c echo.Context) error {
e.Router.POST("postcards", func(c *core.RequestEvent) error {
return savePostcard(app, c, p)
}, utils.IsHtmxRequestMiddleware)
}).BindFunc(utils.IsHtmxRequestMiddleware)
return nil
})
}
37 changes: 12 additions & 25 deletions handlers/postcards/save.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,11 @@ package postcards

import (
"fmt"
"strings"

"github.com/blackfyre/wga/utils"
"github.com/labstack/echo/v5"
"github.com/microcosm-cc/bluemonday"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/forms"
"github.com/pocketbase/pocketbase/models"
"github.com/pocketbase/pocketbase/core"
)

func savePostcard(app *pocketbase.PocketBase, c *core.RequestEvent, p *bluemonday.Policy) error {
Expand All @@ -25,7 +22,7 @@ func savePostcard(app *pocketbase.PocketBase, c *core.RequestEvent, p *bluemonda
HoneyPotEmail string `json:"honey_pot_email" form:"email" query:"honey_pot_email"`
}{}

if err := c.Bind(&postData); err != nil {
if err := c.BindBody(&postData); err != nil {
app.Logger().Error("Failed to parse form", "error", err.Error())
utils.SendToastMessage("Failed to parse form", "error", true, c, "")
return utils.ServerFaultError(c)
Expand All @@ -37,33 +34,23 @@ func savePostcard(app *pocketbase.PocketBase, c *core.RequestEvent, p *bluemonda
return utils.ServerFaultError(c)
}

collection, err := app.Dao().FindCollectionByNameOrId("postcards")
collection, err := app.FindCollectionByNameOrId("postcards")
if err != nil {
app.Logger().Error("Failed to find postcard collection", "error", err.Error())
return utils.NotFoundError(c)
}

record := models.NewRecord(collection)
record := core.NewRecord(collection)

form := forms.NewRecordUpsert(app, record)
record.Set("status", "queued")
record.Set("sender_name", postData.SenderName)
record.Set("sender_email", postData.SenderEmail)
record.Set("recipients", postData.Recipients)
record.Set("message", p.Sanitize(postData.Message))
record.Set("image_id", postData.ImageId)
record.Set("notify_sender", postData.NotificationRequired)

err = form.LoadData(map[string]any{
"status": "queued",
"sender_name": postData.SenderName,
"sender_email": postData.SenderEmail,
"recipients": strings.Join(postData.Recipients, ","),
"message": p.Sanitize(postData.Message),
"image_id": postData.ImageId,
"notify_sender": postData.NotificationRequired,
})

if err != nil {
app.Logger().Error("Failed to process postcard form", "error", err.Error())
utils.SendToastMessage("Failed to process postcard form", "error", true, c, "")
return utils.ServerFaultError(c)
}

if err := form.Submit(); err != nil {
if err := app.Save(record); err != nil {

return renderForm(postData.ImageId, app, c)
}
Expand Down
21 changes: 13 additions & 8 deletions handlers/postcards/send.go
Original file line number Diff line number Diff line change
@@ -1,29 +1,32 @@
package postcards

import (
"bytes"
"cmp"
"context"
"fmt"
"net/http"

"github.com/blackfyre/wga/assets/templ/components"
"github.com/blackfyre/wga/utils"
"github.com/blackfyre/wga/utils/url"
"github.com/labstack/echo/v5"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/core"
)

func sendPostcard(app *pocketbase.PocketBase, c echo.Context) error {
func sendPostcard(app *pocketbase.PocketBase, c *core.RequestEvent) error {

artworkId, err := url.GetRequiredQueryParam(c, "awid")
artworkId := cmp.Or(c.Request.URL.Query().Get("awid"), "")

if err != nil {
app.Logger().Error("Failed to get required query param", "error", err.Error())
if artworkId == "" {
app.Logger().Error("No artwork id provided for postcard", "ip", c.RealIP())
return utils.BadRequestError(c)
}

return renderForm(artworkId, app, c)
}

func renderForm(artworkId string, app *pocketbase.PocketBase, c echo.Context) error {
func renderForm(artworkId string, app *pocketbase.PocketBase, c *core.RequestEvent) error {
ctx := context.Background()

r, err := app.FindRecordById("artworks", artworkId)
Expand All @@ -33,18 +36,20 @@ func renderForm(artworkId string, app *pocketbase.PocketBase, c echo.Context) er
return utils.NotFoundError(c)
}

var buf bytes.Buffer

err = components.PostcardEditor(components.PostcardEditorDTO{
Image: url.GenerateFileUrl("artworks", artworkId, r.GetString("image"), ""),
ImageId: artworkId,
Title: r.GetString("title"),
Comment: r.GetString("comment"),
Technique: r.GetString("technique"),
}).Render(ctx, c.Response().Writer)
}).Render(ctx, &buf)

if err != nil {
app.Logger().Error(fmt.Sprintf("Failed to render the postcard editor with image_id %s", artworkId), "error", err.Error())
return utils.ServerFaultError(c)
}

return nil
return c.HTML(http.StatusOK, buf.String())
}
23 changes: 15 additions & 8 deletions handlers/postcards/view.go
Original file line number Diff line number Diff line change
@@ -1,33 +1,37 @@
package postcards

import (
"bytes"
"cmp"
"context"
"fmt"
"net/http"

"github.com/blackfyre/wga/assets/templ/pages"
tmplUtils "github.com/blackfyre/wga/assets/templ/utils"
"github.com/blackfyre/wga/utils"
"github.com/blackfyre/wga/utils/url"
"github.com/labstack/echo/v5"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/core"
)

func viewPostcard(app *pocketbase.PocketBase, c echo.Context) error {
postCardId := c.QueryParamDefault("p", "nope")
func viewPostcard(app *pocketbase.PocketBase, c *core.RequestEvent) error {
// postCardId := c.QueryParamDefault("p", "nope")
postCardId := cmp.Or(c.Request.URL.Query().Get("p"), "nope")

if postCardId == "nope" {
app.Logger().Error(fmt.Sprintf("Invalid postcard id: %s", postCardId))
return utils.NotFoundError(c)
}

r, err := app.Dao().FindRecordById("Postcards", postCardId)
r, err := app.FindRecordById("Postcards", postCardId)

if err != nil {
app.Logger().Error("Failed to find postcard", "id", postCardId, "error", err.Error())
return utils.NotFoundError(c)
}

if errs := app.Dao().ExpandRecord(r, []string{"image_id"}, nil); len(errs) > 0 {
if errs := app.ExpandRecord(r, []string{"image_id"}, nil); len(errs) > 0 {
app.Logger().Error("Failed to expand record", "id", postCardId, "errors", errs)
return utils.ServerFaultError(c)
}
Expand All @@ -45,13 +49,16 @@ func viewPostcard(app *pocketbase.PocketBase, c echo.Context) error {

ctx := tmplUtils.DecorateContext(context.Background(), tmplUtils.TitleKey, "Postcard")

//c.Response().Header().Set("HX-Push-Url", fullUrl)
err = pages.PostcardPage(content).Render(ctx, c.Response().Writer)
// c.Response.Header().Set("HX-Push-Url", fullUrl)

var buf bytes.Buffer

err = pages.PostcardPage(content).Render(ctx, &buf)

if err != nil {
app.Logger().Error("Error rendering artwork page", "error", err.Error())
return utils.ServerFaultError(c)
}

return nil
return c.HTML(http.StatusOK, buf.String())
}

0 comments on commit 61fa226

Please sign in to comment.