saasitone/pkg/page/page.go

141 lines
4.3 KiB
Go
Raw Permalink Normal View History

package page
2021-12-03 03:11:01 -08:00
import (
"net/http"
2021-12-06 11:53:28 -08:00
"time"
2021-12-03 03:11:01 -08:00
2024-07-14 18:48:40 -07:00
"github.com/a-h/templ"
2024-07-09 17:57:05 -07:00
"github.com/labstack/echo/v4"
2021-12-06 18:51:21 -08:00
echomw "github.com/labstack/echo/v4/middleware"
2021-12-03 04:53:01 -08:00
2024-07-09 17:57:05 -07:00
"git.grosinger.net/tgrosinger/saasitone/pkg/context"
"git.grosinger.net/tgrosinger/saasitone/pkg/htmx"
2024-07-11 21:09:15 -07:00
"git.grosinger.net/tgrosinger/saasitone/pkg/models/sqlc"
2024-07-09 17:57:05 -07:00
"git.grosinger.net/tgrosinger/saasitone/pkg/msg"
2021-12-03 03:11:01 -08:00
)
// Page consists of all data that will be used to render a page response for a given route.
// While it's not required for a handler to render a Page on a route, this is the common data
// object that will be passed to the templates, making it easy for all handlers to share
// functionality both on the back and frontend. The Page can be expanded to include anything else
// your app wants to support.
// Methods on this page also then become available in the templates, which can be more useful than
// the funcmap if your methods require data stored in the page, such as the context.
2021-12-03 03:11:01 -08:00
type Page struct {
// AppName stores the name of the application.
// If omitted, the configuration value will be used.
AppName string
// Title stores the title of the page
Title string
// Context stores the request context
Context echo.Context
// Path stores the path of the current request
Path string
// URL stores the URL of the current request
URL string
// ToURL is a function to convert a route name and optional route parameters to a URL
ToURL func(name string, params ...interface{}) string
LayoutComponent func(p Page, content templ.Component) templ.Component
2024-07-14 18:48:40 -07:00
// IsHome stores whether the requested page is the home page or not
IsHome bool
// IsAuth stores whether the user is authenticated
IsAuth bool
// AuthUser stores the authenticated user
2024-07-11 21:09:15 -07:00
AuthUser *sqlc.User
// StatusCode stores the HTTP status code that will be returned
2021-12-03 03:11:01 -08:00
StatusCode int
// Metatags stores metatag values
Metatags struct {
// Description stores the description metatag value
2021-12-03 03:11:01 -08:00
Description string
// Keywords stores the keywords metatag values
Keywords []string
2021-12-03 03:11:01 -08:00
}
// Pager stores a pager which can be used to page lists of results
Pager Pager
// CSRF stores the CSRF token for the given request.
// This will only be populated if the CSRF middleware is in effect for the given request.
// If this is populated, all forms must include this value otherwise the requests will be rejected.
CSRF string
// Headers stores a list of HTTP headers and values to be set on the response
2021-12-07 18:36:57 -08:00
Headers map[string]string
// RequestID stores the ID of the given request.
// This will only be populated if the request ID middleware is in effect for the given request.
RequestID string
2024-06-15 06:09:36 -07:00
// HTMX provides the ability to interact with the HTMX library
HTMX struct {
2024-06-15 06:09:36 -07:00
// Request contains the information provided by HTMX about the current request
Request htmx.Request
// Response contains values to pass back to HTMX
Response *htmx.Response
}
// Cache stores values for caching the response of this page
Cache struct {
// Enabled dictates if the response of this page should be cached.
// Cached responses are served via middleware.
Enabled bool
// Expiration stores the amount of time that the cache entry should live for before expiring.
// If omitted, the configuration value will be used.
2021-12-11 16:32:34 -08:00
Expiration time.Duration
// Tags stores a list of tags to apply to the cache entry.
// These are useful when invalidating cache for dynamic events such as entity operations.
Tags []string
2021-12-05 18:56:57 -08:00
}
2021-12-03 03:11:01 -08:00
}
// New creates and initiatizes a new Page for a given request context
func New(ctx echo.Context) Page {
2021-12-03 03:11:01 -08:00
p := Page{
2021-12-18 15:08:04 -08:00
Context: ctx,
Path: ctx.Request().URL.Path,
URL: ctx.Request().URL.String(),
ToURL: ctx.Echo().Reverse,
2021-12-03 03:11:01 -08:00
StatusCode: http.StatusOK,
2021-12-18 15:08:04 -08:00
Pager: NewPager(ctx, DefaultItemsPerPage),
2021-12-07 18:36:57 -08:00
Headers: make(map[string]string),
2021-12-18 15:08:04 -08:00
RequestID: ctx.Response().Header().Get(echo.HeaderXRequestID),
2021-12-03 03:11:01 -08:00
}
p.IsHome = p.Path == "/"
2021-12-18 15:08:04 -08:00
if csrf := ctx.Get(echomw.DefaultCSRFConfig.ContextKey); csrf != nil {
2021-12-03 04:53:01 -08:00
p.CSRF = csrf.(string)
}
2021-12-18 15:08:04 -08:00
if u := ctx.Get(context.AuthenticatedUserKey); u != nil {
2021-12-12 14:04:11 -08:00
p.IsAuth = true
2024-07-11 21:09:15 -07:00
p.AuthUser = u.(*sqlc.User)
2021-12-12 14:04:11 -08:00
}
p.HTMX.Request = htmx.GetRequest(ctx)
2021-12-03 03:11:01 -08:00
return p
}
// GetMessages gets all flash messages for a given type.
// This allows for easy access to flash messages from the templates.
func (p Page) GetMessages(typ msg.Type) []string {
return msg.Get(p.Context, typ)
2021-12-03 03:11:01 -08:00
}