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))
}