From 650d739d4023471bf964de2178885272d74715a8 Mon Sep 17 00:00:00 2001 From: Elijah Melton Date: Sun, 29 Dec 2024 00:38:18 -0800 Subject: [PATCH] endpoint for message event injestion --- server/engagement/urls.py | 10 ++++++++ server/engagement/views.py | 52 ++++++++++++++++++++++++++++++++++++-- server/server/urls.py | 1 + 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 server/engagement/urls.py diff --git a/server/engagement/urls.py b/server/engagement/urls.py new file mode 100644 index 0000000..228eae0 --- /dev/null +++ b/server/engagement/urls.py @@ -0,0 +1,10 @@ +from django.urls import path +from . import views + +urlpatterns = [ + path( + "message/", + views.InjestMessageEventView.as_view(), + name="injest-message-event", + ), +] \ No newline at end of file diff --git a/server/engagement/views.py b/server/engagement/views.py index 91ea44a..40dfc63 100644 --- a/server/engagement/views.py +++ b/server/engagement/views.py @@ -1,3 +1,51 @@ -from django.shortcuts import render +from django.shortcuts import get_object_or_404 +from rest_framework import generics, status +from rest_framework.response import Response +from django.http import Http404 +from django.db import transaction +from django.db.models import F +from engagement.models import DiscordMessageStats +from members.models import User +from members.permissions import IsApiKey -# Create your views here. +import logging + +logger = logging.getLogger(__name__) + + +class InjestMessageEventView(generics.CreateAPIView): + permission_classes = [IsApiKey] + + @transaction.atomic + def post(self, request, *args, **kwargs): + discord_id = request.data.get("discord_id") + channel_id = request.data.get("channel_id") + try: + user = get_object_or_404(User, discord_id=discord_id) + + ( + stats, + created, + ) = DiscordMessageStats.objects.select_for_update().get_or_create( + member_id=user.id, channel_id=channel_id, defaults={"message_count": 1} + ) + + if not created: + stats.message_count = F("message_count") + 1 + stats.save() + stats.refresh_from_db() + + logger.info( + "member %s has %d messages in channel %s", + user.id, + stats.message_count, + channel_id, + ) + + return Response(status=status.HTTP_202_ACCEPTED) + + except Http404: + logger.error("member not found for discord_id: %s", discord_id) + return Response( + {"error": "member not found"}, status=status.HTTP_404_NOT_FOUND + ) diff --git a/server/server/urls.py b/server/server/urls.py index cb1fae8..7a907f5 100644 --- a/server/server/urls.py +++ b/server/server/urls.py @@ -13,6 +13,7 @@ path('reports/', include('report.urls')), path('leaderboard/', include('leaderboard.urls')), path('admin/command/', ManagementCommandView.as_view()), + path('engagement/', include('engagement.urls')), ]