subscription.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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. "github.com/miniflux/miniflux/logger"
  7. "github.com/miniflux/miniflux/model"
  8. "github.com/miniflux/miniflux/reader/subscription"
  9. "github.com/miniflux/miniflux/server/core"
  10. "github.com/miniflux/miniflux/server/ui/form"
  11. )
  12. // Bookmarklet prefill the form to add a subscription from the URL provided by the bookmarklet.
  13. func (c *Controller) Bookmarklet(ctx *core.Context, request *core.Request, response *core.Response) {
  14. user := ctx.LoggedUser()
  15. args, err := c.getSubscriptionFormTemplateArgs(ctx, user)
  16. if err != nil {
  17. response.HTML().ServerError(err)
  18. return
  19. }
  20. bookmarkletURL := request.QueryStringParam("uri", "")
  21. response.HTML().Render("add_subscription", args.Merge(tplParams{
  22. "form": &form.SubscriptionForm{URL: bookmarkletURL},
  23. }))
  24. }
  25. // AddSubscription shows the form to add a new feed.
  26. func (c *Controller) AddSubscription(ctx *core.Context, request *core.Request, response *core.Response) {
  27. user := ctx.LoggedUser()
  28. args, err := c.getSubscriptionFormTemplateArgs(ctx, user)
  29. if err != nil {
  30. response.HTML().ServerError(err)
  31. return
  32. }
  33. response.HTML().Render("add_subscription", args)
  34. }
  35. // SubmitSubscription try to find a feed from the URL provided by the user.
  36. func (c *Controller) SubmitSubscription(ctx *core.Context, request *core.Request, response *core.Response) {
  37. user := ctx.LoggedUser()
  38. args, err := c.getSubscriptionFormTemplateArgs(ctx, user)
  39. if err != nil {
  40. response.HTML().ServerError(err)
  41. return
  42. }
  43. subscriptionForm := form.NewSubscriptionForm(request.Request())
  44. if err := subscriptionForm.Validate(); err != nil {
  45. response.HTML().Render("add_subscription", args.Merge(tplParams{
  46. "form": subscriptionForm,
  47. "errorMessage": err.Error(),
  48. }))
  49. return
  50. }
  51. subscriptions, err := subscription.FindSubscriptions(subscriptionForm.URL)
  52. if err != nil {
  53. logger.Error("[Controller:SubmitSubscription] %v", err)
  54. response.HTML().Render("add_subscription", args.Merge(tplParams{
  55. "form": subscriptionForm,
  56. "errorMessage": err,
  57. }))
  58. return
  59. }
  60. logger.Info("[UI:SubmitSubscription] %s", subscriptions)
  61. n := len(subscriptions)
  62. switch {
  63. case n == 0:
  64. response.HTML().Render("add_subscription", args.Merge(tplParams{
  65. "form": subscriptionForm,
  66. "errorMessage": "Unable to find any subscription.",
  67. }))
  68. case n == 1:
  69. feed, err := c.feedHandler.CreateFeed(user.ID, subscriptionForm.CategoryID, subscriptions[0].URL, subscriptionForm.Crawler)
  70. if err != nil {
  71. response.HTML().Render("add_subscription", args.Merge(tplParams{
  72. "form": subscriptionForm,
  73. "errorMessage": err,
  74. }))
  75. return
  76. }
  77. response.Redirect(ctx.Route("feedEntries", "feedID", feed.ID))
  78. case n > 1:
  79. response.HTML().Render("choose_subscription", args.Merge(tplParams{
  80. "categoryID": subscriptionForm.CategoryID,
  81. "subscriptions": subscriptions,
  82. }))
  83. }
  84. }
  85. // ChooseSubscription shows a page to choose a subscription.
  86. func (c *Controller) ChooseSubscription(ctx *core.Context, request *core.Request, response *core.Response) {
  87. user := ctx.LoggedUser()
  88. args, err := c.getSubscriptionFormTemplateArgs(ctx, user)
  89. if err != nil {
  90. response.HTML().ServerError(err)
  91. return
  92. }
  93. subscriptionForm := form.NewSubscriptionForm(request.Request())
  94. if err := subscriptionForm.Validate(); err != nil {
  95. response.HTML().Render("add_subscription", args.Merge(tplParams{
  96. "form": subscriptionForm,
  97. "errorMessage": err.Error(),
  98. }))
  99. return
  100. }
  101. feed, err := c.feedHandler.CreateFeed(user.ID, subscriptionForm.CategoryID, subscriptionForm.URL, subscriptionForm.Crawler)
  102. if err != nil {
  103. response.HTML().Render("add_subscription", args.Merge(tplParams{
  104. "form": subscriptionForm,
  105. "errorMessage": err,
  106. }))
  107. return
  108. }
  109. response.Redirect(ctx.Route("feedEntries", "feedID", feed.ID))
  110. }
  111. func (c *Controller) getSubscriptionFormTemplateArgs(ctx *core.Context, user *model.User) (tplParams, error) {
  112. args, err := c.getCommonTemplateArgs(ctx)
  113. if err != nil {
  114. return nil, err
  115. }
  116. categories, err := c.store.Categories(user.ID)
  117. if err != nil {
  118. return nil, err
  119. }
  120. args["categories"] = categories
  121. args["menu"] = "feeds"
  122. return args, nil
  123. }