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
|
2024-12-24 12:14:38 -05:00
|
|
|
from django.db.models import Q
|
2024-12-23 22:38:49 -05:00
|
|
|
from django.http import HttpResponse
|
2024-12-24 10:22:37 -05:00
|
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
|
|
|
2024-12-24 12:14:38 -05:00
|
|
|
from tmessage.models import tMMessage, tMUser
|
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
|
|
|
|
)
|
|
|
|
|
2024-12-24 12:14:38 -05:00
|
|
|
def _add_qF(original: None | Q, new: Q) -> Q:
|
|
|
|
if original is None:
|
|
|
|
return new
|
|
|
|
return original | new
|
|
|
|
|
2024-12-24 10:22:37 -05:00
|
|
|
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"]
|
2024-12-24 12:14:38 -05:00
|
|
|
print(reply)
|
2024-12-24 10:22:37 -05:00
|
|
|
|
2024-12-24 12:14:38 -05:00
|
|
|
if not (isinstance(message_id, int) and isinstance(reply, str) and reply):
|
|
|
|
print("1")
|
2024-12-24 10:22:37 -05:00
|
|
|
return RESPONSE_400
|
|
|
|
|
|
|
|
try:
|
|
|
|
message = tMMessage.objects.get(message_id=message_id)
|
|
|
|
except tMMessage.DoesNotExist:
|
2024-12-24 12:14:38 -05:00
|
|
|
print("2")
|
2024-12-24 10:22:37 -05:00
|
|
|
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:
|
2024-12-24 12:14:38 -05:00
|
|
|
print("3")
|
2024-12-24 10:22:37 -05:00
|
|
|
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
|
|
|
|
2024-12-24 12:14:38 -05:00
|
|
|
queryFilter = None
|
2024-12-23 22:38:49 -05:00
|
|
|
|
|
|
|
if "offset" in request.GET and (request.GET.get("offset") or "").isdigit():
|
2024-12-24 12:14:38 -05:00
|
|
|
queryFilter = _add_qF(queryFilter, Q(message_id__lt=int(request.GET.get("offset") or "")))
|
2024-12-23 22:38:49 -05:00
|
|
|
|
|
|
|
if "unread" in request.GET:
|
2024-12-24 12:14:38 -05:00
|
|
|
queryFilter = _add_qF(queryFilter, Q(response=None))
|
2024-12-23 22:38:49 -05:00
|
|
|
|
|
|
|
if queryFilter:
|
2024-12-24 12:14:38 -05:00
|
|
|
msgObjects = user.received.filter(queryFilter) # type: ignore
|
2024-12-23 22:38:49 -05:00
|
|
|
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
|
|
|
|
})
|
2024-12-24 12:14:38 -05:00
|
|
|
|
|
|
|
def api_user(request: WSGIRequest, username: str) -> HttpResponse:
|
|
|
|
queryFilter = {}
|
|
|
|
|
|
|
|
try:
|
|
|
|
user = get_user_object(username)
|
|
|
|
except tMUser.DoesNotExist:
|
|
|
|
return RESPONSE_400
|
|
|
|
|
|
|
|
queryFilter = None
|
|
|
|
|
|
|
|
if "offset" in request.GET and (request.GET.get("offset") or "").isdigit():
|
|
|
|
queryFilter = _add_qF(queryFilter, Q(message_id__lt=int(request.GET.get("offset") or "")))
|
|
|
|
|
|
|
|
if "all" not in request.GET:
|
|
|
|
queryFilter = _add_qF(queryFilter, ~Q(response=None))
|
|
|
|
|
|
|
|
if queryFilter:
|
|
|
|
msgObjects = user.received.filter(queryFilter) # type: ignore
|
|
|
|
else:
|
|
|
|
msgObjects = user.received.all() # type: ignore
|
|
|
|
|
|
|
|
output = []
|
|
|
|
messages = msgObjects.order_by("-sent_timestamp" if "all" in request.GET else "-response_timestamp")[:50].values_list(
|
|
|
|
"message_id", "content", "response", "anonymous", "u_from", "u_to", "sent_timestamp", "response_timestamp"
|
|
|
|
)
|
|
|
|
|
|
|
|
for message in messages:
|
|
|
|
output.append({
|
|
|
|
"id": message[0],
|
|
|
|
"content": message[1],
|
|
|
|
"response": message[2],
|
|
|
|
"from": message[4] if not message[3] and message[4] else None,
|
|
|
|
"to": message[5],
|
|
|
|
"timestamp": message[6],
|
|
|
|
"response_timestamp": message[7]
|
|
|
|
})
|
|
|
|
|
|
|
|
return _json_response({
|
|
|
|
"success": True,
|
|
|
|
"canRespond": username == get_username(request),
|
|
|
|
"messages": output,
|
|
|
|
"more": msgObjects.count() > 50
|
|
|
|
})
|