package handlers import ( "strings" "github.com/gin-gonic/gin" ) // DefaultData builds a base gin.H map populated with values set by the // SetUserContext middleware (translations, language, auth state). Handlers // add page-specific fields on top and pass it to c.HTML(). func DefaultData(c *gin.Context) gin.H { tr, _ := c.Get("tr") isLoggedIn, _ := c.Get("is_logged_in") username, _ := c.Get("username") lang, _ := c.Get("lang") switchLang, _ := c.Get("switch_lang") avatar, _ := c.Get("avatar") displayName, _ := c.Get("display_name") role, _ := c.Get("role") siteSetting, _ := c.Get("site_setting") siteLogo, _ := c.Get("site_logo") siteLogoIsURL, _ := c.Get("site_logo_is_url") siteFavicon, _ := c.Get("site_favicon") siteFaviconIsURL, _ := c.Get("site_favicon_is_url") siteLogoText, _ := c.Get("site_logo_text") siteHeaderText, _ := c.Get("site_header_text") siteHomeWelcome, _ := c.Get("site_home_welcome") siteHomeSubtitle, _ := c.Get("site_home_subtitle") siteFooterText, _ := c.Get("site_footer_text") navLinks, _ := c.Get("nav_links") return gin.H{ "Tr": tr, "IsLoggedIn": isLoggedIn, "Username": username, "Lang": lang, "SwitchLang": switchLang, "Avatar": avatar, "DisplayName": displayName, "Role": role, "SiteSetting": siteSetting, "SiteLogo": siteLogo, "SiteLogoIsURL": siteLogoIsURL, "SiteFavicon": siteFavicon, "SiteFaviconIsURL": siteFaviconIsURL, "SiteLogoText": siteLogoText, "SiteHeaderText": siteHeaderText, "SiteHomeWelcome": siteHomeWelcome, "SiteHomeSubtitle": siteHomeSubtitle, "SiteFooterText": siteFooterText, "NavLinks": navLinks, } } // getTr is a convenience helper that returns the translation map from the // Gin context, falling back to an empty map if not set. func getTr(c *gin.Context) map[string]string { tr, ok := c.Get("tr") if !ok { return map[string]string{} } m, ok := tr.(map[string]string) if !ok { return map[string]string{} } return m } // GetClientIP extracts the real client IP address, accounting for CDN/reverse proxy setups. // It checks X-Forwarded-For and X-Real-IP headers before falling back to c.ClientIP(). func GetClientIP(c *gin.Context) string { if xff := c.GetHeader("X-Forwarded-For"); xff != "" { if i := strings.IndexByte(xff, ','); i != -1 { return strings.TrimSpace(xff[:i]) } return strings.TrimSpace(xff) } if xri := c.GetHeader("X-Real-IP"); xri != "" { return strings.TrimSpace(xri) } return c.ClientIP() }