102 lines
3.0 KiB
Go
102 lines
3.0 KiB
Go
|
|
package app
|
||
|
|
|
||
|
|
import (
|
||
|
|
"net/http"
|
||
|
|
"strconv"
|
||
|
|
"strings"
|
||
|
|
|
||
|
|
"archi_folio/internal/store"
|
||
|
|
)
|
||
|
|
|
||
|
|
func (s *Server) home(w http.ResponseWriter, r *http.Request) {
|
||
|
|
content, err := s.store.SiteContent(r.Context())
|
||
|
|
if err != nil {
|
||
|
|
s.error(w, err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
projects, err := s.store.Projects(r.Context(), true)
|
||
|
|
if err != nil {
|
||
|
|
s.error(w, err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
s.render(w, "home.html", pageData{Title: content.HeroTitle, Active: "home", Content: content, Projects: projects, CurrentPath: r.URL.Path})
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *Server) projects(w http.ResponseWriter, r *http.Request) {
|
||
|
|
content, err := s.store.SiteContent(r.Context())
|
||
|
|
if err != nil {
|
||
|
|
s.error(w, err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
projects, err := s.store.Projects(r.Context(), false)
|
||
|
|
if err != nil {
|
||
|
|
s.error(w, err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
s.render(w, "projects.html", pageData{Title: "Projects", Active: "projects", Content: content, Projects: projects, CurrentPath: r.URL.Path})
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *Server) projectDetail(w http.ResponseWriter, r *http.Request) {
|
||
|
|
content, err := s.store.SiteContent(r.Context())
|
||
|
|
if err != nil {
|
||
|
|
s.error(w, err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
project, err := s.store.ProjectBySlug(r.Context(), r.PathValue("slug"))
|
||
|
|
if store.IsNotFound(err) {
|
||
|
|
http.NotFound(w, r)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
if err != nil {
|
||
|
|
s.error(w, err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
s.render(w, "project.html", pageData{Title: project.Title, Active: "projects", Content: content, Project: project, CurrentPath: r.URL.Path})
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *Server) projectImageOverlay(w http.ResponseWriter, r *http.Request) {
|
||
|
|
id, err := strconv.ParseInt(r.PathValue("imageID"), 10, 64)
|
||
|
|
if err != nil {
|
||
|
|
http.NotFound(w, r)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
project, image, err := s.store.ProjectImageForSlug(r.Context(), r.PathValue("slug"), id)
|
||
|
|
if store.IsNotFound(err) {
|
||
|
|
http.NotFound(w, r)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
if err != nil {
|
||
|
|
s.error(w, err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
s.render(w, "overlay.html", pageData{Title: project.Title, Project: project, Image: image})
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *Server) about(w http.ResponseWriter, r *http.Request) {
|
||
|
|
content, err := s.store.SiteContent(r.Context())
|
||
|
|
if err != nil {
|
||
|
|
s.error(w, err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
s.render(w, "about.html", pageData{Title: "About", Active: "about", Content: content, CurrentPath: r.URL.Path})
|
||
|
|
}
|
||
|
|
|
||
|
|
func (s *Server) contact(w http.ResponseWriter, r *http.Request) {
|
||
|
|
if err := r.ParseForm(); err != nil {
|
||
|
|
s.render(w, "contact_result.html", pageData{Error: "Please check the form and try again."})
|
||
|
|
return
|
||
|
|
}
|
||
|
|
name := strings.TrimSpace(r.FormValue("name"))
|
||
|
|
email := strings.TrimSpace(r.FormValue("email"))
|
||
|
|
message := strings.TrimSpace(r.FormValue("message"))
|
||
|
|
if name == "" || email == "" || message == "" || !strings.Contains(email, "@") {
|
||
|
|
s.render(w, "contact_result.html", pageData{Error: "Please provide your name, a valid email, and a short message."})
|
||
|
|
return
|
||
|
|
}
|
||
|
|
if err := s.store.SaveContact(r.Context(), name, email, message); err != nil {
|
||
|
|
s.render(w, "contact_result.html", pageData{Error: "The request could not be saved. Please try again."})
|
||
|
|
return
|
||
|
|
}
|
||
|
|
s.render(w, "contact_result.html", pageData{Success: "Thanks. Your request has been saved and the studio will review it soon."})
|
||
|
|
}
|