message/tmessage/views/api.py

119 lines
3.3 KiB
Python
Raw Normal View History

2024-12-23 22:38:49 -05:00
import json
2024-12-24 10:22:37 -05:00
import math
import time
2024-12-23 22:38:49 -05:00
from django.core.handlers.wsgi import WSGIRequest
from django.http import HttpResponse
2024-12-24 10:22:37 -05:00
from django.views.decorators.csrf import csrf_exempt
from tmessage.models import tMMessage
2024-12-23 22:38:49 -05:00
from .helper import get_user_object, get_username
2024-12-24 10:22:37 -05:00
def _json_response(data: dict | list, /, *, status: int=200, content_type: str="application/json") -> HttpResponse:
return HttpResponse(
json.dumps(data),
status=status,
content_type=content_type
)
RESPONSE_400 = _json_response({ "success": False }, status=400)
RESPONSE_401 = _json_response({ "success": False }, status=401)
2024-12-24 10:42:52 -05:00
RESPONSE_403 = _json_response({ "success": False }, status=403)
2024-12-24 10:22:37 -05:00
@csrf_exempt
def api_messages(request: WSGIRequest) -> HttpResponse:
2024-12-23 22:38:49 -05:00
username = get_username(request)
2024-12-24 10:22:37 -05:00
2024-12-23 22:38:49 -05:00
if username is None:
2024-12-24 10:22:37 -05:00
return RESPONSE_401
2024-12-24 10:42:52 -05:00
user = get_user_object(username, i_promise_this_user_exists=True)
2024-12-24 10:22:37 -05:00
if request.method == "POST":
body = json.loads(request.body)
reply = body["content"].strip()
message_id = body["id"]
if not (isinstance(message_id, int) and isinstance(reply, str)):
return RESPONSE_400
try:
message = tMMessage.objects.get(message_id=message_id)
except tMMessage.DoesNotExist:
return RESPONSE_400
if username != message.u_to.username:
2024-12-24 10:42:52 -05:00
return RESPONSE_403
2024-12-24 10:22:37 -05:00
if message.response is not None:
return RESPONSE_400
message.response = reply
message.response_timestamp = math.floor(time.time())
message.save()
return _json_response({
"success": True,
"content": reply,
"timestamp": message.response_timestamp
})
elif request.method == "DELETE":
2024-12-24 10:42:52 -05:00
body = json.loads(request.body)
message_id = body["id"]
2024-12-23 22:38:49 -05:00
2024-12-24 10:42:52 -05:00
if not isinstance(message_id, int):
return RESPONSE_400
try:
message = tMMessage.objects.get(message_id=message_id)
except tMMessage.DoesNotExist:
return RESPONSE_400
if username != message.u_to.username:
return RESPONSE_403
message.delete()
return _json_response({
"success": True
})
2024-12-23 22:38:49 -05:00
queryFilter = {}
if "offset" in request.GET and (request.GET.get("offset") or "").isdigit():
queryFilter["message_id__lt"] = int(request.GET.get("offset") or "")
if "unread" in request.GET:
queryFilter["response"] = None
if queryFilter:
msgObjects = user.received.filter(**queryFilter)
else:
msgObjects = user.received.all() # type: ignore
output = []
messages = msgObjects.order_by("-message_id")[:50].values_list(
2024-12-24 11:34:10 -05:00
"message_id", "content", "response", "anonymous", "u_from", "u_to", "sent_timestamp", "response_timestamp"
2024-12-23 22:38:49 -05:00
)
for message in messages:
output.append({
"id": message[0],
"content": message[1],
"response": message[2],
2024-12-24 10:22:37 -05:00
"from": message[4] if not message[3] and message[4] else None,
2024-12-24 11:34:10 -05:00
"to": message[5],
"timestamp": message[6],
"response_timestamp": message[7]
2024-12-23 22:38:49 -05:00
})
2024-12-24 10:22:37 -05:00
return _json_response({
"success": True,
"canRespond": True,
"messages": output,
"more": msgObjects.count() > 50
})