"""List posts use case.""" from app.application.dtos.post import PostResponseDTO from app.application.interfaces import TransactionManager from app.domain.entities import Post from app.domain.repositories import PostRepository class ListPostsUseCase: """Use case for listing blog posts with filtering.""" def __init__( self, post_repo: PostRepository, tx_manager: TransactionManager, ) -> None: self._post_repo = post_repo self._tx_manager = tx_manager async def all_posts(self) -> list[PostResponseDTO]: """Get all posts.""" posts = await self._post_repo.get_all() return [self._map_to_dto(post) for post in posts] async def published_posts(self) -> list[PostResponseDTO]: """Get all published posts.""" posts = await self._post_repo.get_published() return [self._map_to_dto(post) for post in posts] async def by_author(self, author_id: str) -> list[PostResponseDTO]: """Get posts by author.""" posts = await self._post_repo.get_by_author(author_id) return [self._map_to_dto(post) for post in posts] async def by_tag(self, tag: str) -> list[PostResponseDTO]: """Get posts by tag.""" posts = await self._post_repo.get_by_tag(tag) return [self._map_to_dto(post) for post in posts] async def search(self, query: str) -> list[PostResponseDTO]: """Search posts.""" posts = await self._post_repo.search(query) return [self._map_to_dto(post) for post in posts] def _map_to_dto(self, post: Post) -> PostResponseDTO: """Map domain entity to response DTO.""" return PostResponseDTO( id=post.id, title=post.title.value, content=post.content.value, slug=post.slug.value, author_id=post.author_id, published=post.published, tags=post.tags.copy(), created_at=post.created_at, updated_at=post.updated_at, )