from abc import ABC, abstractmethod from typing import List from .entities import NewsItem from ..subscriptions.entities import Subscription class NewsFetcher(ABC): """Порт для получения новостей из источника.""" @abstractmethod async def fetch(self, subscription: Subscription) -> List[NewsItem]: """Возвращает все доступные записи из источника.""" ... class NewsPublisher(ABC): """Порт для публикации новости в комнату.""" @abstractmethod async def publish(self, room_jid: str, item: NewsItem) -> bool: """ Отправляет новость в комнату. Возвращает False если бот уже не в комнате — сигнал выключить комнату. """ ... class SentNewsRepository(ABC): """Порт для отслеживания уже отправленных новостей.""" @abstractmethod async def is_sent(self, room_jid: str, subscription_id: int, news_id: str) -> bool: ... @abstractmethod async def mark_sent(self, room_jid: str, subscription_id: int, news_id: str) -> None: ...