package seo import ( "net/http" "time" apicontrollers "git.golem15.com/golem15/sm-seo-plugin/controllers/api" "git.golem15.com/golem15/summercms/modules/pact" "git.golem15.com/golem15/summercms/modules/surf" ) // BucketResolve is the throttle bucket of the public resolve endpoint. const BucketResolve = "seo-resolve" // Routes mounts the public /_seo/api/v1 endpoints. They carry no backend // middleware: the frontend server calls them anonymously. func (p *Plugin) Routes(r pact.Router) error { r.Group("/_seo/api/v1", surf.Use("throttle:"+BucketResolve), func(g pact.Router) { g.Get("/resolve", apicontrollers.Resolve(p.Service)) }) return nil } // Buckets registers seo-resolve: 600 requests a minute per client IP behind // the configured trusted proxies (the frontend server resolves every page // it renders). func (p *Plugin) Buckets() map[string]surf.Bucket { trusted := surf.TrustedProxies(nil) if p.app != nil { trusted = surf.TrustedProxies(p.app.Config) } return map[string]surf.Bucket{ BucketResolve: { Name: BucketResolve, Max: 600, Decay: time.Minute, Key: func(r *http.Request) string { return BucketResolve + "|" + surf.ClientIP(r, trusted) }, }, } }