package handlers import ( "html/template" "log" "net/http" "path/filepath" "custom-start-page/internal/middleware" "custom-start-page/internal/models" "custom-start-page/internal/services" ) // DashboardHandler handles dashboard-related HTTP requests type DashboardHandler struct { pageService services.PageServiceInterface templates *template.Template } // NewDashboardHandler creates a new dashboard handler func NewDashboardHandler(pageService services.PageServiceInterface) *DashboardHandler { // Parse templates templates := template.Must(template.ParseGlob(filepath.Join("templates", "*.html"))) template.Must(templates.ParseGlob(filepath.Join("templates", "layouts", "*.html"))) template.Must(templates.ParseGlob(filepath.Join("templates", "partials", "*.html"))) return &DashboardHandler{ pageService: pageService, templates: templates, } } // HandleDashboard displays the dashboard page // GET /dashboard func (h *DashboardHandler) HandleDashboard(w http.ResponseWriter, r *http.Request) { // Get user ID from context (set by auth middleware) userID, ok := middleware.GetUserIDFromContext(r.Context()) if !ok { http.Error(w, "User ID not found in context", http.StatusInternalServerError) return } // Fetch user's pages from database pages, err := h.pageService.GetPages(r.Context(), userID) if err != nil { log.Printf("Failed to get pages: %v", err) http.Error(w, "Failed to load pages", http.StatusInternalServerError) return } // If user has no pages, create default "Home" page if len(pages) == 0 { defaultPage, err := h.pageService.CreateDefaultPage(r.Context(), userID) if err != nil { log.Printf("Failed to create default page: %v", err) http.Error(w, "Failed to create default page", http.StatusInternalServerError) return } pages = []*models.Page{defaultPage} } // Render dashboard template data := map[string]interface{}{ "UserID": userID, "Pages": pages, } if err := h.templates.ExecuteTemplate(w, "dashboard.html", data); err != nil { log.Printf("Failed to render dashboard template: %v", err) http.Error(w, "Internal server error", http.StatusInternalServerError) } }