| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- from commu.interfaces.post_repository import PostRepository
- from core.models import Post, PostRating
- from django.contrib.auth import get_user_model
- User = get_user_model()
- class DjangoPostRepository(PostRepository):
- def add(self, post):
- # post: commu.entities.post.Post
- try:
- author = User.objects.get(id=post.author_id)
- except User.DoesNotExist:
- raise ValueError("Author not found")
- obj = Post.objects.create(
- author=author,
- text=post.text,
- images=post.images,
- videos=post.videos,
- )
- post.id = str(obj.id)
- return post
- def get(self, post_id):
- try:
- obj = Post.objects.get(id=post_id)
- from commu.entities.post import Post as DomainPost
- domain_post = DomainPost(
- author_id=str(obj.author.id),
- text=obj.text,
- images=obj.images,
- videos=obj.videos,
- )
- domain_post.id = str(obj.id)
- # Load ratings
- domain_post.ratings = [
- (str(r.user.id), r.rating)
- for r in obj.ratings.all()
- ]
- return domain_post
- except Post.DoesNotExist:
- return None
- def search(self, query: str):
- qs = Post.objects.filter(text__icontains=query)
- from commu.entities.post import Post as DomainPost
- result = []
- for obj in qs:
- domain_post = DomainPost(
- author_id=str(obj.author.id),
- text=obj.text,
- images=obj.images,
- videos=obj.videos,
- )
- domain_post.id = str(obj.id)
- # Load ratings
- domain_post.ratings = [
- (str(r.user.id), r.rating)
- for r in obj.ratings.all()
- ]
- result.append(domain_post)
- return result
- def rate_post(self, post_id, user_id, rating: int):
- try:
- post = Post.objects.get(id=post_id)
- user = User.objects.get(id=user_id)
- except (Post.DoesNotExist, User.DoesNotExist):
- raise ValueError("Post or user not found")
- # Remove old rating from user, if any
- PostRating.objects.filter(post=post, user=user).delete()
- # Create new rating
- PostRating.objects.create(post=post, user=user, rating=rating)
- def delete(self, post_id):
- try:
- obj = Post.objects.get(id=post_id)
- obj.delete()
- except Post.DoesNotExist:
- raise ValueError("Post not found")
- def list(self, page=1, per_page=10, order_by="-created"):
- qs = Post.objects.all().order_by(order_by)
- total = qs.count()
- start = (page - 1) * per_page
- end = start + per_page
- from commu.entities.post import Post as DomainPost
- posts = []
- for obj in qs[start:end]:
- domain_post = DomainPost(
- author_id=str(obj.author.id),
- text=obj.text,
- images=obj.images,
- videos=obj.videos,
- )
- domain_post.id = str(obj.id)
- domain_post.ratings = [
- (str(r.user.id), r.rating)
- for r in obj.ratings.all()
- ]
- posts.append(domain_post)
- return posts, total
- def update(self, post):
- try:
- obj = Post.objects.get(id=post.id)
- obj.text = post.text
- obj.images = post.images
- obj.videos = post.videos
- obj.save()
- # Optionally update ratings (if part of update)
- except Post.DoesNotExist:
- raise ValueError("Post not found")
|