import json from django.http import JsonResponse, HttpResponseBadRequest from django.views.decorators.csrf import csrf_exempt from django.contrib.auth.decorators import login_required from commu.usecases.post_service import PostService from core.repositories.django_post_repository import DjangoPostRepository from core.repositories.django_user_repository import DjangoUserRepository # Service setup (could be moved to app config for larger apps) user_repo = DjangoUserRepository() post_repo = DjangoPostRepository() post_service = PostService(post_repo, user_repo) @csrf_exempt @login_required def create_post(request): if request.method != 'POST': return HttpResponseBadRequest("POST only") try: data = json.loads(request.body.decode()) text = data.get("text") images = data.get("images", []) videos = data.get("videos", []) if not text: return JsonResponse({"error": "Missing post text"}, status=400) # Use logged-in Django user as author user_id = str(request.user.id) post = post_service.create_post(user_id, text, images, videos) return JsonResponse({ "id": post.id, "text": post.text, "author_id": post.author_id, "images": post.images, "videos": post.videos }) except Exception as e: return JsonResponse({"error": str(e)}, status=400) def search_posts(request): q = request.GET.get("q", "") results = post_service.search_posts(q) posts = [{ "id": p.id, "text": p.text, "author_id": p.author_id, "images": p.images, "videos": p.videos, "avg_rating": p.average_rating() } for p in results] return JsonResponse({"results": posts}) @csrf_exempt @login_required def rate_post(request): if request.method != 'POST': return HttpResponseBadRequest("POST only") try: data = json.loads(request.body.decode()) post_id = data.get("post_id") rating = data.get("rating") if not post_id or rating is None: return JsonResponse({"error": "Missing post_id or rating"}, status=400) user_id = str(request.user.id) post_service.rate_post(post_id, user_id, int(rating)) return JsonResponse({"ok": True}) except Exception as e: return JsonResponse({"error": str(e)}, status=400)