"""Create post use case.""" from app.application.dtos.post import CreatePostDTO, PostResponseDTO from app.application.interfaces import TransactionManager from app.domain.entities import Post from app.domain.exceptions import AlreadyExistsException from app.domain.repositories import PostRepository class CreatePostUseCase: """Use case for creating a new blog post.""" def __init__( self, post_repo: PostRepository, tx_manager: TransactionManager, ) -> None: self._post_repo = post_repo self._tx_manager = tx_manager async def execute(self, dto: CreatePostDTO) -> PostResponseDTO: """Execute the use case.""" # Generate slug from title from app.domain.value_objects import Slug slug = Slug.from_title(dto.title) # Check if slug already exists if await self._post_repo.slug_exists(slug.value): raise AlreadyExistsException(f"Post with slug '{slug.value}' already exists") # Create domain entity post = Post.create( title_str=dto.title, content_str=dto.content, author_id=dto.author_id, tags=dto.tags or [], ) # Persist entity await self._post_repo.add(post) # Commit transaction await self._tx_manager.commit() return self._map_to_dto(post) 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, )