routes.go 2.4 KB

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