main.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. "io/ioutil"
  6. "os"
  7. "strings"
  8. log "github.com/Sirupsen/logrus"
  9. haikunator "github.com/atrox/haikunatorgo"
  10. "github.com/gin-contrib/sessions"
  11. "github.com/gin-gonic/gin"
  12. )
  13. const sessionHeader = "slide-session"
  14. func NewApp() *gin.Engine {
  15. r := gin.Default()
  16. store := sessions.NewCookieStore([]byte("secret"))
  17. r.Use(sessions.Sessions(sessionHeader, store))
  18. r.LoadHTMLGlob("templates/*.tmpl")
  19. r.Static("/static", "./static")
  20. r.GET("/", func(c *gin.Context) {
  21. fname := c.Param("name")
  22. log.WithFields(log.Fields{
  23. "name": fname,
  24. }).Info("Restore?")
  25. haikunator := haikunator.New()
  26. haikunator.TokenLength = 0
  27. name := haikunator.Haikunate()
  28. path := fmt.Sprintf("slides/%s.md", name)
  29. log.WithFields(log.Fields{
  30. "path": path,
  31. }).Info("A new session")
  32. session := sessions.Default(c)
  33. session.Set("name", path)
  34. session.Save()
  35. c.HTML(200, "index.tmpl", gin.H{
  36. "pubTo": path,
  37. })
  38. })
  39. mustHaveSession := func(c *gin.Context) (string, error) {
  40. session := sessions.Default(c)
  41. val := session.Get("name")
  42. emptySession := errors.New("Emtpy session")
  43. if val == nil {
  44. c.String(400, "No context")
  45. return "", emptySession
  46. }
  47. log.WithFields(log.Fields{
  48. "path": val,
  49. }).Info("Got session")
  50. path, ok := val.(string)
  51. if !ok {
  52. c.String(400, "No context")
  53. return "", emptySession
  54. }
  55. return path, nil
  56. }
  57. r.GET("/slides.md", func(c *gin.Context) {
  58. path, err := mustHaveSession(c)
  59. if err != nil {
  60. return
  61. }
  62. if _, err := os.Stat(path); err != nil {
  63. // copy sample markdown file to the path
  64. body, err := ioutil.ReadFile("initial-slides.md")
  65. if err != nil {
  66. panic(err)
  67. }
  68. ioutil.WriteFile(path, body, 0644)
  69. c.String(200, string(body))
  70. return
  71. }
  72. body, err := ioutil.ReadFile(path)
  73. if err != nil {
  74. panic(err)
  75. }
  76. c.String(200, string(body))
  77. })
  78. r.PUT("/slides.md", func(c *gin.Context) {
  79. path, err := mustHaveSession(c)
  80. if err != nil {
  81. return
  82. }
  83. body, _ := ioutil.ReadAll(c.Request.Body)
  84. ioutil.WriteFile(path, body, 0644)
  85. log.WithFields(log.Fields{
  86. "size": len(body),
  87. "file": path,
  88. }).Info("Wrote to file")
  89. c.String(200, "")
  90. })
  91. r.GET("/stash", func(c *gin.Context) {
  92. files, err := ioutil.ReadDir("slides")
  93. if err != nil {
  94. log.Fatal(err)
  95. }
  96. var stash []string
  97. for _, file := range files {
  98. stash = append(stash, file.Name())
  99. }
  100. c.HTML(200, "stash.tmpl", gin.H{
  101. "stash": stash,
  102. })
  103. })
  104. r.GET("/stash/edit/:name", func(c *gin.Context) {
  105. name := c.Param("name")
  106. log.WithFields(log.Fields{
  107. "name": name,
  108. }).Info("Restore session?")
  109. if strings.HasSuffix(name, ".md") {
  110. name = name[0 : len(name)-3]
  111. }
  112. path := fmt.Sprintf("slides/%s.md", name)
  113. session := sessions.Default(c)
  114. session.Set("name", path)
  115. session.Save()
  116. c.HTML(200, "index.tmpl", gin.H{
  117. "pubTo": path,
  118. })
  119. })
  120. r.GET("/published/slides/:name", func(c *gin.Context) {
  121. name := c.Param("name")
  122. log.WithFields(log.Fields{
  123. "name": name,
  124. }).Info("Published")
  125. if strings.HasSuffix(name, ".md") {
  126. name = name[0 : len(name)-3]
  127. }
  128. path := fmt.Sprintf("slides/%s.md", name)
  129. session := sessions.Default(c)
  130. session.Set("name", path)
  131. session.Save()
  132. c.HTML(200, "slides.tmpl", gin.H{
  133. "pubTo": path,
  134. })
  135. })
  136. return r
  137. }
  138. func main() {
  139. r := NewApp()
  140. port := "8080"
  141. if len(os.Args) > 1 {
  142. port = os.Args[1]
  143. } else {
  144. envPort := os.Getenv("PORT")
  145. if len(envPort) > 0 {
  146. port = envPort
  147. }
  148. }
  149. log.Info("Started http://0.0.0.0:8080")
  150. r.Run(fmt.Sprintf(":%s", port))
  151. }