routes.go 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package web
  2. import (
  3. _ "embed"
  4. "fmt"
  5. "html/template"
  6. "net/http"
  7. "path/filepath"
  8. "github.com/davecgh/go-spew/spew"
  9. "github.com/fgm/izidic"
  10. "github.com/gin-contrib/sessions"
  11. "github.com/gin-contrib/sessions/cookie"
  12. "github.com/gin-gonic/gin"
  13. "code.osinet.fr/fgm/sqs_demo/back/services"
  14. "code.osinet.fr/fgm/sqs_demo/back/services/redriver"
  15. "code.osinet.fr/fgm/sqs_demo/front"
  16. )
  17. func SetupRoutes(rd redriver.Redriver, renderer *template.Template, secret []byte) *gin.Engine {
  18. const assetsPrefix = "/assets/"
  19. r := gin.Default()
  20. r.SetHTMLTemplate(renderer)
  21. r.SetTrustedProxies(nil)
  22. store := cookie.NewStore(secret)
  23. r.Use(sessions.Sessions("defaultsession", store))
  24. // Done
  25. r.StaticFS(assetsPrefix, PrefixFileSystem(assetsPrefix, http.FS(front.Assets)))
  26. r.GET("/queue", gin.WrapH(http.RedirectHandler("/", http.StatusMovedPermanently)))
  27. // Back done, front WIP
  28. r.GET("/queue/:name", makeQueueHandler(rd))
  29. // JSON done
  30. r.GET("/", makeHomeHandler(rd))
  31. // TODO
  32. r.GET("/queue/:name/delete", makeDeleteHandler(rd))
  33. r.POST("/queue/:name/delete", makeDeleteConfirmHandler(rd))
  34. r.GET("/queue/:name/purge", makePurgeHandler(rd))
  35. r.POST("/queue/:name/purge", makePurgeConfirmHandler(rd))
  36. r.POST("/queue/:name/redrive", makeRedriveHandler(rd))
  37. return r
  38. }
  39. func HttpService(dic *izidic.Container) (any, error) {
  40. secret := dic.MustParam(services.PSecret).([]byte)
  41. rd := dic.MustService(services.SvcRedriver).(redriver.Redriver)
  42. re := dic.MustService(services.SvcRenderer).(*template.Template)
  43. return SetupRoutes(rd, re, secret), nil
  44. }
  45. func RendererService(dic *izidic.Container) (any, error) {
  46. var err error
  47. renderer := template.New("redriver").Funcs(template.FuncMap{
  48. "dump": func(args ...any) template.HTML {
  49. return template.HTML("<pre>") + template.HTML(spew.Sdump(args...)) + template.HTML("</pre>\n")
  50. },
  51. })
  52. for _, tpl := range []struct {
  53. name string
  54. value string
  55. }{
  56. {"confirm", front.Confirm},
  57. {"flashes", front.Flashes},
  58. {"queue-get", front.QueueGet},
  59. } {
  60. renderer, err = renderer.New(tpl.name).Parse(tpl.value)
  61. if err != nil {
  62. return nil, fmt.Errorf("failed parsing %q template: %w", tpl.name, err)
  63. }
  64. }
  65. return renderer, nil
  66. }
  67. // PrefixFileSystem converts a http.FileSystem by serving it requests prefixed
  68. // by the passed prefix, allowing rooted static directories matching the name
  69. // of an embed.FS.
  70. func PrefixFileSystem(prefix string, ifs http.FileSystem) http.FileSystem {
  71. return &prefixedFS{
  72. prefix: prefix,
  73. ifs: ifs,
  74. }
  75. }
  76. type prefixedFS struct {
  77. prefix string
  78. ifs http.FileSystem
  79. }
  80. // Open implements http.FileSystem
  81. func (pfs *prefixedFS) Open(name string) (http.File, error) {
  82. return pfs.ifs.Open(filepath.Join(pfs.prefix, name))
  83. }