handler.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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 opml
  5. import (
  6. "errors"
  7. "fmt"
  8. "github.com/miniflux/miniflux2/model"
  9. "github.com/miniflux/miniflux2/storage"
  10. "io"
  11. "log"
  12. )
  13. type OpmlHandler struct {
  14. store *storage.Storage
  15. }
  16. func (o *OpmlHandler) Export(userID int64) (string, error) {
  17. feeds, err := o.store.GetFeeds(userID)
  18. if err != nil {
  19. log.Println(err)
  20. return "", errors.New("Unable to fetch feeds.")
  21. }
  22. var subscriptions SubcriptionList
  23. for _, feed := range feeds {
  24. subscriptions = append(subscriptions, &Subcription{
  25. Title: feed.Title,
  26. FeedURL: feed.FeedURL,
  27. SiteURL: feed.SiteURL,
  28. CategoryName: feed.Category.Title,
  29. })
  30. }
  31. return Serialize(subscriptions), nil
  32. }
  33. func (o *OpmlHandler) Import(userID int64, data io.Reader) (err error) {
  34. subscriptions, err := Parse(data)
  35. if err != nil {
  36. return err
  37. }
  38. for _, subscription := range subscriptions {
  39. if !o.store.FeedURLExists(userID, subscription.FeedURL) {
  40. var category *model.Category
  41. if subscription.CategoryName == "" {
  42. category, err = o.store.GetFirstCategory(userID)
  43. if err != nil {
  44. log.Println(err)
  45. return errors.New("Unable to find first category.")
  46. }
  47. } else {
  48. category, err = o.store.GetCategoryByTitle(userID, subscription.CategoryName)
  49. if err != nil {
  50. log.Println(err)
  51. return errors.New("Unable to search category by title.")
  52. }
  53. if category == nil {
  54. category = &model.Category{
  55. UserID: userID,
  56. Title: subscription.CategoryName,
  57. }
  58. err := o.store.CreateCategory(category)
  59. if err != nil {
  60. log.Println(err)
  61. return fmt.Errorf(`Unable to create this category: "%s".`, subscription.CategoryName)
  62. }
  63. }
  64. }
  65. feed := &model.Feed{
  66. UserID: userID,
  67. Title: subscription.Title,
  68. FeedURL: subscription.FeedURL,
  69. SiteURL: subscription.SiteURL,
  70. Category: category,
  71. }
  72. o.store.CreateFeed(feed)
  73. }
  74. }
  75. return nil
  76. }
  77. func NewOpmlHandler(store *storage.Storage) *OpmlHandler {
  78. return &OpmlHandler{store: store}
  79. }