2026-06-18 22:48:16 +08:00
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 }
}
2026-06-20 21:57:46 +08:00
// 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 }
}
2026-06-18 22:48:16 +08:00
func ( h * PageHandler ) Index ( c * gin . Context ) {
2026-06-20 21:57:46 +08:00
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 )
2026-06-18 22:48:16 +08:00
}
func ( h * PageHandler ) Repo ( c * gin . Context ) {
2026-06-20 21:57:46 +08:00
data := userData ( c )
data [ "ID" ] = c . Param ( "id" )
c . HTML ( http . StatusOK , "pages/repo.html" , data )
2026-06-18 22:48:16 +08:00
}
func ( h * PageHandler ) Generate ( c * gin . Context ) {
2026-06-20 21:57:46 +08:00
data := userData ( c )
data [ "ID" ] = c . Param ( "id" )
c . HTML ( http . StatusOK , "pages/generate.html" , data )
2026-06-18 22:48:16 +08:00
}
func ( h * PageHandler ) Review ( c * gin . Context ) {
2026-06-20 21:57:46 +08:00
user := GetCurrentUser ( c )
2026-06-18 22:48:16 +08:00
topN := "20"
2026-06-19 23:40:13 +08:00
concurrency := "5"
2026-06-20 21:57:46 +08:00
if user != nil {
2026-06-20 23:21:24 +08:00
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 )
2026-06-20 21:57:46 +08:00
}
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/review.html" , data )
2026-06-18 22:48:16 +08:00
}
func ( h * PageHandler ) Settings ( c * gin . Context ) {
2026-06-20 21:57:46 +08:00
user := GetCurrentUser ( c )
2026-06-18 22:48:16 +08:00
settings := make ( map [ string ] string )
for key := range models . DefaultSettings {
settings [ key ] = ""
}
2026-06-20 21:57:46 +08:00
if user != nil {
2026-06-20 23:21:24 +08:00
rows , err := h . db . Query ( "SELECT `key`, value FROM user_settings WHERE user_id = ?" , user . ID )
2026-06-20 21:57:46 +08:00
if err == nil {
defer rows . Close ()
for rows . Next () {
var k , v string
if rows . Scan ( & k , & v ) == nil {
settings [ k ] = v
}
2026-06-18 22:48:16 +08:00
}
}
}
2026-06-20 21:57:46 +08:00
data := userData ( c )
data [ "Settings" ] = settings
c . HTML ( http . StatusOK , "pages/settings.html" , data )
2026-06-18 22:48:16 +08:00
}
2026-06-20 21:57:46 +08:00
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 )
2026-06-18 22:48:16 +08:00
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
}