package api import ( "database/sql" "duhweb/internal/store" "html/template" "io" "net/http" "os" ) type ApiHandler struct { Templates *template.Template ProjectStore *store.SQLiteProjectStore ExperienceStore *store.SQLiteExperienceStore } type Layout struct { TemplateStore store.TemplateStore Project []store.Project Experience []store.ExperienceJSON } var layout = Layout{ TemplateStore: *store.NewTemplateStore(), } func (h *ApiHandler) Render(w http.ResponseWriter, tmpl string, data interface{}) { if err := h.Templates.ExecuteTemplate(w, tmpl, data); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } } func NewApiHandler(db *sql.DB) *ApiHandler { tmpl := template.Must(template.New("").ParseGlob("views/*.html")) template.Must(tmpl.ParseGlob("views/partials/*.html")) return &ApiHandler{ Templates: tmpl, ProjectStore: store.NewSQLiteProjectStore(db), ExperienceStore: store.NewSQLiteExperienceStore(db), } } func (h *ApiHandler) InitPage(w http.ResponseWriter, r *http.Request) { var hxRequest = r.Header.Get("HX-Request") if hxRequest != "true" { h.Render(w, "index", layout) return } h.Render(w, "about-partial", layout) } func (h *ApiHandler) ProjectsPage(w http.ResponseWriter, r *http.Request) { var hxRequest = r.Header.Get("HX-Request") projects, err := h.ProjectStore.GetAllProjects() if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } layout.Project = projects if hxRequest != "true" { h.Render(w, "projects", layout) return } h.Render(w, "projects-partial", layout.Project) } func (h *ApiHandler) ExperiencePage(w http.ResponseWriter, r *http.Request) { var hxRequest = r.Header.Get("HX-Request") // experiences, err := h.ExperienceStore.GetAllExperiences() experiences, err := store.GetAllExperiencesJSON() if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } layout.Experience = experiences if hxRequest != "true" { h.Render(w, "experience", layout) return } h.Render(w, "experience-partial", layout.Experience) } func (h *ApiHandler) MakeDownloadLink(w http.ResponseWriter, r *http.Request) { file, err := os.Open("./documents/DilankaHerath-CV.pdf") w.Header().Set("Hx-Trigger", "DownloadCVButton") if err != nil { http.Error(w, "Failed to open CV file", http.StatusInternalServerError) return } defer file.Close() w.Header().Set("Content-Type", "application/pdf") w.Header().Set("Content-Disposition", "attachment; filename=\"DilankaHerath-CV.pdf\"") _, err = io.Copy(w, file) if err != nil { return } }