4
0

feed.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package validator // import "miniflux.app/v2/internal/validator"
  4. import (
  5. "miniflux.app/v2/internal/locale"
  6. "miniflux.app/v2/internal/model"
  7. "miniflux.app/v2/internal/storage"
  8. )
  9. // ValidateFeedCreation validates feed creation.
  10. func ValidateFeedCreation(store *storage.Storage, userID int64, request *model.FeedCreationRequest) *locale.LocalizedError {
  11. if request.FeedURL == "" || request.CategoryID <= 0 {
  12. return locale.NewLocalizedError("error.feed_mandatory_fields")
  13. }
  14. if !IsValidURL(request.FeedURL) {
  15. return locale.NewLocalizedError("error.invalid_feed_url")
  16. }
  17. if store.FeedURLExists(userID, request.FeedURL) {
  18. return locale.NewLocalizedError("error.feed_already_exists")
  19. }
  20. if !store.CategoryIDExists(userID, request.CategoryID) {
  21. return locale.NewLocalizedError("error.feed_category_not_found")
  22. }
  23. if !IsValidRegex(request.BlocklistRules) {
  24. return locale.NewLocalizedError("error.feed_invalid_blocklist_rule")
  25. }
  26. if !IsValidRegex(request.KeeplistRules) {
  27. return locale.NewLocalizedError("error.feed_invalid_keeplist_rule")
  28. }
  29. if request.ProxyURL != "" && !IsValidURL(request.ProxyURL) {
  30. return locale.NewLocalizedError("error.invalid_feed_proxy_url")
  31. }
  32. return nil
  33. }
  34. // ValidateFeedModification validates feed modification.
  35. func ValidateFeedModification(store *storage.Storage, userID, feedID int64, request *model.FeedModificationRequest) *locale.LocalizedError {
  36. if request.FeedURL != nil {
  37. if *request.FeedURL == "" {
  38. return locale.NewLocalizedError("error.feed_url_not_empty")
  39. }
  40. if !IsValidURL(*request.FeedURL) {
  41. return locale.NewLocalizedError("error.invalid_feed_url")
  42. }
  43. if store.AnotherFeedURLExists(userID, feedID, *request.FeedURL) {
  44. return locale.NewLocalizedError("error.feed_already_exists")
  45. }
  46. }
  47. if request.SiteURL != nil {
  48. if *request.SiteURL == "" {
  49. return locale.NewLocalizedError("error.site_url_not_empty")
  50. }
  51. if !IsValidURL(*request.SiteURL) {
  52. return locale.NewLocalizedError("error.invalid_site_url")
  53. }
  54. }
  55. if request.Title != nil {
  56. if *request.Title == "" {
  57. return locale.NewLocalizedError("error.feed_title_not_empty")
  58. }
  59. }
  60. if request.CategoryID != nil {
  61. if !store.CategoryIDExists(userID, *request.CategoryID) {
  62. return locale.NewLocalizedError("error.feed_category_not_found")
  63. }
  64. }
  65. if request.BlocklistRules != nil {
  66. if !IsValidRegex(*request.BlocklistRules) {
  67. return locale.NewLocalizedError("error.feed_invalid_blocklist_rule")
  68. }
  69. }
  70. if request.KeeplistRules != nil {
  71. if !IsValidRegex(*request.KeeplistRules) {
  72. return locale.NewLocalizedError("error.feed_invalid_keeplist_rule")
  73. }
  74. }
  75. if request.ProxyURL != nil {
  76. if *request.ProxyURL == "" {
  77. return locale.NewLocalizedError("error.proxy_url_not_empty")
  78. }
  79. if !IsValidURL(*request.ProxyURL) {
  80. return locale.NewLocalizedError("error.invalid_feed_proxy_url")
  81. }
  82. }
  83. return nil
  84. }