暫無描述

django_post_repository.py 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. from commu.interfaces.post_repository import PostRepository
  2. from core.models import Post, PostRating
  3. from django.contrib.auth import get_user_model
  4. User = get_user_model()
  5. class DjangoPostRepository(PostRepository):
  6. def add(self, post):
  7. # post: commu.entities.post.Post
  8. try:
  9. author = User.objects.get(id=post.author_id)
  10. except User.DoesNotExist:
  11. raise ValueError("Author not found")
  12. obj = Post.objects.create(
  13. author=author,
  14. text=post.text,
  15. images=post.images,
  16. videos=post.videos,
  17. )
  18. post.id = str(obj.id)
  19. return post
  20. def get(self, post_id):
  21. try:
  22. obj = Post.objects.get(id=post_id)
  23. from commu.entities.post import Post as DomainPost
  24. domain_post = DomainPost(
  25. author_id=str(obj.author.id),
  26. text=obj.text,
  27. images=obj.images,
  28. videos=obj.videos,
  29. )
  30. domain_post.id = str(obj.id)
  31. # Load ratings
  32. domain_post.ratings = [
  33. (str(r.user.id), r.rating)
  34. for r in obj.ratings.all()
  35. ]
  36. return domain_post
  37. except Post.DoesNotExist:
  38. return None
  39. def search(self, query: str):
  40. qs = Post.objects.filter(text__icontains=query)
  41. from commu.entities.post import Post as DomainPost
  42. result = []
  43. for obj in qs:
  44. domain_post = DomainPost(
  45. author_id=str(obj.author.id),
  46. text=obj.text,
  47. images=obj.images,
  48. videos=obj.videos,
  49. )
  50. domain_post.id = str(obj.id)
  51. # Load ratings
  52. domain_post.ratings = [
  53. (str(r.user.id), r.rating)
  54. for r in obj.ratings.all()
  55. ]
  56. result.append(domain_post)
  57. return result
  58. def rate_post(self, post_id, user_id, rating: int):
  59. try:
  60. post = Post.objects.get(id=post_id)
  61. user = User.objects.get(id=user_id)
  62. except (Post.DoesNotExist, User.DoesNotExist):
  63. raise ValueError("Post or user not found")
  64. # Remove old rating from user, if any
  65. PostRating.objects.filter(post=post, user=user).delete()
  66. # Create new rating
  67. PostRating.objects.create(post=post, user=user, rating=rating)
  68. def delete(self, post_id):
  69. try:
  70. obj = Post.objects.get(id=post_id)
  71. obj.delete()
  72. except Post.DoesNotExist:
  73. raise ValueError("Post not found")
  74. def list(self, page=1, per_page=10, order_by="-created"):
  75. qs = Post.objects.all().order_by(order_by)
  76. total = qs.count()
  77. start = (page - 1) * per_page
  78. end = start + per_page
  79. from commu.entities.post import Post as DomainPost
  80. posts = []
  81. for obj in qs[start:end]:
  82. domain_post = DomainPost(
  83. author_id=str(obj.author.id),
  84. text=obj.text,
  85. images=obj.images,
  86. videos=obj.videos,
  87. )
  88. domain_post.id = str(obj.id)
  89. domain_post.ratings = [
  90. (str(r.user.id), r.rating)
  91. for r in obj.ratings.all()
  92. ]
  93. posts.append(domain_post)
  94. return posts, total
  95. def update(self, post):
  96. try:
  97. obj = Post.objects.get(id=post.id)
  98. obj.text = post.text
  99. obj.images = post.images
  100. obj.videos = post.videos
  101. obj.save()
  102. # Optionally update ratings (if part of update)
  103. except Post.DoesNotExist:
  104. raise ValueError("Post not found")