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")