package web import ( _ "embed" "fmt" "html/template" "net/http" "path/filepath" "github.com/fgm/izidic" "github.com/gin-gonic/gin" "code.osinet.fr/fgm/sqs_demo/back/services" "code.osinet.fr/fgm/sqs_demo/back/services/redriver" "code.osinet.fr/fgm/sqs_demo/front" ) func SetupRoutes(rd redriver.Redriver, renderer *template.Template) *gin.Engine { const assetsPrefix = "/assets/" r := gin.Default() r.SetHTMLTemplate(renderer) r.SetTrustedProxies(nil) r.GET("/", makeHomeHandler(rd)) r.StaticFS(assetsPrefix, PrefixFileSystem(assetsPrefix, http.FS(front.Assets))) r.GET("/queue/:name", makeQueueHandler(rd)) return r } func HttpService(dic *izidic.Container) (any, error) { rd := dic.MustService(services.SvcRedriver).(redriver.Redriver) re := dic.MustService(services.SvcRenderer).(*template.Template) return SetupRoutes(rd, re), nil } func RendererService(dic *izidic.Container) (any, error) { renderer := template.New("redriver") renderer, err := renderer.New("queue-get").Parse(front.QueueGet) if err != nil { return nil, fmt.Errorf("failed parsing queue-get template") } return renderer, nil } // PrefixFileSystem converts a http.FileSystem by serving it requests prefixed // by the passed prefix, allowing rooted static directories matching the name // of an embed.FS. func PrefixFileSystem(prefix string, ifs http.FileSystem) http.FileSystem { return &prefixedFS{ prefix: prefix, ifs: ifs, } } type prefixedFS struct { prefix string ifs http.FileSystem } // Open implements http.FileSystem func (pfs *prefixedFS) Open(name string) (http.File, error) { return pfs.ifs.Open(filepath.Join(pfs.prefix, name)) }