Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions client/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ type Feed struct {
HideGlobally bool `json:"hide_globally"`
DisableHTTP2 bool `json:"disable_http2"`
ProxyURL string `json:"proxy_url"`
RefreshIntervalMinutes *int `json:"refresh_interval_minutes"`
}

// FeedCreationRequest represents the request to create a feed.
Expand All @@ -200,6 +201,7 @@ type FeedCreationRequest struct {
HideGlobally bool `json:"hide_globally"`
DisableHTTP2 bool `json:"disable_http2"`
ProxyURL string `json:"proxy_url"`
RefreshIntervalMinutes *int `json:"refresh_interval_minutes,omitempty"`
}

// FeedModificationRequest represents the request to update a feed.
Expand Down Expand Up @@ -228,6 +230,7 @@ type FeedModificationRequest struct {
HideGlobally *bool `json:"hide_globally"`
DisableHTTP2 *bool `json:"disable_http2"`
ProxyURL *string `json:"proxy_url"`
RefreshIntervalMinutes *int `json:"refresh_interval_minutes,omitempty"`
}

// FeedIcon represents the feed icon.
Expand Down
64 changes: 64 additions & 0 deletions internal/api/api_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1625,6 +1625,70 @@ func TestUpdateFeedEndpoint(t *testing.T) {
}
}

func TestUpdateFeedRefreshInterval(t *testing.T) {
testConfig := newIntegrationTestConfig()
if !testConfig.isConfigured() {
t.Skip(skipIntegrationTestsMessage)
}

adminClient := miniflux.NewClient(testConfig.testBaseURL, testConfig.testAdminUsername, testConfig.testAdminPassword)

regularTestUser, err := adminClient.CreateUser(testConfig.genRandomUsername(), testConfig.testRegularPassword, false)
if err != nil {
t.Fatal(err)
}
defer adminClient.DeleteUser(regularTestUser.ID)

regularUserClient := miniflux.NewClient(testConfig.testBaseURL, regularTestUser.Username, testConfig.testRegularPassword)

feedID, err := regularUserClient.CreateFeed(&miniflux.FeedCreationRequest{
FeedURL: testConfig.testFeedURL,
})
if err != nil {
t.Fatal(err)
}

feed, err := regularUserClient.Feed(feedID)
if err != nil {
t.Fatal(err)
}
if feed.RefreshIntervalMinutes != nil {
t.Fatalf(`A new feed must inherit the global polling frequency, got refresh_interval_minutes=%d`, *feed.RefreshIntervalMinutes)
}

updated, err := regularUserClient.UpdateFeed(feedID, &miniflux.FeedModificationRequest{
RefreshIntervalMinutes: new(120),
})
if err != nil {
t.Fatal(err)
}
if updated.RefreshIntervalMinutes == nil || *updated.RefreshIntervalMinutes != 120 {
got := "<nil>"
if updated.RefreshIntervalMinutes != nil {
got = fmt.Sprintf("%d", *updated.RefreshIntervalMinutes)
}
t.Fatalf(`Expected refresh_interval_minutes=120 after update, got %s`, got)
}

// Setting it back to zero must clear the override.
cleared, err := regularUserClient.UpdateFeed(feedID, &miniflux.FeedModificationRequest{
RefreshIntervalMinutes: new(0),
})
if err != nil {
t.Fatal(err)
}
if cleared.RefreshIntervalMinutes != nil {
t.Fatalf(`Expected refresh_interval_minutes to be cleared, got %d`, *cleared.RefreshIntervalMinutes)
}

// Below the minimum should be rejected.
if _, err := regularUserClient.UpdateFeed(feedID, &miniflux.FeedModificationRequest{
RefreshIntervalMinutes: new(1),
}); err == nil {
t.Fatal(`Expected an error when refresh_interval_minutes is below the minimum`)
}
}

func TestCannotHaveDuplicateFeedWhenUpdatingFeed(t *testing.T) {
testConfig := newIntegrationTestConfig()
if !testConfig.isConfigured() {
Expand Down
8 changes: 8 additions & 0 deletions internal/database/migrations.go
Original file line number Diff line number Diff line change
Expand Up @@ -1496,4 +1496,12 @@ var migrations = [...]func(tx *sql.Tx) error{
`)
return err
},
func(tx *sql.Tx) (err error) {
_, err = tx.Exec(`
ALTER TABLE feeds ADD COLUMN refresh_interval_minutes integer;
ALTER TABLE feeds ADD CONSTRAINT feeds_refresh_interval_minutes_check
CHECK (refresh_interval_minutes IS NULL OR refresh_interval_minutes >= 1);
`)
return err
},
}
3 changes: 3 additions & 0 deletions internal/locale/translations/ar_SA.json
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@
"error.feed_format_not_detected": "تعذر اكتشاف تنسيق المصدر: %v.",
"error.feed_invalid_blocklist_rule": "قاعدة قائمة الحظر غير صالحة.",
"error.feed_invalid_keeplist_rule": "قاعدة قائمة الاحتفاظ غير صالحة.",
"error.feed_invalid_refresh_interval": "The refresh interval must be between %d and %d minutes.",
"error.feed_mandatory_fields": "الرابط والفئة إلزاميان.",
"error.feed_not_found": "هذا المصدر غير موجود أو لا ينتمي لهذا المستخدم.",
"error.feed_title_not_empty": "عنوان المصدر لا يمكن أن يكون فارغاً.",
Expand Down Expand Up @@ -210,6 +211,8 @@
"form.feed.label.ntfy_priority": "أولوية Ntfy",
"form.feed.label.ntfy_topic": "موضوع Ntfy (اختياري)",
"form.feed.label.proxy_url": "رابط الوكيل (Proxy)",
"form.feed.label.refresh_interval_minutes": "Refresh interval (minutes)",
"form.feed.help.refresh_interval_minutes": "Override the global polling frequency for this feed. Leave at 0 to use the application default.",
"form.feed.label.pushover_activate": "إرسال المقالات إلى Pushover",
"form.feed.label.pushover_default_priority": "الأولوية الافتراضية",
"form.feed.label.pushover_high_priority": "أولوية عالية",
Expand Down
3 changes: 3 additions & 0 deletions internal/locale/translations/de_DE.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"error.feed_format_not_detected": "Das Format des Abonnements kann nicht erkannt werden: %v.",
"error.feed_invalid_blocklist_rule": "Die Blockierregel ist ungültig.",
"error.feed_invalid_keeplist_rule": "Die Erlaubnisregel ist ungültig.",
"error.feed_invalid_refresh_interval": "The refresh interval must be between %d and %d minutes.",
"error.feed_mandatory_fields": "Die URL und die Kategorie sind obligatorisch.",
"error.feed_not_found": "Dieses Abonnement existiert nicht oder gehört nicht zu diesem Benutzer.",
"error.feed_title_not_empty": "Der Feed-Titel darf nicht leer sein.",
Expand Down Expand Up @@ -198,6 +199,8 @@
"form.feed.label.ntfy_priority": "Ntfy-Priorität",
"form.feed.label.ntfy_topic": "Ntfy-Thema (optional)",
"form.feed.label.proxy_url": "Proxy-URL",
"form.feed.label.refresh_interval_minutes": "Refresh interval (minutes)",
"form.feed.help.refresh_interval_minutes": "Override the global polling frequency for this feed. Leave at 0 to use the application default.",
"form.feed.label.pushover_activate": "Artikel an pushover.net senden",
"form.feed.label.pushover_default_priority": "Pushover-Standardpriorität",
"form.feed.label.pushover_high_priority": "Hohe Pushoverpriorität",
Expand Down
3 changes: 3 additions & 0 deletions internal/locale/translations/el_EL.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"error.feed_format_not_detected": "Δεν είναι δυνατή η ανίχνευση της μορφής ροής: %v.",
"error.feed_invalid_blocklist_rule": "Ο κανόνας λίστας μπλοκ δεν είναι έγκυρος.",
"error.feed_invalid_keeplist_rule": "Ο κανόνας keep list δεν είναι έγκυρος.",
"error.feed_invalid_refresh_interval": "The refresh interval must be between %d and %d minutes.",
"error.feed_mandatory_fields": "Η διεύθυνση URL και η κατηγορία είναι υποχρεωτικά.",
"error.feed_not_found": "Αυτή η ροή δεν υπάρχει ή δεν ανήκει σε αυτόν τον χρήστη.",
"error.feed_title_not_empty": "Ο τίτλος ροής δεν μπορεί να είναι κενός.",
Expand Down Expand Up @@ -198,6 +199,8 @@
"form.feed.label.ntfy_priority": "Προτεραιότητα Ntfy",
"form.feed.label.ntfy_topic": "Θέμα Ntfy (προαιρετικό)",
"form.feed.label.proxy_url": "Διεύθυνση URL διακομιστή μεσολάβησης",
"form.feed.label.refresh_interval_minutes": "Refresh interval (minutes)",
"form.feed.help.refresh_interval_minutes": "Override the global polling frequency for this feed. Leave at 0 to use the application default.",
"form.feed.label.pushover_activate": "Προώθηση καταχωρήσεων στο pushover.net",
"form.feed.label.pushover_default_priority": "Προεπιλεγμένη προτεραιότητα Pushover",
"form.feed.label.pushover_high_priority": "Υψηλή προτεραιότητα Pushover",
Expand Down
3 changes: 3 additions & 0 deletions internal/locale/translations/en_US.json
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@
"error.feed_format_not_detected": "Unable to detect feed format: %v.",
"error.feed_invalid_blocklist_rule": "The block list rule is invalid.",
"error.feed_invalid_keeplist_rule": "The keep list rule is invalid.",
"error.feed_invalid_refresh_interval": "The refresh interval must be between %d and %d minutes.",
"error.feed_mandatory_fields": "The URL and the category are mandatory.",
"error.feed_not_found": "This feed does not exist or does not belong to this user.",
"error.feed_title_not_empty": "The feed title cannot be empty.",
Expand Down Expand Up @@ -198,6 +199,8 @@
"form.feed.label.ntfy_priority": "Ntfy priority",
"form.feed.label.ntfy_topic": "Ntfy topic (optional)",
"form.feed.label.proxy_url": "Proxy URL",
"form.feed.label.refresh_interval_minutes": "Refresh interval (minutes)",
"form.feed.help.refresh_interval_minutes": "Override the global polling frequency for this feed. Leave at 0 to use the application default.",
"form.feed.label.pushover_activate": "Push entries to Pushover",
"form.feed.label.pushover_default_priority": "Default priority",
"form.feed.label.pushover_high_priority": "High priority",
Expand Down
3 changes: 3 additions & 0 deletions internal/locale/translations/es_ES.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"error.feed_format_not_detected": "No se puede detectar el formato del feed: %v.",
"error.feed_invalid_blocklist_rule": "La regla de la lista de bloqueo no es válida.",
"error.feed_invalid_keeplist_rule": "La regla de mantener la lista no es válida.",
"error.feed_invalid_refresh_interval": "The refresh interval must be between %d and %d minutes.",
"error.feed_mandatory_fields": "Los campos de URL y categoría son obligatorios.",
"error.feed_not_found": "Este feed no existe o no pertenece a este usuario.",
"error.feed_title_not_empty": "El título del feed no puede estar vacío.",
Expand Down Expand Up @@ -198,6 +199,8 @@
"form.feed.label.ntfy_priority": "Prioridad Ntfy",
"form.feed.label.ntfy_topic": "Tema Ntfy (opcional)",
"form.feed.label.proxy_url": "URL del Proxy",
"form.feed.label.refresh_interval_minutes": "Refresh interval (minutes)",
"form.feed.help.refresh_interval_minutes": "Override the global polling frequency for this feed. Leave at 0 to use the application default.",
"form.feed.label.pushover_activate": "Enviar artículos a pushover.net",
"form.feed.label.pushover_default_priority": "Prioridad predeterminada de Pushover",
"form.feed.label.pushover_high_priority": "Prioridad alta de Pushover",
Expand Down
3 changes: 3 additions & 0 deletions internal/locale/translations/fi_FI.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"error.feed_format_not_detected": "Syötteen muotoa ei voitu tunnistaa: %v.",
"error.feed_invalid_blocklist_rule": "Estolistan sääntö on virheellinen.",
"error.feed_invalid_keeplist_rule": "Säilytettävien listan sääntö on virheellinen.",
"error.feed_invalid_refresh_interval": "The refresh interval must be between %d and %d minutes.",
"error.feed_mandatory_fields": "URL-osoite ja kategoria ovat pakollisia.",
"error.feed_not_found": "Tämä syöte ei ole olemassa tai se ei kuulu tälle käyttäjälle.",
"error.feed_title_not_empty": "Syötteen otsikko ei voi olla tyhjä.",
Expand Down Expand Up @@ -198,6 +199,8 @@
"form.feed.label.ntfy_priority": "Ntfy-prioriteetti",
"form.feed.label.ntfy_topic": "Ntfy-aihe (valinnainen)",
"form.feed.label.proxy_url": "Välityspalvelimen URL",
"form.feed.label.refresh_interval_minutes": "Refresh interval (minutes)",
"form.feed.help.refresh_interval_minutes": "Override the global polling frequency for this feed. Leave at 0 to use the application default.",
"form.feed.label.pushover_activate": "Lähetä merkinnät pushover.net-palveluun",
"form.feed.label.pushover_default_priority": "Pushover-oletusprioriteetti",
"form.feed.label.pushover_high_priority": "Pushover-korkea prioriteetti",
Expand Down
3 changes: 3 additions & 0 deletions internal/locale/translations/fr_FR.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"error.feed_format_not_detected": "Impossible de détecter le format du flux : %v.",
"error.feed_invalid_blocklist_rule": "La règle de blocage n'est pas valide.",
"error.feed_invalid_keeplist_rule": "La règle d'autorisation n'est pas valide.",
"error.feed_invalid_refresh_interval": "The refresh interval must be between %d and %d minutes.",
"error.feed_mandatory_fields": "L'URL et la catégorie sont obligatoire.",
"error.feed_not_found": "Impossible de trouver ce flux.",
"error.feed_title_not_empty": "Le titre du flux ne peut pas être vide.",
Expand Down Expand Up @@ -198,6 +199,8 @@
"form.feed.label.ntfy_priority": "Priorité de notification",
"form.feed.label.ntfy_topic": "Sujet Ntfy (facultatif)",
"form.feed.label.proxy_url": "URL du proxy",
"form.feed.label.refresh_interval_minutes": "Refresh interval (minutes)",
"form.feed.help.refresh_interval_minutes": "Override the global polling frequency for this feed. Leave at 0 to use the application default.",
"form.feed.label.pushover_activate": "Activer les notifications vers Pushover",
"form.feed.label.pushover_default_priority": "Priorité par défaut",
"form.feed.label.pushover_high_priority": "Priorité élevée",
Expand Down
3 changes: 3 additions & 0 deletions internal/locale/translations/gl_ES.json
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@
"error.feed_format_not_detected": "Non se puido detectar o formato da canle: %v.",
"error.feed_invalid_blocklist_rule": "A regra da lista de bloqueo non é válida.",
"error.feed_invalid_keeplist_rule": "A regra da lista a manter non é válida.",
"error.feed_invalid_refresh_interval": "The refresh interval must be between %d and %d minutes.",
"error.feed_mandatory_fields": "É obrigatorio engadir un URL para a categoría.",
"error.feed_not_found": "A canle non existe ou non pertence a esta usuaria.",
"error.feed_title_not_empty": "O título da canle non pode quedar baleiro.",
Expand Down Expand Up @@ -198,6 +199,8 @@
"form.feed.label.ntfy_priority": "Prioridade en Ntfy",
"form.feed.label.ntfy_topic": "Tema en Ntfy (optativo)",
"form.feed.label.proxy_url": "URL do mandatario",
"form.feed.label.refresh_interval_minutes": "Refresh interval (minutes)",
"form.feed.help.refresh_interval_minutes": "Override the global polling frequency for this feed. Leave at 0 to use the application default.",
"form.feed.label.pushover_activate": "Enviar novidades a Pushover",
"form.feed.label.pushover_default_priority": "Prioridade predeterminada",
"form.feed.label.pushover_high_priority": "Alta prioridade",
Expand Down
3 changes: 3 additions & 0 deletions internal/locale/translations/hi_IN.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"error.feed_format_not_detected": "फ़ीड प्रारूप का पता नहीं लगा सकते: %v।",
"error.feed_invalid_blocklist_rule": "ब्लॉक सूची नियम अमान्य है।",
"error.feed_invalid_keeplist_rule": "सूची रखें नियम अमान्य है।",
"error.feed_invalid_refresh_interval": "The refresh interval must be between %d and %d minutes.",
"error.feed_mandatory_fields": "URL और श्रेणी अनिवार्य हैं।",
"error.feed_not_found": "यह फ़ीड मौजूद नहीं है या इस उपयोगकर्ता से संबंधित नहीं है।",
"error.feed_title_not_empty": "फ़ीड शीर्षक खाली नहीं हो सकता.",
Expand Down Expand Up @@ -198,6 +199,8 @@
"form.feed.label.ntfy_priority": "Ntfy प्राथमिकता",
"form.feed.label.ntfy_topic": "Ntfy विषय (वैकल्पिक)",
"form.feed.label.proxy_url": "प्रॉक्सी URL",
"form.feed.label.refresh_interval_minutes": "Refresh interval (minutes)",
"form.feed.help.refresh_interval_minutes": "Override the global polling frequency for this feed. Leave at 0 to use the application default.",
"form.feed.label.pushover_activate": "प्रविष्टियाँ pushover.net पर भेजें",
"form.feed.label.pushover_default_priority": "Pushover डिफ़ॉल्ट प्राथमिकता",
"form.feed.label.pushover_high_priority": "Pushover उच्च प्राथमिकता",
Expand Down
3 changes: 3 additions & 0 deletions internal/locale/translations/id_ID.json
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@
"error.feed_format_not_detected": "Tidak dapat mendeteksi format umpan: %v.",
"error.feed_invalid_blocklist_rule": "Aturan blokir tidak valid.",
"error.feed_invalid_keeplist_rule": "Aturan simpan tidak valid.",
"error.feed_invalid_refresh_interval": "The refresh interval must be between %d and %d minutes.",
"error.feed_mandatory_fields": "Harus ada URL dan kategorinya.",
"error.feed_not_found": "Umpan ini tidak ada atau tidak dipunyai oleh pengguna ini",
"error.feed_title_not_empty": "Judul umpan tidak boleh kosong.",
Expand Down Expand Up @@ -195,6 +196,8 @@
"form.feed.label.ntfy_priority": "Prioritas Ntfy",
"form.feed.label.ntfy_topic": "Topik Ntfy (opsional)",
"form.feed.label.proxy_url": "URL Proksi",
"form.feed.label.refresh_interval_minutes": "Refresh interval (minutes)",
"form.feed.help.refresh_interval_minutes": "Override the global polling frequency for this feed. Leave at 0 to use the application default.",
"form.feed.label.pushover_activate": "Kirim artikel ke pushover.net",
"form.feed.label.pushover_default_priority": "Prioritas baku Pushover",
"form.feed.label.pushover_high_priority": "Prioritas tinggi Pushover",
Expand Down
3 changes: 3 additions & 0 deletions internal/locale/translations/it_IT.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"error.feed_format_not_detected": "Impossibile rilevare il formato del feed: %v.",
"error.feed_invalid_blocklist_rule": "La regola dell'elenco di blocco non è valida.",
"error.feed_invalid_keeplist_rule": "La regola dell'elenco di conservazione non è valida.",
"error.feed_invalid_refresh_interval": "The refresh interval must be between %d and %d minutes.",
"error.feed_mandatory_fields": "L'URL e la categoria sono obbligatori.",
"error.feed_not_found": "Questo feed non esiste o non appartiene a questo utente.",
"error.feed_title_not_empty": "Il titolo del feed non può essere vuoto.",
Expand Down Expand Up @@ -198,6 +199,8 @@
"form.feed.label.ntfy_priority": "Priorità ntfy",
"form.feed.label.ntfy_topic": "Topic ntfy (opzionale)",
"form.feed.label.proxy_url": "URL del proxy",
"form.feed.label.refresh_interval_minutes": "Refresh interval (minutes)",
"form.feed.help.refresh_interval_minutes": "Override the global polling frequency for this feed. Leave at 0 to use the application default.",
"form.feed.label.pushover_activate": "Invia le voci a pushover.net",
"form.feed.label.pushover_default_priority": "Priorità predefinita Pushover",
"form.feed.label.pushover_high_priority": "Priorità alta Pushover",
Expand Down
3 changes: 3 additions & 0 deletions internal/locale/translations/ja_JP.json
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@
"error.feed_format_not_detected": "フィードの形式を検出できません: %v.",
"error.feed_invalid_blocklist_rule": "ブロックリストルールが無効です。",
"error.feed_invalid_keeplist_rule": "リストの保持ルールが無効です。",
"error.feed_invalid_refresh_interval": "The refresh interval must be between %d and %d minutes.",
"error.feed_mandatory_fields": "URL と カテゴリが必要です。",
"error.feed_not_found": "このフィードは存在しないか、このユーザーに属していません。",
"error.feed_title_not_empty": "フィードのタイトルを空にすることはできません。",
Expand Down Expand Up @@ -195,6 +196,8 @@
"form.feed.label.ntfy_priority": "ntfy 優先度",
"form.feed.label.ntfy_topic": "ntfy トピック(任意)",
"form.feed.label.proxy_url": "プロキシ URL",
"form.feed.label.refresh_interval_minutes": "Refresh interval (minutes)",
"form.feed.help.refresh_interval_minutes": "Override the global polling frequency for this feed. Leave at 0 to use the application default.",
"form.feed.label.pushover_activate": "エントリを pushover.net に送信",
"form.feed.label.pushover_default_priority": "Pushover 既定の優先度",
"form.feed.label.pushover_high_priority": "Pushover 高優先度",
Expand Down
Loading