// Package accountMessageHandler // Path: /internal/handlers/account/messages // File: read.go package accountMessageHandler import ( "net/http" templateHelpers "synlotto-website/internal/helpers/template" "synlotto-website/internal/logging" "synlotto-website/internal/models" "synlotto-website/internal/platform/bootstrap" "github.com/gin-gonic/gin" "github.com/justinas/nosurf" ) // GET /account/messages // Renders: web/templates/account/messages/index.html func (h *AccountMessageHandlers) List(c *gin.Context) { app := c.MustGet("app").(*bootstrap.App) sm := app.SessionManager userID := mustUserID(c) // Pull messages (via service) msgs, err := h.Svc.ListInbox(userID) if err != nil { logging.Info("❌ list inbox error: %v", err) c.String(http.StatusInternalServerError, "Failed to load messages") return } // Build template context just like LoginGet ctx := templateHelpers.TemplateContext(c.Writer, c.Request, models.TemplateData{}) if f := sm.PopString(c.Request.Context(), "flash"); f != "" { ctx["Flash"] = f } ctx["CSRFToken"] = nosurf.Token(c.Request) ctx["Title"] = "Messages" ctx["Messages"] = msgs // Use the same loader + layout pattern tmpl := templateHelpers.LoadTemplateFiles("layout.html", "web/templates/account/messages/index.html") c.Status(http.StatusOK) if err := tmpl.ExecuteTemplate(c.Writer, "layout", ctx); err != nil { logging.Info("❌ Template render error: %v", err) c.String(http.StatusInternalServerError, "Error rendering messages page") } } // GET /account/messages/:id // Renders: web/templates/account/messages/read.html func (h *AccountMessageHandlers) ReadGet(c *gin.Context) { app := c.MustGet("app").(*bootstrap.App) sm := app.SessionManager userID := mustUserID(c) id, err := parseIDParam(c, "id") if err != nil { c.AbortWithStatus(http.StatusNotFound) return } msg, err := h.Svc.GetByID(userID, id) if err != nil || msg == nil { c.AbortWithStatus(http.StatusNotFound) return } ctx := templateHelpers.TemplateContext(c.Writer, c.Request, models.TemplateData{}) if f := sm.PopString(c.Request.Context(), "flash"); f != "" { ctx["Flash"] = f } ctx["CSRFToken"] = nosurf.Token(c.Request) ctx["Title"] = msg.Subject ctx["Message"] = msg tmpl := templateHelpers.LoadTemplateFiles( "layout.html", "web/templates/account/messages/read.html", ) c.Status(http.StatusOK) if err := tmpl.ExecuteTemplate(c.Writer, "layout", ctx); err != nil { logging.Info("❌ Template render error: %v", err) c.String(http.StatusInternalServerError, "Error rendering message") } }