add a setting to mark entries of a feed as read after a number of days (#2041)

This commit is contained in:
Athou
2026-02-20 10:45:17 +01:00
parent f87d3359c2
commit 3fd5cfdecd
39 changed files with 507 additions and 1 deletions

View File

@@ -30,6 +30,7 @@ export interface Subscription {
filter?: string filter?: string
filterLegacy?: string filterLegacy?: string
pushNotificationsEnabled: boolean pushNotificationsEnabled: boolean
autoMarkAsReadAfterDays?: number
} }
export interface Category { export interface Category {
@@ -112,6 +113,7 @@ export interface FeedModificationRequest {
position?: number position?: number
filter?: string filter?: string
pushNotificationsEnabled: boolean pushNotificationsEnabled: boolean
autoMarkAsReadAfterDays?: number
} }
export interface GetEntriesRequest { export interface GetEntriesRequest {

View File

@@ -134,6 +134,10 @@ msgstr "هل أنت متأكد أنك تريد إلغاء الاشتراك من
msgid "Asc" msgid "Asc"
msgstr "تصاعدي" msgstr "تصاعدي"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "العودة" msgstr "العودة"
@@ -282,6 +286,10 @@ msgstr ""
msgid "Date created" msgid "Date created"
msgstr "تاريخ الإنشاء" msgstr "تاريخ الإنشاء"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "حذف" msgstr "حذف"
@@ -600,6 +608,10 @@ msgstr "وضع علامة كمقروء"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "وضع علامة كمقروءة حتى هنا" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "المقاييس" msgstr "المقاييس"

View File

@@ -134,6 +134,10 @@ msgstr "Esteu segur que voleu cancel·lar la subscripció a <0>{feedName}</0>?"
msgid "Asc" msgid "Asc"
msgstr "Asc" msgstr "Asc"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Enrere" msgstr "Enrere"
@@ -282,6 +286,10 @@ msgstr "Fosc"
msgid "Date created" msgid "Date created"
msgstr "Data de creació" msgstr "Data de creació"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Eliminar" msgstr "Eliminar"
@@ -600,6 +608,10 @@ msgstr "Marca com a llegit"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Marca com a llegit fins aquí" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "mètriques" msgstr "mètriques"

View File

@@ -134,6 +134,10 @@ msgstr "Opravdu se chcete odhlásit z odběru <0>{feedName}</0>?"
msgid "Asc" msgid "Asc"
msgstr "" msgstr ""
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Zpět" msgstr "Zpět"
@@ -282,6 +286,10 @@ msgstr ""
msgid "Date created" msgid "Date created"
msgstr "Datum vytvoření" msgstr "Datum vytvoření"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Smazat" msgstr "Smazat"
@@ -600,6 +608,10 @@ msgstr "Označit jako přečtené"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Označit jako přečtené až sem" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "Metriky" msgstr "Metriky"

View File

@@ -134,6 +134,10 @@ msgstr "Ydych chi'n siŵr eich bod am ddad-danysgrifio o <0>{feedName}</0>?"
msgid "Asc" msgid "Asc"
msgstr "" msgstr ""
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Yn ôl" msgstr "Yn ôl"
@@ -282,6 +286,10 @@ msgstr ""
msgid "Date created" msgid "Date created"
msgstr "Dyddiad creu" msgstr "Dyddiad creu"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Dileu" msgstr "Dileu"
@@ -600,6 +608,10 @@ msgstr "Marciwch ei fod wedi'i ddarllen"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Marciwch fel y darllenwyd hyd yma" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "metrigau" msgstr "metrigau"

View File

@@ -134,6 +134,10 @@ msgstr "Er du sikker på, at du vil afmelde <0>{feedName}</0>?"
msgid "Asc" msgid "Asc"
msgstr "" msgstr ""
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Tilbage" msgstr "Tilbage"
@@ -282,6 +286,10 @@ msgstr ""
msgid "Date created" msgid "Date created"
msgstr "Dato oprettet" msgstr "Dato oprettet"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Slet" msgstr "Slet"
@@ -600,6 +608,10 @@ msgstr "Markér som læst"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Markér som læst indtil her" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "" msgstr ""

View File

@@ -134,6 +134,10 @@ msgstr "Sind Sie sicher, dass Sie <0>{feedName}</0> abbestellen möchten?"
msgid "Asc" msgid "Asc"
msgstr "Aufsteigend" msgstr "Aufsteigend"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Zurück" msgstr "Zurück"
@@ -282,6 +286,10 @@ msgstr "Dunkel"
msgid "Date created" msgid "Date created"
msgstr "Erstellungsdatum" msgstr "Erstellungsdatum"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Löschen" msgstr "Löschen"
@@ -600,6 +608,10 @@ msgstr "Als gelesen markieren"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Bis hierhin als gelesen markieren" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "Metriken" msgstr "Metriken"

View File

@@ -134,6 +134,10 @@ msgstr "Are you sure you want to unsubscribe from <0>{feedName}</0>?"
msgid "Asc" msgid "Asc"
msgstr "Asc" msgstr "Asc"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr "Auto-mark as read"
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Back" msgstr "Back"
@@ -282,6 +286,10 @@ msgstr "Dark"
msgid "Date created" msgid "Date created"
msgstr "Date created" msgstr "Date created"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr "days"
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Delete" msgstr "Delete"
@@ -600,6 +608,10 @@ msgstr "Mark as read"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "Metrics" msgstr "Metrics"

View File

@@ -135,6 +135,10 @@ msgstr "¿Estás seguro de que deseas darte de baja de <0>{feedName}</0>?"
msgid "Asc" msgid "Asc"
msgstr "Asc" msgstr "Asc"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Atrás" msgstr "Atrás"
@@ -283,6 +287,10 @@ msgstr "Oscuro"
msgid "Date created" msgid "Date created"
msgstr "Fecha de creación" msgstr "Fecha de creación"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Borrar" msgstr "Borrar"
@@ -601,6 +609,10 @@ msgstr "Marcar como leído"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Marcar como leído hasta aquí" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "Métricas" msgstr "Métricas"

View File

@@ -134,6 +134,10 @@ msgstr "آیا مطمئن هستید که می خواهید اشتراک <0>{fee
msgid "Asc" msgid "Asc"
msgstr "صعودی" msgstr "صعودی"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "برگشت" msgstr "برگشت"
@@ -282,6 +286,10 @@ msgstr ""
msgid "Date created" msgid "Date created"
msgstr "تاریخ ایجاد" msgstr "تاریخ ایجاد"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "حذف کنید" msgstr "حذف کنید"
@@ -600,6 +608,10 @@ msgstr "علامت گذاری به عنوان خوانده شده"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "تا اینجا به عنوان خوانده شده علامت بزنید" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "متریک" msgstr "متریک"

View File

@@ -134,6 +134,10 @@ msgstr "Haluatko varmasti peruuttaa kohteen <0>{feedName}</0> tilauksen?"
msgid "Asc" msgid "Asc"
msgstr "" msgstr ""
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Takaisin" msgstr "Takaisin"
@@ -282,6 +286,10 @@ msgstr ""
msgid "Date created" msgid "Date created"
msgstr "Luontipäivämäärä" msgstr "Luontipäivämäärä"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Poista" msgstr "Poista"
@@ -600,6 +608,10 @@ msgstr "Merkitse luetuksi"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Merkitse luetuksi tähän asti" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "" msgstr ""

View File

@@ -134,6 +134,10 @@ msgstr "Êtes-vous sûr de vouloir vous désabonner de <0>{feedName}</0> ?"
msgid "Asc" msgid "Asc"
msgstr "Ascendant" msgstr "Ascendant"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Retour" msgstr "Retour"
@@ -282,6 +286,10 @@ msgstr "Foncé"
msgid "Date created" msgid "Date created"
msgstr "Date de création" msgstr "Date de création"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Effacer" msgstr "Effacer"
@@ -600,6 +608,10 @@ msgstr "Marquer comme lu"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Marquer comme lu jusqu'ici" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "Métriques" msgstr "Métriques"

View File

@@ -135,6 +135,10 @@ msgstr "Tes certeza de querer cancelar a subscrición a <0>{feedName}</0>?"
msgid "Asc" msgid "Asc"
msgstr "Asc" msgstr "Asc"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Volver" msgstr "Volver"
@@ -283,6 +287,10 @@ msgstr "Escuro"
msgid "Date created" msgid "Date created"
msgstr "Data de creación" msgstr "Data de creación"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Eliminar" msgstr "Eliminar"
@@ -601,6 +609,10 @@ msgstr "Marcar como lido"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Marcar como lido ata aquí" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "Estatísticas" msgstr "Estatísticas"

View File

@@ -134,6 +134,10 @@ msgstr "Biztosan le szeretne iratkozni a következőről: <0>{feedName}</0>?"
msgid "Asc" msgid "Asc"
msgstr "" msgstr ""
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Vissza" msgstr "Vissza"
@@ -282,6 +286,10 @@ msgstr ""
msgid "Date created" msgid "Date created"
msgstr "Létrehozás dátuma" msgstr "Létrehozás dátuma"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Törlés" msgstr "Törlés"
@@ -600,6 +608,10 @@ msgstr "Megjelölés olvasottként"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Megjelölés idáig olvasottként" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "" msgstr ""

View File

@@ -134,6 +134,10 @@ msgstr "Yakin ingin berhenti berlangganan <0>{feedName}</0>?"
msgid "Asc" msgid "Asc"
msgstr "" msgstr ""
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Kembali" msgstr "Kembali"
@@ -282,6 +286,10 @@ msgstr ""
msgid "Date created" msgid "Date created"
msgstr "Tanggal dibuat" msgstr "Tanggal dibuat"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Hapus" msgstr "Hapus"
@@ -600,6 +608,10 @@ msgstr "Tandai sebagai telah dibaca"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Tandai sebagai telah dibaca sampai di sini" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "Metrik" msgstr "Metrik"

View File

@@ -134,6 +134,10 @@ msgstr "Sei sicuro di voler annullare l'iscrizione a <0>{feedName}</0>?"
msgid "Asc" msgid "Asc"
msgstr "" msgstr ""
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Indietro" msgstr "Indietro"
@@ -282,6 +286,10 @@ msgstr ""
msgid "Date created" msgid "Date created"
msgstr "Data di creazione" msgstr "Data di creazione"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Elimina" msgstr "Elimina"
@@ -600,6 +608,10 @@ msgstr "Contrassegna come letto"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Contrassegna come letto fino a qui" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "Metriche" msgstr "Metriche"

View File

@@ -134,6 +134,10 @@ msgstr "<0>{feedName}</0> の登録を解除してもよろしいですか?"
msgid "Asc" msgid "Asc"
msgstr "昇順" msgstr "昇順"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "戻る" msgstr "戻る"
@@ -282,6 +286,10 @@ msgstr "ダーク"
msgid "Date created" msgid "Date created"
msgstr "作成日" msgstr "作成日"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "削除" msgstr "削除"
@@ -600,6 +608,10 @@ msgstr "既読にする"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "ここまで既読にする" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "メトリックス" msgstr "メトリックス"

View File

@@ -134,6 +134,10 @@ msgstr "<0>{feedName}</0> 구독을 취소하시겠습니까?"
msgid "Asc" msgid "Asc"
msgstr "오름차순" msgstr "오름차순"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "뒤로" msgstr "뒤로"
@@ -282,6 +286,10 @@ msgstr ""
msgid "Date created" msgid "Date created"
msgstr "생성 날짜" msgstr "생성 날짜"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "삭제" msgstr "삭제"
@@ -600,6 +608,10 @@ msgstr "읽은 상태로 표시"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "여기까지 읽은 것으로 표시" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "메트릭스" msgstr "메트릭스"

View File

@@ -134,6 +134,10 @@ msgstr "Adakah anda pasti mahu berhenti melanggan <0>{feedName}</0>?"
msgid "Asc" msgid "Asc"
msgstr "" msgstr ""
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Kembali" msgstr "Kembali"
@@ -282,6 +286,10 @@ msgstr ""
msgid "Date created" msgid "Date created"
msgstr "Tarikh dibuat" msgstr "Tarikh dibuat"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Padam" msgstr "Padam"
@@ -600,6 +608,10 @@ msgstr "Tandakan sebagai dibaca"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Tandai sebagai dibaca sehingga di sini" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "Metrik" msgstr "Metrik"

View File

@@ -134,6 +134,10 @@ msgstr "Er du sikker på at du vil avslutte abonnementet på <0>{feedName}</0>?"
msgid "Asc" msgid "Asc"
msgstr "" msgstr ""
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Tilbake" msgstr "Tilbake"
@@ -282,6 +286,10 @@ msgstr ""
msgid "Date created" msgid "Date created"
msgstr "Dato opprettet" msgstr "Dato opprettet"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Slett" msgstr "Slett"
@@ -600,6 +608,10 @@ msgstr "Merk som lest"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Merk som lest frem til her" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "Beregninger" msgstr "Beregninger"

View File

@@ -134,6 +134,10 @@ msgstr "Weet je zeker dat je je wilt afmelden voor <0>{feedName}</0>?"
msgid "Asc" msgid "Asc"
msgstr "" msgstr ""
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Terug" msgstr "Terug"
@@ -282,6 +286,10 @@ msgstr ""
msgid "Date created" msgid "Date created"
msgstr "Datum gemaakt" msgstr "Datum gemaakt"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Verwijderen" msgstr "Verwijderen"
@@ -600,6 +608,10 @@ msgstr "Markeren als gelezen"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Markeer als gelezen tot hier" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "Metrieken" msgstr "Metrieken"

View File

@@ -134,6 +134,10 @@ msgstr "Er du sikker på at du vil avslutte abonnementet på <0>{feedName}</0>?"
msgid "Asc" msgid "Asc"
msgstr "" msgstr ""
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Tilbake" msgstr "Tilbake"
@@ -282,6 +286,10 @@ msgstr ""
msgid "Date created" msgid "Date created"
msgstr "Dato opprettet" msgstr "Dato opprettet"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Slett" msgstr "Slett"
@@ -600,6 +608,10 @@ msgstr "Merk som lest"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Merk som lest frem til her" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "Beregninger" msgstr "Beregninger"

View File

@@ -134,6 +134,10 @@ msgstr "Czy na pewno chcesz zrezygnować z subskrypcji <0>{feedName}</0>?"
msgid "Asc" msgid "Asc"
msgstr "" msgstr ""
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Powrót" msgstr "Powrót"
@@ -282,6 +286,10 @@ msgstr ""
msgid "Date created" msgid "Date created"
msgstr "Data utworzenia" msgstr "Data utworzenia"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Usuń" msgstr "Usuń"
@@ -600,6 +608,10 @@ msgstr "Oznacz jako przeczytane"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Oznacz jako przeczytane do tej pory" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "Metryki" msgstr "Metryki"

View File

@@ -134,6 +134,10 @@ msgstr "Tem certeza de que deseja cancelar a inscrição em <0>{feedName}</0>?"
msgid "Asc" msgid "Asc"
msgstr "Asc" msgstr "Asc"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Voltar" msgstr "Voltar"
@@ -282,6 +286,10 @@ msgstr "Escuro"
msgid "Date created" msgid "Date created"
msgstr "Data de criação" msgstr "Data de criação"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Excluir" msgstr "Excluir"
@@ -600,6 +608,10 @@ msgstr "Marcar como lido"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Marcar como lido até aqui" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "Métricas" msgstr "Métricas"

View File

@@ -134,6 +134,10 @@ msgstr "Вы уверены, что хотите отказаться от по
msgid "Asc" msgid "Asc"
msgstr "По возрастанию" msgstr "По возрастанию"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Назад" msgstr "Назад"
@@ -282,6 +286,10 @@ msgstr "Темная"
msgid "Date created" msgid "Date created"
msgstr "Дата создания" msgstr "Дата создания"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Удалить" msgstr "Удалить"
@@ -600,6 +608,10 @@ msgstr "Отметить как прочитанное"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Отметить как прочитанное до этого места" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "Метрики" msgstr "Метрики"

View File

@@ -134,6 +134,10 @@ msgstr "Naozaj chcete zrušiť odber kanála <0>{feedName}</0>?"
msgid "Asc" msgid "Asc"
msgstr "" msgstr ""
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Späť" msgstr "Späť"
@@ -282,6 +286,10 @@ msgstr ""
msgid "Date created" msgid "Date created"
msgstr "Dátum vytvorenia" msgstr "Dátum vytvorenia"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Vymazať" msgstr "Vymazať"
@@ -600,6 +608,10 @@ msgstr "Označiť ako prečítané"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Označiť ako prečítané až sem" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "Metriky" msgstr "Metriky"

View File

@@ -134,6 +134,10 @@ msgstr "Är du säker på att du vill avsluta prenumerationen på <0>{feedName}<
msgid "Asc" msgid "Asc"
msgstr "" msgstr ""
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Tillbaka" msgstr "Tillbaka"
@@ -282,6 +286,10 @@ msgstr ""
msgid "Date created" msgid "Date created"
msgstr "Datum skapat" msgstr "Datum skapat"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Ta bort" msgstr "Ta bort"
@@ -600,6 +608,10 @@ msgstr "Markera som läst"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Markera som läst hit" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "Mätverk" msgstr "Mätverk"

View File

@@ -134,6 +134,10 @@ msgstr "<0>{feedName}</0> aboneliğinden çıkmak istediğinizden emin misiniz?"
msgid "Asc" msgid "Asc"
msgstr "Artan" msgstr "Artan"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "Geri" msgstr "Geri"
@@ -282,6 +286,10 @@ msgstr ""
msgid "Date created" msgid "Date created"
msgstr "Oluşturulma tarihi" msgstr "Oluşturulma tarihi"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "Sil" msgstr "Sil"
@@ -600,6 +608,10 @@ msgstr "Okundu olarak işaretle"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "Buraya kadar okundu olarak işaretle" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "Metrikler" msgstr "Metrikler"

View File

@@ -134,6 +134,10 @@ msgstr "您确定要退订 <0>{feedName}</0> 吗?"
msgid "Asc" msgid "Asc"
msgstr "升序" msgstr "升序"
#: src/pages/app/FeedDetailsPage.tsx
msgid "Auto-mark as read"
msgstr ""
#: src/components/content/add/Subscribe.tsx #: src/components/content/add/Subscribe.tsx
msgid "Back" msgid "Back"
msgstr "返回" msgstr "返回"
@@ -282,6 +286,10 @@ msgstr "暗黑"
msgid "Date created" msgid "Date created"
msgstr "创建日期" msgstr "创建日期"
#: src/pages/app/FeedDetailsPage.tsx
msgid "days"
msgstr ""
#: src/pages/app/CategoryDetailsPage.tsx #: src/pages/app/CategoryDetailsPage.tsx
msgid "Delete" msgid "Delete"
msgstr "删除" msgstr "删除"
@@ -600,6 +608,10 @@ msgstr "标记为已读"
msgid "Mark as read up to here" msgid "Mark as read up to here"
msgstr "标记为已读到这里" 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 #: src/components/header/ProfileMenu.tsx
msgid "Metrics" msgid "Metrics"
msgstr "指标" msgstr "指标"

View File

@@ -1,3 +1,5 @@
import { msg } from "@lingui/core/macro"
import { useLingui } from "@lingui/react"
import { Trans } from "@lingui/react/macro" import { Trans } from "@lingui/react/macro"
import { import {
Anchor, Anchor,
@@ -38,6 +40,7 @@ export function FeedDetailsPage() {
if (!id) throw new Error("id required") if (!id) throw new Error("id required")
const apiKey = useAppSelector(state => state.user.profile?.apiKey) const apiKey = useAppSelector(state => state.user.profile?.apiKey)
const { _ } = useLingui()
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const query = useAsync(async () => await client.feed.get(id), [id]) const query = useAsync(async () => await client.feed.get(id), [id])
const feed = query.result?.data const feed = query.result?.data
@@ -144,6 +147,14 @@ export function FeedDetailsPage() {
<CategorySelect label={<Trans>Category</Trans>} {...form.getInputProps("categoryId")} clearable /> <CategorySelect label={<Trans>Category</Trans>} {...form.getInputProps("categoryId")} clearable />
<NumberInput label={<Trans>Position</Trans>} {...form.getInputProps("position")} required min={0} /> <NumberInput label={<Trans>Position</Trans>} {...form.getInputProps("position")} required min={0} />
<ReceivePushNotificationsChechbox {...form.getInputProps("pushNotificationsEnabled", { type: "checkbox" })} /> <ReceivePushNotificationsChechbox {...form.getInputProps("pushNotificationsEnabled", { type: "checkbox" })} />
<NumberInput
label={<Trans>Auto-mark as read</Trans>}
description={<Trans>Mark entries in this feed as read after this number of days. Leave empty to disable.</Trans>}
suffix={` ${_(msg`days`)}`}
{...form.getInputProps("autoMarkAsReadAfterDays")}
min={1}
max={3650}
/>
<Input.Wrapper <Input.Wrapper
label={<Trans>Filtering expression</Trans>} label={<Trans>Filtering expression</Trans>}
description={ description={

View File

@@ -18,15 +18,19 @@ import com.commafeed.backend.model.FeedEntry;
import com.commafeed.backend.model.FeedEntryStatus; import com.commafeed.backend.model.FeedEntryStatus;
import com.commafeed.backend.model.FeedEntryTag; import com.commafeed.backend.model.FeedEntryTag;
import com.commafeed.backend.model.FeedSubscription; import com.commafeed.backend.model.FeedSubscription;
import com.commafeed.backend.model.QFeed;
import com.commafeed.backend.model.QFeedEntry; import com.commafeed.backend.model.QFeedEntry;
import com.commafeed.backend.model.QFeedEntryContent; import com.commafeed.backend.model.QFeedEntryContent;
import com.commafeed.backend.model.QFeedEntryStatus; import com.commafeed.backend.model.QFeedEntryStatus;
import com.commafeed.backend.model.QFeedEntryTag; import com.commafeed.backend.model.QFeedEntryTag;
import com.commafeed.backend.model.QFeedSubscription;
import com.commafeed.backend.model.User; import com.commafeed.backend.model.User;
import com.commafeed.backend.model.UserSettings.ReadingOrder; import com.commafeed.backend.model.UserSettings.ReadingOrder;
import com.commafeed.frontend.model.UnreadCount; import com.commafeed.frontend.model.UnreadCount;
import com.querydsl.core.BooleanBuilder; import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.Tuple; 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; import com.querydsl.jpa.impl.JPAQuery;
@Singleton @Singleton
@@ -34,8 +38,10 @@ public class FeedEntryStatusDAO extends GenericDAO<FeedEntryStatus> {
private static final QFeedEntryStatus STATUS = QFeedEntryStatus.feedEntryStatus; private static final QFeedEntryStatus STATUS = QFeedEntryStatus.feedEntryStatus;
private static final QFeedEntry ENTRY = QFeedEntry.feedEntry; private static final QFeedEntry ENTRY = QFeedEntry.feedEntry;
private static final QFeed FEED = QFeed.feed;
private static final QFeedEntryContent CONTENT = QFeedEntryContent.feedEntryContent; private static final QFeedEntryContent CONTENT = QFeedEntryContent.feedEntryContent;
private static final QFeedEntryTag TAG = QFeedEntryTag.feedEntryTag; private static final QFeedEntryTag TAG = QFeedEntryTag.feedEntryTag;
private static final QFeedSubscription SUBSCRIPTION = QFeedSubscription.feedSubscription;
private final FeedEntryTagDAO feedEntryTagDAO; private final FeedEntryTagDAO feedEntryTagDAO;
private final CommaFeedConfiguration config; private final CommaFeedConfiguration config;
@@ -232,4 +238,58 @@ public class FeedEntryStatusDAO extends GenericDAO<FeedEntryStatus> {
return deleteQuery(STATUS).where(STATUS.id.in(ids)).execute(); 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<Integer> daysDiff = Expressions.numberTemplate(Integer.class, "TIMESTAMPDIFF(DAY, {0}, {1})", ENTRY.published,
now);
where.and(daysDiff.goe(SUBSCRIPTION.autoMarkAsReadAfterDays));
where.and(buildUnreadPredicate());
List<Tuple> 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<Long> 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;
}
} }

View File

@@ -49,4 +49,7 @@ public class FeedSubscription extends AbstractModel {
@Column(name = "push_notifications_enabled") @Column(name = "push_notifications_enabled")
private boolean pushNotificationsEnabled; private boolean pushNotificationsEnabled;
@Column(name = "auto_mark_as_read_after_days")
private Integer autoMarkAsReadAfterDays;
} }

View File

@@ -133,4 +133,16 @@ public class DatabaseCleaningService {
} while (deleted != 0); } while (deleted != 0);
log.info("cleanup done: {} old read statuses deleted", total); 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);
}
} }

View File

@@ -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;
}
}

View File

@@ -68,6 +68,9 @@ public class Subscription implements Serializable {
@Schema(description = "whether to send push notifications for new entries of this feed", required = true) @Schema(description = "whether to send push notifications for new entries of this feed", required = true)
private boolean pushNotificationsEnabled; 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) { public static Subscription build(FeedSubscription subscription, UnreadCount unreadCount) {
FeedCategory category = subscription.getCategory(); FeedCategory category = subscription.getCategory();
Feed feed = subscription.getFeed(); Feed feed = subscription.getFeed();
@@ -89,6 +92,7 @@ public class Subscription implements Serializable {
sub.setFilter(subscription.getFilter()); sub.setFilter(subscription.getFilter());
sub.setFilterLegacy(subscription.getFilterLegacy()); sub.setFilterLegacy(subscription.getFilterLegacy());
sub.setPushNotificationsEnabled(subscription.isPushNotificationsEnabled()); sub.setPushNotificationsEnabled(subscription.isPushNotificationsEnabled());
sub.setAutoMarkAsReadAfterDays(subscription.getAutoMarkAsReadAfterDays());
return sub; return sub;
} }

View File

@@ -34,4 +34,7 @@ public class FeedModificationRequest implements Serializable {
@Schema(description = "whether to send push notifications for new entries of this feed") @Schema(description = "whether to send push notifications for new entries of this feed")
private boolean pushNotificationsEnabled; private boolean pushNotificationsEnabled;
@Schema(description = "automatically mark entries as read after this many days (null to disable)")
private Integer autoMarkAsReadAfterDays;
} }

View File

@@ -437,6 +437,7 @@ public class FeedREST {
} }
subscription.setPushNotificationsEnabled(req.isPushNotificationsEnabled()); subscription.setPushNotificationsEnabled(req.isPushNotificationsEnabled());
subscription.setAutoMarkAsReadAfterDays(req.getAutoMarkAsReadAfterDays());
if (StringUtils.isNotBlank(req.getName())) { if (StringUtils.isNotBlank(req.getName())) {
subscription.setTitle(req.getName()); subscription.setTitle(req.getName());

View File

@@ -32,5 +32,15 @@
</addColumn> </addColumn>
</changeSet> </changeSet>
</databaseChangeLog> <changeSet id="add-auto-mark-as-read-after-days" author="athou">
<addColumn tableName="FEEDSUBSCRIPTIONS">
<column name="auto_mark_as_read_after_days" type="INT">
<constraints nullable="true" />
</column>
</addColumn>
<createIndex indexName="feedsubscriptions_automark_index" tableName="FEEDSUBSCRIPTIONS">
<column name="auto_mark_as_read_after_days" />
</createIndex>
</changeSet>
</databaseChangeLog>

View File

@@ -15,6 +15,7 @@ import com.commafeed.TestConstants;
import com.commafeed.backend.service.db.DatabaseCleaningService; import com.commafeed.backend.service.db.DatabaseCleaningService;
import com.commafeed.frontend.model.Entries; import com.commafeed.frontend.model.Entries;
import com.commafeed.frontend.model.Entry; import com.commafeed.frontend.model.Entry;
import com.commafeed.frontend.model.request.FeedModificationRequest;
import com.commafeed.frontend.model.request.StarRequest; import com.commafeed.frontend.model.request.StarRequest;
import com.commafeed.frontend.resource.CategoryREST; import com.commafeed.frontend.resource.CategoryREST;
import com.commafeed.integration.BaseIT; import com.commafeed.integration.BaseIT;
@@ -182,4 +183,30 @@ class DatabaseCleaningIT extends BaseIT {
Assertions.assertEquals(0, entriesAfter.getEntries().size()); 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());
}
}
} }