The backend for the AiteStory website
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

211 lines
4.8 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. package controllers
  2. import (
  3. "fmt"
  4. "net/http"
  5. "strings"
  6. "time"
  7. "git.aiterp.net/gisle/wrouter/response"
  8. "git.aiterp.net/AiteRP/aitestory/model"
  9. "git.aiterp.net/AiteRP/aitestory/view"
  10. "git.aiterp.net/AiteRP/aitestory/viewmodel"
  11. "git.aiterp.net/gisle/wrouter"
  12. "git.aiterp.net/gisle/wrouter/auth"
  13. )
  14. // ListController serves the front page's list, with and without filters
  15. var ListController = wrouter.Router{}
  16. func listIndex(path string, w http.ResponseWriter, req *http.Request, user *auth.User) bool {
  17. var err error
  18. if req.Method != "GET" || len(req.URL.Path) > len(path) {
  19. return false
  20. }
  21. vm := viewmodel.IndexList{}
  22. vm.Headers, err = model.ListHeaders()
  23. vm.Categories = model.PageCategories
  24. vm.Setup(user, req.URL.Path, "Index")
  25. if err != nil {
  26. response.Text(w, 500, err.Error())
  27. return true
  28. }
  29. view.Render(w, "index", 200, vm)
  30. return true
  31. }
  32. func listFiltered(category model.PageCategory) wrouter.FunctionHandlerFunc {
  33. return func(path string, w http.ResponseWriter, req *http.Request, user *auth.User) bool {
  34. var err error
  35. if req.Method != "GET" || strings.LastIndex(req.URL.Path, "/") >= len(path) {
  36. return false
  37. }
  38. tagName := strings.Replace(req.URL.Path[len(path):], "_", " ", -1)
  39. vm := viewmodel.IndexList{}
  40. if tagName != "" {
  41. tag, err := model.FindTag("name", tagName, "")
  42. if err != nil {
  43. response.Text(w, 404, err.Error())
  44. return true
  45. }
  46. vm.ActiveTag = *tag
  47. vm.Headers, err = model.ListHeadersByTag(category.Key, tag)
  48. } else {
  49. vm.Headers, err = model.ListHeadersByCategory(category.Key)
  50. }
  51. vm.Categories = model.PageCategories
  52. vm.ActiveCategory = category
  53. vm.Setup(user, path, category.Plural)
  54. if err != nil {
  55. response.Text(w, 500, err.Error())
  56. return true
  57. }
  58. view.Render(w, "index", 200, vm)
  59. return true
  60. }
  61. }
  62. func listTagged(tagType string) wrouter.FunctionHandlerFunc {
  63. return func(path string, w http.ResponseWriter, req *http.Request, user *auth.User) bool {
  64. var err error
  65. if req.Method != "GET" || strings.LastIndex(req.URL.Path, "/") >= len(path) {
  66. return false
  67. }
  68. tagName := strings.Replace(req.URL.Path[len(path):], "_", " ", -1)
  69. vm := viewmodel.IndexList{}
  70. if tagName == "" {
  71. return false
  72. }
  73. tag, err := model.FindTag("name", tagName, tagType)
  74. if err != nil {
  75. response.Text(w, 404, err.Error())
  76. return true
  77. }
  78. vm.ActiveTag = *tag
  79. vm.Headers, err = model.ListHeadersByTag("", tag)
  80. vm.Categories = model.PageCategories
  81. vm.Setup(user, tag.Path(), tag.Name)
  82. if err != nil {
  83. response.Text(w, 500, err.Error())
  84. return true
  85. }
  86. view.Render(w, "index", 200, vm)
  87. return true
  88. }
  89. }
  90. func tagList(path string, w http.ResponseWriter, req *http.Request, user *auth.User) bool {
  91. //var err error
  92. if (req.Method != "GET" && req.Method != "POST") || len(req.URL.Path) > len(path) {
  93. return false
  94. }
  95. tl := viewmodel.IndexTags{}
  96. tl.Tags, _ = model.ListTags()
  97. tl.Setup(user, path)
  98. view.Render(w, "tags", 200, tl)
  99. return true
  100. }
  101. func listAuthor(path string, w http.ResponseWriter, req *http.Request, user *auth.User) bool {
  102. var err error
  103. if req.Method != "GET" || strings.LastIndex(req.URL.Path, "/") >= len(path) {
  104. return false
  105. }
  106. authorName := strings.Replace(req.URL.Path[len(path):], "_", " ", -1)
  107. vm := viewmodel.IndexList{}
  108. vm.ActiveAuthor = authorName
  109. vm.Headers, err = model.ListHeadersByAuthor(authorName)
  110. if err != nil {
  111. response.Text(w, 500, err.Error())
  112. return true
  113. }
  114. if len(vm.Headers) > 0 {
  115. authorName = vm.Headers[0].Author
  116. }
  117. vm.Categories = model.PageCategories
  118. vm.Setup(user, "/author/"+authorName, authorName)
  119. view.Render(w, "index", 200, vm)
  120. return true
  121. }
  122. func listDate(path string, w http.ResponseWriter, req *http.Request, user *auth.User) bool {
  123. var err error
  124. if req.Method != "GET" || strings.LastIndex(req.URL.Path, "/") >= len(path) {
  125. return false
  126. }
  127. date, err := time.Parse("2006-01", req.URL.Path[len(path):])
  128. if err != nil {
  129. response.Text(w, 400, "Invalid date")
  130. return true
  131. }
  132. vm := viewmodel.IndexList{}
  133. vm.ActiveDate = date.Format("January 2006")
  134. vm.ActiveDatePath = "/month/" + date.Format("2006-01")
  135. vm.Headers, err = model.ListHeadersByMonth(date.Year(), int(date.Month()))
  136. if err != nil {
  137. response.Text(w, 500, err.Error())
  138. return true
  139. }
  140. vm.Categories = model.PageCategories
  141. vm.Setup(user, "/month/"+date.Format("2006-01"), vm.ActiveDate)
  142. view.Render(w, "index", 200, vm)
  143. return true
  144. }
  145. func init() {
  146. ListController.Function("/", listIndex)
  147. ListController.Function("/tags/", tagList)
  148. ListController.Function("/author/", listAuthor)
  149. ListController.Function("/month/", listDate)
  150. for _, category := range model.PageCategories {
  151. ListController.Function(category.Path, listFiltered(category))
  152. }
  153. for _, tagType := range model.TagTypes {
  154. ListController.Function(fmt.Sprintf("/%s/", strings.ToLower(tagType)), listTagged(tagType))
  155. }
  156. }