1
1
Fork 0
mirror of https://code.mensbeam.com/MensBeam/Arsse.git synced 2024-12-23 06:34:55 +00:00

Rewrite article cleanup and update docs

This commit is contained in:
J. King 2023-03-01 11:48:23 -05:00
parent fa5786a4cc
commit 02301b0dd9
3 changed files with 21 additions and 43 deletions

View file

@ -385,7 +385,7 @@ Arsse/0.6.0 (Linux 4.15.0; x86_64; https://thearsse.com/)
|------------------|-----------| |------------------|-----------|
| interval or null | `"PT24H"` | | interval or null | `"PT24H"` |
How long to keep a newsfeed and its articles in the database after all its subscriptions have been deleted. Specifying `null` will retain unsubscribed newsfeeds forever, whereas an interval evaluating to zero (e.g. `"PT0S"`) will delete them immediately. How long to keep a newsfeed subscription and its articles in the database after it has been soft-deleted by its owner. Specifying `null` will retain unsubscribed newsfeeds forever, whereas an interval evaluating to zero (e.g. `"PT0S"`) will delete them immediately.
Note that articles of orphaned newsfeeds are still subject to the `purgeArticleUnread` threshold below. Note that articles of orphaned newsfeeds are still subject to the `purgeArticleUnread` threshold below.
@ -395,11 +395,9 @@ Note that articles of orphaned newsfeeds are still subject to the `purgeArticleU
|------------------|---------| |------------------|---------|
| interval or null | `"P7D"` | | interval or null | `"P7D"` |
How long to keep a an article in the database after all users subscribed to its newsfeed have read it. Specifying `null` will retain articles up to the `purgeArticlesUnread` threshold below, whereas an interval evaluating to zero (e.g. `"PT0S"`) will delete them immediately. How long to keep a an article in the database after it has been read. Specifying `null` will retain articles up to the `purgeArticlesUnread` threshold below, whereas an interval evaluating to zero (e.g. `"PT0S"`) will delete them immediately.
If an article is starred by any user, it is retained indefinitely regardless of this setting. If an article is starred by its owner, it is retained indefinitely regardless of this setting.
This setting also governs when an article is hidden from a user after being read by that user, regardless of its actual presence in the database.
### purgeArticlesUnread ### purgeArticlesUnread
@ -407,9 +405,9 @@ This setting also governs when an article is hidden from a user after being read
|------------------|----------| |------------------|----------|
| interval or null | `"P21D"` | | interval or null | `"P21D"` |
How long to keep a an article in the database regardless of whether any users have read it. Specifying `null` will retain articles forever, whereas an interval evaluating to zero (e.g. `"PT0S"`) will delete them immediately. How long to keep a an article in the database regardless of whether it has been read. Specifying `null` will retain articles forever, whereas an interval evaluating to zero (e.g. `"PT0S"`) will delete them immediately.
If an article is starred by any user, it is retained indefinitely regardless of this setting. If an article is starred by its owner, it is retained indefinitely regardless of this setting.
# Obsolete settings # Obsolete settings

View file

@ -94,10 +94,10 @@ use JKingWeb\Arsse\Misc\ValueInfo as Value;
/** @var string|null User-Agent string to use when fetching feeds from foreign servers */ /** @var string|null User-Agent string to use when fetching feeds from foreign servers */
public $fetchUserAgentString = null; public $fetchUserAgentString = null;
/** @var \DateInterval|null When to delete a feed from the database after all its subscriptions have been deleted, as an ISO 8601 duration (default: 24 hours; null for never) /** @var \DateInterval|null When to delete a subscription from the database after it has been soft-deleted, as an ISO 8601 duration (default: 24 hours; null for never)
* @see https://en.wikipedia.org/wiki/ISO_8601#Durations */ * @see https://en.wikipedia.org/wiki/ISO_8601#Durations */
public $purgeFeeds = "PT24H"; public $purgeFeeds = "PT24H";
/** @var \DateInterval|null When to delete an unstarred article in the database after it has been marked read by all users, as an ISO 8601 duration (default: 7 days; null for never) /** @var \DateInterval|null When to delete an unstarred article in the database after it has been marked read, as an ISO 8601 duration (default: 7 days; null for never)
* @see https://en.wikipedia.org/wiki/ISO_8601#Durations */ * @see https://en.wikipedia.org/wiki/ISO_8601#Durations */
public $purgeArticlesRead = "P7D"; public $purgeArticlesRead = "P7D";
/** @var \DateInterval|null When to delete an unstarred article in the database regardless of its read state, as an ISO 8601 duration (default: 21 days; null for never) /** @var \DateInterval|null When to delete an unstarred article in the database regardless of its read state, as an ISO 8601 duration (default: 21 days; null for never)

View file

@ -2043,40 +2043,18 @@ class Database {
from arsse_articles join ( from arsse_articles join (
SELECT article, max(id) as edition from arsse_editions group by article SELECT article, max(id) as edition from arsse_editions group by article
) as latest_editions on arsse_articles.id = latest_editions.article ) as latest_editions on arsse_articles.id = latest_editions.article
where feed = ? order by edition desc limit ? where subscription = ? order by edition desc limit ?
),
target_articles as (
SELECT
id
from arsse_articles
join (
select
feed,
count(*) as subs
from arsse_subscriptions
where feed = ?
group by feed
) as feed_stats on feed_stats.feed = arsse_articles.feed
left join (
select
article,
sum(case when starred = 1 and hidden = 0 then 1 else 0 end) as starred,
sum(case when \"read\" = 1 or hidden = 1 then 1 else 0 end) as \"read\",
max(arsse_marks.modified) as marked_date
from arsse_marks
group by article
) as mark_stats on mark_stats.article = arsse_articles.id
where
coalesce(starred,0) = 0
and (
coalesce(marked_date,modified) <= ?
or (
coalesce(\"read\",0) = coalesce(subs,0)
and coalesce(marked_date,modified) <= ?
)
)
) )
DELETE FROM arsse_articles WHERE id not in (select id from exempt_articles) and id in (select id from target_articles)", DELETE FROM
arsse_articles
where
subscription = ?
and starred = 0
and (
coalesce(marked,modified) <= ?
or (\"read\" = 1 and coalesce(marked,modified) <= ?)
)
and id not in (select id from exempt_articles)",
["int", "int", "int", "datetime", "datetime"] ["int", "int", "int", "datetime", "datetime"]
); );
$limitRead = null; $limitRead = null;
@ -2087,11 +2065,13 @@ class Database {
if (Arsse::$conf->purgeArticlesUnread) { if (Arsse::$conf->purgeArticlesUnread) {
$limitUnread = Date::sub(Arsse::$conf->purgeArticlesUnread); $limitUnread = Date::sub(Arsse::$conf->purgeArticlesUnread);
} }
$feeds = $this->db->query("SELECT id, size from arsse_feeds")->getAll();
$deleted = 0; $deleted = 0;
$tr = $this->begin();
$feeds = $this->db->query("SELECT id, size from arsse_subscriptions")->getAll();
foreach ($feeds as $feed) { foreach ($feeds as $feed) {
$deleted += $query->run($feed['id'], $feed['size'], $feed['id'], $limitUnread, $limitRead)->changes(); $deleted += $query->run($feed['id'], $feed['size'], $feed['id'], $limitUnread, $limitRead)->changes();
} }
$tr->commit();
return (bool) $deleted; return (bool) $deleted;
} }