- PostLike domain entity (post_id, liked_by) with BaseEntity integration
- Post entity: add like_count field (default 0) and to_dict serialization
- PostRepository interface: add get_like, add_like, remove_like methods
- TogglePostLikeUseCase: toggle logic (like → unlike, unlike → like)
- PostResponseDTO/PostResponseSchema: add like_count field
- PostLikeORM model with FK to posts and cascade delete
- SQLAlchemyPostRepository: implement like query/add/remove with ORM mapping
- DI provider registration for TogglePostLikeUseCase
- API endpoint POST /api/v1/posts/{id}/like (auth required)
- Unit tests: PostLike entity, Post.like_count, TogglePostLikeUseCase (7 tests)
- API tests: POST /api/v1/posts/{id}/like (4 tests)
- Test model files: FEATURE_LIKES.md, TEST_MODEL.md updated
41 lines
988 B
Python
41 lines
988 B
Python
"""Domain entity for PostLike.
|
|
|
|
This module defines the PostLike entity that tracks which users
|
|
or devices have liked which posts.
|
|
"""
|
|
|
|
from dataclasses import dataclass
|
|
from typing import Any
|
|
from uuid import UUID
|
|
|
|
from app.domain.entities.base import BaseEntity
|
|
|
|
|
|
@dataclass(kw_only=True)
|
|
class PostLike(BaseEntity):
|
|
"""Post like domain entity.
|
|
|
|
Tracks a like on a blog post by a user or device.
|
|
Each like is uniquely identified by its entity ID.
|
|
|
|
Attributes:
|
|
post_id: UUID of the liked post.
|
|
liked_by: Identifier of the user or device that liked.
|
|
"""
|
|
|
|
post_id: UUID
|
|
liked_by: str
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
"""Convert entity to dictionary.
|
|
|
|
Returns:
|
|
Dictionary with all PostLike attributes.
|
|
"""
|
|
return {
|
|
"id": str(self.id),
|
|
"post_id": str(self.post_id),
|
|
"liked_by": self.liked_by,
|
|
"created_at": self.created_at.isoformat(),
|
|
}
|