chat/apps/chat/views/messages.py
2026-06-15 13:21:21 +03:30

61 lines
2.1 KiB
Python

from uuid import UUID
from drf_spectacular.utils import OpenApiParameter, extend_schema
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from apps.chat.serializers.messages import MessageSerializer, SendMessageSerializer
from apps.chat.services.message import MessageService
class MessageView(APIView):
authentication_classes = []
permission_classes = []
@extend_schema(
request=SendMessageSerializer,
responses={201: MessageSerializer},
)
def post(self, request, chat_id):
serializer = SendMessageSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
data = serializer.validated_data
result = MessageService().send(
conversation_id=UUID(str(chat_id)),
sender_id=data["sender_id"],
message_type=data["message_type"],
text=data.get("text"),
file=data.get("file"),
)
return Response(MessageSerializer(result).data, status=status.HTTP_201_CREATED)
@extend_schema(
parameters=[
OpenApiParameter("page", int, description="0-based page number", default=0),
OpenApiParameter("per_page", int, description="Results per page", default=20),
OpenApiParameter(
"since",
int,
required=False,
description="Return only posts after this Unix timestamp (milliseconds)",
),
],
responses={200: MessageSerializer(many=True)},
)
def get(self, request, chat_id):
page = int(request.query_params.get("page", 0))
per_page = int(request.query_params.get("per_page", 20))
since_raw = request.query_params.get("since")
since = int(since_raw) if since_raw else None
messages = MessageService().list_messages(
conversation_id=UUID(str(chat_id)),
page=page,
per_page=per_page,
since=since,
)
return Response(MessageSerializer(messages, many=True).data)