|
@@ -4,35 +4,16 @@ from urllib.parse import urlparse
|
|
|
|
|
|
from django.conf import settings
|
|
from django.conf import settings
|
|
from django.http import HttpRequest
|
|
from django.http import HttpRequest
|
|
-from ninja import NinjaAPI, Schema
|
|
|
|
|
|
+from ninja import Router, Schema
|
|
from ninja.errors import AuthenticationError, HttpError, ValidationError
|
|
from ninja.errors import AuthenticationError, HttpError, ValidationError
|
|
|
|
|
|
from projects.models import Project
|
|
from projects.models import Project
|
|
|
|
|
|
from .authentication import event_auth, get_project
|
|
from .authentication import event_auth, get_project
|
|
from .data_models import EnvelopeSchema, EventIngestSchema
|
|
from .data_models import EnvelopeSchema, EventIngestSchema
|
|
-from .exceptions import ThrottleException
|
|
|
|
-from .parsers import EnvelopeParser
|
|
|
|
-from .renderers import ORJSONRenderer
|
|
|
|
from .tasks import ingest_event
|
|
from .tasks import ingest_event
|
|
|
|
|
|
-api = NinjaAPI(parser=EnvelopeParser(), renderer=ORJSONRenderer())
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-@api.exception_handler(ThrottleException)
|
|
|
|
-def throttled(request: HttpRequest, exc: ThrottleException):
|
|
|
|
- response = api.create_response(
|
|
|
|
- request,
|
|
|
|
- {"message": "Please retry later"},
|
|
|
|
- status=429,
|
|
|
|
- )
|
|
|
|
- if retry_after := exc.retry_after:
|
|
|
|
- if isinstance(retry_after, int):
|
|
|
|
- response["Retry-After"] = retry_after
|
|
|
|
- else:
|
|
|
|
- response["Retry-After"] = retry_after.strftime("%a, %d %b %Y %H:%M:%S GMT")
|
|
|
|
-
|
|
|
|
- return response
|
|
|
|
|
|
+router = Router()
|
|
|
|
|
|
|
|
|
|
class EventIngestOut(Schema):
|
|
class EventIngestOut(Schema):
|
|
@@ -44,7 +25,7 @@ def check_status():
|
|
print(json.dumps(self.request.data))
|
|
print(json.dumps(self.request.data))
|
|
|
|
|
|
|
|
|
|
-@api.post("/{project_id}/store/", response=EventIngestOut)
|
|
|
|
|
|
+@router.post("/{project_id}/store/", response=EventIngestOut)
|
|
async def event_store(
|
|
async def event_store(
|
|
request: HttpRequest,
|
|
request: HttpRequest,
|
|
payload: EventIngestSchema,
|
|
payload: EventIngestSchema,
|
|
@@ -52,26 +33,30 @@ async def event_store(
|
|
):
|
|
):
|
|
check_status()
|
|
check_status()
|
|
project = await get_project(request)
|
|
project = await get_project(request)
|
|
- res = ingest_event.delay(project.id, payload.dict())
|
|
|
|
|
|
+ ingest_event.delay(project.id, payload.dict())
|
|
return {"event_id": payload.event_id.hex}
|
|
return {"event_id": payload.event_id.hex}
|
|
|
|
|
|
|
|
|
|
-@api.post("/{project_id}/envelope/", response=EventIngestOut, auth=event_auth)
|
|
|
|
|
|
+@router.post("/{project_id}/envelope/", response=EventIngestOut, auth=event_auth)
|
|
async def event_envelope(
|
|
async def event_envelope(
|
|
request: HttpRequest,
|
|
request: HttpRequest,
|
|
payload: EnvelopeSchema,
|
|
payload: EnvelopeSchema,
|
|
project_id: int,
|
|
project_id: int,
|
|
):
|
|
):
|
|
|
|
+ if not len(payload) >= 3:
|
|
|
|
+ raise ValidationError([])
|
|
header = payload[0]
|
|
header = payload[0]
|
|
|
|
+ event = payload[2]
|
|
if not hasattr(header, "event_id"):
|
|
if not hasattr(header, "event_id"):
|
|
raise ValidationError([])
|
|
raise ValidationError([])
|
|
|
|
|
|
event_id = header.event_id
|
|
event_id = header.event_id
|
|
|
|
+ ingest_event.delay(project_id, event.dict())
|
|
|
|
|
|
return {"event_id": event_id.hex}
|
|
return {"event_id": event_id.hex}
|
|
|
|
|
|
|
|
|
|
-@api.post("/{project_id}/security/", response=EventIngestOut)
|
|
|
|
|
|
+@router.post("/{project_id}/security/", response=EventIngestOut)
|
|
async def event_security(
|
|
async def event_security(
|
|
request: HttpRequest,
|
|
request: HttpRequest,
|
|
payload: EventIngestSchema,
|
|
payload: EventIngestSchema,
|