category.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  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. "log"
  8. "github.com/miniflux/miniflux2/model"
  9. "github.com/miniflux/miniflux2/server/core"
  10. "github.com/miniflux/miniflux2/server/ui/form"
  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. duplicateCategory, err := c.store.GetCategoryByTitle(user.ID, categoryForm.Title)
  91. if err != nil {
  92. response.Html().ServerError(err)
  93. return
  94. }
  95. if duplicateCategory != nil {
  96. response.Html().Render("create_category", args.Merge(tplParams{
  97. "errorMessage": "This category already exists.",
  98. }))
  99. return
  100. }
  101. category := model.Category{Title: categoryForm.Title, UserID: user.ID}
  102. err = c.store.CreateCategory(&category)
  103. if err != nil {
  104. log.Println(err)
  105. response.Html().Render("create_category", args.Merge(tplParams{
  106. "errorMessage": "Unable to create this category.",
  107. }))
  108. return
  109. }
  110. response.Redirect(ctx.GetRoute("categories"))
  111. }
  112. func (c *Controller) EditCategory(ctx *core.Context, request *core.Request, response *core.Response) {
  113. user := ctx.GetLoggedUser()
  114. category, err := c.getCategoryFromURL(ctx, request, response)
  115. if err != nil {
  116. log.Println(err)
  117. return
  118. }
  119. args, err := c.getCategoryFormTemplateArgs(ctx, user, category, nil)
  120. if err != nil {
  121. response.Html().ServerError(err)
  122. return
  123. }
  124. response.Html().Render("edit_category", args)
  125. }
  126. func (c *Controller) UpdateCategory(ctx *core.Context, request *core.Request, response *core.Response) {
  127. user := ctx.GetLoggedUser()
  128. category, err := c.getCategoryFromURL(ctx, request, response)
  129. if err != nil {
  130. log.Println(err)
  131. return
  132. }
  133. categoryForm := form.NewCategoryForm(request.GetRequest())
  134. args, err := c.getCategoryFormTemplateArgs(ctx, user, category, categoryForm)
  135. if err != nil {
  136. response.Html().ServerError(err)
  137. return
  138. }
  139. if err := categoryForm.Validate(); err != nil {
  140. response.Html().Render("edit_category", args.Merge(tplParams{
  141. "errorMessage": err.Error(),
  142. }))
  143. return
  144. }
  145. if c.store.AnotherCategoryExists(user.ID, category.ID, categoryForm.Title) {
  146. response.Html().Render("edit_category", args.Merge(tplParams{
  147. "errorMessage": "This category already exists.",
  148. }))
  149. return
  150. }
  151. err = c.store.UpdateCategory(categoryForm.Merge(category))
  152. if err != nil {
  153. log.Println(err)
  154. response.Html().Render("edit_category", args.Merge(tplParams{
  155. "errorMessage": "Unable to update this category.",
  156. }))
  157. return
  158. }
  159. response.Redirect(ctx.GetRoute("categories"))
  160. }
  161. func (c *Controller) RemoveCategory(ctx *core.Context, request *core.Request, response *core.Response) {
  162. user := ctx.GetLoggedUser()
  163. category, err := c.getCategoryFromURL(ctx, request, response)
  164. if err != nil {
  165. return
  166. }
  167. if err := c.store.RemoveCategory(user.ID, category.ID); err != nil {
  168. response.Html().ServerError(err)
  169. return
  170. }
  171. response.Redirect(ctx.GetRoute("categories"))
  172. }
  173. func (c *Controller) getCategoryFromURL(ctx *core.Context, request *core.Request, response *core.Response) (*model.Category, error) {
  174. categoryID, err := request.GetIntegerParam("categoryID")
  175. if err != nil {
  176. response.Html().BadRequest(err)
  177. return nil, err
  178. }
  179. user := ctx.GetLoggedUser()
  180. category, err := c.store.GetCategory(user.ID, categoryID)
  181. if err != nil {
  182. response.Html().ServerError(err)
  183. return nil, err
  184. }
  185. if category == nil {
  186. response.Html().NotFound()
  187. return nil, errors.New("Category not found")
  188. }
  189. return category, nil
  190. }
  191. func (c *Controller) getCategoryFormTemplateArgs(ctx *core.Context, user *model.User, category *model.Category, categoryForm *form.CategoryForm) (tplParams, error) {
  192. args, err := c.getCommonTemplateArgs(ctx)
  193. if err != nil {
  194. return nil, err
  195. }
  196. if categoryForm == nil {
  197. args["form"] = form.CategoryForm{
  198. Title: category.Title,
  199. }
  200. } else {
  201. args["form"] = categoryForm
  202. }
  203. args["category"] = category
  204. args["menu"] = "categories"
  205. return args, nil
  206. }