refactor: dependency injection instead of package globals (#57)

* refactor: export Settings type, Setup returns value

* refactor: resolver.Setup takes explicit Settings struct

* refactor: GetHeadersWithoutTrustedHeaders takes explicit header params

* refactor: server constructors take narrow config

* refactor: Router struct with handler methods, remove geoSvc global

* refactor: wire DI through main, remove setting.App references

* refactor: remove App global, use returned Settings

* refactor: update router tests for DI

* chore: fix lint issues — rename ServerTimeouts to Timeouts, fix shadowed variables
This commit is contained in:
2026-07-21 18:37:21 +02:00
committed by GitHub
parent 3874f6af3f
commit 2e32a20f60
19 changed files with 298 additions and 253 deletions
+34 -20
View File
@@ -4,35 +4,49 @@ import (
"html/template"
"log"
"github.com/dcarrillo/whatismyip/internal/setting"
"github.com/dcarrillo/whatismyip/service"
"github.com/gin-gonic/gin"
)
var geoSvc *service.Geo
type Router struct {
geo *service.Geo
trustedHeader string
trustedPortHeader string
templatePath string
disableScan bool
}
func SetupTemplate(r *gin.Engine) {
if setting.App.TemplatePath == "" {
func NewRouter(geo *service.Geo, trustedHeader, trustedPortHeader, templatePath string, disableScan bool) *Router {
return &Router{
geo: geo,
trustedHeader: trustedHeader,
trustedPortHeader: trustedPortHeader,
templatePath: templatePath,
disableScan: disableScan,
}
}
func SetupTemplate(r *gin.Engine, templatePath string) {
if templatePath == "" {
r.SetHTMLTemplate(template.Must(template.New("home").Parse(home)))
} else {
log.Printf("Template %s has been loaded", setting.App.TemplatePath)
r.LoadHTMLFiles(setting.App.TemplatePath)
log.Printf("Template %s has been loaded", templatePath)
r.LoadHTMLFiles(templatePath)
}
}
func Setup(r *gin.Engine, geo *service.Geo) {
geoSvc = geo
r.GET("/", getRoot)
if !setting.App.DisableTCPScan {
r.GET("/scan/tcp/:port", scanTCPPort)
func Setup(r *gin.Engine, rt *Router) {
r.GET("/", rt.getRoot)
if !rt.disableScan {
r.GET("/scan/tcp/:port", rt.scanTCPPort)
}
r.GET("/client-port", getClientPortAsString)
r.GET("/geo", getGeoAsString)
r.GET("/geo/:field", getGeoAsString)
r.GET("/asn", getASNAsString)
r.GET("/asn/:field", getASNAsString)
r.GET("/headers", getHeadersAsSortedString)
r.GET("/all", getAllAsString)
r.GET("/json", getJSON)
r.GET("/:header", getHeaderAsString)
r.GET("/client-port", rt.getClientPortAsString)
r.GET("/geo", rt.getGeoAsString)
r.GET("/geo/:field", rt.getGeoAsString)
r.GET("/asn", rt.getASNAsString)
r.GET("/asn/:field", rt.getASNAsString)
r.GET("/headers", rt.getHeadersAsSortedString)
r.GET("/all", rt.getAllAsString)
r.GET("/json", rt.getJSON)
r.GET("/:header", rt.getHeaderAsString)
}