feed.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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) ShowFeedsPage(ctx *core.Context, request *core.Request, response *core.Response) {
  13. user := ctx.GetLoggedUser()
  14. args, err := c.getCommonTemplateArgs(ctx)
  15. if err != nil {
  16. response.Html().ServerError(err)
  17. return
  18. }
  19. feeds, err := c.store.GetFeeds(user.ID)
  20. if err != nil {
  21. response.Html().ServerError(err)
  22. return
  23. }
  24. response.Html().Render("feeds", args.Merge(tplParams{
  25. "feeds": feeds,
  26. "total": len(feeds),
  27. "menu": "feeds",
  28. }))
  29. }
  30. func (c *Controller) ShowFeedEntries(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. feed, err := c.getFeedFromURL(request, response, user)
  39. if err != nil {
  40. return
  41. }
  42. builder := c.store.GetEntryQueryBuilder(user.ID, user.Timezone)
  43. builder.WithFeedID(feed.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("feed_entries", args.Merge(tplParams{
  59. "feed": feed,
  60. "entries": entries,
  61. "total": count,
  62. "pagination": c.getPagination(ctx.GetRoute("feedEntries", "feedID", feed.ID), count, offset),
  63. "menu": "feeds",
  64. }))
  65. }
  66. func (c *Controller) EditFeed(ctx *core.Context, request *core.Request, response *core.Response) {
  67. user := ctx.GetLoggedUser()
  68. feed, err := c.getFeedFromURL(request, response, user)
  69. if err != nil {
  70. return
  71. }
  72. args, err := c.getFeedFormTemplateArgs(ctx, user, feed, nil)
  73. if err != nil {
  74. response.Html().ServerError(err)
  75. return
  76. }
  77. response.Html().Render("edit_feed", args)
  78. }
  79. func (c *Controller) UpdateFeed(ctx *core.Context, request *core.Request, response *core.Response) {
  80. user := ctx.GetLoggedUser()
  81. feed, err := c.getFeedFromURL(request, response, user)
  82. if err != nil {
  83. return
  84. }
  85. feedForm := form.NewFeedForm(request.GetRequest())
  86. args, err := c.getFeedFormTemplateArgs(ctx, user, feed, feedForm)
  87. if err != nil {
  88. response.Html().ServerError(err)
  89. return
  90. }
  91. if err := feedForm.ValidateModification(); err != nil {
  92. response.Html().Render("edit_feed", args.Merge(tplParams{
  93. "errorMessage": err.Error(),
  94. }))
  95. return
  96. }
  97. err = c.store.UpdateFeed(feedForm.Merge(feed))
  98. if err != nil {
  99. log.Println(err)
  100. response.Html().Render("edit_feed", args.Merge(tplParams{
  101. "errorMessage": "Unable to update this feed.",
  102. }))
  103. return
  104. }
  105. response.Redirect(ctx.GetRoute("feeds"))
  106. }
  107. func (c *Controller) RemoveFeed(ctx *core.Context, request *core.Request, response *core.Response) {
  108. feedID, err := request.GetIntegerParam("feedID")
  109. if err != nil {
  110. response.Html().ServerError(err)
  111. return
  112. }
  113. user := ctx.GetLoggedUser()
  114. if err := c.store.RemoveFeed(user.ID, feedID); err != nil {
  115. response.Html().ServerError(err)
  116. return
  117. }
  118. response.Redirect(ctx.GetRoute("feeds"))
  119. }
  120. func (c *Controller) RefreshFeed(ctx *core.Context, request *core.Request, response *core.Response) {
  121. feedID, err := request.GetIntegerParam("feedID")
  122. if err != nil {
  123. response.Html().BadRequest(err)
  124. return
  125. }
  126. user := ctx.GetLoggedUser()
  127. if err := c.feedHandler.RefreshFeed(user.ID, feedID); err != nil {
  128. log.Println("[UI:RefreshFeed]", err)
  129. }
  130. response.Redirect(ctx.GetRoute("feedEntries", "feedID", feedID))
  131. }
  132. func (c *Controller) getFeedFromURL(request *core.Request, response *core.Response, user *model.User) (*model.Feed, error) {
  133. feedID, err := request.GetIntegerParam("feedID")
  134. if err != nil {
  135. response.Html().BadRequest(err)
  136. return nil, err
  137. }
  138. feed, err := c.store.GetFeedById(user.ID, feedID)
  139. if err != nil {
  140. response.Html().ServerError(err)
  141. return nil, err
  142. }
  143. if feed == nil {
  144. response.Html().NotFound()
  145. return nil, errors.New("Feed not found")
  146. }
  147. return feed, nil
  148. }
  149. func (c *Controller) getFeedFormTemplateArgs(ctx *core.Context, user *model.User, feed *model.Feed, feedForm *form.FeedForm) (tplParams, error) {
  150. args, err := c.getCommonTemplateArgs(ctx)
  151. if err != nil {
  152. return nil, err
  153. }
  154. categories, err := c.store.GetCategories(user.ID)
  155. if err != nil {
  156. return nil, err
  157. }
  158. if feedForm == nil {
  159. args["form"] = form.FeedForm{
  160. SiteURL: feed.SiteURL,
  161. FeedURL: feed.FeedURL,
  162. Title: feed.Title,
  163. CategoryID: feed.Category.ID,
  164. }
  165. } else {
  166. args["form"] = feedForm
  167. }
  168. args["categories"] = categories
  169. args["feed"] = feed
  170. args["menu"] = "feeds"
  171. return args, nil
  172. }