mirror of
https://github.com/khoaliber/LetterFeed.git
synced 2026-03-02 21:19:13 +00:00
v0.1.0
This commit is contained in:
38
backend/app/services/feed_generator.py
Normal file
38
backend/app/services/feed_generator.py
Normal file
@@ -0,0 +1,38 @@
|
||||
from dateutil import tz
|
||||
from feedgen.feed import FeedGenerator
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.core.config import settings
|
||||
from app.crud.entries import get_entries_by_newsletter
|
||||
from app.crud.newsletters import get_newsletter
|
||||
|
||||
|
||||
def generate_feed(db: Session, newsletter_id: int):
|
||||
"""Generate an Atom feed for a given newsletter."""
|
||||
newsletter = get_newsletter(db, newsletter_id)
|
||||
if not newsletter:
|
||||
return None
|
||||
|
||||
entries = get_entries_by_newsletter(db, newsletter_id)
|
||||
|
||||
feed_url = f"{settings.app_base_url}/feeds/{newsletter_id}"
|
||||
|
||||
fg = FeedGenerator()
|
||||
fg.id(f"urn:letterfeed:newsletter:{newsletter.id}")
|
||||
fg.title(newsletter.name)
|
||||
fg.link(href=feed_url, rel="self")
|
||||
sender_emails = ", ".join([s.email for s in newsletter.senders])
|
||||
fg.description(f"A feed of newsletters from {sender_emails}")
|
||||
|
||||
for entry in entries:
|
||||
fe = fg.add_entry()
|
||||
fe.id(f"urn:letterfeed:entry:{entry.id}")
|
||||
fe.title(entry.subject)
|
||||
fe.content(entry.body, type="html")
|
||||
if entry.received_at.tzinfo is None:
|
||||
timezone_aware_received_at = entry.received_at.replace(tzinfo=tz.tzutc())
|
||||
fe.published(timezone_aware_received_at)
|
||||
else:
|
||||
fe.published(entry.received_at)
|
||||
|
||||
return fg.atom_str(pretty=True)
|
||||
Reference in New Issue
Block a user