package dynamic import ( "context" "errors" "log" "net/http" "strings" "git.sr.ht/~evanj/cms/internal/c" "git.sr.ht/~evanj/cms/internal/m/content" "git.sr.ht/~evanj/cms/internal/v" ) var ( fieldToSearchBy = "slug" tmpl = v.MustParse("html/dynamic.html") ) type Dynamic struct { *c.Controller log *log.Logger api SkipperAPI ct int } type SkipperAPI interface { QueryContentByField(ctx context.Context, contentTypeID int, field, query string) (content.Content, error) } func New(c *c.Controller, log *log.Logger, api SkipperAPI, contenttype int) Dynamic { return Dynamic{c, log, api, contenttype} } func (d Dynamic) ServeHTTP(w http.ResponseWriter, r *http.Request) { q := strings.Trim(r.URL.Path, "/") c, err := d.api.QueryContentByField(r.Context(), d.ct, fieldToSearchBy, q) if err != nil { d.log.Println(err) d.Error(w, r, http.StatusNotFound, errors.New("failed to find requested content")) return } d.HTML(w, r, tmpl, map[string]interface{}{ "Content": c, }) }