category.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. // Copyright 2017 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. package controller
  5. import (
  6. "errors"
  7. "github.com/miniflux/miniflux2/model"
  8. "github.com/miniflux/miniflux2/server/core"
  9. "github.com/miniflux/miniflux2/server/ui/form"
  10. "log"
  11. )
  12. func (c *Controller) ShowCategories(ctx *core.Context, request *core.Request, response *core.Response) {
  13. args, err := c.getCommonTemplateArgs(ctx)
  14. if err != nil {
  15. response.Html().ServerError(err)
  16. return
  17. }
  18. user := ctx.GetLoggedUser()
  19. categories, err := c.store.GetCategoriesWithFeedCount(user.ID)
  20. if err != nil {
  21. response.Html().ServerError(err)
  22. return
  23. }
  24. response.Html().Render("categories", args.Merge(tplParams{
  25. "categories": categories,
  26. "total": len(categories),
  27. "menu": "categories",
  28. }))
  29. }
  30. func (c *Controller) ShowCategoryEntries(ctx *core.Context, request *core.Request, response *core.Response) {
  31. user := ctx.GetLoggedUser()
  32. offset := request.GetQueryIntegerParam("offset", 0)
  33. args, err := c.getCommonTemplateArgs(ctx)
  34. if err != nil {
  35. response.Html().ServerError(err)
  36. return
  37. }
  38. category, err := c.getCategoryFromURL(ctx, request, response)
  39. if err != nil {
  40. return
  41. }
  42. builder := c.store.GetEntryQueryBuilder(user.ID, user.Timezone)
  43. builder.WithCategoryID(category.ID)
  44. builder.WithOrder(model.DefaultSortingOrder)
  45. builder.WithDirection(model.DefaultSortingDirection)
  46. builder.WithOffset(offset)
  47. builder.WithLimit(NbItemsPerPage)
  48. entries, err := builder.GetEntries()
  49. if err != nil {
  50. response.Html().ServerError(err)
  51. return
  52. }
  53. count, err := builder.CountEntries()
  54. if err != nil {
  55. response.Html().ServerError(err)
  56. return
  57. }
  58. response.Html().Render("category_entries", args.Merge(tplParams{
  59. "category": category,
  60. "entries": entries,
  61. "total": count,
  62. "pagination": c.getPagination(ctx.GetRoute("categoryEntries", "categoryID", category.ID), count, offset),
  63. "menu": "categories",
  64. }))
  65. }
  66. func (c *Controller) CreateCategory(ctx *core.Context, request *core.Request, response *core.Response) {
  67. args, err := c.getCommonTemplateArgs(ctx)
  68. if err != nil {
  69. response.Html().ServerError(err)
  70. return
  71. }
  72. response.Html().Render("create_category", args.Merge(tplParams{
  73. "menu": "categories",
  74. }))
  75. }
  76. func (c *Controller) SaveCategory(ctx *core.Context, request *core.Request, response *core.Response) {
  77. user := ctx.GetLoggedUser()
  78. args, err := c.getCommonTemplateArgs(ctx)
  79. if err != nil {
  80. response.Html().ServerError(err)
  81. return
  82. }
  83. categoryForm := form.NewCategoryForm(request.GetRequest())
  84. if err := categoryForm.Validate(); err != nil {
  85. response.Html().Render("create_category", args.Merge(tplParams{
  86. "errorMessage": err.Error(),
  87. }))
  88. return
  89. }
  90. category := model.Category{Title: categoryForm.Title, UserID: user.ID}
  91. err = c.store.CreateCategory(&category)
  92. if err != nil {
  93. log.Println(err)
  94. response.Html().Render("create_category", args.Merge(tplParams{
  95. "errorMessage": "Unable to create this category.",
  96. }))
  97. return
  98. }
  99. response.Redirect(ctx.GetRoute("categories"))
  100. }
  101. func (c *Controller) EditCategory(ctx *core.Context, request *core.Request, response *core.Response) {
  102. user := ctx.GetLoggedUser()
  103. category, err := c.getCategoryFromURL(ctx, request, response)
  104. if err != nil {
  105. log.Println(err)
  106. return
  107. }
  108. args, err := c.getCategoryFormTemplateArgs(ctx, user, category, nil)
  109. if err != nil {
  110. response.Html().ServerError(err)
  111. return
  112. }
  113. response.Html().Render("edit_category", args)
  114. }
  115. func (c *Controller) UpdateCategory(ctx *core.Context, request *core.Request, response *core.Response) {
  116. user := ctx.GetLoggedUser()
  117. category, err := c.getCategoryFromURL(ctx, request, response)
  118. if err != nil {
  119. log.Println(err)
  120. return
  121. }
  122. categoryForm := form.NewCategoryForm(request.GetRequest())
  123. args, err := c.getCategoryFormTemplateArgs(ctx, user, category, categoryForm)
  124. if err != nil {
  125. response.Html().ServerError(err)
  126. return
  127. }
  128. if err := categoryForm.Validate(); err != nil {
  129. response.Html().Render("edit_category", args.Merge(tplParams{
  130. "errorMessage": err.Error(),
  131. }))
  132. return
  133. }
  134. err = c.store.UpdateCategory(categoryForm.Merge(category))
  135. if err != nil {
  136. log.Println(err)
  137. response.Html().Render("edit_category", args.Merge(tplParams{
  138. "errorMessage": "Unable to update this category.",
  139. }))
  140. return
  141. }
  142. response.Redirect(ctx.GetRoute("categories"))
  143. }
  144. func (c *Controller) RemoveCategory(ctx *core.Context, request *core.Request, response *core.Response) {
  145. user := ctx.GetLoggedUser()
  146. category, err := c.getCategoryFromURL(ctx, request, response)
  147. if err != nil {
  148. return
  149. }
  150. if err := c.store.RemoveCategory(user.ID, category.ID); err != nil {
  151. response.Html().ServerError(err)
  152. return
  153. }
  154. response.Redirect(ctx.GetRoute("categories"))
  155. }
  156. func (c *Controller) getCategoryFromURL(ctx *core.Context, request *core.Request, response *core.Response) (*model.Category, error) {
  157. categoryID, err := request.GetIntegerParam("categoryID")
  158. if err != nil {
  159. response.Html().BadRequest(err)
  160. return nil, err
  161. }
  162. user := ctx.GetLoggedUser()
  163. category, err := c.store.GetCategory(user.ID, categoryID)
  164. if err != nil {
  165. response.Html().ServerError(err)
  166. return nil, err
  167. }
  168. if category == nil {
  169. response.Html().NotFound()
  170. return nil, errors.New("Category not found")
  171. }
  172. return category, nil
  173. }
  174. func (c *Controller) getCategoryFormTemplateArgs(ctx *core.Context, user *model.User, category *model.Category, categoryForm *form.CategoryForm) (tplParams, error) {
  175. args, err := c.getCommonTemplateArgs(ctx)
  176. if err != nil {
  177. return nil, err
  178. }
  179. if categoryForm == nil {
  180. args["form"] = form.CategoryForm{
  181. Title: category.Title,
  182. }
  183. } else {
  184. args["form"] = categoryForm
  185. }
  186. args["category"] = category
  187. args["menu"] = "categories"
  188. return args, nil
  189. }