camper/pkg/location/public.go

68 lines
1.7 KiB
Go

package location
import (
"dev.tandem.ws/tandem/camper/pkg/auth"
"dev.tandem.ws/tandem/camper/pkg/database"
httplib "dev.tandem.ws/tandem/camper/pkg/http"
"dev.tandem.ws/tandem/camper/pkg/template"
gotemplate "html/template"
"net/http"
)
type PublicHandler struct {
}
func NewPublicHandler() *PublicHandler {
return &PublicHandler{}
}
func (h *PublicHandler) Handler(user *auth.User, company *auth.Company, conn *database.Conn) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var head string
head, r.URL.Path = httplib.ShiftPath(r.URL.Path)
switch head {
case "":
switch r.Method {
case http.MethodGet:
page := newLocationPage()
page.MustRender(w, r, user, company, conn)
default:
httplib.MethodNotAllowed(w, r, http.MethodGet)
}
default:
http.NotFound(w, r)
}
})
}
type locationPage struct {
*template.PublicPage
Directions gotemplate.HTML
MapEmbed gotemplate.HTML
}
func newLocationPage() *locationPage {
page := &locationPage{
PublicPage: template.NewPublicPage(),
}
return page
}
func (p *locationPage) MustRender(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company, conn *database.Conn) {
p.Setup(r, user, company, conn)
row := conn.QueryRow(r.Context(), `
select coalesce(i18n.directions, location.directions)::text
, map_embed::text
from location
left join location_i18n as i18n on location.company_id = i18n.company_id and i18n.lang_tag = $1
where location.company_id = $2
`, user.Locale.Language, company.ID)
if err := row.Scan(&p.Directions, &p.MapEmbed); err != nil {
if !database.ErrorIsNotFound(err) {
panic(err)
}
}
template.MustRenderPublic(w, r, user, company, "location.gohtml", p)
}