package handlers import ( "database/sql" "net/http" "github.com/gin-gonic/gin" "github.com/HoHD/PR-Helper/models" ) type PageHandler struct { db *sql.DB } func NewPageHandler(db *sql.DB) *PageHandler { return &PageHandler{db: db} } // userData returns a gin.H with the current user info for template rendering. func userData(c *gin.Context) gin.H { user := GetCurrentUser(c) if user == nil { return gin.H{} } return gin.H{"User": user} } func (h *PageHandler) Index(c *gin.Context) { user := GetCurrentUser(c) if user == nil { c.Redirect(http.StatusFound, "/login") return } repos, _ := h.listRepos(user.ID) data := userData(c) data["Repos"] = repos c.HTML(http.StatusOK, "pages/index.html", data) } func (h *PageHandler) Repo(c *gin.Context) { user := GetCurrentUser(c) topN := "20" concurrency := "5" if user != nil { h.db.QueryRow("SELECT value FROM user_settings WHERE user_id = ? AND `key` = 'review.top_n'", user.ID).Scan(&topN) h.db.QueryRow("SELECT value FROM user_settings WHERE user_id = ? AND `key` = 'review.concurrency'", user.ID).Scan(&concurrency) } if topN == "" { topN = "20" } if concurrency == "" { concurrency = "5" } data := userData(c) data["ID"] = c.Param("id") data["TopN"] = topN data["Concurrency"] = concurrency c.HTML(http.StatusOK, "pages/repo.html", data) } func (h *PageHandler) Settings(c *gin.Context) { user := GetCurrentUser(c) settings := make(map[string]string) for key := range models.DefaultSettings { settings[key] = "" } if user != nil { rows, err := h.db.Query("SELECT `key`, value FROM user_settings WHERE user_id = ?", user.ID) if err == nil { defer rows.Close() for rows.Next() { var k, v string if rows.Scan(&k, &v) == nil { settings[k] = v } } } } data := userData(c) data["Settings"] = settings c.HTML(http.StatusOK, "pages/settings.html", data) } func (h *PageHandler) listRepos(userID int64) ([]models.Repository, error) { rows, err := h.db.Query(`SELECT id, url, local_path, size_bytes, cloned_at, last_used FROM repositories WHERE user_id = ? ORDER BY last_used DESC`, userID) if err != nil { return nil, err } defer rows.Close() var repos []models.Repository for rows.Next() { var r models.Repository if err := rows.Scan(&r.ID, &r.URL, &r.LocalPath, &r.SizeBytes, &r.ClonedAt, &r.LastUsed); err != nil { continue } repos = append(repos, r) } return repos, nil }