118 lines
2.7 KiB
Go
118 lines
2.7 KiB
Go
|
|
package handlers
|
||
|
|
|
||
|
|
import (
|
||
|
|
"net/http"
|
||
|
|
|
||
|
|
"github.com/juanatsap/cv-site/internal/models"
|
||
|
|
"github.com/juanatsap/cv-site/internal/templates"
|
||
|
|
)
|
||
|
|
|
||
|
|
// CVHandler handles CV-related requests
|
||
|
|
type CVHandler struct {
|
||
|
|
templates *templates.Manager
|
||
|
|
}
|
||
|
|
|
||
|
|
// NewCVHandler creates a new CV handler
|
||
|
|
func NewCVHandler(tmpl *templates.Manager) *CVHandler {
|
||
|
|
return &CVHandler{
|
||
|
|
templates: tmpl,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Home renders the full CV page
|
||
|
|
func (h *CVHandler) Home(w http.ResponseWriter, r *http.Request) {
|
||
|
|
// Get language from query parameter, default to English
|
||
|
|
lang := r.URL.Query().Get("lang")
|
||
|
|
if lang == "" {
|
||
|
|
lang = "en"
|
||
|
|
}
|
||
|
|
|
||
|
|
// Validate language
|
||
|
|
if lang != "en" && lang != "es" {
|
||
|
|
HandleError(w, r, BadRequestError("Unsupported language. Use 'en' or 'es'"))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
// Load CV data
|
||
|
|
cv, err := models.LoadCV(lang)
|
||
|
|
if err != nil {
|
||
|
|
HandleError(w, r, DataLoadError(err, "CV"))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
// Prepare template data
|
||
|
|
data := map[string]interface{}{
|
||
|
|
"CV": cv,
|
||
|
|
"Lang": lang,
|
||
|
|
}
|
||
|
|
|
||
|
|
// Render template
|
||
|
|
tmpl, err := h.templates.Render("index.html")
|
||
|
|
if err != nil {
|
||
|
|
HandleError(w, r, TemplateError(err, "index.html"))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||
|
|
if err := tmpl.Execute(w, data); err != nil {
|
||
|
|
HandleError(w, r, TemplateError(err, "index.html"))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// CVContent renders just the CV content for HTMX swaps
|
||
|
|
func (h *CVHandler) CVContent(w http.ResponseWriter, r *http.Request) {
|
||
|
|
// Get language from query parameter
|
||
|
|
lang := r.URL.Query().Get("lang")
|
||
|
|
if lang == "" {
|
||
|
|
lang = "en"
|
||
|
|
}
|
||
|
|
|
||
|
|
// Validate language
|
||
|
|
if lang != "en" && lang != "es" {
|
||
|
|
HandleError(w, r, BadRequestError("Unsupported language. Use 'en' or 'es'"))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
// Load CV data
|
||
|
|
cv, err := models.LoadCV(lang)
|
||
|
|
if err != nil {
|
||
|
|
HandleError(w, r, DataLoadError(err, "CV"))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
// Prepare template data
|
||
|
|
data := map[string]interface{}{
|
||
|
|
"CV": cv,
|
||
|
|
"Lang": lang,
|
||
|
|
}
|
||
|
|
|
||
|
|
// Render template
|
||
|
|
tmpl, err := h.templates.Render("cv-content.html")
|
||
|
|
if err != nil {
|
||
|
|
HandleError(w, r, TemplateError(err, "cv-content.html"))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||
|
|
if err := tmpl.Execute(w, data); err != nil {
|
||
|
|
HandleError(w, r, TemplateError(err, "cv-content.html"))
|
||
|
|
return
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// ExportPDF handles PDF export requests
|
||
|
|
// For now, redirects to print-friendly version
|
||
|
|
// In production, integrate with chromedp or similar for actual PDF generation
|
||
|
|
func (h *CVHandler) ExportPDF(w http.ResponseWriter, r *http.Request) {
|
||
|
|
// Get language from query parameter
|
||
|
|
lang := r.URL.Query().Get("lang")
|
||
|
|
if lang == "" {
|
||
|
|
lang = "en"
|
||
|
|
}
|
||
|
|
|
||
|
|
// Redirect to print-friendly version
|
||
|
|
// The browser's print dialog will handle PDF generation
|
||
|
|
http.Redirect(w, r, "/?lang="+lang+"&print=true", http.StatusSeeOther)
|
||
|
|
}
|