Refactor archive_feed_task to include auto-retry and error handling

This commit is contained in:
Joakim Hellsén 2026-03-26 19:28:19 +01:00
commit 78de71a7ff
Signed by: Joakim Hellsén
SSH key fingerprint: SHA256:/9h/CsExpFp+PRhsfA0xznFx2CGfTT5R/kpuFfUgEQk

View file

@ -1,14 +1,24 @@
from typing import TYPE_CHECKING
from celery import shared_task
from feeds.models import Feed
from feeds.services import fetch_and_archive_feed
if TYPE_CHECKING:
from celery import Task
@shared_task
def archive_feed_task(feed_id: int) -> str:
@shared_task(
bind=True,
autoretry_for=(Exception,),
retry_kwargs={"max_retries": 3, "countdown": 60},
)
def archive_feed_task(self: Task, feed_id: int) -> str:
"""Celery task to fetch and archive a feed by its ID.
Args:
self: The task instance.
feed_id: The ID of the Feed to archive.
Returns:
@ -18,7 +28,14 @@ def archive_feed_task(feed_id: int) -> str:
feed: Feed = Feed.objects.get(id=feed_id)
except Feed.DoesNotExist:
return f"Feed with id {feed_id} does not exist."
new_entries_count: int = fetch_and_archive_feed(feed)
if new_entries_count > 0:
return f"Archived {new_entries_count} new entries for {feed.url}"
return f"No new entries archived for {feed.url}"
try:
new_entries_count: int = fetch_and_archive_feed(feed)
# TODO(TheLovinator): Replace with a specific exception type # noqa: TD003
except ValueError as e:
raise self.retry(exc=e) from e
else:
if new_entries_count > 0:
return f"Archived {new_entries_count} new entries for {feed.url}"
return f"No new entries archived for {feed.url}"