summaryrefslogtreecommitdiff
path: root/pages/page.go
blob: 25c2331b9ce10e7acfdcd4892301c3b55c220f53 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package pages

import (
	"context"
	"gosten/model"
	"gosten/templ"
	"log"
	"net/http"

	"github.com/go-chi/chi/v5"
)

var Q *model.Queries

func Connect(tx model.DBTX) {
	Q = model.New(tx)
}

type Page interface {
	http.Handler
}

type dataFunc func(r *http.Request, uid int32) any

type simplePage struct {
	dataFn   dataFunc
	template string
}

func (p simplePage) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	input := p.dataFn(r, userId(r))
	p.showTemplate(w, input)
}

func simpleByQuery[T any](tpl string, query func(ctx context.Context, id int32) (T, error)) Page {
	dataFn := func(r *http.Request, uid int32) any {
		d, _ := query(r.Context(), uid)
		return d
	}
	return simple(tpl, dataFn)
}

func simple(tpl string, dataFn dataFunc) Page {
	p := simplePage{dataFn, tpl}
	r := chi.NewRouter()
	r.Get("/", p.ServeHTTP)
	return r
}

func showTemplate(w http.ResponseWriter, tpl string, data any) {
	if err := templ.Lookup(tpl).Execute(w, data); err != nil {
		log.Panicf("Executing '%s' with %+v: %v", tpl, data, err)
	}
}

func (p simplePage) showTemplate(w http.ResponseWriter, data any) {
	showTemplate(w, p.template, data)
}