diff --git a/app/services/platforms/__init__.py b/app/services/platforms/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/services/platforms/base.py b/app/services/platforms/base.py new file mode 100644 index 0000000..560a05b --- /dev/null +++ b/app/services/platforms/base.py @@ -0,0 +1,37 @@ +from __future__ import annotations + +from abc import ABC, abstractmethod +from dataclasses import dataclass, field + + +@dataclass +class PostResult: + url: str + metadata: dict | None = field(default=None) + + +class PostingStrategy(ABC): + """Base class for all posting output types. + + Subclasses must set class attribute `campaign_type` matching the value + stored in campaigns.type. + """ + + campaign_type: str # e.g. "reddit_post", "reddit_comment", "blog_post" + + @abstractmethod + def execute( + self, + *, + target: str, + title: str, + body: str, + flair: str | None = None, + extra: dict | None = None, + ) -> PostResult: + """Execute the post. Raise on failure. Return PostResult on success.""" + ... + + def supports_dupe_guard(self) -> bool: + """Return False to skip the weekly-dupe-guard check for this type.""" + return True diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/services/__init__.py b/tests/services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/services/platforms/__init__.py b/tests/services/platforms/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/services/platforms/test_base.py b/tests/services/platforms/test_base.py new file mode 100644 index 0000000..f5002d3 --- /dev/null +++ b/tests/services/platforms/test_base.py @@ -0,0 +1,12 @@ +from app.services.platforms.base import PostResult + + +def test_post_result_requires_url(): + r = PostResult(url="https://reddit.com/r/test/comments/abc") + assert r.url == "https://reddit.com/r/test/comments/abc" + assert r.metadata is None + + +def test_post_result_accepts_metadata(): + r = PostResult(url="https://example.com", metadata={"id": "abc123"}) + assert r.metadata == {"id": "abc123"}