From 3fd5cfdecdf35683b71c41cea0fa0aee6b01e3b5 Mon Sep 17 00:00:00 2001 From: Athou Date: Fri, 20 Feb 2026 10:45:17 +0100 Subject: [PATCH] add a setting to mark entries of a feed as read after a number of days (#2041) --- commafeed-client/src/app/types.ts | 2 + commafeed-client/src/locales/ar/messages.po | 12 ++++ commafeed-client/src/locales/ca/messages.po | 12 ++++ commafeed-client/src/locales/cs/messages.po | 12 ++++ commafeed-client/src/locales/cy/messages.po | 12 ++++ commafeed-client/src/locales/da/messages.po | 12 ++++ commafeed-client/src/locales/de/messages.po | 12 ++++ commafeed-client/src/locales/en/messages.po | 12 ++++ commafeed-client/src/locales/es/messages.po | 12 ++++ commafeed-client/src/locales/fa/messages.po | 12 ++++ commafeed-client/src/locales/fi/messages.po | 12 ++++ commafeed-client/src/locales/fr/messages.po | 12 ++++ commafeed-client/src/locales/gl/messages.po | 12 ++++ commafeed-client/src/locales/hu/messages.po | 12 ++++ commafeed-client/src/locales/id/messages.po | 12 ++++ commafeed-client/src/locales/it/messages.po | 12 ++++ commafeed-client/src/locales/ja/messages.po | 12 ++++ commafeed-client/src/locales/ko/messages.po | 12 ++++ commafeed-client/src/locales/ms/messages.po | 12 ++++ commafeed-client/src/locales/nb/messages.po | 12 ++++ commafeed-client/src/locales/nl/messages.po | 12 ++++ commafeed-client/src/locales/nn/messages.po | 12 ++++ commafeed-client/src/locales/pl/messages.po | 12 ++++ commafeed-client/src/locales/pt/messages.po | 12 ++++ commafeed-client/src/locales/ru/messages.po | 12 ++++ commafeed-client/src/locales/sk/messages.po | 12 ++++ commafeed-client/src/locales/sv/messages.po | 12 ++++ commafeed-client/src/locales/tr/messages.po | 12 ++++ commafeed-client/src/locales/zh/messages.po | 12 ++++ .../src/pages/app/FeedDetailsPage.tsx | 11 ++++ .../backend/dao/FeedEntryStatusDAO.java | 60 +++++++++++++++++++ .../backend/model/FeedSubscription.java | 3 + .../service/db/DatabaseCleaningService.java | 12 ++++ .../backend/task/AutoMarkAsReadTask.java | 37 ++++++++++++ .../frontend/model/Subscription.java | 4 ++ .../request/FeedModificationRequest.java | 3 + .../commafeed/frontend/resource/FeedREST.java | 1 + .../resources/changelogs/db.changelog-7.0.xml | 12 +++- .../cleanup/DatabaseCleaningIT.java | 27 +++++++++ 39 files changed, 507 insertions(+), 1 deletion(-) create mode 100644 commafeed-server/src/main/java/com/commafeed/backend/task/AutoMarkAsReadTask.java diff --git a/commafeed-client/src/app/types.ts b/commafeed-client/src/app/types.ts index f76364a4..29d02165 100644 --- a/commafeed-client/src/app/types.ts +++ b/commafeed-client/src/app/types.ts @@ -30,6 +30,7 @@ export interface Subscription { filter?: string filterLegacy?: string pushNotificationsEnabled: boolean + autoMarkAsReadAfterDays?: number } export interface Category { @@ -112,6 +113,7 @@ export interface FeedModificationRequest { position?: number filter?: string pushNotificationsEnabled: boolean + autoMarkAsReadAfterDays?: number } export interface GetEntriesRequest { diff --git a/commafeed-client/src/locales/ar/messages.po b/commafeed-client/src/locales/ar/messages.po index c69fcef0..a754a734 100644 --- a/commafeed-client/src/locales/ar/messages.po +++ b/commafeed-client/src/locales/ar/messages.po @@ -134,6 +134,10 @@ msgstr "هل أنت متأكد أنك تريد إلغاء الاشتراك من msgid "Asc" msgstr "تصاعدي" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "العودة" @@ -282,6 +286,10 @@ msgstr "" msgid "Date created" msgstr "تاريخ الإنشاء" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "حذف" @@ -600,6 +608,10 @@ msgstr "وضع علامة كمقروء" msgid "Mark as read up to here" msgstr "وضع علامة كمقروءة حتى هنا" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "المقاييس" diff --git a/commafeed-client/src/locales/ca/messages.po b/commafeed-client/src/locales/ca/messages.po index 904f2bd3..28ef9579 100644 --- a/commafeed-client/src/locales/ca/messages.po +++ b/commafeed-client/src/locales/ca/messages.po @@ -134,6 +134,10 @@ msgstr "Esteu segur que voleu cancel·lar la subscripció a <0>{feedName}?" msgid "Asc" msgstr "Asc" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Enrere" @@ -282,6 +286,10 @@ msgstr "Fosc" msgid "Date created" msgstr "Data de creació" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Eliminar" @@ -600,6 +608,10 @@ msgstr "Marca com a llegit" msgid "Mark as read up to here" msgstr "Marca com a llegit fins aquí" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "mètriques" diff --git a/commafeed-client/src/locales/cs/messages.po b/commafeed-client/src/locales/cs/messages.po index 8ef2aec7..ff896e5c 100644 --- a/commafeed-client/src/locales/cs/messages.po +++ b/commafeed-client/src/locales/cs/messages.po @@ -134,6 +134,10 @@ msgstr "Opravdu se chcete odhlásit z odběru <0>{feedName}?" msgid "Asc" msgstr "" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Zpět" @@ -282,6 +286,10 @@ msgstr "" msgid "Date created" msgstr "Datum vytvoření" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Smazat" @@ -600,6 +608,10 @@ msgstr "Označit jako přečtené" msgid "Mark as read up to here" msgstr "Označit jako přečtené až sem" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "Metriky" diff --git a/commafeed-client/src/locales/cy/messages.po b/commafeed-client/src/locales/cy/messages.po index 9a282724..1ea71193 100644 --- a/commafeed-client/src/locales/cy/messages.po +++ b/commafeed-client/src/locales/cy/messages.po @@ -134,6 +134,10 @@ msgstr "Ydych chi'n siŵr eich bod am ddad-danysgrifio o <0>{feedName}?" msgid "Asc" msgstr "" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Yn ôl" @@ -282,6 +286,10 @@ msgstr "" msgid "Date created" msgstr "Dyddiad creu" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Dileu" @@ -600,6 +608,10 @@ msgstr "Marciwch ei fod wedi'i ddarllen" msgid "Mark as read up to here" msgstr "Marciwch fel y darllenwyd hyd yma" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "metrigau" diff --git a/commafeed-client/src/locales/da/messages.po b/commafeed-client/src/locales/da/messages.po index 8fd3e797..4a8585ef 100644 --- a/commafeed-client/src/locales/da/messages.po +++ b/commafeed-client/src/locales/da/messages.po @@ -134,6 +134,10 @@ msgstr "Er du sikker på, at du vil afmelde <0>{feedName}?" msgid "Asc" msgstr "" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Tilbage" @@ -282,6 +286,10 @@ msgstr "" msgid "Date created" msgstr "Dato oprettet" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Slet" @@ -600,6 +608,10 @@ msgstr "Markér som læst" msgid "Mark as read up to here" msgstr "Markér som læst indtil her" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "" diff --git a/commafeed-client/src/locales/de/messages.po b/commafeed-client/src/locales/de/messages.po index df8419ce..67e54f1a 100644 --- a/commafeed-client/src/locales/de/messages.po +++ b/commafeed-client/src/locales/de/messages.po @@ -134,6 +134,10 @@ msgstr "Sind Sie sicher, dass Sie <0>{feedName} abbestellen möchten?" msgid "Asc" msgstr "Aufsteigend" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Zurück" @@ -282,6 +286,10 @@ msgstr "Dunkel" msgid "Date created" msgstr "Erstellungsdatum" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Löschen" @@ -600,6 +608,10 @@ msgstr "Als gelesen markieren" msgid "Mark as read up to here" msgstr "Bis hierhin als gelesen markieren" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "Metriken" diff --git a/commafeed-client/src/locales/en/messages.po b/commafeed-client/src/locales/en/messages.po index 99650057..f12a88b3 100644 --- a/commafeed-client/src/locales/en/messages.po +++ b/commafeed-client/src/locales/en/messages.po @@ -134,6 +134,10 @@ msgstr "Are you sure you want to unsubscribe from <0>{feedName}?" msgid "Asc" msgstr "Asc" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "Auto-mark as read" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Back" @@ -282,6 +286,10 @@ msgstr "Dark" msgid "Date created" msgstr "Date created" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "days" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Delete" @@ -600,6 +608,10 @@ msgstr "Mark as read" msgid "Mark as read up to here" msgstr "Mark as read up to here" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "Mark entries in this feed as read after this number of days. Leave empty to disable." + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "Metrics" diff --git a/commafeed-client/src/locales/es/messages.po b/commafeed-client/src/locales/es/messages.po index 1b0249fe..b6e932f3 100644 --- a/commafeed-client/src/locales/es/messages.po +++ b/commafeed-client/src/locales/es/messages.po @@ -135,6 +135,10 @@ msgstr "¿Estás seguro de que deseas darte de baja de <0>{feedName}?" msgid "Asc" msgstr "Asc" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Atrás" @@ -283,6 +287,10 @@ msgstr "Oscuro" msgid "Date created" msgstr "Fecha de creación" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Borrar" @@ -601,6 +609,10 @@ msgstr "Marcar como leído" msgid "Mark as read up to here" msgstr "Marcar como leído hasta aquí" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "Métricas" diff --git a/commafeed-client/src/locales/fa/messages.po b/commafeed-client/src/locales/fa/messages.po index 20d552ca..4650ca69 100644 --- a/commafeed-client/src/locales/fa/messages.po +++ b/commafeed-client/src/locales/fa/messages.po @@ -134,6 +134,10 @@ msgstr "آیا مطمئن هستید که می خواهید اشتراک <0>{fee msgid "Asc" msgstr "صعودی" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "برگشت" @@ -282,6 +286,10 @@ msgstr "" msgid "Date created" msgstr "تاریخ ایجاد" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "حذف کنید" @@ -600,6 +608,10 @@ msgstr "علامت گذاری به عنوان خوانده شده" msgid "Mark as read up to here" msgstr "تا اینجا به عنوان خوانده شده علامت بزنید" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "متریک" diff --git a/commafeed-client/src/locales/fi/messages.po b/commafeed-client/src/locales/fi/messages.po index 8546d27d..5f6d948c 100644 --- a/commafeed-client/src/locales/fi/messages.po +++ b/commafeed-client/src/locales/fi/messages.po @@ -134,6 +134,10 @@ msgstr "Haluatko varmasti peruuttaa kohteen <0>{feedName} tilauksen?" msgid "Asc" msgstr "" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Takaisin" @@ -282,6 +286,10 @@ msgstr "" msgid "Date created" msgstr "Luontipäivämäärä" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Poista" @@ -600,6 +608,10 @@ msgstr "Merkitse luetuksi" msgid "Mark as read up to here" msgstr "Merkitse luetuksi tähän asti" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "" diff --git a/commafeed-client/src/locales/fr/messages.po b/commafeed-client/src/locales/fr/messages.po index 752e0686..ae9ae4f0 100644 --- a/commafeed-client/src/locales/fr/messages.po +++ b/commafeed-client/src/locales/fr/messages.po @@ -134,6 +134,10 @@ msgstr "Êtes-vous sûr de vouloir vous désabonner de <0>{feedName} ?" msgid "Asc" msgstr "Ascendant" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Retour" @@ -282,6 +286,10 @@ msgstr "Foncé" msgid "Date created" msgstr "Date de création" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Effacer" @@ -600,6 +608,10 @@ msgstr "Marquer comme lu" msgid "Mark as read up to here" msgstr "Marquer comme lu jusqu'ici" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "Métriques" diff --git a/commafeed-client/src/locales/gl/messages.po b/commafeed-client/src/locales/gl/messages.po index 06daa9bf..d5cf5e5e 100644 --- a/commafeed-client/src/locales/gl/messages.po +++ b/commafeed-client/src/locales/gl/messages.po @@ -135,6 +135,10 @@ msgstr "Tes certeza de querer cancelar a subscrición a <0>{feedName}?" msgid "Asc" msgstr "Asc" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Volver" @@ -283,6 +287,10 @@ msgstr "Escuro" msgid "Date created" msgstr "Data de creación" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Eliminar" @@ -601,6 +609,10 @@ msgstr "Marcar como lido" msgid "Mark as read up to here" msgstr "Marcar como lido ata aquí" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "Estatísticas" diff --git a/commafeed-client/src/locales/hu/messages.po b/commafeed-client/src/locales/hu/messages.po index f516dca6..0b2b82e4 100644 --- a/commafeed-client/src/locales/hu/messages.po +++ b/commafeed-client/src/locales/hu/messages.po @@ -134,6 +134,10 @@ msgstr "Biztosan le szeretne iratkozni a következőről: <0>{feedName}?" msgid "Asc" msgstr "" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Vissza" @@ -282,6 +286,10 @@ msgstr "" msgid "Date created" msgstr "Létrehozás dátuma" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Törlés" @@ -600,6 +608,10 @@ msgstr "Megjelölés olvasottként" msgid "Mark as read up to here" msgstr "Megjelölés idáig olvasottként" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "" diff --git a/commafeed-client/src/locales/id/messages.po b/commafeed-client/src/locales/id/messages.po index faf08b00..9add094b 100644 --- a/commafeed-client/src/locales/id/messages.po +++ b/commafeed-client/src/locales/id/messages.po @@ -134,6 +134,10 @@ msgstr "Yakin ingin berhenti berlangganan <0>{feedName}?" msgid "Asc" msgstr "" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Kembali" @@ -282,6 +286,10 @@ msgstr "" msgid "Date created" msgstr "Tanggal dibuat" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Hapus" @@ -600,6 +608,10 @@ msgstr "Tandai sebagai telah dibaca" msgid "Mark as read up to here" msgstr "Tandai sebagai telah dibaca sampai di sini" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "Metrik" diff --git a/commafeed-client/src/locales/it/messages.po b/commafeed-client/src/locales/it/messages.po index ce33b208..5129bc72 100644 --- a/commafeed-client/src/locales/it/messages.po +++ b/commafeed-client/src/locales/it/messages.po @@ -134,6 +134,10 @@ msgstr "Sei sicuro di voler annullare l'iscrizione a <0>{feedName}?" msgid "Asc" msgstr "" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Indietro" @@ -282,6 +286,10 @@ msgstr "" msgid "Date created" msgstr "Data di creazione" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Elimina" @@ -600,6 +608,10 @@ msgstr "Contrassegna come letto" msgid "Mark as read up to here" msgstr "Contrassegna come letto fino a qui" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "Metriche" diff --git a/commafeed-client/src/locales/ja/messages.po b/commafeed-client/src/locales/ja/messages.po index 41e13469..340a37c9 100644 --- a/commafeed-client/src/locales/ja/messages.po +++ b/commafeed-client/src/locales/ja/messages.po @@ -134,6 +134,10 @@ msgstr "<0>{feedName} の登録を解除してもよろしいですか?" msgid "Asc" msgstr "昇順" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "戻る" @@ -282,6 +286,10 @@ msgstr "ダーク" msgid "Date created" msgstr "作成日" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "削除" @@ -600,6 +608,10 @@ msgstr "既読にする" msgid "Mark as read up to here" msgstr "ここまで既読にする" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "メトリックス" diff --git a/commafeed-client/src/locales/ko/messages.po b/commafeed-client/src/locales/ko/messages.po index 6518b8f3..7fdbce98 100644 --- a/commafeed-client/src/locales/ko/messages.po +++ b/commafeed-client/src/locales/ko/messages.po @@ -134,6 +134,10 @@ msgstr "<0>{feedName} 구독을 취소하시겠습니까?" msgid "Asc" msgstr "오름차순" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "뒤로" @@ -282,6 +286,10 @@ msgstr "" msgid "Date created" msgstr "생성 날짜" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "삭제" @@ -600,6 +608,10 @@ msgstr "읽은 상태로 표시" msgid "Mark as read up to here" msgstr "여기까지 읽은 것으로 표시" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "메트릭스" diff --git a/commafeed-client/src/locales/ms/messages.po b/commafeed-client/src/locales/ms/messages.po index e3f57a3e..93b8310f 100644 --- a/commafeed-client/src/locales/ms/messages.po +++ b/commafeed-client/src/locales/ms/messages.po @@ -134,6 +134,10 @@ msgstr "Adakah anda pasti mahu berhenti melanggan <0>{feedName}?" msgid "Asc" msgstr "" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Kembali" @@ -282,6 +286,10 @@ msgstr "" msgid "Date created" msgstr "Tarikh dibuat" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Padam" @@ -600,6 +608,10 @@ msgstr "Tandakan sebagai dibaca" msgid "Mark as read up to here" msgstr "Tandai sebagai dibaca sehingga di sini" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "Metrik" diff --git a/commafeed-client/src/locales/nb/messages.po b/commafeed-client/src/locales/nb/messages.po index c2e7d969..f84bae9b 100644 --- a/commafeed-client/src/locales/nb/messages.po +++ b/commafeed-client/src/locales/nb/messages.po @@ -134,6 +134,10 @@ msgstr "Er du sikker på at du vil avslutte abonnementet på <0>{feedName}?" msgid "Asc" msgstr "" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Tilbake" @@ -282,6 +286,10 @@ msgstr "" msgid "Date created" msgstr "Dato opprettet" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Slett" @@ -600,6 +608,10 @@ msgstr "Merk som lest" msgid "Mark as read up to here" msgstr "Merk som lest frem til her" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "Beregninger" diff --git a/commafeed-client/src/locales/nl/messages.po b/commafeed-client/src/locales/nl/messages.po index 90c02c24..e9355bea 100644 --- a/commafeed-client/src/locales/nl/messages.po +++ b/commafeed-client/src/locales/nl/messages.po @@ -134,6 +134,10 @@ msgstr "Weet je zeker dat je je wilt afmelden voor <0>{feedName}?" msgid "Asc" msgstr "" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Terug" @@ -282,6 +286,10 @@ msgstr "" msgid "Date created" msgstr "Datum gemaakt" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Verwijderen" @@ -600,6 +608,10 @@ msgstr "Markeren als gelezen" msgid "Mark as read up to here" msgstr "Markeer als gelezen tot hier" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "Metrieken" diff --git a/commafeed-client/src/locales/nn/messages.po b/commafeed-client/src/locales/nn/messages.po index b051c0da..1de7def5 100644 --- a/commafeed-client/src/locales/nn/messages.po +++ b/commafeed-client/src/locales/nn/messages.po @@ -134,6 +134,10 @@ msgstr "Er du sikker på at du vil avslutte abonnementet på <0>{feedName}?" msgid "Asc" msgstr "" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Tilbake" @@ -282,6 +286,10 @@ msgstr "" msgid "Date created" msgstr "Dato opprettet" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Slett" @@ -600,6 +608,10 @@ msgstr "Merk som lest" msgid "Mark as read up to here" msgstr "Merk som lest frem til her" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "Beregninger" diff --git a/commafeed-client/src/locales/pl/messages.po b/commafeed-client/src/locales/pl/messages.po index 995f2b72..f5ac813d 100644 --- a/commafeed-client/src/locales/pl/messages.po +++ b/commafeed-client/src/locales/pl/messages.po @@ -134,6 +134,10 @@ msgstr "Czy na pewno chcesz zrezygnować z subskrypcji <0>{feedName}?" msgid "Asc" msgstr "" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Powrót" @@ -282,6 +286,10 @@ msgstr "" msgid "Date created" msgstr "Data utworzenia" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Usuń" @@ -600,6 +608,10 @@ msgstr "Oznacz jako przeczytane" msgid "Mark as read up to here" msgstr "Oznacz jako przeczytane do tej pory" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "Metryki" diff --git a/commafeed-client/src/locales/pt/messages.po b/commafeed-client/src/locales/pt/messages.po index aea986c6..4ecb906f 100644 --- a/commafeed-client/src/locales/pt/messages.po +++ b/commafeed-client/src/locales/pt/messages.po @@ -134,6 +134,10 @@ msgstr "Tem certeza de que deseja cancelar a inscrição em <0>{feedName}?" msgid "Asc" msgstr "Asc" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Voltar" @@ -282,6 +286,10 @@ msgstr "Escuro" msgid "Date created" msgstr "Data de criação" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Excluir" @@ -600,6 +608,10 @@ msgstr "Marcar como lido" msgid "Mark as read up to here" msgstr "Marcar como lido até aqui" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "Métricas" diff --git a/commafeed-client/src/locales/ru/messages.po b/commafeed-client/src/locales/ru/messages.po index c342217d..79997724 100644 --- a/commafeed-client/src/locales/ru/messages.po +++ b/commafeed-client/src/locales/ru/messages.po @@ -134,6 +134,10 @@ msgstr "Вы уверены, что хотите отказаться от по msgid "Asc" msgstr "По возрастанию" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Назад" @@ -282,6 +286,10 @@ msgstr "Темная" msgid "Date created" msgstr "Дата создания" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Удалить" @@ -600,6 +608,10 @@ msgstr "Отметить как прочитанное" msgid "Mark as read up to here" msgstr "Отметить как прочитанное до этого места" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "Метрики" diff --git a/commafeed-client/src/locales/sk/messages.po b/commafeed-client/src/locales/sk/messages.po index 7e3a97f4..15aafa61 100644 --- a/commafeed-client/src/locales/sk/messages.po +++ b/commafeed-client/src/locales/sk/messages.po @@ -134,6 +134,10 @@ msgstr "Naozaj chcete zrušiť odber kanála <0>{feedName}?" msgid "Asc" msgstr "" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Späť" @@ -282,6 +286,10 @@ msgstr "" msgid "Date created" msgstr "Dátum vytvorenia" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Vymazať" @@ -600,6 +608,10 @@ msgstr "Označiť ako prečítané" msgid "Mark as read up to here" msgstr "Označiť ako prečítané až sem" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "Metriky" diff --git a/commafeed-client/src/locales/sv/messages.po b/commafeed-client/src/locales/sv/messages.po index af46e4d9..6d3172aa 100644 --- a/commafeed-client/src/locales/sv/messages.po +++ b/commafeed-client/src/locales/sv/messages.po @@ -134,6 +134,10 @@ msgstr "Är du säker på att du vill avsluta prenumerationen på <0>{feedName}< msgid "Asc" msgstr "" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Tillbaka" @@ -282,6 +286,10 @@ msgstr "" msgid "Date created" msgstr "Datum skapat" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Ta bort" @@ -600,6 +608,10 @@ msgstr "Markera som läst" msgid "Mark as read up to here" msgstr "Markera som läst hit" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "Mätverk" diff --git a/commafeed-client/src/locales/tr/messages.po b/commafeed-client/src/locales/tr/messages.po index 0d1b26d6..33907970 100644 --- a/commafeed-client/src/locales/tr/messages.po +++ b/commafeed-client/src/locales/tr/messages.po @@ -134,6 +134,10 @@ msgstr "<0>{feedName} aboneliğinden çıkmak istediğinizden emin misiniz?" msgid "Asc" msgstr "Artan" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "Geri" @@ -282,6 +286,10 @@ msgstr "" msgid "Date created" msgstr "Oluşturulma tarihi" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "Sil" @@ -600,6 +608,10 @@ msgstr "Okundu olarak işaretle" msgid "Mark as read up to here" msgstr "Buraya kadar okundu olarak işaretle" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "Metrikler" diff --git a/commafeed-client/src/locales/zh/messages.po b/commafeed-client/src/locales/zh/messages.po index b67ffbc9..4cf9b243 100644 --- a/commafeed-client/src/locales/zh/messages.po +++ b/commafeed-client/src/locales/zh/messages.po @@ -134,6 +134,10 @@ msgstr "您确定要退订 <0>{feedName} 吗?" msgid "Asc" msgstr "升序" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Auto-mark as read" +msgstr "" + #: src/components/content/add/Subscribe.tsx msgid "Back" msgstr "返回" @@ -282,6 +286,10 @@ msgstr "暗黑" msgid "Date created" msgstr "创建日期" +#: src/pages/app/FeedDetailsPage.tsx +msgid "days" +msgstr "" + #: src/pages/app/CategoryDetailsPage.tsx msgid "Delete" msgstr "删除" @@ -600,6 +608,10 @@ msgstr "标记为已读" msgid "Mark as read up to here" msgstr "标记为已读到这里" +#: src/pages/app/FeedDetailsPage.tsx +msgid "Mark entries in this feed as read after this number of days. Leave empty to disable." +msgstr "" + #: src/components/header/ProfileMenu.tsx msgid "Metrics" msgstr "指标" diff --git a/commafeed-client/src/pages/app/FeedDetailsPage.tsx b/commafeed-client/src/pages/app/FeedDetailsPage.tsx index d7cc1727..ea8a3037 100644 --- a/commafeed-client/src/pages/app/FeedDetailsPage.tsx +++ b/commafeed-client/src/pages/app/FeedDetailsPage.tsx @@ -1,3 +1,5 @@ +import { msg } from "@lingui/core/macro" +import { useLingui } from "@lingui/react" import { Trans } from "@lingui/react/macro" import { Anchor, @@ -38,6 +40,7 @@ export function FeedDetailsPage() { if (!id) throw new Error("id required") const apiKey = useAppSelector(state => state.user.profile?.apiKey) + const { _ } = useLingui() const dispatch = useAppDispatch() const query = useAsync(async () => await client.feed.get(id), [id]) const feed = query.result?.data @@ -144,6 +147,14 @@ export function FeedDetailsPage() { Category} {...form.getInputProps("categoryId")} clearable /> Position} {...form.getInputProps("position")} required min={0} /> + Auto-mark as read} + description={Mark entries in this feed as read after this number of days. Leave empty to disable.} + suffix={` ${_(msg`days`)}`} + {...form.getInputProps("autoMarkAsReadAfterDays")} + min={1} + max={3650} + /> Filtering expression} description={ diff --git a/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java b/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java index 272a7d95..c709c1f9 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java @@ -18,15 +18,19 @@ import com.commafeed.backend.model.FeedEntry; import com.commafeed.backend.model.FeedEntryStatus; import com.commafeed.backend.model.FeedEntryTag; import com.commafeed.backend.model.FeedSubscription; +import com.commafeed.backend.model.QFeed; import com.commafeed.backend.model.QFeedEntry; import com.commafeed.backend.model.QFeedEntryContent; import com.commafeed.backend.model.QFeedEntryStatus; import com.commafeed.backend.model.QFeedEntryTag; +import com.commafeed.backend.model.QFeedSubscription; import com.commafeed.backend.model.User; import com.commafeed.backend.model.UserSettings.ReadingOrder; import com.commafeed.frontend.model.UnreadCount; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.Tuple; +import com.querydsl.core.types.dsl.Expressions; +import com.querydsl.core.types.dsl.NumberExpression; import com.querydsl.jpa.impl.JPAQuery; @Singleton @@ -34,8 +38,10 @@ public class FeedEntryStatusDAO extends GenericDAO { private static final QFeedEntryStatus STATUS = QFeedEntryStatus.feedEntryStatus; private static final QFeedEntry ENTRY = QFeedEntry.feedEntry; + private static final QFeed FEED = QFeed.feed; private static final QFeedEntryContent CONTENT = QFeedEntryContent.feedEntryContent; private static final QFeedEntryTag TAG = QFeedEntryTag.feedEntryTag; + private static final QFeedSubscription SUBSCRIPTION = QFeedSubscription.feedSubscription; private final FeedEntryTagDAO feedEntryTagDAO; private final CommaFeedConfiguration config; @@ -232,4 +238,58 @@ public class FeedEntryStatusDAO extends GenericDAO { return deleteQuery(STATUS).where(STATUS.id.in(ids)).execute(); } + public long autoMarkAsRead(int limit) { + Instant now = Instant.now(); + + BooleanBuilder where = new BooleanBuilder(); + where.and(SUBSCRIPTION.autoMarkAsReadAfterDays.isNotNull()); + where.and(SUBSCRIPTION.autoMarkAsReadAfterDays.gt(0)); + + NumberExpression daysDiff = Expressions.numberTemplate(Integer.class, "TIMESTAMPDIFF(DAY, {0}, {1})", ENTRY.published, + now); + where.and(daysDiff.goe(SUBSCRIPTION.autoMarkAsReadAfterDays)); + + where.and(buildUnreadPredicate()); + + List tuples = query().select(ENTRY, STATUS, SUBSCRIPTION) + .from(ENTRY) + .join(ENTRY.feed, FEED) + .join(SUBSCRIPTION) + .on(SUBSCRIPTION.feed.eq(FEED)) + .leftJoin(ENTRY.statuses, STATUS) + .on(STATUS.subscription.eq(SUBSCRIPTION)) + .where(where) + .limit(limit) + .fetch(); + + long updated = 0; + + // Update existing statuses + List statusIdsToUpdate = tuples.stream() + .map(t -> t.get(STATUS)) + .filter(s -> s != null && s.getId() != null) + .map(FeedEntryStatus::getId) + .distinct() + .toList(); + + if (!statusIdsToUpdate.isEmpty()) { + updated += updateQuery(STATUS).where(STATUS.id.in(statusIdsToUpdate)).set(STATUS.read, true).execute(); + } + + // Insert new statuses for entries without existing status + for (Tuple tuple : tuples) { + FeedEntryStatus status = tuple.get(STATUS); + if (status == null || status.getId() == null) { + FeedEntry entry = tuple.get(ENTRY); + FeedSubscription sub = tuple.get(SUBSCRIPTION); + FeedEntryStatus newStatus = new FeedEntryStatus(sub.getUser(), sub, entry); + newStatus.setRead(true); + persist(newStatus); + updated++; + } + } + + return updated; + } + } diff --git a/commafeed-server/src/main/java/com/commafeed/backend/model/FeedSubscription.java b/commafeed-server/src/main/java/com/commafeed/backend/model/FeedSubscription.java index 41a0e4dd..2dec0d2a 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/model/FeedSubscription.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/model/FeedSubscription.java @@ -49,4 +49,7 @@ public class FeedSubscription extends AbstractModel { @Column(name = "push_notifications_enabled") private boolean pushNotificationsEnabled; + @Column(name = "auto_mark_as_read_after_days") + private Integer autoMarkAsReadAfterDays; + } diff --git a/commafeed-server/src/main/java/com/commafeed/backend/service/db/DatabaseCleaningService.java b/commafeed-server/src/main/java/com/commafeed/backend/service/db/DatabaseCleaningService.java index a4e21891..63098966 100644 --- a/commafeed-server/src/main/java/com/commafeed/backend/service/db/DatabaseCleaningService.java +++ b/commafeed-server/src/main/java/com/commafeed/backend/service/db/DatabaseCleaningService.java @@ -133,4 +133,16 @@ public class DatabaseCleaningService { } while (deleted != 0); log.info("cleanup done: {} old read statuses deleted", total); } + + public void autoMarkAsRead() { + log.info("marking entries as read based on autoMarkAsReadAfterDays"); + long total = 0; + long marked; + do { + marked = unitOfWork.call(() -> feedEntryStatusDAO.autoMarkAsRead(batchSize)); + total += marked; + log.debug("marked {} entries as read", total); + } while (marked != 0); + log.info("cleanup done: marked {} entries as read", total); + } } diff --git a/commafeed-server/src/main/java/com/commafeed/backend/task/AutoMarkAsReadTask.java b/commafeed-server/src/main/java/com/commafeed/backend/task/AutoMarkAsReadTask.java new file mode 100644 index 00000000..f12b96d8 --- /dev/null +++ b/commafeed-server/src/main/java/com/commafeed/backend/task/AutoMarkAsReadTask.java @@ -0,0 +1,37 @@ +package com.commafeed.backend.task; + +import java.util.concurrent.TimeUnit; + +import jakarta.inject.Singleton; + +import com.commafeed.backend.service.db.DatabaseCleaningService; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Singleton +public class AutoMarkAsReadTask extends ScheduledTask { + + private final DatabaseCleaningService cleaner; + + @Override + public void run() { + cleaner.autoMarkAsRead(); + } + + @Override + public long getInitialDelay() { + return 25; + } + + @Override + public long getPeriod() { + return 60; + } + + @Override + public TimeUnit getTimeUnit() { + return TimeUnit.MINUTES; + } + +} diff --git a/commafeed-server/src/main/java/com/commafeed/frontend/model/Subscription.java b/commafeed-server/src/main/java/com/commafeed/frontend/model/Subscription.java index 0522e0f3..534bbe8f 100644 --- a/commafeed-server/src/main/java/com/commafeed/frontend/model/Subscription.java +++ b/commafeed-server/src/main/java/com/commafeed/frontend/model/Subscription.java @@ -68,6 +68,9 @@ public class Subscription implements Serializable { @Schema(description = "whether to send push notifications for new entries of this feed", required = true) private boolean pushNotificationsEnabled; + @Schema(description = "automatically mark entries as read after this many days (null to disable)") + private Integer autoMarkAsReadAfterDays; + public static Subscription build(FeedSubscription subscription, UnreadCount unreadCount) { FeedCategory category = subscription.getCategory(); Feed feed = subscription.getFeed(); @@ -89,6 +92,7 @@ public class Subscription implements Serializable { sub.setFilter(subscription.getFilter()); sub.setFilterLegacy(subscription.getFilterLegacy()); sub.setPushNotificationsEnabled(subscription.isPushNotificationsEnabled()); + sub.setAutoMarkAsReadAfterDays(subscription.getAutoMarkAsReadAfterDays()); return sub; } diff --git a/commafeed-server/src/main/java/com/commafeed/frontend/model/request/FeedModificationRequest.java b/commafeed-server/src/main/java/com/commafeed/frontend/model/request/FeedModificationRequest.java index 49aa73e2..6d26c34e 100644 --- a/commafeed-server/src/main/java/com/commafeed/frontend/model/request/FeedModificationRequest.java +++ b/commafeed-server/src/main/java/com/commafeed/frontend/model/request/FeedModificationRequest.java @@ -34,4 +34,7 @@ public class FeedModificationRequest implements Serializable { @Schema(description = "whether to send push notifications for new entries of this feed") private boolean pushNotificationsEnabled; + @Schema(description = "automatically mark entries as read after this many days (null to disable)") + private Integer autoMarkAsReadAfterDays; + } diff --git a/commafeed-server/src/main/java/com/commafeed/frontend/resource/FeedREST.java b/commafeed-server/src/main/java/com/commafeed/frontend/resource/FeedREST.java index bcd435d9..71f991d0 100644 --- a/commafeed-server/src/main/java/com/commafeed/frontend/resource/FeedREST.java +++ b/commafeed-server/src/main/java/com/commafeed/frontend/resource/FeedREST.java @@ -437,6 +437,7 @@ public class FeedREST { } subscription.setPushNotificationsEnabled(req.isPushNotificationsEnabled()); + subscription.setAutoMarkAsReadAfterDays(req.getAutoMarkAsReadAfterDays()); if (StringUtils.isNotBlank(req.getName())) { subscription.setTitle(req.getName()); diff --git a/commafeed-server/src/main/resources/changelogs/db.changelog-7.0.xml b/commafeed-server/src/main/resources/changelogs/db.changelog-7.0.xml index 2314273d..cb5f6176 100644 --- a/commafeed-server/src/main/resources/changelogs/db.changelog-7.0.xml +++ b/commafeed-server/src/main/resources/changelogs/db.changelog-7.0.xml @@ -32,5 +32,15 @@ - + + + + + + + + + + + diff --git a/commafeed-server/src/test/java/com/commafeed/integration/cleanup/DatabaseCleaningIT.java b/commafeed-server/src/test/java/com/commafeed/integration/cleanup/DatabaseCleaningIT.java index 9ab7db17..0dbf42f5 100644 --- a/commafeed-server/src/test/java/com/commafeed/integration/cleanup/DatabaseCleaningIT.java +++ b/commafeed-server/src/test/java/com/commafeed/integration/cleanup/DatabaseCleaningIT.java @@ -15,6 +15,7 @@ import com.commafeed.TestConstants; import com.commafeed.backend.service.db.DatabaseCleaningService; import com.commafeed.frontend.model.Entries; import com.commafeed.frontend.model.Entry; +import com.commafeed.frontend.model.request.FeedModificationRequest; import com.commafeed.frontend.model.request.StarRequest; import com.commafeed.frontend.resource.CategoryREST; import com.commafeed.integration.BaseIT; @@ -182,4 +183,30 @@ class DatabaseCleaningIT extends BaseIT { Assertions.assertEquals(0, entriesAfter.getEntries().size()); } } + + @Nested + class AutoMarkAsRead { + @Test + void entriesAreMarkedAsReadAfterSpecifiedDays() { + // Subscribe to feed + Long subscriptionId = subscribeAndWaitForEntries(getFeedUrl()); + + // verify we have 2 unread entries + Entries entries = getFeedEntries(subscriptionId); + Assertions.assertEquals(2, entries.getEntries().stream().filter(e -> !e.isRead()).count()); + + // set auto-mark as read + FeedModificationRequest req = new FeedModificationRequest(); + req.setId(subscriptionId); + req.setAutoMarkAsReadAfterDays(1); + RestAssured.given().body(req).contentType(ContentType.JSON).post("rest/feed/modify").then().statusCode(200); + + // run auto-mark as read + databaseCleaningService.autoMarkAsRead(); + + // verify all entries are now read + entries = getFeedEntries(subscriptionId); + Assertions.assertEquals(0, entries.getEntries().stream().filter(e -> !e.isRead()).count()); + } + } }