Validate hooks with serde

This commit is contained in:
Mark Veidemanis 2022-10-15 23:24:03 +01:00
parent a15ebaf82c
commit 20a4e21eaa
Signed by: m
GPG Key ID: 5ACFCEED46C0904F
4 changed files with 43 additions and 2 deletions

View File

18
core/lib/serde/drakdoo.py Normal file
View File

@ -0,0 +1,18 @@
from serde import Model, fields
class Market(Model):
exchange = fields.Str()
item = fields.Str()
currency = fields.Str()
contract = fields.Str()
class Timestamp(Model):
sent = fields.DateTime()
trade = fields.DateTime()
class BaseDrakdoo(Model):
title = fields.Str()
message = fields.Str()
period = fields.Str()
market = fields.Nested(Market)
timestamp = fields.Nested(Timestamp)

View File

@ -11,6 +11,11 @@ from rest_framework.views import APIView
from core.forms import HookForm from core.forms import HookForm
from core.models import Callback, Hook from core.models import Callback, Hook
from core.lib.serde import drakdoo
from serde import ValidationError
from util import log
log = log.get_logger(__name__)
def get_hooks(user): def get_hooks(user):
hooks = Hook.objects.filter(user=user) hooks = Hook.objects.filter(user=user)
@ -21,19 +26,36 @@ class HookAPI(APIView):
parser_classes = [JSONParser] parser_classes = [JSONParser]
def post(self, request, hook_name): def post(self, request, hook_name):
print("DATA", request.data) log.debug(f"HookAPI POST: {request.data}")
# Try loading the JSON
try:
loaded_json = orjson.loads(request.data)
except orjson.JSONDecodeError:
return HttpResponseBadRequest("Invalid JSON")
# Try validating the JSON
try:
hook_resp = drakdoo.BaseDrakdoo.from_dict(loaded_json)
except ValidationError as e:
log.error(f"HookAPI POST: {e}")
return HttpResponseBadRequest(e)
# Try getting the hook
try: try:
hook = Hook.objects.get(hook=hook_name) hook = Hook.objects.get(hook=hook_name)
except Hook.DoesNotExist: except Hook.DoesNotExist:
return HttpResponseBadRequest("Hook does not exist.") return HttpResponseBadRequest("Hook does not exist.")
# Create the callback object
callback = Callback.objects.create( callback = Callback.objects.create(
hook=hook, hook=hook,
data=request.data, data=request.data,
) )
callback.save() callback.save()
# Bump received count
hook.received = hook.received + 1 hook.received = hook.received + 1
hook.save() hook.save()
print("SAVED")
return HttpResponse("OK") return HttpResponse("OK")

View File

@ -15,3 +15,4 @@ django-debug-toolbar-template-profiler
orjson orjson
django-otp django-otp
qrcode qrcode
serde[ext]