/* * SPDX-FileCopyrightText: 2023 jordi fita mas * SPDX-License-Identifier: AGPL-3.0-only */ package app import ( "net/http" "dev.tandem.ws/tandem/camper/pkg/auth" "dev.tandem.ws/tandem/camper/pkg/campsite" "dev.tandem.ws/tandem/camper/pkg/database" "dev.tandem.ws/tandem/camper/pkg/home" httplib "dev.tandem.ws/tandem/camper/pkg/http" "dev.tandem.ws/tandem/camper/pkg/services" "dev.tandem.ws/tandem/camper/pkg/template" ) type publicHandler struct { home *home.PublicHandler campsite *campsite.PublicHandler services *services.PublicHandler } func newPublicHandler() *publicHandler { return &publicHandler{ home: home.NewPublicHandler(), campsite: campsite.NewPublicHandler(), services: services.NewPublicHandler(), } } 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 "": h.home.Handler(user, company, conn).ServeHTTP(w, r) case "campground": campgroundHandler(user, company, conn).ServeHTTP(w, r) case "campsites": h.campsite.Handler(user, company, conn).ServeHTTP(w, r) case "contact": contactHandler(user, company, conn).ServeHTTP(w, r) case "services": h.services.Handler(user, company, conn).ServeHTTP(w, r) case "surroundings": surroundingsHandler(user, company, conn).ServeHTTP(w, r) default: http.NotFound(w, r) } }) } func surroundingsHandler(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 := template.NewPublicPage() page.Setup(r, user, company, conn) template.MustRenderPublic(w, r, user, company, "surroundings.gohtml", page) default: httplib.MethodNotAllowed(w, r, http.MethodGet) } default: http.NotFound(w, r) } }) } func campgroundHandler(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 := template.NewPublicPage() page.Setup(r, user, company, conn) template.MustRenderPublicFiles(w, r, user, company, page, "campground.gohtml", "web/templates/campground_map.svg") default: httplib.MethodNotAllowed(w, r, http.MethodGet) } default: http.NotFound(w, r) } }) } func contactHandler(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 := newContactPage() page.MustRender(w, r, user, company, conn) default: httplib.MethodNotAllowed(w, r, http.MethodGet) } default: http.NotFound(w, r) } }) } type contactPage struct { *template.PublicPage CompanyGeography *geographyPoint } func newContactPage() *contactPage { page := &contactPage{ PublicPage: template.NewPublicPage(), } return page } func (p *contactPage) 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 st_x(geog::geometry)::text, st_y(geog::geometry)::text from company_geography where company_id = $1`, company.ID) geography := &geographyPoint{} if err := row.Scan(&geography.Lng, &geography.Lat); err != nil { if !database.ErrorIsNotFound(err) { panic(err) } } else { p.CompanyGeography = geography } template.MustRenderPublic(w, r, user, company, "contact.gohtml", p) } type geographyPoint struct { Lat string Lng string }