# app/modules/contracts/cms.py """ CMS module contracts. Defines the interface for content management functionality that other modules can depend on without importing the concrete implementation. """ from typing import TYPE_CHECKING, Protocol, runtime_checkable if TYPE_CHECKING: from sqlalchemy.orm import Session @runtime_checkable class ContentServiceProtocol(Protocol): """ Protocol for content page service. Defines the interface for retrieving and managing content pages with three-tier resolution (platform > vendor default > vendor override). """ def get_page_for_vendor( self, db: "Session", platform_id: int, slug: str, vendor_id: int | None = None, include_unpublished: bool = False, ) -> object | None: """ Get content page with three-tier resolution. Resolution order: 1. Vendor override (platform_id + vendor_id + slug) 2. Vendor default (platform_id + vendor_id=NULL + is_platform_page=False + slug) Args: db: Database session platform_id: Platform ID slug: Page slug vendor_id: Vendor ID (None for defaults only) include_unpublished: Include draft pages Returns: ContentPage or None """ ... def get_platform_page( self, db: "Session", platform_id: int, slug: str, include_unpublished: bool = False, ) -> object | None: """ Get a platform marketing page. Args: db: Database session platform_id: Platform ID slug: Page slug include_unpublished: Include draft pages Returns: ContentPage or None """ ... def list_pages_for_vendor( self, db: "Session", platform_id: int, vendor_id: int | None = None, include_unpublished: bool = False, footer_only: bool = False, header_only: bool = False, legal_only: bool = False, ) -> list: """ List all available pages for a vendor storefront. Merges vendor overrides with vendor defaults, prioritizing overrides. Args: db: Database session platform_id: Platform ID vendor_id: Vendor ID (None for vendor defaults only) include_unpublished: Include draft pages footer_only: Only pages marked for footer display header_only: Only pages marked for header display legal_only: Only pages marked for legal/bottom bar display Returns: List of ContentPage objects """ ... def list_platform_pages( self, db: "Session", platform_id: int, include_unpublished: bool = False, footer_only: bool = False, header_only: bool = False, ) -> list: """ List platform marketing pages. Args: db: Database session platform_id: Platform ID include_unpublished: Include draft pages footer_only: Only pages marked for footer display header_only: Only pages marked for header display Returns: List of platform marketing ContentPage objects """ ... @runtime_checkable class MediaServiceProtocol(Protocol): """ Protocol for media library service. Defines the interface for managing media files (images, documents, etc.). """ def get_media_by_id( self, db: "Session", media_id: int, ) -> object | None: """Get media item by ID.""" ... def list_media_for_vendor( self, db: "Session", vendor_id: int, media_type: str | None = None, ) -> list: """List media items for a vendor.""" ...